diff --git a/.docker/.env b/.docker/.env index e50d4f6b5b1c15372029abec7a4fb924a70781ad..821b16a5c08b6577f7aa1728baded9960c24b311 100644 --- a/.docker/.env +++ b/.docker/.env @@ -1,9 +1,13 @@ +APP_VERSION=1.8 +FLUENTBIT_VERSION=4.0.0 +GRAFANA_VERSION=11.4.0 MARIADB_VERSION=11.3.2 -POSTGRES_VERSION=17.0.0 -KEYCLOAK_VERSION=26.0.4 -RABBITMQ_VERSION=3.13.7 -OPENSEARCH_VERSION=2.10.0 -NGINX_VERSION=1.27.3-alpine3.20-slim +KEYCLOAK_VERSION=26.2.4 +MYSQLD_EXPORTER_VERSION=0.15.1 +NGINX_VERSION=1.28.0 OPENLDAP_VERSION=2.6.8 -SEAWEEDFS_VERSION=3.71.0 -PROMETHEUS_VERSION=2.54.1 \ No newline at end of file +OPENSEARCH_VERSION=2.18.0 +POSTGRES_VERSION=17.0.0 +PROMETHEUS_VERSION=2.54.1 +RABBITMQ_VERSION=3.13.1 +SEAWEEDFS_VERSION=3.87.0 diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml index f85459e3bd783e84dffc486fa8d8de4691679ce0..88023aa8d219d4a80324210156668d7ea99a00c3 100644 --- a/.docker/docker-compose.yml +++ b/.docker/docker-compose.yml @@ -1,57 +1,3 @@ -x-resources-nano: &resources-nano - resources: - reservations: - cpus: '0.1' - memory: 128M - limits: - cpus: '0.15' - memory: 192M - -x-resources-micro: &resources-micro - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 384M - -x-resources-nano-hm: &resources-micro-hm - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 4096M - -x-resources-small: &resources-small - resources: - reservations: - cpus: '0.5' - memory: 512M - limits: - cpus: '0.75' - memory: 768M - -x-resources-medium: &resources-medium - resources: - reservations: - cpus: '0.5' - memory: 1024M - limits: - cpus: '0.75' - memory: 1536M - -x-resources-large: &resources-large - resources: - reservations: - cpus: '1' - memory: 2048M - limits: - cpus: '1.5' - memory: 3072M - x-healthcheck-params: &healthcheck-params interval: 30s timeout: 10s @@ -66,29 +12,49 @@ volumes: identity-service-data: metric-db-data: dashboard-ui-data: + dashboard-db-data: services: dbrepo-metadata-db: restart: "no" container_name: dbrepo-metadata-db hostname: metadata-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - metadata-db-data:/bitnami/mariadb + - metadata-db-data:/var/lib/mysql - ./config/1_setup-schema.sql:/docker-entrypoint-initdb.d/1_setup-schema.sql - ./config/2_setup-data.sql:/docker-entrypoint-initdb.d/2_setup-data.sql ports: - "3306:3306" environment: + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${METADATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_DATABASE: "${METADATA_DB:-dbrepo}" - MARIADB_EXTRA_FLAGS: "${METADATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${METADATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" + MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-metadata-db-metrics: + restart: "no" + container_name: dbrepo-metadata-db-metrics + hostname: metadata-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=metadata-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./config/metrics.cnf:/.my.cnf + healthcheck: + test: -h + <<: *healthcheck-params + depends_on: + dbrepo-metadata-db: + condition: service_healthy logging: driver: json-file @@ -96,23 +62,40 @@ services: restart: "no" container_name: dbrepo-data-db hostname: data-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - data-db-data:/bitnami/mariadb + - data-db-data:/var/lib/mysql - ./config/1_grant-user.sql:/docker-entrypoint-initdb.d/1_grant-user.sql ports: - "3307:3306" environment: - MARIADB_EXTRA_FLAGS: "${DATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${DATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${DATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-data-db-metrics: + restart: "no" + container_name: dbrepo-data-db-metrics + hostname: data-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=data-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./dbrepo-data-db/metrics.cnf:/.my.cnf + healthcheck: + test: -h + <<: *healthcheck-params + depends_on: + dbrepo-data-db: + condition: service_healthy logging: driver: json-file @@ -131,9 +114,23 @@ services: healthcheck: test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'" <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-dashboard-db: + restart: "no" + container_name: dbrepo-dashboard-db + hostname: dashboard-db + image: docker.io/bitnami/postgresql:${POSTGRES_VERSION} + volumes: + - dashboard-db-data:/bitnami/postgresql + environment: + POSTGRESQL_DATABASE: "${DASHBOARD_DB_NAME:-grafana}" + POSTGRESQL_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + POSTGRESQL_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" + healthcheck: + test: "psql -U ${DASHBOARD_DB_USERNAME:-grafana} -h 127.0.0.1 -p 5432 -d ${DASHBOARD_DB_NAME:-grafana} -c 'select version();'" + <<: *healthcheck-params logging: driver: json-file @@ -168,9 +165,6 @@ services: healthcheck: test: curl -fsS localhost:8080/realms/master <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 depends_on: dbrepo-identity-service: condition: service_healthy @@ -183,7 +177,7 @@ services: init: true restart: "no" container_name: dbrepo-auth-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.2 environment: AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} METADATA_DB: "${METADATA_DB:-dbrepo}" @@ -192,14 +186,11 @@ services: READONLY_USERNAME: "${READONLY_USERNAME:-readonly}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy dbrepo-gateway-service: - condition: service_healthy + condition: service_started dbrepo-metadata-db: condition: service_healthy logging: @@ -209,7 +200,7 @@ services: restart: "no" container_name: dbrepo-metadata-service hostname: metadata-service - image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.2 environment: ADMIN_EMAIL: "${ADMIN_EMAIL:-noreply@localhost}" ANALYSE_SERVICE_ENDPOINT: "${ANALYSE_SERVICE_ENDPOINT:-http://analyse-service:8080}" @@ -251,9 +242,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-small - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy @@ -274,7 +262,7 @@ services: restart: "no" container_name: dbrepo-analyse-service hostname: analyse-service - image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.2 environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -291,9 +279,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -319,9 +304,6 @@ services: healthcheck: test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running' <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -337,9 +319,6 @@ services: healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 logging: driver: json-file @@ -347,7 +326,7 @@ services: restart: "no" container_name: dbrepo-search-service hostname: search-service - image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.2 environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -362,9 +341,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -372,7 +348,7 @@ services: restart: "no" container_name: dbrepo-ui hostname: ui - image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.2 environment: NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}" NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://gateway-service}" @@ -389,9 +365,6 @@ services: healthcheck: test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-search-service: condition: service_healthy @@ -404,17 +377,11 @@ services: restart: "no" container_name: dbrepo-gateway-service hostname: gateway-service - image: docker.io/nginx:${NGINX_VERSION} + image: docker.io/bitnami/nginx:${NGINX_VERSION} ports: - "80:8080" volumes: - - ./config/dbrepo.conf:/etc/nginx/conf.d/default.conf - healthcheck: - test: lsof -i TCP:80 || exit 1 - <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 + - ./dbrepo-gateway-service/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro depends_on: dbrepo-analyse-service: condition: service_healthy @@ -437,7 +404,7 @@ services: restart: "no" container_name: dbrepo-identity-service hostname: identity-service - image: bitnami/openldap:${OPENLDAP_VERSION} + image: docker.io/bitnami/openldap:${OPENLDAP_VERSION} environment: LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" @@ -451,9 +418,6 @@ services: healthcheck: test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1" <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -462,7 +426,7 @@ services: init: true container_name: dbrepo-search-service-init hostname: search-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.2 environment: LOG_LEVEL: ${LOG_LEVEL:-info} METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} @@ -470,9 +434,6 @@ services: OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-search-db: condition: service_healthy @@ -486,16 +447,13 @@ services: init: true container_name: dbrepo-dashboard-service-init hostname: search-dashboard-init - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.2 environment: LOG_LEVEL: ${LOG_LEVEL:-info} DASHBOARD_UI_ENDPOINT: "${DASHBOARD_UI_ENDPOINT:-http://dashboard-ui:3000}" METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy @@ -518,9 +476,6 @@ services: healthcheck: test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -535,9 +490,6 @@ services: healthcheck: test: promtool check healthy <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -546,15 +498,12 @@ services: init: true container_name: dbrepo-storage-service-init hostname: storage-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.2 environment: S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin} S3_BUCKET: "${S3_BUCKET:-dbrepo}" S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-storage-service: condition: service_healthy @@ -565,7 +514,7 @@ services: restart: "no" container_name: dbrepo-data-service hostname: data-service - image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.2 environment: AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}" AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" @@ -600,9 +549,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-large - platform: linux/amd64 depends_on: dbrepo-data-db: condition: service_healthy @@ -613,15 +559,24 @@ services: restart: "no" container_name: dbrepo-dashboard-ui hostname: dashboard-ui - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-ui:1.8.1 + image: docker.io/bitnami/grafana:${GRAFANA_VERSION} ports: - "3000:3000" volumes: - - dashboard-ui-data:/opt/bitnami/grafana/data + - ./config/dashboards:/app/dashboards + - ./config/grafana.ini:/opt/bitnami/grafana/conf/grafana.ini + - ./config/ldap.toml:/opt/bitnami/grafana/conf/ldap.toml + - ./config/provisioning/dashboards/provider.yaml:/opt/bitnami/grafana/conf/provisioning/dashboards/provider.yaml + - ./config/provisioning/datasources/infinity.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/infinity.yaml + - ./config/provisioning/datasources/prometheus.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/prometheus.yaml + - ./config/provisioning/datasources/opensearch.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/opensearch.yaml environment: BASE_URL: "${BASE_URL:-http://localhost}" + DASHBOARD_DB_NAME: "${DASHBOARD_DB_NAME:-grafana}" + DASHBOARD_DB_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + DASHBOARD_DB_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" GF_SERVER_ROOT_URL: http://dashboard-ui:3000/dashboard/ - GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource" + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource,grafana-opensearch-datasource" GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" @@ -629,9 +584,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:3000 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 extra_hosts: - "localhost:host-gateway" logging: @@ -641,9 +593,7 @@ services: restart: "no" container_name: dbrepo-dashboard-service hostname: dashboard-service - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.1 - ports: - - "4070:8080" + image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.2 environment: AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} BASE_URL: "${BASE_URL:-http://localhost}" @@ -653,9 +603,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:8080/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy diff --git a/.docs/.openapi/api-analyse.yaml b/.docs/.openapi/api-analyse-service.yaml similarity index 99% rename from .docs/.openapi/api-analyse.yaml rename to .docs/.openapi/api-analyse-service.yaml index f859315e1f901d4a12fa6c56f99266a77748bd66..e4baa497455fe4f2121cb7a1eb4f632388879fe8 100644 --- a/.docs/.openapi/api-analyse.yaml +++ b/.docs/.openapi/api-analyse-service.yaml @@ -124,7 +124,7 @@ "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "title": "Database Repository Analyse Service API", - "version": "1.8.1" + "version": "1.8.2" }, "openapi": "3.0.0", "paths": { diff --git a/.docs/.openapi/api-dashboard-service.yaml b/.docs/.openapi/api-dashboard-service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a5f61af6c080dcde0d8908da20ac9e53e3e4b0dd --- /dev/null +++ b/.docs/.openapi/api-dashboard-service.yaml @@ -0,0 +1,231 @@ +{ + "components": { + "schemas": { + "ApiError": { + "properties": { + "code": { + "example": "error.dashboard.create", + "type": "string" + }, + "message": { + "example": "Message", + "type": "string" + }, + "status": { + "example": "BAD_REQUEST", + "type": "string" + } + }, + "type": "object" + } + }, + "securitySchemes": { + "basicAuth": { + "in": "header", + "scheme": "basic", + "type": "http" + }, + "bearerAuth": { + "bearerFormat": "JWT", + "in": "header", + "scheme": "bearer", + "type": "http" + } + } + }, + "externalDocs": { + "description": "Sourcecode Documentation", + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/" + }, + "info": { + "contact": { + "email": "andreas.rauber@tuwien.ac.at", + "name": "Prof. Andreas Rauber" + }, + "description": "Service that manages the dashboards", + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + }, + "title": "Database Repository Dashboard Service API", + "version": "1.8.1" + }, + "openapi": "3.0.0", + "paths": { + "/api/dashboard": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Creates a dashboard in the Dashboard UI. Requires role `system`.", + "operationId": "create_dashboard", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "properties": { + "database_name": { + "example": "some_database", + "type": "string" + }, + "is_public": { + "example": true, + "type": "boolean" + }, + "is_schema_public": { + "example": true, + "type": "boolean" + }, + "owner_username": { + "example": "foobar", + "type": "string" + } + }, + "required": [ + "is_public", + "is_schema_public", + "database_name", + "owner_username" + ], + "type": "object" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Created dashboard successfully" + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Dashboard exists with same name" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Unexpected system error" + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ], + "summary": "Create dashboard", + "tags": [ + "dashboard-endpoint" + ] + } + }, + "/api/dashboard/{uid}": { + "put": { + "consumes": [ + "application/json" + ], + "description": "Updates a dashboard in the Dashboard UI. Requires role `system`.", + "operationId": "update_dashboard", + "parameters": [ + { + "in": "path", + "name": "uid", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "202": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Updated dashboard successfully" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Dashboard not found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Unexpected system error" + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ], + "summary": "Update dashboard", + "tags": [ + "dashboard-endpoint" + ] + } + } + }, + "servers": [ + { + "description": "Generated server url", + "url": "http://localhost" + }, + { + "description": "Sandbox", + "url": "https://test.dbrepo.tuwien.ac.at" + } + ] +} diff --git a/.docs/.openapi/api-dashboard.yaml b/.docs/.openapi/api-dashboard.yaml deleted file mode 100644 index 54a27444f68e0760fded5be2a5b9d1770a1d8c39..0000000000000000000000000000000000000000 --- a/.docs/.openapi/api-dashboard.yaml +++ /dev/null @@ -1 +0,0 @@ -"<!doctype html> <html lang=en> <title>500 Internal Server Error</title> <h1>Internal Server Error</h1> <p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>" diff --git a/.docs/.openapi/api-data-service.yaml b/.docs/.openapi/api-data-service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..826cd46410b65d281c1b52a1c222bc7ad072d0d9 --- /dev/null +++ b/.docs/.openapi/api-data-service.yaml @@ -0,0 +1,3884 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Database Repository Data Service API", + "description": "Service that manages the data", + "contact": { + "name": "Prof. Andreas Rauber", + "email": "andreas.rauber@tuwien.ac.at" + }, + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + }, + "version": "1.8.2" + }, + "externalDocs": { + "description": "Sourcecode Documentation", + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.2/system-services-metadata/" + }, + "servers": [ + { + "url": "http://localhost", + "description": "Development instance" + }, + { + "url": "https://test.dbrepo.tuwien.ac.at", + "description": "Staging instance" + } + ], + "paths": { + "/api/database/{databaseId}/view/{viewId}/data": { + "get": { + "tags": [ + "view-endpoint" + ], + "summary": "Get view data", + "description": "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database.", + "operationId": "getData", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved view data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve view data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find view in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "View schema could not be mapped", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "head": { + "tags": [ + "view-endpoint" + ], + "summary": "Get view data", + "description": "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database.", + "operationId": "getData_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved view data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve view data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find view in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "View schema could not be mapped", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/data": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Get table data", + "description": "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.", + "operationId": "getData_2", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Get table data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to get table data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update tuple", + "description": "Updates a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.", + "operationId": "updateRawTuple", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TupleUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated table data" + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Update table data not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "post": { + "tags": [ + "table-endpoint" + ], + "summary": "Insert tuple", + "description": "Inserts a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.", + "operationId": "insertRawTuple", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TupleDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created table data" + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Create table data not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database or blob in storage service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service or storage service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "delete": { + "tags": [ + "table-endpoint" + ], + "summary": "Delete tuple", + "description": "Deletes a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `delete-table-data`.", + "operationId": "deleteRawTuple", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TupleDeleteDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Deleted table data" + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Delete table data not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "head": { + "tags": [ + "table-endpoint" + ], + "summary": "Get table data", + "description": "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.", + "operationId": "getData_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Get table data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to get table data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset/{subsetId}/data": { + "get": { + "tags": [ + "subset-endpoint" + ], + "summary": "Get subset data", + "description": "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header", + "operationId": "getData_4", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subsetId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Retrieved subset data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Reverse proxy exposing of custom headers", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Id": { + "description": "The subset id", + "required": true, + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Headers": { + "description": "The list of headers separated by comma", + "style": "simple", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Invalid pagination", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve subset data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "subset-endpoint" + ], + "summary": "Get subset data", + "description": "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header", + "operationId": "getData_5", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subsetId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Retrieved subset data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Reverse proxy exposing of custom headers", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Id": { + "description": "The subset id", + "required": true, + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Headers": { + "description": "The list of headers separated by comma", + "style": "simple", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Invalid pagination", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve subset data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset/{queryId}": { + "put": { + "tags": [ + "subset-endpoint" + ], + "summary": "Persist subset", + "description": "Persists a subset with id. Requires role `persist-query`.", + "operationId": "persist", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "queryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryPersistDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Persisted subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryDto" + } + } + } + }, + "400": { + "description": "Malformed select query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to persist subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Failed to persist subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/upload": { + "post": { + "tags": [ + "upload-endpoint" + ], + "summary": "Uploads a multipart file", + "description": "Uploads a multipart file to the Storage Service. Requires role `upload-file`.", + "operationId": "create", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + }, + "required": [ + "file" + ] + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Uploaded the file", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the storage service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/data/import": { + "post": { + "tags": [ + "table-endpoint" + ], + "summary": "Import dataset", + "description": "Imports a dataset in a table. Then update the table statistics. The user needs to have at least *WRITE_OWN* access to the associated database when importing into a owned table. Otherwise *WRITE_ALL* access in needed. Requires role `insert-table-data`.", + "operationId": "importDataset", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Imported dataset successfully" + }, + "400": { + "description": "Dataset and/or query are malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Import table dataset not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset": { + "get": { + "tags": [ + "subset-endpoint" + ], + "summary": "Find subsets", + "description": "Finds subsets in the query store. When the database schema is marked as hidden, the user needs to be authorized, have at least read-access to the database. The result can be optionally filtered by setting `persisted`. When set to *true*, only persisted queries are returned, otherwise only non-persisted queries are returned.", + "operationId": "list", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "persisted", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Found subsets", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/QueryDto" + } + } + } + } + }, + "403": { + "description": "Not allowed to find subsets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database or user in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "post": { + "tags": [ + "subset-endpoint" + ], + "summary": "Create subset", + "description": "Creates a subset in the query store of the data database. Can also be used without authentication if (and only if) the database is marked as public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise at least read access is required.", + "operationId": "create_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubsetDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created subset", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Malformed select query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to find subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Failed to insert query into query store of data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "501": { + "description": "Failed to execute query as it contains non-supported keywords", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/history": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Get history", + "description": "Gets the insert/delete operations history performed. For tables in private databases, the user needs to have at least *READ* access to the associated database.", + "operationId": "getHistory", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Found table history", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableHistoryDto" + } + } + } + } + }, + "400": { + "description": "Invalid pagination size request, must be > 0", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Find table history not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table history in data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset/{subsetId}": { + "get": { + "tags": [ + "subset-endpoint" + ], + "summary": "Find subset", + "description": "Finds a subset in the data database. When the database schema is marked as hidden, the user needs to be authorized, have at least read-access to the database. Requests with HTTP header `Accept=application/json` return the metadata, requests with HTTP header `Accept=text/csv` return the data as downloadable file.", + "operationId": "findById", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subsetId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "description": "Found subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryDto" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Malformed select query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to find subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to find acceptable representation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + } + }, + "components": { + "schemas": { + "ApiErrorDto": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "100 CONTINUE", + "101 SWITCHING_PROTOCOLS", + "102 PROCESSING", + "103 EARLY_HINTS", + "103 CHECKPOINT", + "200 OK", + "201 CREATED", + "202 ACCEPTED", + "203 NON_AUTHORITATIVE_INFORMATION", + "204 NO_CONTENT", + "205 RESET_CONTENT", + "206 PARTIAL_CONTENT", + "207 MULTI_STATUS", + "208 ALREADY_REPORTED", + "226 IM_USED", + "300 MULTIPLE_CHOICES", + "301 MOVED_PERMANENTLY", + "302 FOUND", + "302 MOVED_TEMPORARILY", + "303 SEE_OTHER", + "304 NOT_MODIFIED", + "305 USE_PROXY", + "307 TEMPORARY_REDIRECT", + "308 PERMANENT_REDIRECT", + "400 BAD_REQUEST", + "401 UNAUTHORIZED", + "402 PAYMENT_REQUIRED", + "403 FORBIDDEN", + "404 NOT_FOUND", + "405 METHOD_NOT_ALLOWED", + "406 NOT_ACCEPTABLE", + "407 PROXY_AUTHENTICATION_REQUIRED", + "408 REQUEST_TIMEOUT", + "409 CONFLICT", + "410 GONE", + "411 LENGTH_REQUIRED", + "412 PRECONDITION_FAILED", + "413 PAYLOAD_TOO_LARGE", + "413 REQUEST_ENTITY_TOO_LARGE", + "414 URI_TOO_LONG", + "414 REQUEST_URI_TOO_LONG", + "415 UNSUPPORTED_MEDIA_TYPE", + "416 REQUESTED_RANGE_NOT_SATISFIABLE", + "417 EXPECTATION_FAILED", + "418 I_AM_A_TEAPOT", + "419 INSUFFICIENT_SPACE_ON_RESOURCE", + "420 METHOD_FAILURE", + "421 DESTINATION_LOCKED", + "422 UNPROCESSABLE_ENTITY", + "423 LOCKED", + "424 FAILED_DEPENDENCY", + "425 TOO_EARLY", + "426 UPGRADE_REQUIRED", + "428 PRECONDITION_REQUIRED", + "429 TOO_MANY_REQUESTS", + "431 REQUEST_HEADER_FIELDS_TOO_LARGE", + "451 UNAVAILABLE_FOR_LEGAL_REASONS", + "500 INTERNAL_SERVER_ERROR", + "501 NOT_IMPLEMENTED", + "502 BAD_GATEWAY", + "503 SERVICE_UNAVAILABLE", + "504 GATEWAY_TIMEOUT", + "505 HTTP_VERSION_NOT_SUPPORTED", + "506 VARIANT_ALSO_NEGOTIATES", + "507 INSUFFICIENT_STORAGE", + "508 LOOP_DETECTED", + "509 BANDWIDTH_LIMIT_EXCEEDED", + "510 NOT_EXTENDED", + "511 NETWORK_AUTHENTICATION_REQUIRED" + ], + "example": "NOT_FOUND" + }, + "message": { + "type": "string", + "example": "Error message" + }, + "code": { + "type": "string", + "example": "error.service.code" + } + }, + "required": [ + "code", + "message", + "status" + ] + }, + "TupleUpdateDto": { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "key": "value" + } + }, + "keys": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "id": 1 + } + } + }, + "required": [ + "data", + "keys" + ] + }, + "QueryPersistDto": { + "type": "object", + "properties": { + "persist": { + "type": "boolean", + "example": true + } + }, + "required": [ + "persist" + ] + }, + "CreatorBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "IdentifierBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorBriefDto" + } + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5" + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "id", + "owned_by", + "publication_year", + "publisher", + "status", + "titles", + "type" + ] + }, + "IdentifierDescriptionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e0e9692c-910b-4b60-b53a-fc7c358a917d" + }, + "description": { + "type": "string", + "example": "Air quality reports at Stephansplatz, Vienna" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "Abstract", + "Methods", + "SeriesInformation", + "TableOfContents", + "TechnicalInfo", + "Other" + ], + "example": "Abstract" + } + }, + "required": [ + "id" + ] + }, + "IdentifierTitleDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "70ce5164-fd74-413f-8712-f996b91defbf" + }, + "title": { + "type": "string", + "example": "Airquality Demonstrator" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "AlternativeTitle", + "Subtitle", + "TranslatedTitle", + "Other" + ] + } + }, + "required": [ + "id" + ] + }, + "QueryDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "83ea2326-f8f6-4263-baf8-cdf88a54efc7" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "execution": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality`" + }, + "type": { + "type": "string", + "enum": [ + "query", + "view" + ], + "example": "query" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierBriefDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "query_normalized": { + "type": "string", + "example": "SELECT `id` FROM `air_quality`" + }, + "query_hash": { + "type": "string", + "example": "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76" + }, + "is_persisted": { + "type": "boolean", + "example": true + }, + "result_hash": { + "type": "string", + "example": "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76" + }, + "result_number": { + "type": "integer", + "format": "int64", + "example": 1 + } + }, + "required": [ + "database_id", + "execution", + "id", + "identifiers", + "is_persisted", + "owner", + "query", + "query_hash", + "query_normalized" + ] + }, + "UserBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4" + }, + "username": { + "type": "string", + "description": "Only contains lowercase characters", + "example": "jcarberry" + }, + "name": { + "type": "string", + "example": "Josiah Carberry" + }, + "orcid": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "qualified_name": { + "type": "string", + "example": "Josiah Carberry — @jcarberry" + }, + "given_name": { + "type": "string", + "example": "Josiah" + }, + "family_name": { + "type": "string", + "example": "Carberry" + } + }, + "required": [ + "id", + "username" + ] + }, + "CreatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "name_identifier_scheme_uri": { + "type": "string", + "example": "https://orcid.org/" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + }, + "affiliation_identifier_scheme_uri": { + "type": "string", + "example": "https://ror.org/" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "EnumDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "5343bb3d-14d3-4eb7-a86f-b8fc553cb315" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "IdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "links": { + "$ref": "#/components/schemas/LinksDto" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierFunderDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "execution": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorDto" + } + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_normalized": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RelatedIdentifierDto" + } + }, + "query_hash": { + "type": "string", + "description": "query hash in sha512" + }, + "result_hash": { + "type": "string", + "example": "34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5" + }, + "result_number": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "funders", + "id", + "language", + "licenses", + "links", + "owner", + "publication_year", + "publisher", + "query", + "query_hash", + "query_normalized", + "status", + "titles", + "type" + ] + }, + "IdentifierFunderDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "39693413-e0ce-46da-ad5e-029c0556d439" + }, + "funder_name": { + "type": "string", + "example": "European Commission" + }, + "funder_identifier": { + "type": "string", + "example": "http://doi.org/10.13039/501100000780" + }, + "funder_identifier_type": { + "type": "string", + "enum": [ + "Crossref Funder ID", + "ROR", + "GND", + "ISNI", + "Other" + ], + "example": "Crossref Funder ID" + }, + "scheme_uri": { + "type": "string", + "example": "http://doi.org/" + }, + "award_number": { + "type": "string", + "example": 824087 + }, + "award_title": { + "type": "string", + "example": "EOSC-Life" + } + }, + "required": [ + "funder_name", + "id" + ] + }, + "LicenseDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "example": "MIT" + }, + "uri": { + "type": "string", + "example": "https://opensource.org/licenses/MIT" + }, + "description": { + "type": "string", + "example": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code." + } + }, + "required": [ + "identifier", + "uri" + ] + }, + "LinksDto": { + "type": "object", + "properties": { + "self": { + "type": "string", + "example": "http://example.com/api/" + }, + "data": { + "type": "string", + "example": "http://example.com" + }, + "self_html": { + "type": "string", + "example": "http://example.com" + }, + "dashboard_html": { + "type": "string", + "example": "http://example.com/d/defi2baxqawaod" + } + }, + "required": [ + "self", + "self_html" + ] + }, + "RelatedIdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ce9d11f0-60a2-448d-a3e4-44719a443e8a" + }, + "value": { + "type": "string", + "example": "10.70124/dc4zh-9ce78" + }, + "type": { + "type": "string", + "enum": [ + "DOI", + "URL", + "URN", + "ARK", + "arXiv", + "bibcode", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "w3id" + ], + "example": "DOI" + }, + "relation": { + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsDescribedBy", + "Describes", + "HasMetadata", + "IsMetadataFor", + "HasVersion", + "IsVersionOf", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "IsReviewedBy", + "Reviews", + "IsDerivedFrom", + "IsSourceOf", + "IsRequiredBy", + "Requires", + "IsObsoletedBy", + "Obsoletes" + ], + "example": "Cites" + } + }, + "required": [ + "id", + "relation", + "type", + "value" + ] + }, + "SetDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7eb4eded-bacc-4a91-84db-a9ae6ddafda7" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "ViewColumnDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6aec3a91-2e0b-4e92-a16a-9c3c5e892da1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "description": { + "type": "string", + "example": "Column comment", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/EnumDto" + } + }, + "sets": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/SetDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4" + }, + "ord": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "index_length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "is_null_allowed": { + "type": "boolean", + "example": false + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_null_allowed", + "name", + "ord", + "type" + ] + }, + "ViewDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "787439d0-e85e-400c-a7e6-996a023bfad9" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ViewColumnDto" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "2022-01-01 08:00:00.000" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "initial_view": { + "type": "boolean", + "description": "True if it is the default view for the database", + "example": true + }, + "query_hash": { + "type": "string", + "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916" + } + }, + "required": [ + "columns", + "created", + "database_id", + "id", + "identifiers", + "internal_name", + "name", + "owner", + "query", + "query_hash" + ] + }, + "TupleDto": { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "key": "value" + } + } + }, + "required": [ + "data" + ] + }, + "ImportDto": { + "type": "object", + "properties": { + "location": { + "type": "string", + "example": "file.csv" + }, + "header": { + "type": "boolean", + "description": "If true, the first line contains the column names, otherwise it contains only data", + "example": true + }, + "separator": { + "type": "string", + "example": "," + }, + "quote": { + "type": "string", + "example": "\"" + }, + "line_termination": { + "type": "string", + "example": "\\r\\n" + } + }, + "required": [ + "header", + "location", + "separator" + ] + }, + "FilterDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "where", + "or", + "and" + ], + "example": "where" + }, + "value": { + "type": "string", + "example": 1 + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "14128033-54b5-4818-a489-21b0dded86e2" + }, + "operator_id": { + "type": "string", + "format": "uuid", + "example": "67c5b54d-2eb0-4f42-8dc1-a504562e9f32" + } + }, + "required": [ + "column_id", + "operator_id", + "type" + ] + }, + "OrderDto": { + "type": "object", + "properties": { + "direction": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "e891ba86-0258-41a6-a8d9-ff58bc10b618" + } + }, + "required": [ + "column_id" + ] + }, + "SubsetDto": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "example": [ + "e891ba86-0258-41a6-a8d9-ff58bc10b618" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "filter": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterDto" + } + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrderDto" + } + }, + "datasource_id": { + "type": "string", + "format": "uuid", + "example": "f7df2a7d-4ade-4c78-97b0-7c744d0893c7" + }, + "datasource_type": { + "type": "string", + "enum": [ + "table", + "view" + ] + } + }, + "required": [ + "columns", + "datasource_id", + "datasource_type" + ] + }, + "TableHistoryDto": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "event": { + "type": "string", + "enum": [ + "insert", + "delete" + ], + "example": "INSERT" + }, + "total": { + "type": "integer", + "format": "int64", + "example": 1 + } + }, + "required": [ + "event", + "timestamp", + "total" + ] + }, + "TupleDeleteDto": { + "type": "object", + "properties": { + "keys": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "id": 1 + } + } + }, + "required": [ + "keys" + ] + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + } +} diff --git a/.docs/.openapi/api-data.yaml b/.docs/.openapi/api-data.yaml deleted file mode 100644 index 6e817cc925d4dda76bd26ccd97dad93d303621ac..0000000000000000000000000000000000000000 --- a/.docs/.openapi/api-data.yaml +++ /dev/null @@ -1,2872 +0,0 @@ -openapi: 3.1.0 -info: - title: Database Repository Data Service API - description: Service that manages the data - contact: - name: Prof. Andreas Rauber - email: andreas.rauber@tuwien.ac.at - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.8.1 -externalDocs: - description: Sourcecode Documentation - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.1/system-services-metadata/ -servers: -- url: http://localhost - description: Development instance -- url: https://test.dbrepo.tuwien.ac.at - description: Staging instance -paths: - /api/database/{databaseId}/view/{viewId}/data: - get: - tags: - - view-endpoint - summary: Get view data - description: "Gets data from a view of a database. For private databases, the\ - \ user needs at least *READ* access to the associated database." - operationId: getData - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Retrieved view data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve view data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find view in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: View schema could not be mapped - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - head: - tags: - - view-endpoint - summary: Get view data - description: "Gets data from a view of a database. For private databases, the\ - \ user needs at least *READ* access to the associated database." - operationId: getData_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Retrieved view data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve view data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find view in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: View schema could not be mapped - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data: - get: - tags: - - table-endpoint - summary: Get table data - description: "Gets data from a table with id. For a table in a private database,\ - \ the user needs to have at least *READ* access to the associated database.\ - \ Requests with HTTP method **GET** return the full dataset, requests with\ - \ HTTP method **HEAD** only the number of tuples in the `X-Count` header." - operationId: getData_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Get table data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to get table data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - put: - tags: - - table-endpoint - summary: Update tuple - description: "Updates a data tuple into a table, then the table statistics are\ - \ updated. The user needs to have at least *WRITE_OWN* access to the associated\ - \ database. Requires role `insert-table-data`." - operationId: updateRawTuple - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TupleUpdateDto" - required: true - responses: - "202": - description: Updated table data - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Update table data not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - post: - tags: - - table-endpoint - summary: Insert tuple - description: "Inserts a data tuple into a table, then the table statistics are\ - \ updated. The user needs to have at least *WRITE_OWN* access to the associated\ - \ database. Requires role `insert-table-data`." - operationId: insertRawTuple - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TupleDto" - required: true - responses: - "201": - description: Created table data - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Create table data not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database or blob in storage - service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service or - storage service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - delete: - tags: - - table-endpoint - summary: Delete tuple - description: "Deletes a data tuple into a table, then the table statistics are\ - \ updated. The user needs to have at least *WRITE_OWN* access to the associated\ - \ database. Requires role `delete-table-data`." - operationId: deleteRawTuple - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TupleDeleteDto" - required: true - responses: - "202": - description: Deleted table data - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Delete table data not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - head: - tags: - - table-endpoint - summary: Get table data - description: "Gets data from a table with id. For a table in a private database,\ - \ the user needs to have at least *READ* access to the associated database.\ - \ Requests with HTTP method **GET** return the full dataset, requests with\ - \ HTTP method **HEAD** only the number of tuples in the `X-Count` header." - operationId: getData_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Get table data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to get table data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset/{subsetId}/data: - get: - tags: - - subset-endpoint - summary: Get subset data - description: "Gets data of subset with id. For private databases, the user needs\ - \ at least *READ* access to the associated database. Requests with HTTP method\ - \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\ - \ the number of rows in the subset dataset in the `X-Count` header" - operationId: getData_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: subsetId - in: path - required: true - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "200": - description: Retrieved subset data - headers: - Access-Control-Expose-Headers: - description: Reverse proxy exposing of custom headers - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - style: simple - schema: - type: string - format: uuid - X-Id: - description: The subset id - required: true - style: simple - schema: - type: string - format: uuid - X-Headers: - description: The list of headers separated by comma - style: simple - schema: - type: string - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Invalid pagination - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve subset data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - subset-endpoint - summary: Get subset data - description: "Gets data of subset with id. For private databases, the user needs\ - \ at least *READ* access to the associated database. Requests with HTTP method\ - \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\ - \ the number of rows in the subset dataset in the `X-Count` header" - operationId: getData_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: subsetId - in: path - required: true - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "200": - description: Retrieved subset data - headers: - Access-Control-Expose-Headers: - description: Reverse proxy exposing of custom headers - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - style: simple - schema: - type: string - format: uuid - X-Id: - description: The subset id - required: true - style: simple - schema: - type: string - format: uuid - X-Headers: - description: The list of headers separated by comma - style: simple - schema: - type: string - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Invalid pagination - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve subset data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/subset/{queryId}: - put: - tags: - - subset-endpoint - summary: Persist subset - description: Persists a subset with id. Requires role `persist-query`. - operationId: persist - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: queryId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/QueryPersistDto" - required: true - responses: - "202": - description: Persisted subset - content: - application/json: - schema: - $ref: "#/components/schemas/QueryDto" - "400": - description: Malformed select query - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to persist subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Failed to persist subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/upload: - post: - tags: - - upload-endpoint - summary: Uploads a multipart file - description: Uploads a multipart file to the Storage Service. Requires role - `upload-file`. - operationId: create - requestBody: - content: - application/json: - schema: - type: object - properties: - file: - type: string - format: binary - required: - - file - required: true - responses: - "201": - description: Uploaded the file - content: - application/json: - schema: - $ref: "#/components/schemas/ViewDto" - "503": - description: Failed to establish connection with the storage service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data/import: - post: - tags: - - table-endpoint - summary: Import dataset - description: Imports a dataset in a table. Then update the table statistics. - The user needs to have at least *WRITE_OWN* access to the associated database - when importing into a owned table. Otherwise *WRITE_ALL* access in needed. - Requires role `insert-table-data`. - operationId: importDataset - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ImportDto" - required: true - responses: - "202": - description: Imported dataset successfully - "400": - description: Dataset and/or query are malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Import table dataset not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset: - get: - tags: - - subset-endpoint - summary: Find subsets - description: "Finds subsets in the query store. When the database schema is\ - \ marked as hidden, the user needs to be authorized, have at least read-access\ - \ to the database. The result can be optionally filtered by setting `persisted`.\ - \ When set to *true*, only persisted queries are returned, otherwise only\ - \ non-persisted queries are returned." - operationId: list - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: persisted - in: query - required: false - schema: - type: boolean - responses: - "200": - description: Found subsets - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/QueryDto" - "403": - description: Not allowed to find subsets - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - post: - tags: - - subset-endpoint - summary: Create subset - description: Creates a subset in the query store of the data database. Can also - be used without authentication if (and only if) the database is marked as - public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise - at least read access is required. - operationId: create_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SubsetDto" - required: true - responses: - "201": - description: Created subset - content: - application/json: - schema: - type: string - "400": - description: Malformed select query - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to find subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Failed to insert query into query store of data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "501": - description: Failed to execute query as it contains non-supported keywords - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/history: - get: - tags: - - table-endpoint - summary: Get history - description: "Gets the insert/delete operations history performed. For tables\ - \ in private databases, the user needs to have at least *READ* access to the\ - \ associated database." - operationId: getHistory - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "200": - description: Found table history - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TableHistoryDto" - "400": - description: "Invalid pagination size request, must be > 0" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Find table history not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table history in data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset/{subsetId}: - get: - tags: - - subset-endpoint - summary: Find subset - description: "Finds a subset in the data database. When the database schema\ - \ is marked as hidden, the user needs to be authorized, have at least read-access\ - \ to the database. Requests with HTTP header `Accept=application/json` return\ - \ the metadata, requests with HTTP header `Accept=text/csv` return the data\ - \ as downloadable file." - operationId: findById - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: subsetId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "200": - description: Found subset - content: - application/json: - schema: - $ref: "#/components/schemas/QueryDto" - text/csv: {} - "400": - description: Malformed select query - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to find subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to find acceptable representation - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] -components: - schemas: - ApiErrorDto: - type: object - properties: - status: - type: string - enum: - - 100 CONTINUE - - 101 SWITCHING_PROTOCOLS - - 102 PROCESSING - - 103 EARLY_HINTS - - 103 CHECKPOINT - - 200 OK - - 201 CREATED - - 202 ACCEPTED - - 203 NON_AUTHORITATIVE_INFORMATION - - 204 NO_CONTENT - - 205 RESET_CONTENT - - 206 PARTIAL_CONTENT - - 207 MULTI_STATUS - - 208 ALREADY_REPORTED - - 226 IM_USED - - 300 MULTIPLE_CHOICES - - 301 MOVED_PERMANENTLY - - 302 FOUND - - 302 MOVED_TEMPORARILY - - 303 SEE_OTHER - - 304 NOT_MODIFIED - - 305 USE_PROXY - - 307 TEMPORARY_REDIRECT - - 308 PERMANENT_REDIRECT - - 400 BAD_REQUEST - - 401 UNAUTHORIZED - - 402 PAYMENT_REQUIRED - - 403 FORBIDDEN - - 404 NOT_FOUND - - 405 METHOD_NOT_ALLOWED - - 406 NOT_ACCEPTABLE - - 407 PROXY_AUTHENTICATION_REQUIRED - - 408 REQUEST_TIMEOUT - - 409 CONFLICT - - 410 GONE - - 411 LENGTH_REQUIRED - - 412 PRECONDITION_FAILED - - 413 PAYLOAD_TOO_LARGE - - 413 REQUEST_ENTITY_TOO_LARGE - - 414 URI_TOO_LONG - - 414 REQUEST_URI_TOO_LONG - - 415 UNSUPPORTED_MEDIA_TYPE - - 416 REQUESTED_RANGE_NOT_SATISFIABLE - - 417 EXPECTATION_FAILED - - 418 I_AM_A_TEAPOT - - 419 INSUFFICIENT_SPACE_ON_RESOURCE - - 420 METHOD_FAILURE - - 421 DESTINATION_LOCKED - - 422 UNPROCESSABLE_ENTITY - - 423 LOCKED - - 424 FAILED_DEPENDENCY - - 425 TOO_EARLY - - 426 UPGRADE_REQUIRED - - 428 PRECONDITION_REQUIRED - - 429 TOO_MANY_REQUESTS - - 431 REQUEST_HEADER_FIELDS_TOO_LARGE - - 451 UNAVAILABLE_FOR_LEGAL_REASONS - - 500 INTERNAL_SERVER_ERROR - - 501 NOT_IMPLEMENTED - - 502 BAD_GATEWAY - - 503 SERVICE_UNAVAILABLE - - 504 GATEWAY_TIMEOUT - - 505 HTTP_VERSION_NOT_SUPPORTED - - 506 VARIANT_ALSO_NEGOTIATES - - 507 INSUFFICIENT_STORAGE - - 508 LOOP_DETECTED - - 509 BANDWIDTH_LIMIT_EXCEEDED - - 510 NOT_EXTENDED - - 511 NETWORK_AUTHENTICATION_REQUIRED - example: NOT_FOUND - message: - type: string - example: Error message - code: - type: string - example: error.service.code - required: - - code - - message - - status - TupleUpdateDto: - type: object - properties: - data: - type: object - additionalProperties: - type: object - example: - key: value - keys: - type: object - additionalProperties: - type: object - example: - id: 1 - required: - - data - - keys - QueryPersistDto: - type: object - properties: - persist: - type: boolean - example: true - required: - - persist - CreatorBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - required: - - creator_name - - id - IdentifierBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - type: - type: string - enum: - - database - - subset - - table - - view - example: database - creators: - type: array - items: - $ref: "#/components/schemas/CreatorBriefDto" - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - query_id: - type: string - format: uuid - example: 1 - table_id: - type: string - format: uuid - example: 1 - view_id: - type: string - format: uuid - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - owned_by: - type: string - format: uuid - example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5 - required: - - creators - - database_id - - descriptions - - id - - owned_by - - publication_year - - publisher - - status - - titles - - type - IdentifierDescriptionDto: - type: object - properties: - id: - type: string - format: uuid - example: e0e9692c-910b-4b60-b53a-fc7c358a917d - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - example: Abstract - required: - - id - IdentifierTitleDto: - type: object - properties: - id: - type: string - format: uuid - example: 70ce5164-fd74-413f-8712-f996b91defbf - title: - type: string - example: Airquality Demonstrator - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - required: - - id - QueryDto: - type: object - properties: - id: - type: string - format: uuid - example: 83ea2326-f8f6-4263-baf8-cdf88a54efc7 - owner: - $ref: "#/components/schemas/UserBriefDto" - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - enum: - - query - - view - example: query - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierBriefDto" - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - query_normalized: - type: string - example: SELECT `id` FROM `air_quality` - query_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - is_persisted: - type: boolean - example: true - result_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - result_number: - type: integer - format: int64 - example: 1 - required: - - database_id - - execution - - id - - identifiers - - is_persisted - - owner - - query - - query_hash - - query_normalized - UserBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 - username: - type: string - description: Only contains lowercase characters - example: jcarberry - name: - type: string - example: Josiah Carberry - orcid: - type: string - example: 0000-0002-1825-0097 - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - required: - - id - - username - CreatorDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - name_identifier_scheme_uri: - type: string - example: https://orcid.org/ - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - affiliation_identifier_scheme_uri: - type: string - example: https://ror.org/ - required: - - creator_name - - id - EnumDto: - type: object - properties: - id: - type: string - format: uuid - example: 5343bb3d-14d3-4eb7-a86f-b8fc553cb315 - value: - type: string - example: 3 - required: - - id - - value - IdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - links: - $ref: "#/components/schemas/LinksDto" - type: - type: string - enum: - - database - - subset - - table - - view - example: database - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/IdentifierFunderDto" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - owner: - $ref: "#/components/schemas/UserBriefDto" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - creators: - type: array - items: - $ref: "#/components/schemas/CreatorDto" - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: null - query_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related_identifiers: - type: array - items: - $ref: "#/components/schemas/RelatedIdentifierDto" - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5 - result_number: - type: integer - format: int64 - example: 1 - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - required: - - creators - - database_id - - descriptions - - funders - - id - - language - - licenses - - links - - owner - - publication_year - - publisher - - query - - query_hash - - query_normalized - - status - - titles - - type - IdentifierFunderDto: - type: object - properties: - id: - type: string - format: uuid - example: 39693413-e0ce-46da-ad5e-029c0556d439 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - example: Crossref Funder ID - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: 824087 - award_title: - type: string - example: EOSC-Life - required: - - funder_name - - id - LicenseDto: - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - description: - type: string - example: "A short and simple permissive license with conditions only requiring\ - \ preservation of copyright and license notices. Licensed works, modifications,\ - \ and larger works may be distributed under different terms and without\ - \ source code." - required: - - identifier - - uri - LinksDto: - type: object - properties: - self: - type: string - example: http://example.com/api/ - data: - type: string - example: http://example.com - self_html: - type: string - example: http://example.com - dashboard_html: - type: string - example: http://example.com/d/defi2baxqawaod - required: - - self - - self_html - RelatedIdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: ce9d11f0-60a2-448d-a3e4-44719a443e8a - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - example: DOI - relation: - type: string - enum: - - IsCitedBy - - Cites - - IsSupplementTo - - IsSupplementedBy - - IsContinuedBy - - Continues - - IsDescribedBy - - Describes - - HasMetadata - - IsMetadataFor - - HasVersion - - IsVersionOf - - IsNewVersionOf - - IsPreviousVersionOf - - IsPartOf - - HasPart - - IsPublishedIn - - IsReferencedBy - - References - - IsDocumentedBy - - Documents - - IsCompiledBy - - Compiles - - IsVariantFormOf - - IsOriginalFormOf - - IsIdenticalTo - - IsReviewedBy - - Reviews - - IsDerivedFrom - - IsSourceOf - - IsRequiredBy - - Requires - - IsObsoletedBy - - Obsoletes - example: Cites - required: - - id - - relation - - type - - value - SetDto: - type: object - properties: - id: - type: string - format: uuid - example: 7eb4eded-bacc-4a91-84db-a9ae6ddafda7 - value: - type: string - example: 3 - required: - - id - - value - ViewColumnDto: - type: object - properties: - id: - type: string - format: uuid - example: 6aec3a91-2e0b-4e92-a16a-9c3c5e892da1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - description: - type: string - example: Column comment - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/EnumDto" - sets: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/SetDto" - database_id: - type: string - format: uuid - example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4 - ord: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - index_length: - type: integer - format: int64 - example: 255 - length: - type: integer - format: int64 - example: 255 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - is_null_allowed: - type: boolean - example: false - required: - - database_id - - id - - internal_name - - is_null_allowed - - name - - ord - - type - ViewDto: - type: object - properties: - id: - type: string - format: uuid - example: 787439d0-e85e-400c-a7e6-996a023bfad9 - name: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierDto" - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - owner: - $ref: "#/components/schemas/UserBriefDto" - columns: - type: array - items: - $ref: "#/components/schemas/ViewColumnDto" - created: - type: string - format: date-time - example: 2022-01-01 08:00:00.000 - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - query_hash: - type: string - example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 - required: - - columns - - created - - database_id - - id - - identifiers - - internal_name - - name - - owner - - query - - query_hash - TupleDto: - type: object - properties: - data: - type: object - additionalProperties: - type: object - example: - key: value - required: - - data - ImportDto: - type: object - properties: - location: - type: string - example: file.csv - header: - type: boolean - description: "If true, the first line contains the column names, otherwise\ - \ it contains only data" - example: true - separator: - type: string - example: "," - quote: - type: string - example: '"' - line_termination: - type: string - example: \r\n - required: - - header - - location - - separator - FilterDto: - type: object - properties: - type: - type: string - enum: - - where - - or - - and - example: where - value: - type: string - example: 1 - column_id: - type: string - format: uuid - example: 14128033-54b5-4818-a489-21b0dded86e2 - operator_id: - type: string - format: uuid - example: 67c5b54d-2eb0-4f42-8dc1-a504562e9f32 - required: - - column_id - - operator_id - - type - - value - OrderDto: - type: object - properties: - direction: - type: string - enum: - - asc - - desc - example: asc - column_id: - type: string - format: uuid - example: e891ba86-0258-41a6-a8d9-ff58bc10b618 - required: - - column_id - SubsetDto: - type: object - properties: - columns: - type: array - example: - - e891ba86-0258-41a6-a8d9-ff58bc10b618 - items: - type: string - format: uuid - filter: - type: array - items: - $ref: "#/components/schemas/FilterDto" - order: - type: array - items: - $ref: "#/components/schemas/OrderDto" - datasource_id: - type: string - format: uuid - example: f7df2a7d-4ade-4c78-97b0-7c744d0893c7 - datasource_type: - type: string - enum: - - table - - view - required: - - columns - - datasource_id - - datasource_type - TableHistoryDto: - type: object - properties: - timestamp: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - event: - type: string - enum: - - insert - - delete - example: INSERT - total: - type: integer - format: int64 - example: 1 - required: - - event - - timestamp - - total - TupleDeleteDto: - type: object - properties: - keys: - type: object - additionalProperties: - type: object - example: - id: 1 - required: - - keys - securitySchemes: - basicAuth: - type: http - scheme: basic - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.openapi/api-metadata-service.yaml b/.docs/.openapi/api-metadata-service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8367c4c7b6aae081447758a673f72f7b1233989f --- /dev/null +++ b/.docs/.openapi/api-metadata-service.yaml @@ -0,0 +1,9754 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Database Repository Metadata Service API", + "description": "Service that manages the metadata", + "contact": { + "name": "Prof. Andreas Rauber", + "email": "andreas.rauber@tuwien.ac.at" + }, + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + }, + "version": "1.8.2" + }, + "externalDocs": { + "description": "Sourcecode Documentation", + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.2/system-services-metadata/" + }, + "servers": [ + { + "url": "http://localhost", + "description": "Development instance" + }, + { + "url": "https://test.dbrepo.tuwien.ac.at", + "description": "Staging instance" + } + ], + "paths": { + "/api/user/{userId}": { + "get": { + "tags": [ + "user-endpoint" + ], + "summary": "Get user", + "description": "Gets own user information from the metadata database. Requires authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error.", + "operationId": "find", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "Find user is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "User was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "user-endpoint" + ], + "summary": "Update user", + "description": "Updates user with id. Requires role `modify-user-information`.", + "operationId": "modify", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modified user information", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "400": { + "description": "Modify user query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to modify user metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/user in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to modify user at auth service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "user-endpoint" + ], + "summary": "Get user", + "description": "Gets own user information from the metadata database. Requires authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error.", + "operationId": "find_1", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "Find user is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "User was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database": { + "get": { + "tags": [ + "database-endpoint" + ], + "summary": "List databases", + "description": "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.", + "operationId": "list", + "parameters": [ + { + "name": "internal_name", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of databases", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of databases", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "database-endpoint" + ], + "summary": "Create database", + "description": "Creates a database in the container with id. Requires roles `create-database`.", + "operationId": "create", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDatabaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created a new database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Database create query is malformed or image is not supported", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Database create permission is missing or grant permissions at broker service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to fin container/user/database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Query store could not be created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "423": { + "description": "Database quota exceeded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "database-endpoint" + ], + "summary": "List databases", + "description": "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.", + "operationId": "list_1", + "parameters": [ + { + "name": "internal_name", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of databases", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of databases", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + } + } + } + } + }, + "/api/database/{databaseId}/access/{userId}": { + "get": { + "tags": [ + "access-endpoint" + ], + "summary": "Find/Check access", + "description": "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `check-foreign-database-access`.", + "operationId": "find_2", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found database access", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + }, + "403": { + "description": "No access to this database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "access-endpoint" + ], + "summary": "Modify access", + "description": "Modifies access of a user with given id to database with given id. Requires role `update-database-access`.", + "operationId": "update", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccessDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modified access" + }, + "400": { + "description": "Modify access query or database connection is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Modify access not permitted when no access is granted in the first place", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or user not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Access could not be updated due to connection error in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Access could not be updated in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "post": { + "tags": [ + "access-endpoint" + ], + "summary": "Give access", + "description": "Give a user with given id access to some database with given id. Requires role `create-database-access`.", + "operationId": "create_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccessDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Granting access succeeded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + }, + "400": { + "description": "Granting access query or database connection is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Failed giving access", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or user not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Access could not be created due to connection error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Access could not be created in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "access-endpoint" + ], + "summary": "Delete access", + "description": "Delete access of a user with id to a database with id. Requires role `delete-database-access`.", + "operationId": "revoke", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted access" + }, + "400": { + "description": "Modify access query or database connection is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Revoke of access not permitted as no access was found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "User, database with access was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Access could not be created due to connection error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Access could not be revoked in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "access-endpoint" + ], + "summary": "Find/Check access", + "description": "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `check-foreign-database-access`.", + "operationId": "find_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found database access", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + }, + "403": { + "description": "No access to this database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/ontology/{ontologyId}": { + "get": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Find ontology", + "description": "Finds an ontology with id in the metadata database.", + "operationId": "find_4", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find one ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyDto" + } + } + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "put": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Update ontology", + "description": "Updates an ontology with id. Requires role `update-ontology`.", + "operationId": "update_1", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyModifyDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated ontology successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyDto" + } + } + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Delete ontology", + "description": "Deletes an ontology with given id. Requires role `delete-ontology`.", + "operationId": "delete", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted ontology successfully", + "content": { + "application/json": {} + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/message/{messageId}": { + "put": { + "tags": [ + "message-endpoint" + ], + "summary": "Update message", + "description": "Updates a message with id. Requires role `update-maintenance-message`.", + "operationId": "update_2", + "parameters": [ + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageBriefDto" + } + } + } + }, + "404": { + "description": "Could not find message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "message-endpoint" + ], + "summary": "Delete message", + "description": "Deletes a message with id. Requires role `delete-maintenance-message`.", + "operationId": "delete_1", + "parameters": [ + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted message", + "content": { + "application/json": {} + } + }, + "404": { + "description": "Could not find message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/image/{imageId}": { + "get": { + "tags": [ + "image-endpoint" + ], + "summary": "Find image", + "description": "Finds a container image in the metadata database.", + "operationId": "findById", + "parameters": [ + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found image", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageDto" + } + } + } + }, + "404": { + "description": "Image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "put": { + "tags": [ + "image-endpoint" + ], + "summary": "Update image", + "description": "Updates container image in the metadata database. Requires role `modify-image`.", + "operationId": "update_3", + "parameters": [ + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageChangeDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated image successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageDto" + } + } + } + }, + "404": { + "description": "Image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "image-endpoint" + ], + "summary": "Delete image", + "description": "Deletes a container image in the metadata database. Requires role `delete-image`.", + "operationId": "delete_2", + "parameters": [ + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted image successfully" + }, + "404": { + "description": "Image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/identifier/{identifierId}": { + "get": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Find identifier", + "description": "Finds an identifier with id. The response format depends on the HTTP `Accept` header set on the request.", + "operationId": "find_5", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Found identifier successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "application/ld+json": { + "schema": { + "$ref": "#/components/schemas/LdDatasetDto" + } + }, + "text/xml": {}, + "text/bibliography": {}, + "text/bibliography; style=apa": {}, + "text/bibliography; style=ieee": {}, + "text/bibliography; style=bibtex": {} + } + }, + "400": { + "description": "Identifier could not be exported, the requested style is not known", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to view identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Identifier could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to find acceptable representation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Exported resource was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "410": { + "description": "Failed to retrieve from S3 endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to data service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to find in data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "put": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Save identifier", + "description": "Saves an identifier with id as a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).", + "operationId": "save", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierSaveDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Saved identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "400": { + "description": "Identifier form contains invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Insufficient access rights or authorities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database, table or view", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Delete identifier", + "description": "Deletes an identifier with id. Requires role `delete-identifier`.", + "operationId": "delete_3", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted identifier" + }, + "403": { + "description": "Deleting identifier not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Identifier or database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to delete in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/identifier/{identifierId}/publish": { + "put": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Publish identifier", + "description": "Publishes an identifier with id. A published identifier cannot be changed anymore. Requires role `publish-identifier`.", + "operationId": "publish", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Published identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "400": { + "description": "Identifier form contains invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Insufficient access rights or authorities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database, table or view", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/visibility": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database visibility", + "description": "Updates the database with id on the visibility. Only the database owner can perform this operation. Requires role `modify-database-visibility`.", + "operationId": "visibility", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseModifyVisibilityDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Visibility modified successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "The visibility payload is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Visibility modification is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/view/{viewId}": { + "get": { + "tags": [ + "view-endpoint" + ], + "summary": "Get view", + "description": "Gets a view with id in the metadata database.", + "operationId": "find_6", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find view successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "403": { + "description": "Find view is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database, view or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "view-endpoint" + ], + "summary": "Update view", + "description": "Updates a view with id. This can only be performed by the view owner or database owner. Requires role `create-database-view`.", + "operationId": "update_4", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Update view successfully", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ViewBriefDto" + } + } + } + }, + "400": { + "description": "Update view query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Update not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or View could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "view-endpoint" + ], + "summary": "Delete view", + "description": "Deletes a view with id. Requires role `delete-database-view`.", + "operationId": "delete_4", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Delete view successfully" + }, + "400": { + "description": "Delete view query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Deletion not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database, view or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "423": { + "description": "Delete view resulted in an invalid query statement", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Find table", + "description": "Finds a table with id. When a table is hidden (i.e. when `is_public` is `false`), then the user needs to have at least read access and the role `find-table`. When the `system` role is present, the endpoint responds with additional connection metadata in the header.", + "operationId": "findById_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find table successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableDto" + } + } + } + }, + "403": { + "description": "Access to the database is forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Table, database or container could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update table", + "description": "Updates a table in the database with id. Requires role `update-table`.", + "operationId": "update_5", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated the table", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableBriefDto" + } + } + } + }, + "400": { + "description": "Update table visibility payload is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Update table visibility not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Table could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "table-endpoint" + ], + "summary": "Delete table", + "description": "Deletes a table with id. Only the owner of a table can perform this action (requires role `delete-table`) or anyone can delete a table (requires role `delete-foreign-table`).", + "operationId": "delete_5", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Delete table successfully" + }, + "400": { + "description": "Delete table query resulted in an invalid query statement", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Access to the database is forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Table, database or container could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/statistic": { + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update statistics", + "description": "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. This action can only be performed by the table owner. Requires role `update-table-statistic`.", + "operationId": "updateStatistic", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Updated table statistics successfully" + }, + "400": { + "description": "Failed to map column statistic to known columns", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not the owner", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/column/{columnId}": { + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update semantics", + "description": "Updates column semantics of a table column with id. Only the table owner with at least *READ* access to the associated database can update the column semantics (requires role `modify-table-column-semantics`) or foreign table columns if role `modify-foreign-table-column-semantics`.", + "operationId": "updateColumn", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "columnId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ColumnSemanticsUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated column semantics successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ColumnDto" + } + } + } + }, + "400": { + "description": "Update semantic concept query is malformed or update unit of measurement query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Access to the database is forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find user/table/database/ontology in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/owner": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database owner", + "description": "Updates the database with id on the owner. Only the database owner can perform this operation. Requires role `modify-database-owner`.", + "operationId": "transfer", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseTransferDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Transfer of ownership was successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Owner payload is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Transfer of ownership is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/metadata/view": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database view schemas", + "description": "Updates the database with id with generated metadata from view that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.", + "operationId": "refreshViewMetadata", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Refreshed database views metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "403": { + "description": "Refresh view metadata is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/metadata/table": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database table schemas", + "description": "Updates the database with id with generated metadata from tables that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.", + "operationId": "refreshTableMetadata", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Refreshed database tables metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Failed to parse payload at search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to refresh table metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/image": { + "get": { + "tags": [ + "database-endpoint" + ], + "summary": "Get database preview image", + "description": "Gets the database with id on the preview image.", + "operationId": "findPreviewImage", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "View of image was successful", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } + } + } + }, + "404": { + "description": "Database or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database preview image", + "description": "Updates the database with id on the preview image. Only the database owner can perform this operation. Requires role `modify-database-image`.", + "operationId": "modifyImage", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseModifyImageDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modify of image was successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "403": { + "description": "Modify of image is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "410": { + "description": "File was not found in the Storage Service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/dashboard": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database dashboard uid", + "description": "Updates the dashboard uid for a database with given id. Only the database owner can perform this operation. Requires role `system`.", + "operationId": "modifyDashboard", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseModifyDashboardDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modify of dashboard uid was successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Malformed payload", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/ontology": { + "get": { + "tags": [ + "ontology-endpoint" + ], + "summary": "List ontologies", + "description": "Lists all ontologies known to the metadata database.", + "operationId": "findAll", + "responses": { + "200": { + "description": "List ontologies", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OntologyBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Create ontology", + "description": "Creates an ontology in the metadata database. Requires role `create-ontology`.", + "operationId": "create_2", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyCreateDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Registered ontology successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/message": { + "get": { + "tags": [ + "message-endpoint" + ], + "summary": "List messages", + "description": "Lists messages known to the metadata database. Messages can be filtered be filtered with the optional `active` parameter. If set to *true*, only active messages (that is, messages whose end time has not been reached) will be returned. Otherwise only inactive messages are returned. If not set, active and inactive messages are returned.", + "operationId": "list_2", + "parameters": [ + { + "name": "active", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "List messages", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BannerMessageDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "message-endpoint" + ], + "summary": "Create message", + "description": "Creates a message in the metadata database. Requires role `create-maintenance-message`.", + "operationId": "create_3", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageCreateDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageBriefDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/image": { + "get": { + "tags": [ + "image-endpoint" + ], + "summary": "List images", + "description": "Lists all container images known to the metadata database.", + "operationId": "findAll_1", + "responses": { + "200": { + "description": "List images", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ImageBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "image-endpoint" + ], + "summary": "Create image", + "description": "Creates a container image in the metadata database. Requires role `create-image`.", + "operationId": "create_4", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageCreateDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created image", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageDto" + } + } + } + }, + "400": { + "description": "Image specification is invalid", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Image already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/identifier": { + "get": { + "tags": [ + "identifier-endpoint" + ], + "summary": "List identifiers", + "description": "Lists all identifiers known to the metadata database", + "operationId": "findAll_2", + "parameters": [ + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ] + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "draft", + "published" + ] + } + }, + { + "name": "dbid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "qid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "vid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Found identifiers successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierBriefDto" + } + } + } + }, + "application/ld+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LdDatasetDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Create identifier", + "description": "Create an identifier with id to create a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).", + "operationId": "create_5", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIdentifierDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Drafted identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "400": { + "description": "Identifier form contains invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Insufficient access rights or authorities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database, table or view", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/view": { + "get": { + "tags": [ + "view-endpoint" + ], + "summary": "List views", + "description": "Lists views known to the metadata database.", + "operationId": "findAll_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find views successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ViewBriefDto" + } + } + } + } + }, + "404": { + "description": "Database or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "post": { + "tags": [ + "view-endpoint" + ], + "summary": "Create view", + "description": "Creates a view. This can only be performed by the database owner. Requires role `create-database-view`.", + "operationId": "create_6", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateViewDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Create view successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewBriefDto" + } + } + } + }, + "400": { + "description": "Create view query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Credentials missing", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/user in metadata database.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "View exists with name", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "423": { + "description": "Create view resulted in an invalid query statement", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "List tables", + "description": "Lists all tables known to the metadata database. When a database has a hidden schema (i.e. when `is_schema_public` is `false`), then the user needs to have at least read access and the role `list-tables`.", + "operationId": "list_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "List tables", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableBriefDto" + } + } + } + } + }, + "403": { + "description": "List tables not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "post": { + "tags": [ + "table-endpoint" + ], + "summary": "Create table", + "description": "Creates a table in the database with id. Requires role `create-table`.", + "operationId": "create_7", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTableDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created a new table", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableBriefDto" + } + } + } + }, + "400": { + "description": "Create table query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Create table not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database, container or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Create table conflicts with existing table name", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/container": { + "get": { + "tags": [ + "container-endpoint" + ], + "summary": "List containers", + "description": "List all containers in the metadata database.", + "operationId": "findAll_4", + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "List containers", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ContainerBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "container-endpoint" + ], + "summary": "Create container", + "description": "Creates a container in the metadata database. Requires role `create-container`.", + "operationId": "create_8", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContainerDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created a new container", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContainerDto" + } + } + } + }, + "400": { + "description": "Container payload malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Create container not permitted, need authority `create-container`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Container image or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Container name already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/user": { + "get": { + "tags": [ + "user-endpoint" + ], + "summary": "List users", + "description": "Lists users known to the metadata database. Internal users are omitted from the result list. If the optional query parameter `username` is present, the result list can be filtered by matching this exact username.", + "operationId": "findAll_5", + "parameters": [ + { + "name": "username", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List users", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserBriefDto" + } + } + } + } + } + } + } + }, + "/api/unit": { + "get": { + "tags": [ + "unit-endpoint" + ], + "summary": "List units", + "description": "Lists units known to the metadata database.", + "operationId": "findAll_6", + "responses": { + "200": { + "description": "Find all semantic units", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UnitDto" + } + } + } + } + } + } + } + }, + "/api/ontology/{ontologyId}/entity": { + "get": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Find entities", + "description": "Finds semantic entities by label or uri in an ontology with id. Requires role `execute-semantic-query`.", + "operationId": "find_7", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "label", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "uri", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Found entities", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityDto" + } + } + } + } + }, + "400": { + "description": "Filter params are invalid", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Generated query or uri is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Ontology does not have rdf or sparql endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/oai": { + "get": { + "tags": [ + "metadata-endpoint" + ], + "summary": "Get record", + "operationId": "identify", + "parameters": [ + { + "name": "verb", + "in": "query" + }, + { + "name": "parameters", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/OaiListIdentifiersParameters" + } + } + ], + "responses": { + "200": { + "description": "List containers", + "content": { + "text/xml": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/api/message/message/{messageId}": { + "get": { + "tags": [ + "message-endpoint" + ], + "summary": "Find message", + "description": "Finds a message with id in the metadata database.", + "operationId": "find_8", + "parameters": [ + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Get messages", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageDto" + } + } + } + }, + "404": { + "description": "Could not find message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + } + }, + "/api/license": { + "get": { + "tags": [ + "license-endpoint" + ], + "summary": "List licenses", + "description": "Lists licenses known to the metadata database.", + "operationId": "list_4", + "responses": { + "200": { + "description": "List of licenses", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + } + } + } + } + } + } + }, + "/api/identifier/retrieve": { + "get": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Retrieve PID metadata", + "description": "Retrieves Persistent Identifier (PID) metadata from external endpoints. Supported PIDs are: ORCID, ROR, DOI.", + "operationId": "retrieve", + "parameters": [ + { + "name": "url", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved metadata from identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "404": { + "description": "Failed to find metadata for identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + } + }, + "/api/database/{databaseId}": { + "get": { + "tags": [ + "database-endpoint" + ], + "summary": "Find database", + "description": "Finds a database with id.", + "operationId": "findById_2", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Database found successfully", + "headers": { + "X-Username": { + "description": "The authentication username", + "style": "simple", + "schema": { + "type": "string" + } + }, + "Access-Control-Expose-Headers": { + "description": "Expose custom headers", + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Password": { + "description": "The authentication password", + "style": "simple", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "403": { + "description": "Not allowed to view database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/suggest": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Suggest semantics", + "description": "Suggests semantic concepts for a table. This action can only be performed by the table owner. Requires role `table-semantic-analyse`.", + "operationId": "analyseTable", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Suggested table semantics successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityDto" + } + } + } + } + }, + "400": { + "description": "Failed to parse statistic in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not the table owner.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Generated query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Ontology does not have rdf or sparql endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Suggest semantics", + "description": "Suggests column semantics. Requires role `table-semantic-analyse`.", + "operationId": "analyseTableColumn", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "columnId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Suggested table column semantics successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableColumnEntityDto" + } + } + } + } + }, + "400": { + "description": "Generated query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Ontology does not have rdf or sparql endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/container/{containerId}": { + "get": { + "tags": [ + "container-endpoint" + ], + "summary": "Find container", + "description": "Finds a container in the metadata database.", + "operationId": "findById_3", + "parameters": [ + { + "name": "containerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found container", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContainerDto" + } + } + } + }, + "404": { + "description": "Container image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "delete": { + "tags": [ + "container-endpoint" + ], + "summary": "Delete container", + "description": "Deletes a container in the metadata database. Requires role `delete-container`.", + "operationId": "delete_6", + "parameters": [ + { + "name": "containerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted container" + }, + "403": { + "description": "Create container not permitted, need authority `delete-container`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Container not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/concept": { + "get": { + "tags": [ + "concept-endpoint" + ], + "summary": "List concepts", + "description": "List all semantic concepts known to the metadata database", + "operationId": "findAll_7", + "responses": { + "200": { + "description": "List concepts", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConceptDto" + } + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "UserAttributesDto": { + "type": "object", + "properties": { + "theme": { + "type": "string", + "example": "light" + }, + "orcid": { + "type": "string", + "example": "https://orcid.org/0000-0002-1825-0097" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "language": { + "type": "string", + "example": "en" + } + }, + "required": [ + "language", + "theme" + ] + }, + "UserDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4" + }, + "name": { + "type": "string", + "example": "Josiah Carberry" + }, + "username": { + "type": "string", + "example": "username" + }, + "password": { + "type": "string", + "example": "p4ssw0rd" + }, + "attributes": { + "$ref": "#/components/schemas/UserAttributesDto" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "qualified_name": { + "type": "string", + "example": "Josiah Carberry — @jcarberry" + }, + "given_name": { + "type": "string", + "example": "Josiah" + }, + "family_name": { + "type": "string", + "example": "Carberry" + } + }, + "required": [ + "attributes", + "id", + "password", + "username" + ] + }, + "ApiErrorDto": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "100 CONTINUE", + "101 SWITCHING_PROTOCOLS", + "102 PROCESSING", + "103 EARLY_HINTS", + "103 CHECKPOINT", + "200 OK", + "201 CREATED", + "202 ACCEPTED", + "203 NON_AUTHORITATIVE_INFORMATION", + "204 NO_CONTENT", + "205 RESET_CONTENT", + "206 PARTIAL_CONTENT", + "207 MULTI_STATUS", + "208 ALREADY_REPORTED", + "226 IM_USED", + "300 MULTIPLE_CHOICES", + "301 MOVED_PERMANENTLY", + "302 FOUND", + "302 MOVED_TEMPORARILY", + "303 SEE_OTHER", + "304 NOT_MODIFIED", + "305 USE_PROXY", + "307 TEMPORARY_REDIRECT", + "308 PERMANENT_REDIRECT", + "400 BAD_REQUEST", + "401 UNAUTHORIZED", + "402 PAYMENT_REQUIRED", + "403 FORBIDDEN", + "404 NOT_FOUND", + "405 METHOD_NOT_ALLOWED", + "406 NOT_ACCEPTABLE", + "407 PROXY_AUTHENTICATION_REQUIRED", + "408 REQUEST_TIMEOUT", + "409 CONFLICT", + "410 GONE", + "411 LENGTH_REQUIRED", + "412 PRECONDITION_FAILED", + "413 PAYLOAD_TOO_LARGE", + "413 REQUEST_ENTITY_TOO_LARGE", + "414 URI_TOO_LONG", + "414 REQUEST_URI_TOO_LONG", + "415 UNSUPPORTED_MEDIA_TYPE", + "416 REQUESTED_RANGE_NOT_SATISFIABLE", + "417 EXPECTATION_FAILED", + "418 I_AM_A_TEAPOT", + "419 INSUFFICIENT_SPACE_ON_RESOURCE", + "420 METHOD_FAILURE", + "421 DESTINATION_LOCKED", + "422 UNPROCESSABLE_ENTITY", + "423 LOCKED", + "424 FAILED_DEPENDENCY", + "425 TOO_EARLY", + "426 UPGRADE_REQUIRED", + "428 PRECONDITION_REQUIRED", + "429 TOO_MANY_REQUESTS", + "431 REQUEST_HEADER_FIELDS_TOO_LARGE", + "451 UNAVAILABLE_FOR_LEGAL_REASONS", + "500 INTERNAL_SERVER_ERROR", + "501 NOT_IMPLEMENTED", + "502 BAD_GATEWAY", + "503 SERVICE_UNAVAILABLE", + "504 GATEWAY_TIMEOUT", + "505 HTTP_VERSION_NOT_SUPPORTED", + "506 VARIANT_ALSO_NEGOTIATES", + "507 INSUFFICIENT_STORAGE", + "508 LOOP_DETECTED", + "509 BANDWIDTH_LIMIT_EXCEEDED", + "510 NOT_EXTENDED", + "511 NETWORK_AUTHENTICATION_REQUIRED" + ], + "example": "NOT_FOUND" + }, + "message": { + "type": "string", + "example": "Error message" + }, + "code": { + "type": "string", + "example": "error.service.code" + } + }, + "required": [ + "code", + "message", + "status" + ] + }, + "CreatorBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "DatabaseBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "description": { + "type": "string", + "example": "Air Quality" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierBriefDto" + } + }, + "contact": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "owner_id": { + "type": "string", + "format": "uuid", + "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5" + }, + "preview_image": { + "type": "string" + } + }, + "required": [ + "contact", + "id", + "identifiers", + "internal_name", + "is_public", + "is_schema_public", + "name", + "owner_id" + ] + }, + "IdentifierBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorBriefDto" + } + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5" + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "id", + "owned_by", + "publication_year", + "publisher", + "status", + "titles", + "type" + ] + }, + "IdentifierDescriptionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e0e9692c-910b-4b60-b53a-fc7c358a917d" + }, + "description": { + "type": "string", + "example": "Air quality reports at Stephansplatz, Vienna" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "Abstract", + "Methods", + "SeriesInformation", + "TableOfContents", + "TechnicalInfo", + "Other" + ], + "example": "Abstract" + } + }, + "required": [ + "id" + ] + }, + "IdentifierTitleDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "70ce5164-fd74-413f-8712-f996b91defbf" + }, + "title": { + "type": "string", + "example": "Airquality Demonstrator" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "AlternativeTitle", + "Subtitle", + "TranslatedTitle", + "Other" + ] + } + }, + "required": [ + "id" + ] + }, + "UserBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4" + }, + "username": { + "type": "string", + "description": "Only contains lowercase characters", + "example": "jcarberry" + }, + "name": { + "type": "string", + "example": "Josiah Carberry" + }, + "orcid": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "qualified_name": { + "type": "string", + "example": "Josiah Carberry — @jcarberry" + }, + "given_name": { + "type": "string", + "example": "Josiah" + }, + "family_name": { + "type": "string", + "example": "Carberry" + } + }, + "required": [ + "id", + "username" + ] + }, + "DatabaseAccessDto": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "type": { + "type": "string", + "enum": [ + "read", + "write_own", + "write_all" + ], + "example": "read" + } + }, + "required": [ + "type", + "user" + ] + }, + "UserUpdateDto": { + "type": "object", + "properties": { + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "orcid": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "theme": { + "type": "string", + "example": "dark" + }, + "language": { + "type": "string", + "example": "en" + } + }, + "required": [ + "language", + "theme" + ] + }, + "OntologyModifyDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "Ontology URI" + }, + "prefix": { + "type": "string", + "example": "Ontology prefix" + }, + "sparql_endpoint": { + "type": "string", + "example": "Ontology SPARQL endpoint" + }, + "rdf_path": { + "type": "string", + "example": "rdf/om-2.0.rdf" + } + }, + "required": [ + "prefix", + "uri" + ] + }, + "OntologyDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7c491e40-082a-47b8-b82c-51d03c520466" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/" + }, + "prefix": { + "type": "string", + "example": "wd" + }, + "sparql": { + "type": "boolean", + "example": true + }, + "rdf": { + "type": "boolean", + "example": false + }, + "uri_pattern": { + "type": "string", + "example": "http://www.wikidata.org/entity/.*" + }, + "sparql_endpoint": { + "type": "string", + "example": "https://query.wikidata.org/sparql" + }, + "rdf_path": { + "type": "string", + "example": "rdf/om-2.0.rdf" + } + }, + "required": [ + "id", + "prefix", + "rdf", + "sparql", + "uri" + ] + }, + "BannerMessageUpdateDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + }, + "display_start": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "display_end": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + } + }, + "required": [ + "message", + "type" + ] + }, + "BannerMessageBriefDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + } + }, + "required": [ + "message", + "type" + ] + }, + "ImageChangeDto": { + "type": "object", + "properties": { + "registry": { + "type": "string", + "example": "docker.io/library" + }, + "defaultPort": { + "type": "integer", + "format": "int32", + "example": 5432, + "maximum": 65535, + "minimum": 1024 + }, + "dialect": { + "type": "string", + "example": "Postgres" + }, + "driver_class": { + "type": "string", + "example": "org.postgresql.Driver" + }, + "jdbc_method": { + "type": "string", + "example": "postgresql" + } + }, + "required": [ + "dialect", + "driver_class", + "jdbc_method", + "registry" + ] + }, + "DataTypeDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dcca" + }, + "value": { + "type": "string", + "example": "time" + }, + "documentation": { + "type": "string", + "example": "https://mariadb.com/kb/en/time/" + }, + "display_name": { + "type": "string", + "example": "TIME(fsp)" + }, + "size_min": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "size_max": { + "type": "integer", + "format": "int32", + "example": 6 + }, + "size_default": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "size_required": { + "type": "boolean", + "example": false + }, + "d_min": { + "type": "integer", + "format": "int32" + }, + "d_max": { + "type": "integer", + "format": "int32" + }, + "d_default": { + "type": "integer", + "format": "int32" + }, + "d_required": { + "type": "boolean" + }, + "data_hint": { + "type": "string", + "example": "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S" + }, + "type_hint": { + "type": "string", + "example": "fsp=microsecond precision, min. 0, max. 6" + }, + "is_quoted": { + "type": "boolean", + "description": "frontend needs to quote this data type", + "example": false + }, + "is_buildable": { + "type": "boolean", + "description": "frontend can build this data type", + "example": true + } + }, + "required": [ + "display_name", + "documentation", + "id", + "is_buildable", + "is_quoted", + "value" + ] + }, + "ImageDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dcce" + }, + "name": { + "type": "string", + "example": "mariadb" + }, + "version": { + "type": "string", + "example": 10.5 + }, + "operators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OperatorDto" + } + }, + "default": { + "type": "boolean", + "example": false + }, + "data_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DataTypeDto" + } + } + }, + "required": [ + "data_types", + "default", + "id", + "name", + "operators", + "version" + ] + }, + "OperatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dccf" + }, + "value": { + "type": "string", + "example": "XOR" + }, + "documentation": { + "type": "string", + "example": "https://mariadb.com/kb/en/xor/" + }, + "display_name": { + "type": "string", + "example": "XOR" + } + }, + "required": [ + "display_name", + "documentation", + "id", + "value" + ] + }, + "IdentifierSaveDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "68e11675-1e0f-4d24-a6d9-887ad1c4445d" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "doi": { + "type": "string", + "example": "10.1111/11111111" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierFunderDto" + } + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierCreatorDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveRelatedIdentifierDto" + } + } + }, + "required": [ + "creators", + "database_id", + "id", + "publication_year", + "publisher", + "titles", + "type" + ] + }, + "LicenseDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "example": "MIT" + }, + "uri": { + "type": "string", + "example": "https://opensource.org/licenses/MIT" + }, + "description": { + "type": "string", + "example": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code." + } + }, + "required": [ + "identifier", + "uri" + ] + }, + "SaveIdentifierCreatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "da9dd034-00a8-4517-b93d-d1b2adfee418" + }, + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Wesleyan University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/04d836q62" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "SaveIdentifierDescriptionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "35bd84d8-b181-43c8-b786-4d024e4f843c" + }, + "description": { + "type": "string", + "example": "Air quality reports at Stephansplatz, Vienna" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "Abstract", + "Methods", + "SeriesInformation", + "TableOfContents", + "TechnicalInfo", + "Other" + ], + "example": "Abstract" + } + }, + "required": [ + "description", + "id" + ] + }, + "SaveIdentifierFunderDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1c6b9212-a315-44b9-946c-3682a7a0e517" + }, + "funder_name": { + "type": "string", + "example": "European Commission" + }, + "funder_identifier": { + "type": "string", + "example": "http://doi.org/10.13039/501100000780" + }, + "funder_identifier_type": { + "type": "string", + "enum": [ + "Crossref Funder ID", + "ROR", + "GND", + "ISNI", + "Other" + ], + "example": "Crossref Funder ID" + }, + "scheme_uri": { + "type": "string", + "example": "http://doi.org/" + }, + "award_number": { + "type": "string", + "example": 824087 + }, + "award_title": { + "type": "string", + "example": "EOSC-Life" + } + }, + "required": [ + "funder_name", + "id" + ] + }, + "SaveIdentifierTitleDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "2af9f40e-eaf5-4ea1-861a-1a696587bf29" + }, + "title": { + "type": "string", + "example": "Airquality Demonstrator" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "AlternativeTitle", + "Subtitle", + "TranslatedTitle", + "Other" + ], + "example": "Subtitle" + } + }, + "required": [ + "id", + "title" + ] + }, + "SaveRelatedIdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "5bb272c7-7421-4f74-83ac-0486812d0f44" + }, + "value": { + "type": "string", + "example": "10.70124/dc4zh-9ce78" + }, + "type": { + "type": "string", + "enum": [ + "DOI", + "URL", + "URN", + "ARK", + "arXiv", + "bibcode", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "w3id" + ], + "example": "DOI" + }, + "relation": { + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsDescribedBy", + "Describes", + "HasMetadata", + "IsMetadataFor", + "HasVersion", + "IsVersionOf", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "IsReviewedBy", + "Reviews", + "IsDerivedFrom", + "IsSourceOf", + "IsRequiredBy", + "Requires", + "IsObsoletedBy", + "Obsoletes" + ], + "example": "Cites" + } + }, + "required": [ + "id", + "relation", + "type", + "value" + ] + }, + "CreatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "name_identifier_scheme_uri": { + "type": "string", + "example": "https://orcid.org/" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + }, + "affiliation_identifier_scheme_uri": { + "type": "string", + "example": "https://ror.org/" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "IdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "links": { + "$ref": "#/components/schemas/LinksDto" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierFunderDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "execution": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorDto" + } + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_normalized": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RelatedIdentifierDto" + } + }, + "query_hash": { + "type": "string", + "description": "query hash in sha512" + }, + "result_hash": { + "type": "string", + "example": "34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5" + }, + "result_number": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "funders", + "id", + "language", + "licenses", + "links", + "owner", + "publication_year", + "publisher", + "query", + "query_hash", + "query_normalized", + "status", + "titles", + "type" + ] + }, + "IdentifierFunderDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "39693413-e0ce-46da-ad5e-029c0556d439" + }, + "funder_name": { + "type": "string", + "example": "European Commission" + }, + "funder_identifier": { + "type": "string", + "example": "http://doi.org/10.13039/501100000780" + }, + "funder_identifier_type": { + "type": "string", + "enum": [ + "Crossref Funder ID", + "ROR", + "GND", + "ISNI", + "Other" + ], + "example": "Crossref Funder ID" + }, + "scheme_uri": { + "type": "string", + "example": "http://doi.org/" + }, + "award_number": { + "type": "string", + "example": 824087 + }, + "award_title": { + "type": "string", + "example": "EOSC-Life" + } + }, + "required": [ + "funder_name", + "id" + ] + }, + "LinksDto": { + "type": "object", + "properties": { + "self": { + "type": "string", + "example": "http://example.com/api/" + }, + "data": { + "type": "string", + "example": "http://example.com" + }, + "self_html": { + "type": "string", + "example": "http://example.com" + }, + "dashboard_html": { + "type": "string", + "example": "http://example.com/d/defi2baxqawaod" + } + }, + "required": [ + "self", + "self_html" + ] + }, + "RelatedIdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ce9d11f0-60a2-448d-a3e4-44719a443e8a" + }, + "value": { + "type": "string", + "example": "10.70124/dc4zh-9ce78" + }, + "type": { + "type": "string", + "enum": [ + "DOI", + "URL", + "URN", + "ARK", + "arXiv", + "bibcode", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "w3id" + ], + "example": "DOI" + }, + "relation": { + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsDescribedBy", + "Describes", + "HasMetadata", + "IsMetadataFor", + "HasVersion", + "IsVersionOf", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "IsReviewedBy", + "Reviews", + "IsDerivedFrom", + "IsSourceOf", + "IsRequiredBy", + "Requires", + "IsObsoletedBy", + "Obsoletes" + ], + "example": "Cites" + } + }, + "required": [ + "id", + "relation", + "type", + "value" + ] + }, + "DatabaseModifyVisibilityDto": { + "type": "object", + "properties": { + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "is_dashboard_enabled": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_dashboard_enabled", + "is_public", + "is_schema_public" + ] + }, + "ViewUpdateDto": { + "type": "object", + "properties": { + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_public", + "is_schema_public" + ] + }, + "ViewBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "787439d0-e85e-400c-a7e6-996a023bfad9" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "initial_view": { + "type": "boolean", + "description": "True if it is the default view for the database", + "example": true + }, + "query_hash": { + "type": "string", + "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916" + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "ac750fcf-ea02-4fce-85ac-d73857e18b35" + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "name", + "query", + "query_hash" + ] + }, + "TableUpdateDto": { + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "Air Quality in Austria", + "maxLength": 180, + "minLength": 0 + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_public", + "is_schema_public" + ] + }, + "TableBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "41ed10e0-687b-4e18-8521-810f5cffbce1" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "description": { + "type": "string", + "example": "Air Quality in Austria" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "a8fec026-dfaf-4b1d-8f6c-f01720d91705" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_versioned": { + "type": "boolean", + "example": true + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "78337b80-5699-45db-8111-cec86439ab6b" + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_public", + "is_schema_public", + "is_versioned", + "name", + "owned_by" + ] + }, + "ColumnSemanticsUpdateDto": { + "type": "object", + "properties": { + "concept_uri": { + "type": "string" + }, + "unit_uri": { + "type": "string" + } + } + }, + "ColumnDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "a453e444-e00d-41ca-902c-11e9c54b39f1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "alias": { + "type": "string", + "example": "firstname" + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "mean": { + "type": "number", + "example": 45.4 + }, + "median": { + "type": "number", + "example": 51 + }, + "concept": { + "$ref": "#/components/schemas/ConceptBriefDto" + }, + "unit": { + "$ref": "#/components/schemas/UnitBriefDto" + }, + "description": { + "type": "string", + "example": "Column comment", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/EnumDto" + } + }, + "sets": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/SetDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "911f9052-c58c-4e1c-b3f2-66af2107be16" + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": "bfffa915-a547-4466-9c65-ddc0d38fdb08" + }, + "ord": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "index_length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "data_length": { + "type": "integer", + "format": "int64", + "example": 34300 + }, + "max_data_length": { + "type": "integer", + "format": "int64", + "example": 34300 + }, + "num_rows": { + "type": "integer", + "format": "int64", + "example": 32 + }, + "val_min": { + "type": "number", + "example": 0 + }, + "val_max": { + "type": "number", + "example": 100 + }, + "std_dev": { + "type": "number", + "example": 5.32 + }, + "is_null_allowed": { + "type": "boolean", + "example": false + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_null_allowed", + "name", + "ord", + "table_id", + "type" + ] + }, + "ConceptBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "8cabc011-4bdf-44d4-9d33-b2648e2ddbf1" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/entity/Q202444" + }, + "name": { + "type": "string", + "example": "given name" + }, + "description": { + "type": "string", + "example": "name typically used to differentiate people from the same family, clan, or other social group who have a common last name" + } + }, + "required": [ + "id", + "uri" + ] + }, + "EnumDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "5343bb3d-14d3-4eb7-a86f-b8fc553cb315" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "SetDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7eb4eded-bacc-4a91-84db-a9ae6ddafda7" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "UnitBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ba1935e8-6817-488f-af0a-f54389af9000" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/entity/Q1422583" + }, + "name": { + "type": "string", + "example": "importance" + }, + "description": { + "type": "string", + "example": "subjective magnitude of value, meaning, or purpose" + } + }, + "required": [ + "id", + "uri" + ] + }, + "DatabaseTransferDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + }, + "required": [ + "id" + ] + }, + "DatabaseModifyImageDto": { + "type": "object", + "properties": { + "key": { + "type": "string" + } + } + }, + "DatabaseModifyDashboardDto": { + "type": "object", + "properties": { + "uid": { + "type": "string" + } + }, + "required": [ + "uid" + ] + }, + "CreateAccessDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "read", + "write_own", + "write_all" + ], + "example": "read" + } + }, + "required": [ + "type" + ] + }, + "OntologyCreateDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "Ontology URI" + }, + "prefix": { + "type": "string", + "example": "Ontology prefix" + }, + "sparql_endpoint": { + "type": "string", + "example": "Ontology SPARQL endpoint" + } + }, + "required": [ + "prefix", + "uri" + ] + }, + "BannerMessageCreateDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + }, + "display_start": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "display_end": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + } + }, + "required": [ + "message", + "type" + ] + }, + "ImageCreateDto": { + "type": "object", + "properties": { + "registry": { + "type": "string", + "example": "docker.io/library" + }, + "name": { + "type": "string", + "example": "mariadb" + }, + "version": { + "type": "string" + }, + "dialect": { + "type": "string" + }, + "is_default": { + "type": "boolean", + "example": false + }, + "driver_class": { + "type": "string" + }, + "jdbc_method": { + "type": "string" + }, + "default_port": { + "type": "integer", + "format": "int32", + "maximum": 65535, + "minimum": 1024 + } + }, + "required": [ + "default_port", + "dialect", + "driver_class", + "is_default", + "jdbc_method", + "name", + "registry", + "version" + ] + }, + "CreateIdentifierDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "doi": { + "type": "string", + "example": "10.1111/11111111" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierFunderDto" + } + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierCreatorDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "d002e8d5-8db4-4ff7-ab3a-bc3f52d9ec44" + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveRelatedIdentifierDto" + } + } + }, + "required": [ + "creators", + "database_id", + "publication_year", + "publisher", + "titles", + "type" + ] + }, + "CreateDatabaseDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality" + }, + "container_id": { + "type": "string", + "format": "uuid", + "example": "0888e108-d521-46e2-9d3e-82099185305b" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "container_id", + "is_public", + "is_schema_public", + "name" + ] + }, + "CreateViewDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality", + "maxLength": 63, + "minLength": 1 + }, + "query": { + "$ref": "#/components/schemas/SubsetDto" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_public", + "is_schema_public", + "name", + "query" + ] + }, + "FilterDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "where", + "or", + "and" + ], + "example": "where" + }, + "value": { + "type": "string", + "example": 1 + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "14128033-54b5-4818-a489-21b0dded86e2" + }, + "operator_id": { + "type": "string", + "format": "uuid", + "example": "67c5b54d-2eb0-4f42-8dc1-a504562e9f32" + } + }, + "required": [ + "column_id", + "operator_id", + "type" + ] + }, + "OrderDto": { + "type": "object", + "properties": { + "direction": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "e891ba86-0258-41a6-a8d9-ff58bc10b618" + } + }, + "required": [ + "column_id" + ] + }, + "SubsetDto": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "example": [ + "e891ba86-0258-41a6-a8d9-ff58bc10b618" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "filter": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterDto" + } + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrderDto" + } + }, + "datasource_id": { + "type": "string", + "format": "uuid", + "example": "f7df2a7d-4ade-4c78-97b0-7c744d0893c7" + }, + "datasource_type": { + "type": "string", + "enum": [ + "table", + "view" + ] + } + }, + "required": [ + "columns", + "datasource_id", + "datasource_type" + ] + }, + "CreateForeignKeyDto": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "example": [ + "id" + ], + "items": { + "type": "string" + } + }, + "referenced_table": { + "type": "string", + "example": "sensor" + }, + "referenced_columns": { + "type": "array", + "example": [ + "other_id" + ], + "items": { + "type": "string" + } + }, + "on_update": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "cascade" + }, + "on_delete": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "cascade" + } + }, + "required": [ + "columns", + "referenced_columns", + "referenced_table" + ] + }, + "CreateTableColumnDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Date" + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "description": { + "type": "string", + "example": "Formatted as YYYY-MM-dd", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "type": "string" + } + }, + "sets": { + "type": "array", + "description": "set values, only considered when type = SET", + "items": { + "type": "string" + } + }, + "index_length": { + "type": "integer", + "format": "int64" + }, + "null_allowed": { + "type": "boolean", + "example": true + }, + "concept_uri": { + "type": "string" + }, + "unit_uri": { + "type": "string" + } + }, + "required": [ + "name", + "null_allowed", + "type" + ] + }, + "CreateTableConstraintsDto": { + "type": "object", + "properties": { + "uniques": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "checks": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "foreign_keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateForeignKeyDto" + } + }, + "primary_key": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "required": [ + "checks", + "foreign_keys", + "primary_key", + "uniques" + ] + }, + "CreateTableDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality", + "maxLength": 64, + "minLength": 1 + }, + "description": { + "type": "string", + "example": "Air Quality in Austria", + "maxLength": 180, + "minLength": 0 + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateTableColumnDto" + } + }, + "constraints": { + "$ref": "#/components/schemas/CreateTableConstraintsDto" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "columns", + "constraints", + "is_public", + "is_schema_public", + "name" + ] + }, + "CreateContainerDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality" + }, + "host": { + "type": "string", + "description": "Hostname of container", + "example": "data-db2" + }, + "port": { + "type": "integer", + "format": "int32", + "description": "Port of container", + "example": 3306 + }, + "quota": { + "type": "integer", + "format": "int64", + "example": 50 + }, + "image_id": { + "type": "string", + "format": "uuid", + "description": "Image ID", + "example": "2360f3c4-85e0-4fac-a7c6-73b296b9dde2" + }, + "ui_host": { + "type": "string", + "example": "example.com" + }, + "ui_port": { + "type": "integer", + "format": "int32", + "example": 3306 + }, + "privileged_username": { + "type": "string", + "description": "Username of privileged user", + "example": "root" + }, + "privileged_password": { + "type": "string", + "description": "Password of privileged user", + "example": "dbrepo" + } + }, + "required": [ + "host", + "image_id", + "name", + "privileged_password", + "privileged_username", + "quota" + ] + }, + "ContainerDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7ddb7e87-b965-43a2-9a24-4fa406d998f4" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "image": { + "$ref": "#/components/schemas/ImageDto" + }, + "quota": { + "type": "integer", + "format": "int64", + "example": 50 + }, + "count": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "username": { + "type": "string", + "example": "username" + }, + "password": { + "type": "string", + "example": "p4ssw0rd" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + } + }, + "required": [ + "count", + "id", + "image", + "internal_name", + "name" + ] + }, + "ColumnBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "a453e444-e00d-41ca-902c-11e9c54b39f1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "alias": { + "type": "string", + "example": "firstname" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "911f9052-c58c-4e1c-b3f2-66af2107be16" + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": "bfffa915-a547-4466-9c65-ddc0d38fdb08" + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "name", + "table_id", + "type" + ] + }, + "UnitDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ba1935e8-6817-488f-af0a-f54389af9000" + }, + "uri": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + } + }, + "required": [ + "columns", + "id", + "uri" + ] + }, + "OntologyBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7c491e40-082a-47b8-b82c-51d03c520466" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/" + }, + "prefix": { + "type": "string", + "example": "wd" + }, + "sparql": { + "type": "boolean", + "example": true + }, + "rdf": { + "type": "boolean", + "example": false + }, + "uri_pattern": { + "type": "string", + "example": "http://www.wikidata.org/entity/.*" + } + }, + "required": [ + "id", + "prefix", + "rdf", + "sparql", + "uri" + ] + }, + "EntityDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "https://www.wikidata.org/entity/Q1686799" + }, + "label": { + "type": "string", + "example": "Apache Jena" + }, + "description": { + "type": "string", + "example": "open source semantic web framework for Java" + } + }, + "required": [ + "label", + "uri" + ] + }, + "OaiListIdentifiersParameters": { + "type": "object", + "properties": { + "metadataPrefix": { + "type": "string" + }, + "from": { + "type": "string" + }, + "until": { + "type": "string" + }, + "set": { + "type": "string" + }, + "resumptionToken": { + "type": "string" + }, + "parametersString": { + "type": "string" + }, + "fromDate": { + "type": "string", + "format": "date-time" + }, + "untilDate": { + "type": "string", + "format": "date-time" + } + } + }, + "BannerMessageDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ae3f795b-a3da-4ebe-bdc4-21a8ce631e6f" + }, + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ], + "example": "WARNING" + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + }, + "display_start": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "display_end": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + } + }, + "required": [ + "id", + "message", + "type" + ] + }, + "ImageBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dcce" + }, + "name": { + "type": "string", + "example": "mariadb" + }, + "version": { + "type": "string", + "example": 10.5 + }, + "default": { + "type": "boolean", + "example": false + } + }, + "required": [ + "default", + "id", + "name", + "version" + ] + }, + "LdCreatorDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "sameAs": { + "type": "string" + }, + "givenName": { + "type": "string" + }, + "familyName": { + "type": "string" + }, + "@type": { + "type": "string" + } + }, + "required": [ + "@type", + "name" + ] + }, + "LdDatasetDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "url": { + "type": "string" + }, + "identifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "license": { + "type": "string" + }, + "creator": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LdCreatorDto" + } + }, + "citation": { + "type": "string" + }, + "hasPart": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LdDatasetDto" + } + }, + "temporalCoverage": { + "type": "string" + }, + "version": { + "type": "string", + "format": "date-time" + }, + "@context": { + "type": "string" + }, + "@type": { + "type": "string" + } + }, + "required": [ + "@context", + "@type", + "citation", + "creator", + "description", + "hasPart", + "identifier", + "name", + "temporalCoverage", + "url", + "version" + ] + }, + "ViewColumnDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6aec3a91-2e0b-4e92-a16a-9c3c5e892da1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "description": { + "type": "string", + "example": "Column comment", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/EnumDto" + } + }, + "sets": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/SetDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4" + }, + "ord": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "index_length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "is_null_allowed": { + "type": "boolean", + "example": false + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_null_allowed", + "name", + "ord", + "type" + ] + }, + "ViewDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "787439d0-e85e-400c-a7e6-996a023bfad9" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ViewColumnDto" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "2022-01-01 08:00:00.000" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "initial_view": { + "type": "boolean", + "description": "True if it is the default view for the database", + "example": true + }, + "query_hash": { + "type": "string", + "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916" + } + }, + "required": [ + "columns", + "created", + "database_id", + "id", + "identifiers", + "internal_name", + "name", + "owner", + "query", + "query_hash" + ] + }, + "ConstraintsDto": { + "type": "object", + "properties": { + "uniques": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UniqueDto" + } + }, + "checks": { + "type": "array", + "example": [ + "value > 1" + ], + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "foreign_keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForeignKeyDto" + } + }, + "primary_key": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PrimaryKeyDto" + }, + "uniqueItems": true + } + } + }, + "ForeignKeyBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a" + } + } + }, + "ForeignKeyDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a" + }, + "name": { + "type": "string", + "example": "fk_name" + }, + "references": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForeignKeyReferenceDto" + } + }, + "table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "referenced_table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "on_update": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "restrict" + }, + "on_delete": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "restrict" + } + }, + "required": [ + "name", + "referenced_table", + "references", + "table" + ] + }, + "ForeignKeyReferenceDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a" + }, + "column": { + "$ref": "#/components/schemas/ColumnBriefDto" + }, + "foreign_key": { + "$ref": "#/components/schemas/ForeignKeyBriefDto" + }, + "referenced_column": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + }, + "required": [ + "column", + "foreign_key", + "referenced_column" + ] + }, + "PrimaryKeyDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "d984f9d7-e8a7-4b81-b59a-862db1871f18" + }, + "table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "column": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + }, + "required": [ + "column", + "table" + ] + }, + "TableDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "d346f844-b84c-490f-9aec-725a2dc8f820" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "alias": { + "type": "string", + "example": "a" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "description": { + "type": "string", + "example": "Air Quality in Austria", + "maxLength": 2048, + "minLength": 0 + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnDto" + } + }, + "constraints": { + "$ref": "#/components/schemas/ConstraintsDto" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "2022-01-01 08:00:00.000" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_versioned": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "queue_name": { + "type": "string", + "example": "air_quality" + }, + "queue_type": { + "type": "string", + "example": "quorum" + }, + "routing_key": { + "type": "string", + "example": "dbrepo.1.2" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "num_rows": { + "type": "integer", + "format": "int64", + "example": 5 + }, + "data_length": { + "type": "integer", + "format": "int64", + "description": "in bytes", + "example": 16384 + }, + "max_data_length": { + "type": "integer", + "format": "int64", + "description": "in bytes", + "example": 0 + }, + "avg_row_length": { + "type": "integer", + "format": "int64", + "description": "in bytes", + "example": 3276 + } + }, + "required": [ + "columns", + "constraints", + "created", + "database_id", + "id", + "internal_name", + "is_public", + "is_schema_public", + "is_versioned", + "name", + "owner", + "queue_name", + "routing_key" + ] + }, + "UniqueDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "d984f9d7-e8a7-4b81-b59a-862db1871f13" + }, + "name": { + "type": "string", + "example": "uk_name" + }, + "table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + } + }, + "required": [ + "columns", + "id", + "name", + "table" + ] + }, + "TableColumnEntityDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "https://www.wikidata.org/entity/Q1686799" + }, + "label": { + "type": "string", + "example": "Apache Jena" + }, + "description": { + "type": "string", + "example": "open source semantic web framework for Java" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "475b4107-a64d-4495-a7ef-3cb0dadd4804" + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": "9a9208af-90ea-4382-9a11-0c8f6d89bd1f" + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "297860e3-3b29-451c-ae8a-a85ed5941018" + } + }, + "required": [ + "column_id", + "database_id", + "table_id", + "uri" + ] + }, + "ContainerBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7ddb7e87-b965-43a2-9a24-4fa406d998f4" + }, + "hash": { + "type": "string", + "example": "f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "image": { + "$ref": "#/components/schemas/ImageBriefDto" + }, + "quota": { + "type": "integer", + "format": "int32", + "example": 50 + }, + "count": { + "type": "integer", + "format": "int32", + "example": 10 + }, + "internal_name": { + "type": "string", + "example": "air-quality" + } + }, + "required": [ + "count", + "hash", + "id", + "image", + "internal_name", + "name", + "quota" + ] + }, + "ConceptDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "8cabc011-4bdf-44d4-9d33-b2648e2ddbf1" + }, + "uri": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + } + }, + "required": [ + "columns", + "id", + "uri" + ] + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + } +} diff --git a/.docs/.openapi/api-metadata.yaml b/.docs/.openapi/api-metadata.yaml deleted file mode 100644 index db1edbb1c8044d03aa2acf408f6580facf1e8f66..0000000000000000000000000000000000000000 --- a/.docs/.openapi/api-metadata.yaml +++ /dev/null @@ -1,7097 +0,0 @@ -openapi: 3.1.0 -info: - title: Database Repository Metadata Service API - description: Service that manages the metadata - contact: - name: Prof. Andreas Rauber - email: andreas.rauber@tuwien.ac.at - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.8.1 -externalDocs: - description: Sourcecode Documentation - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.1/system-services-metadata/ -servers: -- url: http://localhost - description: Development instance -- url: https://test.dbrepo.tuwien.ac.at - description: Staging instance -paths: - /api/user/{userId}: - get: - tags: - - user-endpoint - summary: Get user - description: Gets own user information from the metadata database. Requires - authentication. Foreign user information can only be obtained if additional - role `find-foreign-user` is present. Finding information about internal users - results in a 404 error. - operationId: find - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found user - content: - application/json: - schema: - $ref: "#/components/schemas/UserDto" - "403": - description: Find user is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: User was not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - user-endpoint - summary: Update user - description: Updates user with id. Requires role `modify-user-information`. - operationId: modify - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/UserUpdateDto" - required: true - responses: - "202": - description: Modified user information - content: - application/json: - schema: - $ref: "#/components/schemas/UserDto" - "400": - description: Modify user query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to modify user metadata - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/user in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to modify user at auth service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - user-endpoint - summary: Get user - description: Gets own user information from the metadata database. Requires - authentication. Foreign user information can only be obtained if additional - role `find-foreign-user` is present. Finding information about internal users - results in a 404 error. - operationId: find_1 - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found user - content: - application/json: - schema: - $ref: "#/components/schemas/UserDto" - "403": - description: Find user is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: User was not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database: - get: - tags: - - database-endpoint - summary: List databases - description: "Lists all databases in the metadata database. Requests with HTTP\ - \ method **GET** return the list of databases, requests with HTTP method **HEAD**\ - \ only the number in the `X-Count` header." - operationId: list - parameters: - - name: internal_name - in: query - required: false - schema: - type: string - responses: - "200": - description: List of databases - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of databases - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/DatabaseBriefDto" - post: - tags: - - database-endpoint - summary: Create database - description: Creates a database in the container with id. Requires roles `create-database`. - operationId: create - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateDatabaseDto" - required: true - responses: - "201": - description: Created a new database - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Database create query is malformed or image is not supported - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Database create permission is missing or grant permissions - at broker service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to fin container/user/database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Query store could not be created - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "423": - description: Database quota exceeded - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - database-endpoint - summary: List databases - description: "Lists all databases in the metadata database. Requests with HTTP\ - \ method **GET** return the list of databases, requests with HTTP method **HEAD**\ - \ only the number in the `X-Count` header." - operationId: list_1 - parameters: - - name: internal_name - in: query - required: false - schema: - type: string - responses: - "200": - description: List of databases - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of databases - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/DatabaseBriefDto" - /api/database/{databaseId}/access/{userId}: - get: - tags: - - access-endpoint - summary: Find/Check access - description: "Finds or checks access of a user with given id to a database with\ - \ given id. Requests with HTTP method **GET** return the access object, requests\ - \ with HTTP method **HEAD** only the status. When the user has at least *READ*\ - \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\ - \ or `check-foreign-database-access`." - operationId: find_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found database access - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseAccessDto" - "403": - description: No access to this database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - access-endpoint - summary: Modify access - description: Modifies access of a user with given id to database with given - id. Requires role `update-database-access`. - operationId: update - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateAccessDto" - required: true - responses: - "202": - description: Modified access - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Modify access not permitted when no access is granted in the - first place - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Access could not be updated due to connection error in the - data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Access could not be updated in the data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - access-endpoint - summary: Give access - description: Give a user with given id access to some database with given id. - Requires role `create-database-access`. - operationId: create_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateAccessDto" - required: true - responses: - "202": - description: Granting access succeeded - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseAccessDto" - "400": - description: Granting access query or database connection is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Failed giving access - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Access could not be created due to connection error - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Access could not be created in the data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - access-endpoint - summary: Delete access - description: Delete access of a user with id to a database with id. Requires - role `delete-database-access`. - operationId: revoke - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted access - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Revoke of access not permitted as no access was found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "User, database with access was not found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Access could not be created due to connection error - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Access could not be revoked in the data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - access-endpoint - summary: Find/Check access - description: "Finds or checks access of a user with given id to a database with\ - \ given id. Requests with HTTP method **GET** return the access object, requests\ - \ with HTTP method **HEAD** only the status. When the user has at least *READ*\ - \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\ - \ or `check-foreign-database-access`." - operationId: find_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found database access - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseAccessDto" - "403": - description: No access to this database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/ontology/{ontologyId}: - get: - tags: - - ontology-endpoint - summary: Find ontology - description: Finds an ontology with id in the metadata database. - operationId: find_4 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find one ontology - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyDto" - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - put: - tags: - - ontology-endpoint - summary: Update ontology - description: Updates an ontology with id. Requires role `update-ontology`. - operationId: update_1 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyModifyDto" - required: true - responses: - "202": - description: Updated ontology successfully - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyDto" - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - ontology-endpoint - summary: Delete ontology - description: Deletes an ontology with given id. Requires role `delete-ontology`. - operationId: delete - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted ontology successfully - content: - application/json: {} - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/message/{messageId}: - put: - tags: - - message-endpoint - summary: Update message - description: Updates a message with id. Requires role `update-maintenance-message`. - operationId: update_2 - parameters: - - name: messageId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageUpdateDto" - required: true - responses: - "202": - description: Updated message - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageBriefDto" - "404": - description: Could not find message - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - message-endpoint - summary: Delete message - description: Deletes a message with id. Requires role `delete-maintenance-message`. - operationId: delete_1 - parameters: - - name: messageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted message - content: - application/json: {} - "404": - description: Could not find message - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/image/{imageId}: - get: - tags: - - image-endpoint - summary: Find image - description: Finds a container image in the metadata database. - operationId: findById - parameters: - - name: imageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found image - content: - application/json: - schema: - $ref: "#/components/schemas/ImageDto" - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - put: - tags: - - image-endpoint - summary: Update image - description: Updates container image in the metadata database. Requires role - `modify-image`. - operationId: update_3 - parameters: - - name: imageId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ImageChangeDto" - required: true - responses: - "202": - description: Updated image successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ImageDto" - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - image-endpoint - summary: Delete image - description: Deletes a container image in the metadata database. Requires role - `delete-image`. - operationId: delete_2 - parameters: - - name: imageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted image successfully - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier/{identifierId}: - get: - tags: - - identifier-endpoint - summary: Find identifier - description: Finds an identifier with id. The response format depends on the - HTTP `Accept` header set on the request. - operationId: find_5 - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Found identifier successfully - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - application/ld+json: - schema: - $ref: "#/components/schemas/LdDatasetDto" - text/xml: {} - text/bibliography: {} - text/bibliography; style=apa: {} - text/bibliography; style=ieee: {} - text/bibliography; style=bibtex: {} - "400": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to view identifier - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Identifier could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to find acceptable representation - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Exported resource was not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "410": - description: Failed to retrieve from S3 endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to data service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to find in data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - put: - tags: - - identifier-endpoint - summary: Save identifier - description: Saves an identifier with id as a draft identifier. Identifiers - can only be created for objects the user has at least *READ* access in the - associated database (requires role `create-identifier`) or for any object - in any database (requires role `create-foreign-identifier`). - operationId: save - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierSaveDto" - required: true - responses: - "202": - description: Saved identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - identifier-endpoint - summary: Delete identifier - description: Deletes an identifier with id. Requires role `delete-identifier`. - operationId: delete_3 - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted identifier - "403": - description: Deleting identifier not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Identifier or database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to delete in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier/{identifierId}/publish: - put: - tags: - - identifier-endpoint - summary: Publish identifier - description: Publishes an identifier with id. A published identifier cannot - be changed anymore. Requires role `publish-identifier`. - operationId: publish - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Published identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/visibility: - put: - tags: - - database-endpoint - summary: Update database visibility - description: Updates the database with id on the visibility. Only the database - owner can perform this operation. Requires role `modify-database-visibility`. - operationId: visibility - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseModifyVisibilityDto" - required: true - responses: - "202": - description: Visibility modified successfully - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: The visibility payload is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Visibility modification is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/view/{viewId}: - get: - tags: - - view-endpoint - summary: Get view - description: Gets a view with id in the metadata database. - operationId: find_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find view successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ViewDto" - "403": - description: Find view is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Database, view or user could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - view-endpoint - summary: Update view - description: Updates a view with id. This can only be performed by the view - owner or database owner. Requires role `create-database-view`. - operationId: update_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ViewUpdateDto" - required: true - responses: - "202": - description: Update view successfully - content: - '*/*': - schema: - $ref: "#/components/schemas/ViewBriefDto" - "400": - description: Update view query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Update not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or View could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - view-endpoint - summary: Delete view - description: Deletes a view with id. Requires role `delete-database-view`. - operationId: delete_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Delete view successfully - "400": - description: Delete view query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Deletion not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Database, view or user could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "423": - description: Delete view resulted in an invalid query statement - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}: - get: - tags: - - table-endpoint - summary: Find table - description: "Finds a table with id. When a table is hidden (i.e. when `is_public`\ - \ is `false`), then the user needs to have at least read access and the role\ - \ `find-table`. When the `system` role is present, the endpoint responds with\ - \ additional connection metadata in the header." - operationId: findById_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find table successfully - content: - application/json: - schema: - $ref: "#/components/schemas/TableDto" - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Table, database or container could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - table-endpoint - summary: Update table - description: Updates a table in the database with id. Requires role `update-table`. - operationId: update_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TableUpdateDto" - required: true - responses: - "202": - description: Updated the table - content: - application/json: - schema: - $ref: "#/components/schemas/TableBriefDto" - "400": - description: Update table visibility payload is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Update table visibility not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Table could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - table-endpoint - summary: Delete table - description: Deletes a table with id. Only the owner of a table can perform - this action (requires role `delete-table`) or anyone can delete a table (requires - role `delete-foreign-table`). - operationId: delete_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Delete table successfully - "400": - description: Delete table query resulted in an invalid query statement - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Table, database or container could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/statistic: - put: - tags: - - table-endpoint - summary: Update statistics - description: "Updates basic statistical properties (min, max, mean, median,\ - \ std.dev) for numerical columns in a table with id. This action can only\ - \ be performed by the table owner. Requires role `update-table-statistic`." - operationId: updateStatistic - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Updated table statistics successfully - "400": - description: Failed to map column statistic to known columns - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not the owner - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/column/{columnId}: - put: - tags: - - table-endpoint - summary: Update semantics - description: Updates column semantics of a table column with id. Only the table - owner with at least *READ* access to the associated database can update the - column semantics (requires role `modify-table-column-semantics`) or foreign - table columns if role `modify-foreign-table-column-semantics`. - operationId: updateColumn - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: columnId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ColumnSemanticsUpdateDto" - required: true - responses: - "202": - description: Updated column semantics successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ColumnDto" - "400": - description: Update semantic concept query is malformed or update unit of - measurement query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find user/table/database/ontology in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/owner: - put: - tags: - - database-endpoint - summary: Update database owner - description: Updates the database with id on the owner. Only the database owner - can perform this operation. Requires role `modify-database-owner`. - operationId: transfer - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseTransferDto" - required: true - responses: - "202": - description: Transfer of ownership was successful - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Owner payload is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Transfer of ownership is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/metadata/view: - put: - tags: - - database-endpoint - summary: Update database view schemas - description: Updates the database with id with generated metadata from view - that are not yet known to the database. Only the database owner can perform - this operation. Requires role `find-database`. - operationId: refreshViewMetadata - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Refreshed database views metadata - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "403": - description: Refresh view metadata is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/metadata/table: - put: - tags: - - database-endpoint - summary: Update database table schemas - description: Updates the database with id with generated metadata from tables - that are not yet known to the database. Only the database owner can perform - this operation. Requires role `find-database`. - operationId: refreshTableMetadata - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Refreshed database tables metadata - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Failed to parse payload at search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to refresh table metadata - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/image: - get: - tags: - - database-endpoint - summary: Get database preview image - description: Gets the database with id on the preview image. - operationId: findPreviewImage - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: View of image was successful - content: - '*/*': - schema: - type: string - format: byte - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - database-endpoint - summary: Update database preview image - description: Updates the database with id on the preview image. Only the database - owner can perform this operation. Requires role `modify-database-image`. - operationId: modifyImage - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseModifyImageDto" - required: true - responses: - "202": - description: Modify of image was successful - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "403": - description: Modify of image is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "410": - description: File was not found in the Storage Service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/dashboard: - put: - tags: - - database-endpoint - summary: Update database dashboard uid - description: Updates the dashboard uid for a database with given id. Only the - database owner can perform this operation. Requires role `system`. - operationId: modifyDashboard - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseModifyDashboardDto" - required: true - responses: - "202": - description: Modify of dashboard uid was successful - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Malformed payload - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/ontology: - get: - tags: - - ontology-endpoint - summary: List ontologies - description: Lists all ontologies known to the metadata database. - operationId: findAll - responses: - "200": - description: List ontologies - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/OntologyBriefDto" - post: - tags: - - ontology-endpoint - summary: Create ontology - description: Creates an ontology in the metadata database. Requires role `create-ontology`. - operationId: create_2 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyCreateDto" - required: true - responses: - "201": - description: Registered ontology successfully - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/message: - get: - tags: - - message-endpoint - summary: List messages - description: "Lists messages known to the metadata database. Messages can be\ - \ filtered be filtered with the optional `active` parameter. If set to *true*,\ - \ only active messages (that is, messages whose end time has not been reached)\ - \ will be returned. Otherwise only inactive messages are returned. If not\ - \ set, active and inactive messages are returned." - operationId: list_2 - parameters: - - name: active - in: query - required: false - schema: - type: boolean - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/BannerMessageDto" - post: - tags: - - message-endpoint - summary: Create message - description: Creates a message in the metadata database. Requires role `create-maintenance-message`. - operationId: create_3 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageCreateDto" - required: true - responses: - "201": - description: Created message - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageBriefDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/image: - get: - tags: - - image-endpoint - summary: List images - description: Lists all container images known to the metadata database. - operationId: findAll_1 - responses: - "200": - description: List images - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ImageBriefDto" - post: - tags: - - image-endpoint - summary: Create image - description: Creates a container image in the metadata database. Requires role - `create-image`. - operationId: create_4 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ImageCreateDto" - required: true - responses: - "201": - description: Created image - content: - application/json: - schema: - $ref: "#/components/schemas/ImageDto" - "400": - description: Image specification is invalid - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Image already exists - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier: - get: - tags: - - identifier-endpoint - summary: List identifiers - description: Lists all identifiers known to the metadata database - operationId: findAll_2 - parameters: - - name: type - in: query - required: false - schema: - type: string - enum: - - database - - subset - - table - - view - - name: status - in: query - required: false - schema: - type: string - enum: - - draft - - published - - name: dbid - in: query - required: false - schema: - type: string - format: uuid - - name: qid - in: query - required: false - schema: - type: string - format: uuid - - name: vid - in: query - required: false - schema: - type: string - format: uuid - - name: tid - in: query - required: false - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Found identifiers successfully - content: - application/json: - schema: - type: array - items: - type: array - items: - $ref: "#/components/schemas/IdentifierBriefDto" - application/ld+json: - schema: - type: array - items: - $ref: "#/components/schemas/LdDatasetDto" - post: - tags: - - identifier-endpoint - summary: Create identifier - description: Create an identifier with id to create a draft identifier. Identifiers - can only be created for objects the user has at least *READ* access in the - associated database (requires role `create-identifier`) or for any object - in any database (requires role `create-foreign-identifier`). - operationId: create_5 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateIdentifierDto" - required: true - responses: - "201": - description: Drafted identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/view: - get: - tags: - - view-endpoint - summary: List views - description: Lists views known to the metadata database. - operationId: findAll_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find views successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ViewBriefDto" - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - view-endpoint - summary: Create view - description: Creates a view. This can only be performed by the database owner. - Requires role `create-database-view`. - operationId: create_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateViewDto" - required: true - responses: - "201": - description: Create view successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ViewBriefDto" - "400": - description: Create view query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/user in metadata database. - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: View exists with name - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "423": - description: Create view resulted in an invalid query statement - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table: - get: - tags: - - table-endpoint - summary: List tables - description: "Lists all tables known to the metadata database. When a database\ - \ has a hidden schema (i.e. when `is_schema_public` is `false`), then the\ - \ user needs to have at least read access and the role `list-tables`." - operationId: list_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: List tables - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TableBriefDto" - "403": - description: List tables not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - table-endpoint - summary: Create table - description: Creates a table in the database with id. Requires role `create-table`. - operationId: create_7 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateTableDto" - required: true - responses: - "201": - description: Created a new table - content: - application/json: - schema: - $ref: "#/components/schemas/TableBriefDto" - "400": - description: Create table query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Create table not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Database, container or user could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Create table conflicts with existing table name - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/container: - get: - tags: - - container-endpoint - summary: List containers - description: List all containers in the metadata database. - operationId: findAll_4 - parameters: - - name: limit - in: query - required: false - schema: - type: integer - format: int32 - responses: - "200": - description: List containers - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ContainerBriefDto" - post: - tags: - - container-endpoint - summary: Create container - description: Creates a container in the metadata database. Requires role `create-container`. - operationId: create_8 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateContainerDto" - required: true - responses: - "201": - description: Created a new container - content: - application/json: - schema: - $ref: "#/components/schemas/ContainerDto" - "400": - description: Container payload malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: "Create container not permitted, need authority `create-container`" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Container image or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Container name already exists - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/user: - get: - tags: - - user-endpoint - summary: List users - description: "Lists users known to the metadata database. Internal users are\ - \ omitted from the result list. If the optional query parameter `username`\ - \ is present, the result list can be filtered by matching this exact username." - operationId: findAll_5 - parameters: - - name: username - in: query - required: false - schema: - type: string - responses: - "200": - description: List users - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/UserBriefDto" - /api/unit: - get: - tags: - - unit-endpoint - summary: List units - description: Lists units known to the metadata database. - operationId: findAll_6 - responses: - "200": - description: Find all semantic units - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/UnitDto" - /api/ontology/{ontologyId}/entity: - get: - tags: - - ontology-endpoint - summary: Find entities - description: Finds semantic entities by label or uri in an ontology with id. - Requires role `execute-semantic-query`. - operationId: find_7 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - - name: label - in: query - required: false - schema: - type: string - - name: uri - in: query - required: false - schema: - type: string - responses: - "200": - description: Found entities - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/EntityDto" - "400": - description: Filter params are invalid - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Generated query or uri is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/oai: - get: - tags: - - metadata-endpoint - summary: Get record - operationId: identify - parameters: - - name: verb - in: query - - name: parameters - in: query - required: true - schema: - $ref: "#/components/schemas/OaiListIdentifiersParameters" - responses: - "200": - description: List containers - content: - text/xml: - schema: - type: string - /api/message/message/{messageId}: - get: - tags: - - message-endpoint - summary: Find message - description: Finds a message with id in the metadata database. - operationId: find_8 - parameters: - - name: messageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Get messages - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageDto" - "404": - description: Could not find message - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - /api/license: - get: - tags: - - license-endpoint - summary: List licenses - description: Lists licenses known to the metadata database. - operationId: list_4 - responses: - "200": - description: List of licenses - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - /api/identifier/retrieve: - get: - tags: - - identifier-endpoint - summary: Retrieve PID metadata - description: "Retrieves Persistent Identifier (PID) metadata from external endpoints.\ - \ Supported PIDs are: ORCID, ROR, DOI." - operationId: retrieve - parameters: - - name: url - in: query - required: true - schema: - type: string - responses: - "200": - description: Retrieved metadata from identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "404": - description: Failed to find metadata for identifier - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - /api/database/{databaseId}: - get: - tags: - - database-endpoint - summary: Find database - description: Finds a database with id. - operationId: findById_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Database found successfully - headers: - X-Username: - description: The authentication username - style: simple - schema: - type: string - Access-Control-Expose-Headers: - description: Expose custom headers - style: simple - schema: - type: string - X-Password: - description: The authentication password - style: simple - schema: - type: string - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "403": - description: Not allowed to view database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/suggest: - get: - tags: - - table-endpoint - summary: Suggest semantics - description: Suggests semantic concepts for a table. This action can only be - performed by the table owner. Requires role `table-semantic-analyse`. - operationId: analyseTable - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Suggested table semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/EntityDto" - "400": - description: Failed to parse statistic in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not the table owner. - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Generated query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest: - get: - tags: - - table-endpoint - summary: Suggest semantics - description: Suggests column semantics. Requires role `table-semantic-analyse`. - operationId: analyseTableColumn - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: columnId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Suggested table column semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TableColumnEntityDto" - "400": - description: Generated query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/container/{containerId}: - get: - tags: - - container-endpoint - summary: Find container - description: Finds a container in the metadata database. - operationId: findById_3 - parameters: - - name: containerId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found container - content: - application/json: - schema: - $ref: "#/components/schemas/ContainerDto" - "404": - description: Container image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - delete: - tags: - - container-endpoint - summary: Delete container - description: Deletes a container in the metadata database. Requires role `delete-container`. - operationId: delete_6 - parameters: - - name: containerId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted container - "403": - description: "Create container not permitted, need authority `delete-container`" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Container not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/concept: - get: - tags: - - concept-endpoint - summary: List concepts - description: List all semantic concepts known to the metadata database - operationId: findAll_7 - responses: - "200": - description: List concepts - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ConceptDto" -components: - schemas: - UserAttributesDto: - type: object - properties: - theme: - type: string - example: light - orcid: - type: string - example: https://orcid.org/0000-0002-1825-0097 - affiliation: - type: string - example: Brown University - language: - type: string - example: en - required: - - language - - theme - UserDto: - type: object - properties: - id: - type: string - format: uuid - example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 - name: - type: string - example: Josiah Carberry - username: - type: string - example: username - password: - type: string - example: p4ssw0rd - attributes: - $ref: "#/components/schemas/UserAttributesDto" - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - required: - - attributes - - id - - password - - username - ApiErrorDto: - type: object - properties: - status: - type: string - enum: - - 100 CONTINUE - - 101 SWITCHING_PROTOCOLS - - 102 PROCESSING - - 103 EARLY_HINTS - - 103 CHECKPOINT - - 200 OK - - 201 CREATED - - 202 ACCEPTED - - 203 NON_AUTHORITATIVE_INFORMATION - - 204 NO_CONTENT - - 205 RESET_CONTENT - - 206 PARTIAL_CONTENT - - 207 MULTI_STATUS - - 208 ALREADY_REPORTED - - 226 IM_USED - - 300 MULTIPLE_CHOICES - - 301 MOVED_PERMANENTLY - - 302 FOUND - - 302 MOVED_TEMPORARILY - - 303 SEE_OTHER - - 304 NOT_MODIFIED - - 305 USE_PROXY - - 307 TEMPORARY_REDIRECT - - 308 PERMANENT_REDIRECT - - 400 BAD_REQUEST - - 401 UNAUTHORIZED - - 402 PAYMENT_REQUIRED - - 403 FORBIDDEN - - 404 NOT_FOUND - - 405 METHOD_NOT_ALLOWED - - 406 NOT_ACCEPTABLE - - 407 PROXY_AUTHENTICATION_REQUIRED - - 408 REQUEST_TIMEOUT - - 409 CONFLICT - - 410 GONE - - 411 LENGTH_REQUIRED - - 412 PRECONDITION_FAILED - - 413 PAYLOAD_TOO_LARGE - - 413 REQUEST_ENTITY_TOO_LARGE - - 414 URI_TOO_LONG - - 414 REQUEST_URI_TOO_LONG - - 415 UNSUPPORTED_MEDIA_TYPE - - 416 REQUESTED_RANGE_NOT_SATISFIABLE - - 417 EXPECTATION_FAILED - - 418 I_AM_A_TEAPOT - - 419 INSUFFICIENT_SPACE_ON_RESOURCE - - 420 METHOD_FAILURE - - 421 DESTINATION_LOCKED - - 422 UNPROCESSABLE_ENTITY - - 423 LOCKED - - 424 FAILED_DEPENDENCY - - 425 TOO_EARLY - - 426 UPGRADE_REQUIRED - - 428 PRECONDITION_REQUIRED - - 429 TOO_MANY_REQUESTS - - 431 REQUEST_HEADER_FIELDS_TOO_LARGE - - 451 UNAVAILABLE_FOR_LEGAL_REASONS - - 500 INTERNAL_SERVER_ERROR - - 501 NOT_IMPLEMENTED - - 502 BAD_GATEWAY - - 503 SERVICE_UNAVAILABLE - - 504 GATEWAY_TIMEOUT - - 505 HTTP_VERSION_NOT_SUPPORTED - - 506 VARIANT_ALSO_NEGOTIATES - - 507 INSUFFICIENT_STORAGE - - 508 LOOP_DETECTED - - 509 BANDWIDTH_LIMIT_EXCEEDED - - 510 NOT_EXTENDED - - 511 NETWORK_AUTHENTICATION_REQUIRED - example: NOT_FOUND - message: - type: string - example: Error message - code: - type: string - example: error.service.code - required: - - code - - message - - status - CreatorBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - required: - - creator_name - - id - DatabaseBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierBriefDto" - contact: - $ref: "#/components/schemas/UserBriefDto" - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - owner_id: - type: string - format: uuid - example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5 - preview_image: - type: string - required: - - contact - - id - - identifiers - - internal_name - - is_public - - is_schema_public - - name - - owner_id - IdentifierBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - type: - type: string - enum: - - database - - subset - - table - - view - example: database - creators: - type: array - items: - $ref: "#/components/schemas/CreatorBriefDto" - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - query_id: - type: string - format: uuid - example: 1 - table_id: - type: string - format: uuid - example: 1 - view_id: - type: string - format: uuid - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - owned_by: - type: string - format: uuid - example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5 - required: - - creators - - database_id - - descriptions - - id - - owned_by - - publication_year - - publisher - - status - - titles - - type - IdentifierDescriptionDto: - type: object - properties: - id: - type: string - format: uuid - example: e0e9692c-910b-4b60-b53a-fc7c358a917d - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - example: Abstract - required: - - id - IdentifierTitleDto: - type: object - properties: - id: - type: string - format: uuid - example: 70ce5164-fd74-413f-8712-f996b91defbf - title: - type: string - example: Airquality Demonstrator - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - required: - - id - UserBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 - username: - type: string - description: Only contains lowercase characters - example: jcarberry - name: - type: string - example: Josiah Carberry - orcid: - type: string - example: 0000-0002-1825-0097 - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - required: - - id - - username - DatabaseAccessDto: - type: object - properties: - user: - $ref: "#/components/schemas/UserBriefDto" - type: - type: string - enum: - - read - - write_own - - write_all - example: read - required: - - type - - user - UserUpdateDto: - type: object - properties: - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Brown University - orcid: - type: string - example: 0000-0002-1825-0097 - theme: - type: string - example: dark - language: - type: string - example: en - required: - - language - - theme - OntologyModifyDto: - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - rdf_path: - type: string - example: rdf/om-2.0.rdf - required: - - prefix - - uri - OntologyDto: - type: object - properties: - id: - type: string - format: uuid - example: 7c491e40-082a-47b8-b82c-51d03c520466 - uri: - type: string - example: http://www.wikidata.org/ - prefix: - type: string - example: wd - sparql: - type: boolean - example: true - rdf: - type: boolean - example: false - uri_pattern: - type: string - example: http://www.wikidata.org/entity/.* - sparql_endpoint: - type: string - example: https://query.wikidata.org/sparql - rdf_path: - type: string - example: rdf/om-2.0.rdf - required: - - id - - prefix - - rdf - - sparql - - uri - BannerMessageUpdateDto: - type: object - properties: - type: - type: string - enum: - - error - - warning - - info - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - display_start: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - display_end: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - required: - - message - - type - BannerMessageBriefDto: - type: object - properties: - type: - type: string - enum: - - error - - warning - - info - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - required: - - message - - type - ImageChangeDto: - type: object - properties: - registry: - type: string - example: docker.io/library - defaultPort: - type: integer - format: int32 - example: 5432 - maximum: 65535 - minimum: 1024 - dialect: - type: string - example: Postgres - driver_class: - type: string - example: org.postgresql.Driver - jdbc_method: - type: string - example: postgresql - required: - - dialect - - driver_class - - jdbc_method - - registry - DataTypeDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dcca - value: - type: string - example: time - documentation: - type: string - example: https://mariadb.com/kb/en/time/ - display_name: - type: string - example: TIME(fsp) - size_min: - type: integer - format: int32 - example: 0 - size_max: - type: integer - format: int32 - example: 6 - size_default: - type: integer - format: int32 - example: 0 - size_required: - type: boolean - example: false - d_min: - type: integer - format: int32 - d_max: - type: integer - format: int32 - d_default: - type: integer - format: int32 - d_required: - type: boolean - data_hint: - type: string - example: "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S" - type_hint: - type: string - example: "fsp=microsecond precision, min. 0, max. 6" - is_quoted: - type: boolean - description: frontend needs to quote this data type - example: false - is_buildable: - type: boolean - description: frontend can build this data type - example: true - required: - - display_name - - documentation - - id - - is_buildable - - is_quoted - - value - ImageDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dcce - name: - type: string - example: mariadb - version: - type: string - example: 10.5 - operators: - type: array - items: - $ref: "#/components/schemas/OperatorDto" - default: - type: boolean - example: false - data_types: - type: array - items: - $ref: "#/components/schemas/DataTypeDto" - required: - - data_types - - default - - id - - name - - operators - - version - OperatorDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dccf - value: - type: string - example: XOR - documentation: - type: string - example: https://mariadb.com/kb/en/xor/ - display_name: - type: string - example: XOR - required: - - display_name - - documentation - - id - - value - IdentifierSaveDto: - type: object - properties: - id: - type: string - format: uuid - example: 68e11675-1e0f-4d24-a6d9-887ad1c4445d - type: - type: string - enum: - - database - - subset - - table - - view - example: database - doi: - type: string - example: 10.1111/11111111 - titles: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierFunderDto" - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - publisher: - type: string - example: TU Wien - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - creators: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierCreatorDto" - database_id: - type: string - format: uuid - example: null - query_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - related_identifiers: - type: array - items: - $ref: "#/components/schemas/SaveRelatedIdentifierDto" - required: - - creators - - database_id - - id - - publication_year - - publisher - - titles - - type - LicenseDto: - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - description: - type: string - example: "A short and simple permissive license with conditions only requiring\ - \ preservation of copyright and license notices. Licensed works, modifications,\ - \ and larger works may be distributed under different terms and without\ - \ source code." - required: - - identifier - - uri - SaveIdentifierCreatorDto: - type: object - properties: - id: - type: string - format: uuid - example: da9dd034-00a8-4517-b93d-d1b2adfee418 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - affiliation_identifier: - type: string - example: https://ror.org/04d836q62 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - required: - - creator_name - - id - SaveIdentifierDescriptionDto: - type: object - properties: - id: - type: string - format: uuid - example: 35bd84d8-b181-43c8-b786-4d024e4f843c - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - example: Abstract - required: - - description - - id - SaveIdentifierFunderDto: - type: object - properties: - id: - type: string - format: uuid - example: 1c6b9212-a315-44b9-946c-3682a7a0e517 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - example: Crossref Funder ID - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: 824087 - award_title: - type: string - example: EOSC-Life - required: - - funder_name - - id - SaveIdentifierTitleDto: - type: object - properties: - id: - type: string - format: uuid - example: 2af9f40e-eaf5-4ea1-861a-1a696587bf29 - title: - type: string - example: Airquality Demonstrator - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - example: Subtitle - required: - - id - - title - SaveRelatedIdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: 5bb272c7-7421-4f74-83ac-0486812d0f44 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - example: DOI - relation: - type: string - enum: - - IsCitedBy - - Cites - - IsSupplementTo - - IsSupplementedBy - - IsContinuedBy - - Continues - - IsDescribedBy - - Describes - - HasMetadata - - IsMetadataFor - - HasVersion - - IsVersionOf - - IsNewVersionOf - - IsPreviousVersionOf - - IsPartOf - - HasPart - - IsPublishedIn - - IsReferencedBy - - References - - IsDocumentedBy - - Documents - - IsCompiledBy - - Compiles - - IsVariantFormOf - - IsOriginalFormOf - - IsIdenticalTo - - IsReviewedBy - - Reviews - - IsDerivedFrom - - IsSourceOf - - IsRequiredBy - - Requires - - IsObsoletedBy - - Obsoletes - example: Cites - required: - - id - - relation - - type - - value - CreatorDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - name_identifier_scheme_uri: - type: string - example: https://orcid.org/ - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - affiliation_identifier_scheme_uri: - type: string - example: https://ror.org/ - required: - - creator_name - - id - IdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - links: - $ref: "#/components/schemas/LinksDto" - type: - type: string - enum: - - database - - subset - - table - - view - example: database - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/IdentifierFunderDto" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - owner: - $ref: "#/components/schemas/UserBriefDto" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - creators: - type: array - items: - $ref: "#/components/schemas/CreatorDto" - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: null - query_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related_identifiers: - type: array - items: - $ref: "#/components/schemas/RelatedIdentifierDto" - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5 - result_number: - type: integer - format: int64 - example: 1 - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - required: - - creators - - database_id - - descriptions - - funders - - id - - language - - licenses - - links - - owner - - publication_year - - publisher - - query - - query_hash - - query_normalized - - status - - titles - - type - IdentifierFunderDto: - type: object - properties: - id: - type: string - format: uuid - example: 39693413-e0ce-46da-ad5e-029c0556d439 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - example: Crossref Funder ID - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: 824087 - award_title: - type: string - example: EOSC-Life - required: - - funder_name - - id - LinksDto: - type: object - properties: - self: - type: string - example: http://example.com/api/ - data: - type: string - example: http://example.com - self_html: - type: string - example: http://example.com - dashboard_html: - type: string - example: http://example.com/d/defi2baxqawaod - required: - - self - - self_html - RelatedIdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: ce9d11f0-60a2-448d-a3e4-44719a443e8a - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - example: DOI - relation: - type: string - enum: - - IsCitedBy - - Cites - - IsSupplementTo - - IsSupplementedBy - - IsContinuedBy - - Continues - - IsDescribedBy - - Describes - - HasMetadata - - IsMetadataFor - - HasVersion - - IsVersionOf - - IsNewVersionOf - - IsPreviousVersionOf - - IsPartOf - - HasPart - - IsPublishedIn - - IsReferencedBy - - References - - IsDocumentedBy - - Documents - - IsCompiledBy - - Compiles - - IsVariantFormOf - - IsOriginalFormOf - - IsIdenticalTo - - IsReviewedBy - - Reviews - - IsDerivedFrom - - IsSourceOf - - IsRequiredBy - - Requires - - IsObsoletedBy - - Obsoletes - example: Cites - required: - - id - - relation - - type - - value - DatabaseModifyVisibilityDto: - type: object - properties: - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - is_dashboard_enabled: - type: boolean - example: true - required: - - is_dashboard_enabled - - is_public - - is_schema_public - ViewUpdateDto: - type: object - properties: - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - is_public - - is_schema_public - ViewBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 787439d0-e85e-400c-a7e6-996a023bfad9 - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - database_id: - type: string - format: uuid - example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4 - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - query_hash: - type: string - example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 - owned_by: - type: string - format: uuid - example: ac750fcf-ea02-4fce-85ac-d73857e18b35 - required: - - database_id - - id - - internal_name - - name - - query - - query_hash - TableUpdateDto: - type: object - properties: - description: - type: string - example: Air Quality in Austria - maxLength: 180 - minLength: 0 - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - is_public - - is_schema_public - TableBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 41ed10e0-687b-4e18-8521-810f5cffbce1 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - database_id: - type: string - format: uuid - example: a8fec026-dfaf-4b1d-8f6c-f01720d91705 - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - owned_by: - type: string - format: uuid - example: 78337b80-5699-45db-8111-cec86439ab6b - required: - - database_id - - id - - internal_name - - is_public - - is_schema_public - - is_versioned - - name - - owned_by - ColumnSemanticsUpdateDto: - type: object - properties: - concept_uri: - type: string - unit_uri: - type: string - ColumnDto: - type: object - properties: - id: - type: string - format: uuid - example: a453e444-e00d-41ca-902c-11e9c54b39f1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - alias: - type: string - example: firstname - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - mean: - type: number - example: 45.4 - median: - type: number - example: 51 - concept: - $ref: "#/components/schemas/ConceptBriefDto" - unit: - $ref: "#/components/schemas/UnitBriefDto" - description: - type: string - example: Column comment - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/EnumDto" - sets: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/SetDto" - database_id: - type: string - format: uuid - example: 911f9052-c58c-4e1c-b3f2-66af2107be16 - table_id: - type: string - format: uuid - example: bfffa915-a547-4466-9c65-ddc0d38fdb08 - ord: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - index_length: - type: integer - format: int64 - example: 255 - length: - type: integer - format: int64 - example: 255 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - data_length: - type: integer - format: int64 - example: 34300 - max_data_length: - type: integer - format: int64 - example: 34300 - num_rows: - type: integer - format: int64 - example: 32 - val_min: - type: number - example: 0 - val_max: - type: number - example: 100 - std_dev: - type: number - example: 5.32 - is_null_allowed: - type: boolean - example: false - required: - - database_id - - id - - internal_name - - is_null_allowed - - name - - ord - - table_id - - type - ConceptBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 8cabc011-4bdf-44d4-9d33-b2648e2ddbf1 - uri: - type: string - example: http://www.wikidata.org/entity/Q202444 - name: - type: string - example: given name - description: - type: string - example: "name typically used to differentiate people from the same family,\ - \ clan, or other social group who have a common last name" - required: - - id - - uri - EnumDto: - type: object - properties: - id: - type: string - format: uuid - example: 5343bb3d-14d3-4eb7-a86f-b8fc553cb315 - value: - type: string - example: 3 - required: - - id - - value - SetDto: - type: object - properties: - id: - type: string - format: uuid - example: 7eb4eded-bacc-4a91-84db-a9ae6ddafda7 - value: - type: string - example: 3 - required: - - id - - value - UnitBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: ba1935e8-6817-488f-af0a-f54389af9000 - uri: - type: string - example: http://www.wikidata.org/entity/Q1422583 - name: - type: string - example: importance - description: - type: string - example: "subjective magnitude of value, meaning, or purpose" - required: - - id - - uri - DatabaseTransferDto: - type: object - properties: - id: - type: string - format: uuid - required: - - id - DatabaseModifyImageDto: - type: object - properties: - key: - type: string - DatabaseModifyDashboardDto: - type: object - properties: - uid: - type: string - required: - - uid - CreateAccessDto: - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - example: read - required: - - type - OntologyCreateDto: - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - required: - - prefix - - uri - BannerMessageCreateDto: - type: object - properties: - type: - type: string - enum: - - error - - warning - - info - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - display_start: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - display_end: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - required: - - message - - type - ImageCreateDto: - type: object - properties: - registry: - type: string - example: docker.io/library - name: - type: string - example: mariadb - version: - type: string - dialect: - type: string - is_default: - type: boolean - example: false - driver_class: - type: string - jdbc_method: - type: string - default_port: - type: integer - format: int32 - maximum: 65535 - minimum: 1024 - required: - - default_port - - dialect - - driver_class - - is_default - - jdbc_method - - name - - registry - - version - CreateIdentifierDto: - type: object - properties: - type: - type: string - enum: - - database - - subset - - table - - view - example: database - doi: - type: string - example: 10.1111/11111111 - titles: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierFunderDto" - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - publisher: - type: string - example: TU Wien - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - creators: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierCreatorDto" - database_id: - type: string - format: uuid - example: d002e8d5-8db4-4ff7-ab3a-bc3f52d9ec44 - query_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - related_identifiers: - type: array - items: - $ref: "#/components/schemas/SaveRelatedIdentifierDto" - required: - - creators - - database_id - - publication_year - - publisher - - titles - - type - CreateDatabaseDto: - type: object - properties: - name: - type: string - example: Air Quality - container_id: - type: string - format: uuid - example: 0888e108-d521-46e2-9d3e-82099185305b - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - container_id - - is_public - - is_schema_public - - name - CreateViewDto: - type: object - properties: - name: - type: string - example: Air Quality - maxLength: 63 - minLength: 1 - query: - $ref: "#/components/schemas/SubsetDto" - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - is_public - - is_schema_public - - name - - query - FilterDto: - type: object - properties: - type: - type: string - enum: - - where - - or - - and - example: where - value: - type: string - example: 1 - column_id: - type: string - format: uuid - example: 14128033-54b5-4818-a489-21b0dded86e2 - operator_id: - type: string - format: uuid - example: 67c5b54d-2eb0-4f42-8dc1-a504562e9f32 - required: - - column_id - - operator_id - - type - - value - OrderDto: - type: object - properties: - direction: - type: string - enum: - - asc - - desc - example: asc - column_id: - type: string - format: uuid - example: e891ba86-0258-41a6-a8d9-ff58bc10b618 - required: - - column_id - SubsetDto: - type: object - properties: - columns: - type: array - example: - - e891ba86-0258-41a6-a8d9-ff58bc10b618 - items: - type: string - format: uuid - filter: - type: array - items: - $ref: "#/components/schemas/FilterDto" - order: - type: array - items: - $ref: "#/components/schemas/OrderDto" - datasource_id: - type: string - format: uuid - example: f7df2a7d-4ade-4c78-97b0-7c744d0893c7 - datasource_type: - type: string - enum: - - table - - view - required: - - columns - - datasource_id - - datasource_type - CreateForeignKeyDto: - type: object - properties: - columns: - type: array - example: - - id - items: - type: string - referenced_table: - type: string - example: sensor - referenced_columns: - type: array - example: - - other_id - items: - type: string - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: cascade - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: cascade - required: - - columns - - referenced_columns - - referenced_table - CreateTableColumnDto: - type: object - properties: - name: - type: string - example: Date - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - description: - type: string - example: Formatted as YYYY-MM-dd - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - type: string - sets: - type: array - description: "set values, only considered when type = SET" - items: - type: string - index_length: - type: integer - format: int64 - null_allowed: - type: boolean - example: true - concept_uri: - type: string - unit_uri: - type: string - required: - - name - - null_allowed - - type - CreateTableConstraintsDto: - type: object - properties: - uniques: - type: array - items: - type: array - items: - type: string - checks: - type: array - items: - type: string - uniqueItems: true - foreign_keys: - type: array - items: - $ref: "#/components/schemas/CreateForeignKeyDto" - primary_key: - type: array - items: - type: string - uniqueItems: true - required: - - checks - - foreign_keys - - primary_key - - uniques - CreateTableDto: - type: object - properties: - name: - type: string - example: Air Quality - maxLength: 64 - minLength: 1 - description: - type: string - example: Air Quality in Austria - maxLength: 180 - minLength: 0 - columns: - type: array - items: - $ref: "#/components/schemas/CreateTableColumnDto" - constraints: - $ref: "#/components/schemas/CreateTableConstraintsDto" - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - columns - - constraints - - is_public - - is_schema_public - - name - CreateContainerDto: - type: object - properties: - name: - type: string - example: Air Quality - host: - type: string - description: Hostname of container - example: data-db2 - port: - type: integer - format: int32 - description: Port of container - example: 3306 - quota: - type: integer - format: int64 - example: 50 - image_id: - type: string - format: uuid - description: Image ID - example: 2360f3c4-85e0-4fac-a7c6-73b296b9dde2 - ui_host: - type: string - example: example.com - ui_port: - type: integer - format: int32 - example: 3306 - privileged_username: - type: string - description: Username of privileged user - example: root - privileged_password: - type: string - description: Password of privileged user - example: dbrepo - required: - - host - - image_id - - name - - privileged_password - - privileged_username - - quota - ContainerDto: - type: object - properties: - id: - type: string - format: uuid - example: 7ddb7e87-b965-43a2-9a24-4fa406d998f4 - name: - type: string - example: Air Quality - image: - $ref: "#/components/schemas/ImageDto" - quota: - type: integer - format: int64 - example: 50 - count: - type: integer - format: int64 - example: 10 - username: - type: string - example: username - password: - type: string - example: p4ssw0rd - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - internal_name: - type: string - example: air_quality - required: - - count - - id - - image - - internal_name - - name - ColumnBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: a453e444-e00d-41ca-902c-11e9c54b39f1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - alias: - type: string - example: firstname - database_id: - type: string - format: uuid - example: 911f9052-c58c-4e1c-b3f2-66af2107be16 - table_id: - type: string - format: uuid - example: bfffa915-a547-4466-9c65-ddc0d38fdb08 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - required: - - database_id - - id - - internal_name - - name - - table_id - - type - UnitDto: - type: object - properties: - id: - type: string - format: uuid - example: ba1935e8-6817-488f-af0a-f54389af9000 - uri: - type: string - name: - type: string - description: - type: string - columns: - type: array - items: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - columns - - id - - uri - OntologyBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 7c491e40-082a-47b8-b82c-51d03c520466 - uri: - type: string - example: http://www.wikidata.org/ - prefix: - type: string - example: wd - sparql: - type: boolean - example: true - rdf: - type: boolean - example: false - uri_pattern: - type: string - example: http://www.wikidata.org/entity/.* - required: - - id - - prefix - - rdf - - sparql - - uri - EntityDto: - type: object - properties: - uri: - type: string - example: https://www.wikidata.org/entity/Q1686799 - label: - type: string - example: Apache Jena - description: - type: string - example: open source semantic web framework for Java - required: - - label - - uri - OaiListIdentifiersParameters: - type: object - properties: - metadataPrefix: - type: string - from: - type: string - until: - type: string - set: - type: string - resumptionToken: - type: string - fromDate: - type: string - format: date-time - untilDate: - type: string - format: date-time - parametersString: - type: string - BannerMessageDto: - type: object - properties: - id: - type: string - format: uuid - example: ae3f795b-a3da-4ebe-bdc4-21a8ce631e6f - type: - type: string - enum: - - error - - warning - - info - example: WARNING - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - display_start: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - display_end: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - required: - - id - - message - - type - ImageBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dcce - name: - type: string - example: mariadb - version: - type: string - example: 10.5 - default: - type: boolean - example: false - required: - - default - - id - - name - - version - LdCreatorDto: - type: object - properties: - name: - type: string - sameAs: - type: string - givenName: - type: string - familyName: - type: string - '@type': - type: string - required: - - '@type' - - name - LdDatasetDto: - type: object - properties: - name: - type: string - description: - type: string - url: - type: string - identifier: - type: array - items: - type: string - license: - type: string - creator: - type: array - items: - $ref: "#/components/schemas/LdCreatorDto" - citation: - type: string - hasPart: - type: array - items: - $ref: "#/components/schemas/LdDatasetDto" - temporalCoverage: - type: string - version: - type: string - format: date-time - '@context': - type: string - '@type': - type: string - required: - - '@context' - - '@type' - - citation - - creator - - description - - hasPart - - identifier - - name - - temporalCoverage - - url - - version - ViewColumnDto: - type: object - properties: - id: - type: string - format: uuid - example: 6aec3a91-2e0b-4e92-a16a-9c3c5e892da1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - description: - type: string - example: Column comment - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/EnumDto" - sets: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/SetDto" - database_id: - type: string - format: uuid - example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4 - ord: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - index_length: - type: integer - format: int64 - example: 255 - length: - type: integer - format: int64 - example: 255 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - is_null_allowed: - type: boolean - example: false - required: - - database_id - - id - - internal_name - - is_null_allowed - - name - - ord - - type - ViewDto: - type: object - properties: - id: - type: string - format: uuid - example: 787439d0-e85e-400c-a7e6-996a023bfad9 - name: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierDto" - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - owner: - $ref: "#/components/schemas/UserBriefDto" - columns: - type: array - items: - $ref: "#/components/schemas/ViewColumnDto" - created: - type: string - format: date-time - example: 2022-01-01 08:00:00.000 - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - query_hash: - type: string - example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 - required: - - columns - - created - - database_id - - id - - identifiers - - internal_name - - name - - owner - - query - - query_hash - ConstraintsDto: - type: object - properties: - uniques: - type: array - items: - $ref: "#/components/schemas/UniqueDto" - checks: - type: array - example: - - value > 1 - items: - type: string - uniqueItems: true - foreign_keys: - type: array - items: - $ref: "#/components/schemas/ForeignKeyDto" - primary_key: - type: array - items: - $ref: "#/components/schemas/PrimaryKeyDto" - uniqueItems: true - ForeignKeyBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: f2b740ec-0b13-4d07-88a9-529d354bba6a - ForeignKeyDto: - type: object - properties: - id: - type: string - format: uuid - example: f2b740ec-0b13-4d07-88a9-529d354bba6a - name: - type: string - example: fk_name - references: - type: array - items: - $ref: "#/components/schemas/ForeignKeyReferenceDto" - table: - $ref: "#/components/schemas/TableBriefDto" - referenced_table: - $ref: "#/components/schemas/TableBriefDto" - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: restrict - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: restrict - required: - - name - - referenced_table - - references - - table - ForeignKeyReferenceDto: - type: object - properties: - id: - type: string - format: uuid - example: f2b740ec-0b13-4d07-88a9-529d354bba6a - column: - $ref: "#/components/schemas/ColumnBriefDto" - foreign_key: - $ref: "#/components/schemas/ForeignKeyBriefDto" - referenced_column: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - column - - foreign_key - - referenced_column - PrimaryKeyDto: - type: object - properties: - id: - type: string - format: uuid - example: d984f9d7-e8a7-4b81-b59a-862db1871f18 - table: - $ref: "#/components/schemas/TableBriefDto" - column: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - column - - table - TableDto: - type: object - properties: - id: - type: string - format: uuid - example: d346f844-b84c-490f-9aec-725a2dc8f820 - name: - type: string - example: Air Quality - alias: - type: string - example: a - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierDto" - owner: - $ref: "#/components/schemas/UserBriefDto" - description: - type: string - example: Air Quality in Austria - maxLength: 2048 - minLength: 0 - columns: - type: array - items: - $ref: "#/components/schemas/ColumnDto" - constraints: - $ref: "#/components/schemas/ConstraintsDto" - created: - type: string - format: date-time - example: 2022-01-01 08:00:00.000 - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - queue_name: - type: string - example: air_quality - queue_type: - type: string - example: quorum - routing_key: - type: string - example: dbrepo.1.2 - is_public: - type: boolean - example: true - num_rows: - type: integer - format: int64 - example: 5 - data_length: - type: integer - format: int64 - description: in bytes - example: 16384 - max_data_length: - type: integer - format: int64 - description: in bytes - example: 0 - avg_row_length: - type: integer - format: int64 - description: in bytes - example: 3276 - required: - - columns - - constraints - - created - - database_id - - id - - internal_name - - is_public - - is_schema_public - - is_versioned - - name - - owner - - queue_name - - routing_key - UniqueDto: - type: object - properties: - id: - type: string - format: uuid - example: d984f9d7-e8a7-4b81-b59a-862db1871f13 - name: - type: string - example: uk_name - table: - $ref: "#/components/schemas/TableBriefDto" - columns: - type: array - items: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - columns - - id - - name - - table - TableColumnEntityDto: - type: object - properties: - uri: - type: string - example: https://www.wikidata.org/entity/Q1686799 - label: - type: string - example: Apache Jena - description: - type: string - example: open source semantic web framework for Java - database_id: - type: string - format: uuid - example: 475b4107-a64d-4495-a7ef-3cb0dadd4804 - table_id: - type: string - format: uuid - example: 9a9208af-90ea-4382-9a11-0c8f6d89bd1f - column_id: - type: string - format: uuid - example: 297860e3-3b29-451c-ae8a-a85ed5941018 - required: - - column_id - - database_id - - table_id - - uri - ContainerBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 7ddb7e87-b965-43a2-9a24-4fa406d998f4 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - image: - $ref: "#/components/schemas/ImageBriefDto" - quota: - type: integer - format: int32 - example: 50 - count: - type: integer - format: int32 - example: 10 - internal_name: - type: string - example: air-quality - required: - - count - - hash - - id - - image - - internal_name - - name - - quota - ConceptDto: - type: object - properties: - id: - type: string - format: uuid - example: 8cabc011-4bdf-44d4-9d33-b2648e2ddbf1 - uri: - type: string - name: - type: string - description: - type: string - columns: - type: array - items: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - columns - - id - - uri - securitySchemes: - basicAuth: - type: http - scheme: basic - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.openapi/api-search.yaml b/.docs/.openapi/api-search-service.yaml similarity index 99% rename from .docs/.openapi/api-search.yaml rename to .docs/.openapi/api-search-service.yaml index 4e2eb82ce413b578f0cb6d7b36b8bf819c8cadd2..8c0d8b0a1c4f59745153b0c822990f430417cf13 100644 --- a/.docs/.openapi/api-search.yaml +++ b/.docs/.openapi/api-search-service.yaml @@ -128,7 +128,7 @@ "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "title": "Database Repository Search Service API", - "version": "1.8.1" + "version": "1.8.2" }, "openapi": "3.0.0", "paths": { diff --git a/.docs/.openapi/api.base.yaml b/.docs/.openapi/api.base.yaml index cbb093262e474657926eb0e9f917d1f445988837..b0e7470af3323c49abb3f7ea4c5f722022efa1ad 100644 --- a/.docs/.openapi/api.base.yaml +++ b/.docs/.openapi/api.base.yaml @@ -24,7 +24,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: DBRepo REST API - version: 1.8.1 + version: 1.8.2 openapi: 3.1.0 servers: - description: Test Instance diff --git a/.docs/.openapi/api.yaml b/.docs/.openapi/api.yaml index d68683f51e263e332f29c29bd76bb45f6cb0ee00..e93b918845001cec1c4d769e76ad50235544d8a4 100644 --- a/.docs/.openapi/api.yaml +++ b/.docs/.openapi/api.yaml @@ -16,7 +16,7 @@ info: name: Apache 2.0 url: 'https://www.apache.org/licenses/LICENSE-2.0' title: DBRepo REST API - version: 1.8.1 + version: 1.8.2 servers: - description: Test Instance url: 'https://test.dbrepo.tuwien.ac.at' @@ -1193,8 +1193,8 @@ paths: $ref: '#/components/schemas/ApiErrorDto' '404': description: >- - Failed to find database in metadata database or query in query store - of the data database + Failed to find database or user in metadata database or query in + query store of the data database content: application/json: schema: @@ -5252,7 +5252,7 @@ components: execution: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' query: type: string example: SELECT `id` FROM `air_quality` @@ -5430,7 +5430,7 @@ components: execution: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' doi: type: string example: 10.1038/nphys1170 @@ -5991,11 +5991,11 @@ components: created: type: string format: date-time - example: '2022-01-01T08:00:00.000Z' + example: '2022-01-01 08:00:00.000' last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' database_id: type: string format: uuid @@ -6088,7 +6088,6 @@ components: - column_id - operator_id - type - - value OrderDto: type: object properties: @@ -6141,7 +6140,7 @@ components: timestamp: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' event: type: string enum: @@ -6206,7 +6205,7 @@ components: last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' qualified_name: type: string example: Josiah Carberry — @jcarberry @@ -6376,11 +6375,11 @@ components: display_start: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' display_end: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' required: - message - type @@ -7778,11 +7777,11 @@ components: display_start: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' display_end: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' required: - message - type @@ -8376,7 +8375,7 @@ components: last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' internal_name: type: string example: air_quality @@ -8532,14 +8531,14 @@ components: type: string resumptionToken: type: string + parametersString: + type: string fromDate: type: string format: date-time untilDate: type: string format: date-time - parametersString: - type: string BannerMessageDto: type: object properties: @@ -8566,11 +8565,11 @@ components: display_start: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' display_end: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' required: - id - message @@ -8793,11 +8792,11 @@ components: created: type: string format: date-time - example: '2022-01-01T08:00:00.000Z' + example: '2022-01-01 08:00:00.000' last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' database_id: type: string format: uuid diff --git a/.docs/.openapi/openapi-generate.sh b/.docs/.openapi/openapi-generate.sh index aeab907799cf93e130b1a0596cdca7e68c34116d..4ed8d11c8fbd8c2049e377b5c27b4010fba3d00f 100644 --- a/.docs/.openapi/openapi-generate.sh +++ b/.docs/.openapi/openapi-generate.sh @@ -1,24 +1,51 @@ #!/bin/bash -declare -A services -services[4050]=analyse -services[4060]=search -services[4070]=dashboard -services[9093]=data -services[9099]=metadata +ENDPOINTS="analyse-service:8080,search-service:8080,dashboard-service:8080,data-service:8080,metadata-service:8080" # requires https://github.com/mikefarah/yq/ -> v4.44.3 +function ip () { + HOSTNAME=$(hostname $1) + IP=$(docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "dbrepo-$HOSTNAME") + echo $IP +} + function retrieve () { - if [[ "$2" == analyse ]] || [[ "$2" == search ]] || [[ "$2" == dashboard ]]; then - echo "... retrieve json api from localhost:$1" - curl -sSL "http://localhost:$1/api-$2.json" | yq -o=json - > "./.docs/.openapi/api-$2.yaml" + IP=$(ip $1) + if [[ $IP == "" ]]; then + echo "FATAL: failed to find ip for endpoint: $1" + exit 1 + fi + URL=$(url $1) + HOSTNAME=$(hostname $1) + echo "... retrieve json api from URL: $URL" + touch "./.docs/.openapi/api-$HOSTNAME.yaml" + curl -sSL $URL | yq -o=json - > "./.docs/.openapi/api-$HOSTNAME.yaml" +} + +function url () { + HOSTNAME=$(hostname $1) + PORT=$(port $1) + if [[ "$HOSTNAME" == "analyse-service" ]] || [[ "$HOSTNAME" == "search-service" ]] || [[ "$HOSTNAME" == "dashboard-service" ]]; then + echo "http://$IP:$PORT/api-docs.json" else - echo "... retrieve yaml api from localhost:$1" - curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/.openapi/api-$2.yaml" + echo "http://$IP:$PORT/v3/api-docs.yaml" fi } -for key in "${!services[@]}"; do - echo "Generating ${services[$key]} API" - retrieve "$key" "${services[$key]}" -done +function hostname () { + IN="$1" + arrIN=(${IN//:/ }) + echo ${arrIN[0]} +} + +function port () { + IN="$1" + arrIN=(${IN//:/ }) + echo ${arrIN[1]} +} + +IFS=',' read -ra ARR <<< "$ENDPOINTS" +for ENDPOINT in "${ARR[@]}"; do + echo "Request OpenAPI definition for endpoint: $ENDPOINT" + retrieve $ENDPOINT +done \ No newline at end of file diff --git a/.docs/.openapi/openapi-merge.json b/.docs/.openapi/openapi-merge.json index 6e41b75f580bb4e49a068f30665436632fca5acb..32dd1991c6dcf0d6229b6659028ef32f37154cb3 100644 --- a/.docs/.openapi/openapi-merge.json +++ b/.docs/.openapi/openapi-merge.json @@ -4,16 +4,16 @@ "inputFile": "./api.base.yaml" }, { - "inputFile": "./api-analyse.yaml" + "inputFile": "./api-analyse-service.yaml" }, { - "inputFile": "./api-data.yaml" + "inputFile": "./api-data-service.yaml" }, { - "inputFile": "./api-metadata.yaml" + "inputFile": "./api-metadata-service.yaml" }, { - "inputFile": "./api-search.yaml" + "inputFile": "./api-search-service.yaml" } ], "output": "./api.yaml" diff --git a/.docs/api/analyse-service.md b/.docs/api/analyse-service.md index 0b8bf886f35dc19f3d3d1e1c7ada59e30a929975..ebb7ee3ed9b6a40ac6a629d9c40f99b5393f939a 100644 --- a/.docs/api/analyse-service.md +++ b/.docs/api/analyse-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1`](https://hub.docker.com/r/dbrepo/analyse-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.2`](https://hub.docker.com/r/dbrepo/analyse-service) * Ports: 5000/tcp * Prometheus: `http://<hostname>:5000/metrics` diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md index 50193a54e6b35a2034b8367d4be7d89150f49161..0a09406d806b1540408944c9d3d087fb9a59ba5a 100644 --- a/.docs/api/data-service.md +++ b/.docs/api/data-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1`](https://hub.docker.com/r/dbrepo/data-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.2`](https://hub.docker.com/r/dbrepo/data-service) * Ports: 9093/tcp * Info: `http://<hostname>:9093/actuator/info` diff --git a/.docs/api/metadata-service.md b/.docs/api/metadata-service.md index 435ef9cdd1dba538e8e3593224a620d22ae17c89..c040eeb3b24b07c5a3351d26aedd75d1dbbcd507 100644 --- a/.docs/api/metadata-service.md +++ b/.docs/api/metadata-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1`](https://hub.docker.com/r/dbrepo/metadata-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.2`](https://hub.docker.com/r/dbrepo/metadata-service) * Ports: 9099/tcp * Info: `http://<hostname>:9099/actuator/info` diff --git a/.docs/api/search-service.md b/.docs/api/search-service.md index 22cf6e71b520c02cedb4051d959c9c972a396854..1745cf55182aa598b4c262b3f2e73deb392baf24 100644 --- a/.docs/api/search-service.md +++ b/.docs/api/search-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1`](https://hub.docker.com/r/dbrepo/search-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.2`](https://hub.docker.com/r/dbrepo/search-service) * Ports: 4000/tcp * Health: `http://<hostname>:4000/api/search/health` diff --git a/.docs/api/ui.md b/.docs/api/ui.md index ddc8b9d88331c4d41be690651a079bbff105d672..fab9e54324b5ee5ac72c07c4a3b30f2f14e6093a 100644 --- a/.docs/api/ui.md +++ b/.docs/api/ui.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1`](https://hub.docker.com/r/dbrepo/ui) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.2`](https://hub.docker.com/r/dbrepo/ui) * Ports: 3000/tcp diff --git a/.docs/changelog.md b/.docs/changelog.md index 1f4a4ed9040a1b623f9179035c1f11b576b88034..64cbfeac1fc195a6e697887bec9b11fee69574ea 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,6 +2,25 @@ author: Martin Weise --- +## v1.8.2 (2025-05-15) + +#### Fixes + +* Fixed a bug in the UI where the resource status was displayed as identifier when a draft identifier has been created. + +#### Features + +* Added structured logging through the `fluentd` protocol via the lightweight fluentbit in a + separate [Logging Service](../api/logging-service) + in [#524](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/524). +* Added a separate database for the Dashboard Service for high-availability deployment of Grafana + in [#526](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/526). + +#### Changes + +* Improved internal packaging mechanism that is compatible with multiarch deployments + in [#523](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/523). + ## v1.8.1 (2025-04-13) #### Changes diff --git a/.docs/concepts/logging.md b/.docs/concepts/logging.md new file mode 100644 index 0000000000000000000000000000000000000000..b13328c18a36aa549d3c6afc6a235cbc267b28dc --- /dev/null +++ b/.docs/concepts/logging.md @@ -0,0 +1,37 @@ +--- +author: Martin Weise +--- + +:octicons-tag-16:{ title="Minimum version" } 1.8.2 + +DBRepo uses the lightweight open-source logging framework [fluentbit](https://fluentbit.io) to collect, parse and +forward logs to the [Search Database](../../api/search-db). + +!!! info "Only available in the Kubernetes deployment" + +## Collection + +Logs are collected with a sidecar in each pod. They are collected with the `tail` plugin from the log files. +For the Data-, Metadata-, Analyse-, Dashboard- and Search Services, the application log is located in +`/var/log/app/service/<name>/app.log` (e.g. `/var/log/app/service/search/app.log` for the Search Service). + +## Parse + +The logs are parsed directly in the config file of the sidecar. The config file is always located in +`/opt/bitnami/fluent-bit/conf/parsers.conf` and contains the parsing regex. By default, the pre-defined `docker` +parser is used that performs lightweight parsing by just parsing the logs as JSON. + +## Storage + +After parsing, the logs are sent to the [Search Database](../../api/search-db) where they are stored as documents in +the index `logging`. + +## Insights + +The logs can be inspected in the operational dashboard in `https://<hostname>/dashboard/d/aejhojr0mrpj4c` to gain +insight on potential errors. + +<figure markdown> + +<figcaption>Figure 1: Operational Dashboard for Logging</figcaption> +</figure> diff --git a/.docs/images/architecture.drawio b/.docs/images/architecture.drawio index 2559a653790f7a5de96948d00394017982d8073a..bc93b1622773bfa8eca538dadb348868e5905ffd 100644 --- a/.docs/images/architecture.drawio +++ b/.docs/images/architecture.drawio @@ -1,12 +1,9 @@ -<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.2 Chrome/134.0.6998.178 Electron/35.1.2 Safari/537.36" version="26.2.2" pages="9"> +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.15 Chrome/134.0.6998.205 Electron/35.2.1 Safari/537.36" version="26.2.15" pages="9"> <diagram id="mvBsv1rP8O80Qe3yGnn_" name="docker-compose"> - <mxGraphModel dx="985" dy="565" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> + <mxGraphModel dx="982" dy="396" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-26" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" parent="1" vertex="1"> - <mxGeometry x="700" y="574.61" width="150" height="105" as="geometry" /> - </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;jumpStyle=arc;startArrow=classic;startFill=1;" parent="1" source="FWEJ_FGA9GBXbfwohBE8-101" target="FWEJ_FGA9GBXbfwohBE8-119" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> @@ -135,13 +132,13 @@ <mxPoint x="3" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="FWEJ_FGA9GBXbfwohBE8-106" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-106" value="<i>mariadb</i>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="750" y="256" width="50" height="64" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-107" value="search-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> <mxGeometry x="732.5" y="320.5" width="85" height="17" as="geometry" /> </mxCell> - <mxCell id="FWEJ_FGA9GBXbfwohBE8-111" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-111" value="psql" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;fontStyle=2" parent="1" vertex="1"> <mxGeometry x="560" y="584" width="50" height="64" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-112" value="auth-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> @@ -218,7 +215,7 @@ <mxCell id="FWEJ_FGA9GBXbfwohBE8-137" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="369.5" y="594" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="FWEJ_FGA9GBXbfwohBE8-138" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" parent="1" vertex="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-138" value="mariadb-galera" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;fontStyle=2" parent="1" vertex="1"> <mxGeometry x="320" y="575" width="150" height="105" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-139" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;entryX=1.004;entryY=0.397;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="FWEJ_FGA9GBXbfwohBE8-129" target="FWEJ_FGA9GBXbfwohBE8-138" edge="1"> @@ -265,11 +262,11 @@ <mxPoint x="4" y="34" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="a_cl7nsyDpLQFaXOHeFD-3" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="559.5" y="318" width="50" height="64" as="geometry" /> + <mxCell id="a_cl7nsyDpLQFaXOHeFD-3" value="prom" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;fontStyle=2;fontSize=12;" parent="1" vertex="1"> + <mxGeometry x="370" y="164" width="50" height="64" as="geometry" /> </mxCell> <mxCell id="a_cl7nsyDpLQFaXOHeFD-4" value="metric-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="542" y="382" width="85" height="17" as="geometry" /> + <mxGeometry x="352" y="228" width="85" height="17" as="geometry" /> </mxCell> <mxCell id="uDJ2bVtIrgoZBCZFZmDG-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-5" target="FWEJ_FGA9GBXbfwohBE8-105" edge="1"> <mxGeometry relative="1" as="geometry" /> @@ -289,7 +286,7 @@ <mxCell id="uDJ2bVtIrgoZBCZFZmDG-10" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="280" y="272" width="40" height="12" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-12" value="<b>Dashboard UI</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-12" value="<b>Dashboard UI</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="520" y="258" width="130" height="40" as="geometry" /> </mxCell> <mxCell id="uDJ2bVtIrgoZBCZFZmDG-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-14" target="FWEJ_FGA9GBXbfwohBE8-104" edge="1"> @@ -336,6 +333,23 @@ <mxPoint x="1" y="-12" as="offset" /> </mxGeometry> </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-1" value="<i>psql</i>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="560" y="328" width="50" height="64" as="geometry" /> + </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-2" value="dashboard-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxGeometry x="542.5" y="392" width="85" height="17" as="geometry" /> + </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-12" target="CEhTLEpK94wtDmjaM6P2-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-4" value="JDBC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="CEhTLEpK94wtDmjaM6P2-3"> + <mxGeometry x="-0.3333" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-26" value="mariadb-galera" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;fontStyle=2" parent="1" vertex="1"> + <mxGeometry x="700" y="574.61" width="150" height="105" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> @@ -975,113 +989,95 @@ </mxGraphModel> </diagram> <diagram id="DNBJDzVGt1bZ_wE9aRrb" name="Authentication (TU)"> - <mxGraphModel dx="1434" dy="822" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> + <mxGraphModel dx="1182" dy="678" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="UK1E1MY9NPGJr35xhmfM-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="6Mvu0cpha-60HerBRlcp-5" target="QHHrKqhJkxuvhbEd7n-v-1" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="618" y="253" as="sourcePoint" /> - <mxPoint x="677.5" y="221" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" parent="1" source="0UriubutAV_ndhbAIQOG-1" target="lwbPPWB284nzco3shXtu-11" edge="1"> + <mxCell id="H5geC8BQpTcnQeXLB8gK-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-1" target="H5geC8BQpTcnQeXLB8gK-2"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="0UriubutAV_ndhbAIQOG-1" value="SATOSA" style="rounded=0;whiteSpace=wrap;html=1;fillColor=default;dashed=1;verticalAlign=top;" parent="1" vertex="1"> - <mxGeometry x="447.5" y="414" width="170" height="210" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-4" value="Force" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-3"> + <mxGeometry x="0.0781" y="-2" relative="1" as="geometry"> + <mxPoint x="7" y="2" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="h4DClbYJ9orVhpn0rvY8-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="OTtTGdUG0AnkBV5d_5uu-1" target="OTtTGdUG0AnkBV5d_5uu-2" edge="1"> + <mxCell id="H5geC8BQpTcnQeXLB8gK-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-1" target="H5geC8BQpTcnQeXLB8gK-5"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="OTtTGdUG0AnkBV5d_5uu-1" value="SAML 2.0 IdP<br>(Frontend)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="467.5" y="444" width="130" height="40" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-20" value="OIDC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-9"> + <mxGeometry x="-0.0962" y="-1" relative="1" as="geometry"> + <mxPoint x="6" y="-1" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="h4DClbYJ9orVhpn0rvY8-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="OTtTGdUG0AnkBV5d_5uu-2" target="OTtTGdUG0AnkBV5d_5uu-3" edge="1"> + <mxCell id="H5geC8BQpTcnQeXLB8gK-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-1" target="H5geC8BQpTcnQeXLB8gK-7"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="OTtTGdUG0AnkBV5d_5uu-2" value="Middleware" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="467.5" y="504" width="130" height="40" as="geometry" /> - </mxCell> - <mxCell id="OTtTGdUG0AnkBV5d_5uu-3" value="SAML 2.0 SP<br>(Backend)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="467.5" y="564" width="130" height="40" as="geometry" /> - </mxCell> - <mxCell id="h4DClbYJ9orVhpn0rvY8-2" value="<a href="https://test.dbrepo.tuwien.ac.at/api/auth/realms/dbrepo/.well-known/openid-configuration">JSON<br>Metadata</a>" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;size=17;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="1" vertex="1"> - <mxGeometry x="307.5" y="181" width="70" height="90" as="geometry" /> - </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" parent="1" source="h4DClbYJ9orVhpn0rvY8-3" target="OTtTGdUG0AnkBV5d_5uu-3" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="410" y="576" as="targetPoint" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-19" value="OIDC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-10"> + <mxGeometry x="-0.1281" y="2" relative="1" as="geometry"> + <mxPoint x="-2" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="h4DClbYJ9orVhpn0rvY8-3" value="<a href="https://test.dbrepo.tuwien.ac.at/saml2/endpoint">XML<br>Metadata</a>" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;size=17;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="1" vertex="1"> - <mxGeometry x="307.5" y="539" width="70" height="90" as="geometry" /> - </mxCell> - <mxCell id="QHHrKqhJkxuvhbEd7n-v-1" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#dae8fc;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="677.5" y="248" width="50" height="64" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-1" target="H5geC8BQpTcnQeXLB8gK-6"> + <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="QHHrKqhJkxuvhbEd7n-v-2" value="auth-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="660" y="314" width="85" height="20" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-18" value="OIDC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-11"> + <mxGeometry x="0.1536" relative="1" as="geometry"> + <mxPoint x="9" as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="hp2oGXdcphavrsRCR3EN-1" value="<b>EntityID&nbsp;</b>https://test.dbrepo.tuwien.ac.at/saml2/backend" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> - <mxGeometry x="10" y="10" width="440" height="20" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-1" value="<b>Auth Service</b><br>Keycloak" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="455" y="335" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;dashed=1;" parent="1" source="lwbPPWB284nzco3shXtu-11" target="h4DClbYJ9orVhpn0rvY8-3" edge="1"> + <mxCell id="H5geC8BQpTcnQeXLB8gK-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-2" target="H5geC8BQpTcnQeXLB8gK-8"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-11" value="TU SSO" style="rounded=0;whiteSpace=wrap;html=1;fillColor=default;dashed=1;verticalAlign=top;" parent="1" vertex="1"> - <mxGeometry x="50" y="474" width="170" height="90" as="geometry" /> - </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-12" value="SimpleSAML" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> - <mxGeometry x="70" y="504" width="130" height="40" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-16" value="LDAP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-12"> + <mxGeometry x="-0.0986" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" parent="1" source="lwbPPWB284nzco3shXtu-18" target="OTtTGdUG0AnkBV5d_5uu-1" edge="1"> + <mxCell id="H5geC8BQpTcnQeXLB8gK-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-2" target="H5geC8BQpTcnQeXLB8gK-13"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-18" value="<a href="https://test.dbrepo.tuwien.ac.at/saml2/backend">XML<br>Metadata</a>" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;size=17;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="1" vertex="1"> - <mxGeometry x="307.5" y="419" width="70" height="90" as="geometry" /> - </mxCell> - <mxCell id="tOMRmRFzJHC1-SXyWV1O-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#000000;startArrow=classic;startFill=1;dashed=1;" parent="1" edge="1"> - <mxGeometry x="-0.028" relative="1" as="geometry"> - <mxPoint x="532" y="126" as="sourcePoint" /> - <mxPoint as="offset" /> - <mxPoint x="532" y="174" as="targetPoint" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-17" value="LDAP" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-15"> + <mxGeometry x="0.0932" y="-2" relative="1" as="geometry"> + <mxPoint x="6" y="1" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="tOMRmRFzJHC1-SXyWV1O-4" value="Researcher" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> - <mxGeometry x="517.5" y="42" width="30" height="60" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-2" value="<b>Identity Service</b><br>OpenLDAP" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="224" y="335" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-4" value="<a href="https://test.dbrepo.tuwien.ac.at/api/auth/realms/dbrepo/broker/saml/endpoint/descriptor">XML<br>Metadata</a>" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;size=17;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="1" vertex="1"> - <mxGeometry x="307.5" y="300" width="70" height="90" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-5" value="<b>UI</b>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="530" y="470" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-5" value="Keycloak" style="rounded=0;whiteSpace=wrap;html=1;fillColor=default;dashed=1;verticalAlign=top;" parent="1" vertex="1"> - <mxGeometry x="447.5" y="175" width="170" height="210" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-6" value="<b>Metadata Service</b>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="380" y="470" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6Mvu0cpha-60HerBRlcp-7" target="6Mvu0cpha-60HerBRlcp-10" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-7" value="<b>Data Service</b>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="455" y="530" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-7" value="OIDC IdP" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="467.5" y="205" width="130" height="40" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-8" value="<b>Broker Service</b>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="224" y="530" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="6Mvu0cpha-60HerBRlcp-5" target="0UriubutAV_ndhbAIQOG-1" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-13" value="<b>Dashboard UI</b>" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="150" y="470" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-10" value="SAML 2.0 SP<br>(Identity Broker)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> - <mxGeometry x="467.5" y="325" width="130" height="40" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-21" target="H5geC8BQpTcnQeXLB8gK-1"> + <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="lwbPPWB284nzco3shXtu-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" parent="1" source="h4DClbYJ9orVhpn0rvY8-2" edge="1"> - <mxGeometry relative="1" as="geometry"> - <mxPoint x="467.5" y="226" as="targetPoint" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-23" value="SAML 2.0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="H5geC8BQpTcnQeXLB8gK-22"> + <mxGeometry x="0.0113" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;startArrow=classic;startFill=1;endArrow=none;endFill=0;" parent="1" source="6Mvu0cpha-60HerBRlcp-4" target="6Mvu0cpha-60HerBRlcp-10" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-21" value="<b>IdP</b>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="455" y="190" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="6Mvu0cpha-60HerBRlcp-15" target="OTtTGdUG0AnkBV5d_5uu-1" edge="1"> + <mxCell id="H5geC8BQpTcnQeXLB8gK-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="H5geC8BQpTcnQeXLB8gK-24" target="H5geC8BQpTcnQeXLB8gK-1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="6Mvu0cpha-60HerBRlcp-15" value="JSON<br>(Denylist)" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;size=17;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" parent="1" vertex="1"> - <mxGeometry x="667.5" y="419" width="70" height="90" as="geometry" /> + <mxCell id="H5geC8BQpTcnQeXLB8gK-24" value="Browser / REST API" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1"> + <mxGeometry x="730" y="325" width="30" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> diff --git a/.docs/images/architecture.svg b/.docs/images/architecture.svg index 369974785eeda30172c581771c30a8b0ec270a69..0cdb8411394fcd6f98ffbc43492d1b38aa74e458 100644 --- a/.docs/images/architecture.svg +++ b/.docs/images/architecture.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: #ffffff; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="611px" height="614px" viewBox="-0.5 -0.5 611 614"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: rgb(255, 255, 255);"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-26"><g><rect x="420" y="505.61" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 495.01 428.63 L 495.03 411 L 380 411 L 380 171 L 337.49 171 L 337.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 433.88 L 491.51 426.88 L 495.01 428.63 L 498.51 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 337.5 148.12 L 341 155.12 L 337.5 153.37 L 334 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 172px; margin-left: 361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="346.5" y="166" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 115.01 428.63 L 115.03 411 L 220 411 L 220 171 L 272.51 171 L 272.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 433.88 L 111.51 426.88 L 115.01 428.63 L 118.51 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 272.5 148.12 L 276 155.12 L 272.5 153.37 L 269 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 171px; margin-left: 240px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="225.5" y="165" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 376.37 137 L 388 137 L 388 331 L 495.03 331 L 495.01 346.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 137 L 378.12 133.5 L 376.37 137 L 378.12 140.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 351.88 L 491.51 344.88 L 495.01 346.63 L 498.51 344.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 295px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="289" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="325" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 305 399.37 L 305 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 394.12 L 308.5 401.12 L 305 399.37 L 301.5 401.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 433.88 L 301.5 426.88 L 305 428.63 L 308.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="290.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="72.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="71" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 82.5 428.63 L 82.5 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 82.5 433.88 L 79 426.88 L 82.5 428.63 L 86 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 411px; margin-left: 83px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">AMQP</div></div></div></foreignObject><image x="67" y="405" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="50" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Data Service</div></div></div></foreignObject><image x="51" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 115.03 481.37 L 115.03 500.03 L 114.63 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115.03 476.12 L 118.53 483.12 L 115.03 481.37 L 111.53 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.52 523.88 L 111.17 516.81 L 114.63 518.63 L 118.17 516.96 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="100.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACm1JREFUeF7tnAWoFG0Xx881Xrsbu7sTuwsVxU5QTLDF7m4xMRC7CyxssTsudjcGJrZer/fjN3yz3+zszM7uvbvDu/ebAyLuPvOcec7/OX3WsKioqChxKNZIIMwBNNZgqRzEATR24ekAGsvwdAB1AI1tEohl53F8qANoLJNALDuOo6H/b4DeuHFDihYtannsWrVqyeHDhw3XLV++XLp162a5R1hYmCRPnlxSp04tqVKlkmzZsknFihWlUqVKUqZMGfnnn38s9zBa0KFDB1m/fr1Pz8aJE0eSJEkiyZIlU/gXKlRIKleuLI0bN5a0adP6tIcvi65cuSL79u2TCxcuyP379+Xly5fy7ds3iRs3rsI7Xbp0Cu+SJUsqvIsVK+bLttZRrp2AentjAO7Ro4f07dtXMmXK5NPh1EX+AGq2cbx48aRLly4yYcIEyZAhg1/81cV///6V1atXy6xZs+TWrVt+7VG4cGEZPny4tG3bVrh0ZmRpcv8tgKoHQEsHDRqkCBYh+0KBAFTlkyVLFtm/f78gYH/ozp070r59e0EzY0JYi7Vr10qOHDkMt7EE9OPHj7J9+3aPhy9evCjLli1zfe6PyS1RooSMHDnSY09u8KdPn+TDhw/y4sULOX36tFy/fl0iIyM91nKwjRs3CgK2Ij2gCLZp06aGj/EOmL7nz5/LpUuXFDfy48cPt7W5c+eWa9euSeLEia1YK9+zR7NmzeTr168e69OkSSPILnv27JI+fXqJHz++IHM0+OTJk/L69WuPZzD9R44cMTTDloCavfGmTZsU9VfJH0Dr1aun3HJfiMNxcebNmyevXr1yewQfx6H52xvpAZ06daoMGzbMF/by7t07GTBggKxbt85t/ezZs2XgwIGWe1y+fFmJAX79+uW2tkKFCjJ58mSpXr26qQnlcnEZxo8fL2fOnHF7HlCvXr3qcaH/9YCqp0BLevXqpfggLaHt586dkwQJEpgKNyaAqpvWqVPHLegjWMOCeCOsTalSpeTx48euZfi/uXPnSp8+fSwvg7qAhhiXUG/VuAxHjx4VgkmVQgZQ9YWnT5/uoV0EC1OmTAkqoDt37nQz05hKtNcbderUSfF3LmGHhSluonXr1j6DqV1IMDV48GC3Z3fs2KGY85AFlBfv2LGjmwlEOx8+fCiZM2c2FFQgNPTevXuSP39+N00z8u3qArQyb968bv6fCB3XEROqW7euHDp0SNmC9A6Ate4j5DSUg3z58kUJIvCvKmGOJk2aFDRAb9++reSFKpFGEbyZUe/evWXRokWur7lsDx48kIQJE8YET8EnE1M0b95catas6RHphySgSGTMmDEyceJEl3By5cqlaKkRBUJDMW0IUaUaNWoo/suI8HlErFqTzGUziuxjhK7BwyEL6JMnTyRnzpxuR6LikidPHo9jBgLQhg0bKpUdldASs+rXzZs3pUiRIm7vQSXI34JIdMAOWUA5LOkK+aJKlPfatWsXUEDRNooY48aNc+0LWJg+s1LkkiVLlIhcJXwpPtgOCmlAW7VqJVu3bnXJCaGPHTs2RoCS+1EAwAKQllCH1lZ3smbNKseOHRNMvBn179/fLfghiFuzZo0deFrXcs3ewq7CgjcpkMstXLjQtaR79+6ydOlSS0CjI1nKjFSYKCiQsngjfbpilVZF533MnglpDUUbMYcqYW6NuioxreWijYDSpk0bSZo0qaX8GzVqJHv37nWtI3ceMmSI5XOBWBDSgE6bNk0RtEoInMRdTzEFVN0vUaJE0rJlSyW69lZupIJz/Phx12ssWLBASGPsoJAGdNSoUUo9VCWiTm3DQP1cDyjrjIIndX1ERISS61IcIPjZs2eP8m+V6Jdu2LBBmjRpYohRgwYN3GrVdqUsvExIAwowBC0qUTWZMWOGpYb6U5xnM7ovlBZ5Tv2hAT6VjkfVqlU9+FHa27Jli+tzivj4XjsopAFFmHRbVCIgIjCyMrn+AqruR1GdzotK5MGkI/q+7NChQ90uFj519+7dduAZuhpKO4pa5vfv312CAlz6pMECFO0kB9VOG6CJ+FUtrVy5UpluUIn3pGqk7YoEC92Q1VD6qfgqrV97//69YRstEJUilQ9BGMGYSkap0t27d6VAgQJumDE7VLZs2WDh6No32oASTWoDC29Na/2QmD8NbjMJUFelvqoSAQotLiMKJKD6KhDdjwMHDniwZUTk6dOnrs8DWVw4ePCgUACpX7++B9+wiIiIKPwA9Uf+YFbokFsR/qpnz56uZQQCFBuMKNCAhoeHS+nSpZVDqbRr1y5lOi7YgM6fP1/69evnYmNWpNdH4JQJMdWMr8SEcDFoPyXPcuXKKZUx6swqhYWHh0fR9VeJxBnTZTUySaI8c+ZM13Peen2BBPT3799SpUoVZfxRJWqlDGGZTcMFUkMBE1BVMst9ETjgkQKpxNjJqVOnlFHN6FLnzp1l1apVrscZ8yS1Uv1zWGRkZBTzKdre4ubNm4U6qTdCQ7Q1TrPCOHsEClA0kmBDP4ZCVUZ7S/XvHShA//z5I/ny5XMbKSEPHjFihKGomE6cM2eO23f43MWLF3sdxTSTu9G0Bi08rIRLQ/nBL/Ou2oSczjxgmU21MbjEjI1KhO3Pnj0zbQ8FAlAuXNeuXd38JvwBSzvmEUyTSy6q72niprSNby3/z58/KzNF+j4t7gmZ+FJGZD8uElMJ+lzWyCoqQRGjkphdrU8icEFTU6RI4SYj/BfO+M2bN67PrYQaE0BJ6jExaIJ+6o9p+hMnTgglOW8UUw3lHSj3UbTQ/g8GBGbbtm3zyhvAGSgDXC1lzJhRiVWYnGRS3ogAkirV6NGjhfloLVWrVk0IjvSu0RXl6jsXPIwpJpLlBpL3MUrIjC6MVGIUg3FCRkLMSA+o2Vwuz3OpKLPhg7ASVGO0uabKg6ICgZD+wvmiod7mcnke0GihcYE4GymSfqaWNtrZs2dN55i074GPI8V6+/atx+sBCOAULFhQmXLAKjItyEXgsho9U7t2bSWiN7KgLkABDD9kNlZhJCg0g9TBKHzWrvf1ty1er/p/vySgoMTH7bYK3NT9AlWcV/cjCANkbz1R/Vm4oLgMtCq6xNmJntFYs8DKLQ/9+fOnULaix6g1v0YvQOhMcELobEWBAJQDEKjhw/z9GUKgAE2ZMqXSNeEdojvshWZRejx//ryV2FzfE6NQjSJF0U4eGm1gWFh49OiRrFixQmkBkaMSkHAATEL58uWVLkOLFi18Dr/9BZSxTH6Fhlnjl2+YJHhaNZbNJBQdQAlYMOe8A6kBJp6fT0QXSP27IVfqu6RfmFd+8qB2dODLlGDx4sWVFA2+vp492pUin6+Xs9BWCTiA2iru4DNzAA2+jG3l4ABqq7iDz8wBNPgytpWDA6it4g4+MwfQ4MvYVg4OoLaKO/jMHECDL2NbOTiA2iru4DNzAA2+jG3l4ABqq7iDz+x//31G8Hk5HGyQgAOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gZcDqA1CtpOFA6id0raBlwOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gdd/AGTpUcp01/CWAAAAAElFTkSuQmCC"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 186.37 373 L 233.63 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 181.12 373 L 188.12 369.5 L 186.37 373 L 188.12 376.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 373 L 231.88 376.5 L 233.63 373 L 231.88 369.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 373px; margin-left: 210px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="195.5" y="367" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 115.01 346.63 L 115.03 331 L 210 331 L 210 137 L 233.63 137" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 351.88 L 111.51 344.88 L 115.01 346.63 L 118.51 344.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 137 L 231.88 140.5 L 233.63 137 L 231.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>AMQP,<br />MQTT</div></div></div></div></foreignObject><image x="173" y="318.5" width="34" height="28.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABzCAYAAABD70qIAAAAAXNSR0IArs4c6QAAFVpJREFUeF7tnQW0XTXThnNxp7gVd3cv7sXdXYsXd3coUqC4Fddixd0pXgoUdy9eoEDhfv+Tv3PWnNwtyd776sms9a2P3rMje/LuZPLOZNLU3NzcbKJEDaRooCkCJGIjSwMRIBEfmRqIAIkAiQCJGCiugTiDFNddQ5SMAGmIYS7+khEgxXXXECUjQBpimIu/ZDBAlltuOfPMM8/UtXj33Xebddddt1AvPvjgAzP77LO3KHvuueea/fbbr1CdutC7775r5pprrhb13HPPPWadddYpVP8bb7xh7r//fjNo0CDz/vvvmy+//NL8/vvvBs5xwgknNJNPPrltc6GFFjJrrbWWWWKJJcxoo40W3FaabjJ5i6YmM9FEE5lJJpnEzDbbbGbJJZe077nUUksFt0+BIIC88847Zp555mnREOAAJEUkTQko97XXXitSZV2ZI444wpx66qmlAfLvv/+aa665xpx99tnmrbfeCurXDDPMYMG+++67m/HHH9+7bBGApFW+yCKLmPPOO8/06NHDu/1ggPTu3dvwZbsy+uijm88++8xMO+20QY3zcJYSXn/9dbPgggsG1ykF+KJnmmkm2zdXQmaQN99802yzzTZm8ODBhftCwRlnnNFccsklZo011vCqp0qA0CCz2AknnGCOPPJIr/aDAPLXX3+Z6aabzvzwww+2csDw1Vdf1Ro66aSTghqWgq4SeIn//vvP/rz//vubc845x/tl3Acfe+wxs8oqq9g/63r5ty9A7rrrLrPllluaP//8s0U/WEpWWmklC8IpppjCjDnmmOa7776zennyySfNJ5980qJMU1OTOeOMM8xBBx2U+16ubqj/hhtuyCz3999/m59//tkw2/P+b7/9dovn+/bta/bZZ5/c9oMAcv3119uvSOTSSy81TN/Dhg2zf5plllnsbIACQsRVwuKLL25eeuklWwVKZ31HMUVkhx12sMsCssACC9TNAD4Aefzxx81qq61mWF60AIrjjz/eLLvsspm2BYPDh3PTTTdZ+0QLIDn44IMzX8vVzdhjj21GjBgRpIqHH37Y7LrrrubTTz+tlRtnnHEMthlLX5542yArrLCCeeqpp2x9Y4wxhvnmm2/MYYcdZi6//PJaG4888kjti81rWH53lQDoTjnllFrxO++806y//vq+1dWe++OPP8xUU01lhg8fbv/Wq1cvc9FFF9V+zwMIswDr9rffflsrwwBdddVVdkYJEYz6DTbYoDb7UpYZ7b777stcbqoACG0BDgxlZjcR9NGvX7/c1/ACiLsTwDLn5R566KG6F9x8883t1xIirhKY/q688kqD/YGg2AEDBoRUaZ+97rrrzLbbbmv/my8GcOy4447eAFl99dUNX58I4HjwwQcNH0oRQYcrrrii/bBEWJqYZcYdd9zEKqsCCJWff/75Zt9996210717d/P555/nvooXQA488EBrvYug/K233tpOvTQkL40SWRImm2yy3IblAVcJZ511luHrP+aYY+wjLC98zaz3IaIHeO211zabbbaZ2X777b0A8uKLL7bYFlax7X7ggQdMz54965abrKWmSoAwE04zzTR1bTOz5C0zuQDB6ME4FVtjggkmsNPueOONZ5WNsdWnT5+a4gESux1fcZXA8rLeeuuZ+eabr1ZF6OAAUl5cjN0rrrjC2kY77bSTF0A23HBDw9ImApfw/PPPB9tXSTrQdhG/s7P58MMPDTtBV6oECHVj08k48m94HGy+LMkFyI033mi22mqrWh0777xznd3BFDnvvPPWfocnCeEJXCUcd9xx5thjj7VEE9MyEsqJnH766dY+QsYaayw7w912221mt912ywXIr7/+aiaddNI6w5Rlk+WzCmHLjMGs5YknnkhcuqoGyKyzzmo++uijWtOPPvqoWXnllcsBBIudFxB59tlnzTLLLFNXKSwd07LIc889Z5ZeemkvfbpKOOqoo8yJJ55o9+sARSSEE2H2EZButNFG5vbbb7f8wx577JELEGwrliQRGElmzKI7qSQloJsXXnih9tOhhx5qTjvttFafQVj6f/zxxyCdZs4g0Mhzzjlnbd3iv4cOHdriRdjywhKKYAxiaPqICxBIHLaGrI8zzzxzrW1fTuSVV14xiy22WK1peAyWrIsvvtjuZETSdjEMFnaBCDbDwIEDfV7F+xm3DQxf/RFKRVXOICy72IsiLLnff/99rr2YCRD26RiNIkzdhxxySAtFMC1jAGFcItDJX3/9tfVL5EkaQCjH9AcXgfhyIlDa7ITcMr4AwW+hAcFMdvTRR+e9RtDv2DfYOSJsx/XupjUAAuF4wAEH1Nr0XbZTAYJxCuJAGQL3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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="50" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="51" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="240" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Identity Service</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="241" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 462.5 435 L 462.51 421 L 308 421 C 308 417.1 302 417.1 302 421 L 302 421 L 147.49 421 L 147.49 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 147.5 433.88 L 143.99 426.89 L 147.49 428.63 L 150.99 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 421px; margin-left: 245px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="230.5" y="415" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="430" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Metadata Service</div></div></div></foreignObject><image x="431" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 376.37 465 L 423.63 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 465 L 378.12 461.5 L 376.37 465 L 378.12 468.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 465 L 421.88 468.5 L 423.63 465 L 421.88 461.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 465px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="459" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 470 195.6 C 470 190.85 481.19 187 495 187 C 501.63 187 507.99 187.91 512.68 189.52 C 517.37 191.13 520 193.32 520 195.6 L 520 242.4 C 520 247.15 508.81 251 495 251 C 481.19 251 470 247.15 470 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520 195.6 C 520 200.35 508.81 204.2 495 204.2 C 481.19 204.2 470 200.35 470 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="452.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">search-db</div></div></div></foreignObject><image x="451" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 280 523.6 C 280 518.85 291.19 515 305 515 C 311.63 515 317.99 515.91 322.68 517.52 C 327.37 519.13 330 521.32 330 523.6 L 330 570.4 C 330 575.15 318.81 579 305 579 C 291.19 579 280 575.15 280 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 523.6 C 330 528.35 318.81 532.2 305 532.2 C 291.19 532.2 280 528.35 280 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="262.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">auth-db</div></div></div></foreignObject><image x="261" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 376.37 117 L 423.63 117" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 117 L 378.12 113.5 L 376.37 117 L 378.12 120.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 117 L 421.88 120.5 L 423.63 117 L 421.88 113.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 233.63 127 L 200 127 L 200 291 L 186.37 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 127 L 231.88 130.5 L 233.63 127 L 231.88 123.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 181.12 291 L 188.12 287.5 L 186.37 291 L 188.12 294.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="175.5" y="236" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-13"><g><path d="M 305 147 L 305 182.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 187.88 L 301.5 180.88 L 305 182.63 L 308.5 180.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="240" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="241" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 115.01 264.63 L 115.03 250.03 L 114.66 235.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 269.88 L 111.51 262.88 L 115.01 264.63 L 118.51 262.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.53 230.12 L 118.2 237.03 L 114.66 235.37 L 111.21 237.2 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">S3</div></div></div></foreignObject><image x="108.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="50" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Analyse Service</div></div></div></foreignObject><image x="51" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 495 153.37 L 495 180.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 148.12 L 498.5 155.12 L 495 153.37 L 491.5 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 185.88 L 491.5 178.88 L 495 180.63 L 498.5 178.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="481.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 276.37 41 L 305.03 41 L 305.03 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 271.12 41 L 278.12 37.5 L 276.37 41 L 278.12 44.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305.03 105.88 L 301.53 98.88 L 305.03 100.63 L 308.53 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="255" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 255 15 L 255 40 M 255 20 L 240 20 M 255 20 L 270 20 M 255 40 L 240 60 M 255 40 L 270 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Researcher</div></div></div></foreignObject><image x="224" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPgAAABECAYAAACs2fgFAAAAAXNSR0IArs4c6QAAEqFJREFUeF7t3QOQLc2SB/B8y7e2bdu2bdvet36rt7Zt27Zt27bt3f5FdG1k5NeonnNm3pz5KiMm7r3T1V1VWfVPV937xKDBgcGBO8uB+9zZmY2JDQ4MDsQA+NgEgwN3mAMD4Hd4ccfUBgcGwMceGBy4wxwYAL/DizumNjgwAD72wODAHebAAPgdXtwxtcGBAfCxBwYH7jAHBsDv8OLey6f2VxHxKIkHLxcR33Rv48kA+L1txe898x0Aj7hHocsjRsTfnrAH/ici/jEi/i4i/jAifjoifjgivjEi/u2E745XBweOcmAA/BoAvrYIhMZnRMQHRMS/HF2p0X5w4AocGAC/QYC39fndiHjliPi5KyzYeGVw4AgHBsA7Af6jEfErnZx9iIh4hIh4soh48oh40IX3/joiXjAifqnzm6PZ4MBVODAA3gnwt4uIT7oCh0UwXzsi3iciHq28//OTX/4s07P/vsJ3xyuDAz0cGAC/ZoC3RQDu74iIZyyr8oYR8fk9KzXaDA5cgQMD4DcEcGvzJLNJft+0UN8cES97hYUbrwwO9HBgAPwGAW5BvnIC+aumlfmniHi4npVKbZ49Il4qIl44Ih53Nv35/X8ZEX8REeIF3z5bDP9+8NuaP8wsdF48Ip4uIh5/HuNDRsQ/R4RN8xtzP18fEVyNq5B0JOH2ErNlw8p55DnFqI/fjojvnAszfvMqHczvmA9+6edpJ4vpieb54Nk/RMTfzHOQyvzimYc93T3sPNbW9u8jwpyQuMtbTnN4vYh46rm//Hzt+w8eES85j/e5IuIx5kIV6VXrK+Vqbb+sMxNTAY4P3zZ3/iBzsNd+5Co+VkTgSUvv/tBsXf5MDzMW2jxYRNhD+P4881weNSL+a57LH09xqO+LiG+d2v3IgT4+auL7O6f295v4/nHzv59qSkW/R0S8UEQ8ZkTg5/1qoctSHvyqPngd97tMAPrI8ksAB/Q9eraI+PB58HttPf+9iHivKdD3JT2Np/SdBccs8QJBwl76ngkUbx0Rv975AgvmnaYN+m6d/agr+MJ5LjZFL5mPfu4/C46e9/5jEpifHBHv2VGzAMQ2a6P/nAHi91+3YJntAfzl570hMLtHUq428mdGxP9uNK4Af5GIsF5PM++Lp9/raOb9W0TEv3a0bU1eIyI+KCKetPOdH5wwABs/0dHed+3rRv7+IXPQmrDIFrI2NwrwN58k5aeXSTx2RPzpzsTeYNLWnzUxjVQ8Sp82Scy3iQhAWSPfpRVe5ejH5/YE1EtHhIXaIkFHpZLPeYV+WCc0Qo/FQBN97TymK3QVPz5bSHv1CkCd18Tf3zEiaJlKWwB/vwmoD7jCQAm+N9oI1FaAP+8M1O9O1kZPt3gptbtHhJtgNOvlKBGWbzwLlK13ARrIG/n7R0TEr011JrBU6UYB/t6T+faBZQQkzpYpbQE/p7xD03xBRHzLrKltNCaWBXyTSbI/TmlPK73tBtdogw8tz2nkL58BBVz6oNlpGKYeU5KWbCT19xQR4c8lYiqT0EzWTL8wzwWovPvwk7B5yqlO4BUj4hWKC8V8ZMn81s7u+ZSIeKvS5k9mIcbkNB8bisB55tmU5u5k+qL591tdEWzm1YhZ+Mul/hvI8ImlyAWpVDes59wG7o+x4gkr75kigmZ8pPKBT5zav/3KICvAX2zeS483a34aj8mv4pI5CyAE9YsuuK7W4ht2+P55EUEZZcJryok5TpERvk8wVXcai7YPnRqzRl5z2iNfsdFPtYI/enYb8/7l0hCo9uv9b9JE/65JyzGTGil6eeKNyTBxFMTkTSQfz5zjoy4RgUGKAnomPvv3LrxgYS1C8x81+YTZXN/S+vw2kt1mafRhs0m8NC6WBFOvkcVkPnNZ1vrhu31NRDx6es9GMZc105RwALIsfAQzX33Db32oyZwE6KylfB/4twqSbCICqRFBiQc0PzPfhtcGWUMxjExAS7BZg0Y2Nw24VC5tjcQJgDATnxNfKlWAW39tuW+vNrkRP7W0UJNQf6U5XpRrOCiTl1lp79eA+aXluZiTfah0e4kIFHtIXKmRMfOl/blE3MiPSQ8+deYHocEywfefnPcHbN/3pgD+rLMGy/3xoZjta0SKA3MjPqhU29rk83fqu784gWXJ53r+adG/P734Z3Pwric/D+SY2eZk4whiVQIUAaJMFqJaDUt8sPgCPhkEXAnAXyJxCv59I6ASKKQVt4gm+f1JOAoENfItoF0j38waVfDxCWd/ULBzjwBOwVMjIKXZsm9fv0GA/+xs5bRngpHcl0oV4J4T5tZjL55RrSB8JMyWhLEA7B8UQcw6EETdUhLGQ2hxu6xRoy2rhLXy8aktnrMqxT3si3v0dxMAN3ggsviZgHXNpySRfqdoIhqGxOshmtX72UcEFoDM9LrF72Fl2GS9pLYeATeA2LSVyZ89+1ftm7Qi4bC3+K29uEUWhFva5INn0ND6fgSVaKQeqpv6xyYTVjR7jZYAJOCTg0Br76p0tDkzcT/WtOrWmuGjuVb3aGl8NPdXdTDjOSY3zPwzsY6WgqmyBVzGRlxOgn4vttTav1YJBrNeuJxLritXkwDIxEKArUUhfp0AJ/H4Ge+/4DvxS95sg9Gi2Q08mgErk30ralo/R6rxnRotScZqWtl0fOlzEeluwZjBjY4W+BCEtFYj1oUNIHW0R9a3l2c1CEorEbRrVAF0ZFz2xPumDwMOAPUQX54gBuj2I1VU04l1fFxCe6hHsLJoqkvxApN79AMLA2Qac5sacU3EjnqJEmI55rPra1baEsC5lO+w1lkPwJlOPdFbfRhsq0W3MW3wSvwuvnhlYG7HxBHIakS7iIYfIYEm7zWivbO/4/e0Rk1P2Ojch3NQ1QTAJhjFVOwla0QbyAs34g/S5OckOWF+YyOaIfvYta8KIK7E83UOSHArm9VXWd+9rur4jvZh/vL9jbiLjj1n4qeLM+Q4kXhH5uPeOD0X0PVeI7GZ7Gq13y8BXFCQkFmkHoD3DLC3Dd+YSbMWeGjfIZlz1JW2p/WPEPMyFxGILorIZh/P/AXusvYAQiaXCCXf/RSqPhPfr0ase75fASEjwRw/J4ncZxeIAM4bvPZVAfSxc+69Z0z1XRqIJjon1T6OCm5COJ+hWDLvxXWq8uN+7GU66jwFXLk3jdZcxSWAU6iKlh6oAOfPkEprwaE8OAOWEsrErztS8eNdJk/1t5aYz7xS4ZQDWa1vrgFrAsPFEY5ehmHTyw03YkZuBRbX1kn1Ui7rFU0WP9gjwU0SXlWeudPIhNySZSWFkysLjwKchZUtprWxGUOLrrc2PWmovbnW5xXgLJSvPvARZnO2mpYAbtxcwUysq70agjoMFi2h3WhNEVSAc9NyluUe07tuDa6AQQoGUHqJ3ydodR20Fshhfjn4ktNltX++G1+YNmWJ9FQefe40Fz73uWmvjt9mpuF7KsPWxnYU4IJFCob2SNBVQDLTWhpz71tbz0+tRe8BuBgTn/vctMb7CvDd2EUPwHtLVZnUOsypFppRYcgRWjJ7jry/1baVKy61sfEE9mxU2myP5OKlLOS4FcIsEYulN4q9119+rmpOiq+S/DdX5kiQZ63fowDv1cKsCQU+mVT3ic2ck24C4NUFO+f4xbNqurYCnMKR9lulcwJcJ0uVZ3xuWryXVHsp1rgO6tmETHsakE8qcpoj4EtjItSk8JYuxVC4wbQ7N60trEKTdy+diTmoyWd1uGSDZmJC1nzzqT54762lSwBX1HPUBdvj6U0A3DkElZLXQUu+dQW4+gpu2I0BnMCQSlA22kjATHVOT1rHO0pN/6iMeC1FcR2Mzd9UWGHz8WNpf/nrXCXW2vLNRcxrqkY0/k3TB+XJc0rlnOPnYxOMOZYg1SUb8asdHd0UwJdMdLUH4hznpJsA+OsU5cWNo3l7U5NH5/tAB7gBO5ZIw+QiE74Z07eHpBzqCbOlFEXPt87dhvshR+mkVvVvCTaCKJPAovrhRuqrCYnrIHX+OVBjs1mLHnAbj1rv7EMfNdF7NfhSELXXfz/Ct5sAuIBavWtdEHEvS3RkHrntrQC4ATnh8q5lFr0bwGsORyjmaMTXqRU8V2XSOd6jJUWMs3b2XfGDnFqrxSOsmRyjOMdY2jeYuLnyzOGIXOiz1xfTnonf6LoA7vs1DSoYmwub9sba8/wmAE7I1+q2ugd6xtrb5tYAnBamOfJhDGa3s7irObs0y1pLLsJ9HdHoXsYutWOhWNx8YIZP5gBAIwcq6qUByhivI0vAHM/8VilWT+9tzbceBrpOgLvCK5cESzUdCUaKk2RXhMashVM3AXAuqRLRnH0Rh7qOyLq1uzUANxgLVvPeIs71KOPSpqvahMR3+sZR0esgfrXI+dH/nMFR1hyxrqAiBGyAnF+W084ngs41H3GAvNGOFHaIkQjA5fjCdQKctlaO3IhLxrLpvYXnz0v+ly9cL/e4CYAbf626VO2WD0mda31vHcANiH+Sj9kJPjhBtFTTmxkh0CZXmo/sMYcd3OglpZCqg2gLuWsmbE5nqTmXApRmeIbZ5K5uxV5fNlWOLSylFOtRUek1lkzvZm58BDhz8eMMcyVWQa4dJyS5SntECCniee7SkDBdKohpzU4BEN67pCCTY6L1QpClsSs3rik1VpRa80ynjM93evLg2tXzDLITMgV1flvrwEURzG3rW9OI7d1bpcENijkqsptTTQ50ANSetqw5ZFpcgKoWSSwxTk5e9ZzIcqMKvhrNBSDjWjtrXvvhhijgyZVESwUbvlnPVSuDzcG3rcU37lzGqS4dkGvuXc2BO8AarR2jzH0xMX3bxrGh1cln2iqDPBVAhHyuXde/9RV/WSPjBQJZjUZrNQGnjq8X4Cw/7lGuenPHnaxLjxCX5lLHn4Xpmh9/6wBuEZx9rnXTW5cjtIVzEytg5HrovcP63hU5dvjen40sADO0lhBW88r3mXt7OVkb35VBAoeNAI8PvHSWnF9er/JxtREzdU3Q8TFpYeZsrlewyEu516U776S+xDOWiB+r5t4FCoSFgqSaqto61HIqgFQVOjeerTTKwKGLpZoC0WnWUM3GSAOy0CqdOr5egOvXmB0YyUTAqnTbOjbKjWWV5nP1yqvXaiduJcBJOAX5+UAHM4aplY9BLm1CgTXlnpmkf/g5fmhQARY+ru9bbDXb2Ze0eZnrS7d+KKpxyixfnaMvAKcpBApZDr5BY9P6xq2wpZa1SjOtXbfj+/qpVzYRPMx8/fErjVusQR9Mv3pc05jMcSnPymph3WSBiM80tNNNgpzy+u3aKZuvxQZaXECtQo7ys2YIJn9axxwxPhVA+Fx9cb/Da4KXhnfgA99pdunJemUTk37tDrRTx3cE4Ma9VJYstiD1COwsExodf2lo8yHkMqlB5zKunTa8lQA3AVfluHwgk+iy4pCtGzy0f/25/HLpMMiKcvr/X9PYNHI9EJDfo4VJ372KtbW+gI2mrTfG1vY0JqG0dYnC1nxoVxp565jtVWqjnaV2FRBaulesjanWv58KoPbdpeq7vXX1nGC0N9Zu3zl1fEcBzhKRyu0JIi/Nj3CmiOpFGLntrQW4QTJp6wkoVwK5GmiPSHAbIftee+/QAk5ybTGsfYM57+TXke97lwuh6GXpvrel8dGgxuSsb9VGa/MhzQULbZ6eywpEz2ntrQCZvpzoMg7/62sjMQvlj0v31V8XwPVNm9kH3LI9kpXg9u0F5G4a4G3czGvpyd6LQ7hozHRz2ksh32qAC0KILGbT1uSYK72X+wM6X5FFwHx1XpcJR1MDgu8LcDjXfCSK2RaHCc3Ed/jBAgk6+b5IM3PL5vJd1geroOeKoaUNy5/k38oFm5N50PCsAYssIsyt4VsC1l5AsvbBzGe6CvQwyfGc6csNEKEVkHPkdGlDiQC7ccVhFuPkokih2YS50u1UANUxs9CsrR9WjuAlnjBr8398IL7Scxzz1PEd1eB5PrQ5ZUEjK9u2j6xx20dMcfEGVq191HsByMkA35Oe4/ngwODABXGgnia7oKGPoQ4ODA7scWAAfI9D4/ngwAVzYAD8ghdvDH1wYI8DA+B7HBrPBwcumAMD4Be8eGPogwN7HBgA3+PQeD44cMEcGAC/4MUbQx8c2OPAAPgeh8bzwYEL5sAA+AUv3hj64MAeBwbA9zg0ng8OXDAHBsAvePHG0AcH9jgwAL7HofF8cOCCOTAAfsGLN4Y+OLDHgQHwPQ6N54MDF8yBAfALXrwx9MGBPQ4MgO9xaDwfHLhgDgyAX/DijaEPDuxxYAB8j0Pj+eDABXNgAPyCF28MfXBgjwMD4HscGs8HBy6YAwPgF7x4Y+iDA3scGADf49B4PjhwwRwYAL/gxRtDHxzY48D/AbTWH0p48Qc9AAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="225" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 225 532 L 225 557 M 225 537 L 210 537 M 225 537 L 240 537 M 225 557 L 210 577 M 225 557 L 240 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 225px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Database<div>Engineer</div></div></div></div></foreignObject><image x="199.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 305 481.37 L 305 508.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 476.12 L 308.5 483.12 L 305 481.37 L 301.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 513.88 L 301.5 506.88 L 305 508.63 L 308.5 506.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="385" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 385 532 L 385 557 M 385 537 L 370 537 M 385 537 L 400 537 M 385 557 L 370 577 M 385 557 L 400 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 385px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">System<div>Engineer</div></div></div></div></foreignObject><image x="361" y="584.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 59.5 523.6 C 59.5 518.85 70.69 515 84.5 515 C 91.13 515 97.49 515.91 102.18 517.52 C 106.87 519.13 109.5 521.32 109.5 523.6 L 109.5 570.4 C 109.5 575.15 98.31 579 84.5 579 C 70.69 579 59.5 575.15 59.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 109.5 523.6 C 109.5 528.35 98.31 532.2 84.5 532.2 C 70.69 532.2 59.5 528.35 59.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 119.5 523.6 C 119.5 518.85 130.69 515 144.5 515 C 151.13 515 157.49 515.91 162.18 517.52 C 166.87 519.13 169.5 521.32 169.5 523.6 L 169.5 570.4 C 169.5 575.15 158.31 579 144.5 579 C 130.69 579 119.5 575.15 119.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 169.5 523.6 C 169.5 528.35 158.31 532.2 144.5 532.2 C 130.69 532.2 119.5 528.35 119.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 89.5 533.6 C 89.5 528.85 100.69 525 114.5 525 C 121.13 525 127.49 525.91 132.18 527.52 C 136.87 529.13 139.5 531.32 139.5 533.6 L 139.5 580.4 C 139.5 585.15 128.31 589 114.5 589 C 100.69 589 89.5 585.15 89.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 139.5 533.6 C 139.5 538.35 128.31 542.2 114.5 542.2 C 100.69 542.2 89.5 538.35 89.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="40" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 210 547 L 196.37 547" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 191.12 547 L 198.12 543.5 L 196.37 547 L 198.12 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="430" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">User Interface</div></div></div></foreignObject><image x="431" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 333.63 41 L 305.03 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 338.88 41 L 331.88 44.5 L 333.63 41 L 331.88 37.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="355" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 355 15 L 355 40 M 355 20 L 340 20 M 355 20 L 370 20 M 355 40 L 340 60 M 355 40 L 370 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 355px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Machine</div></div></div></foreignObject><image x="332.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 376.37 127 L 403.03 127 L 403.03 291 L 423.63 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 127 L 378.12 123.5 L 376.37 127 L 378.12 130.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 291 L 421.88 294.5 L 423.63 291 L 421.88 287.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 403px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="388.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 423.63 137 L 417.03 137 L 417.03 288 C 420.93 288 420.93 294 417.03 294 L 417.03 294 L 417.03 328 C 420.93 328 420.93 334 417.03 334 L 417.03 334 L 417.03 408 C 420.93 408 420.93 414 417.03 414 L 417.03 414 L 417.03 418 C 420.93 418 420.93 424 417.03 424 L 417.03 424 L 417.03 445 L 430 445" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 428.88 137 L 421.88 140.5 L 423.63 137 L 421.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 237px; margin-left: 420px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="405.5" y="231" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-3"><g><path d="M 279.5 257.6 C 279.5 252.85 290.69 249 304.5 249 C 311.13 249 317.49 249.91 322.18 251.52 C 326.87 253.13 329.5 255.32 329.5 257.6 L 329.5 304.4 C 329.5 309.15 318.31 313 304.5 313 C 290.69 313 279.5 309.15 279.5 304.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 329.5 257.6 C 329.5 262.35 318.31 266.2 304.5 266.2 C 290.69 266.2 279.5 262.35 279.5 257.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-4"><g><rect x="262" y="313" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 322px; margin-left: 260px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">metric-db</div></div></div></foreignObject><image x="260" y="315.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-6"><g><path d="M 570 127 L 550 127 L 580 127 L 564.87 127" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 127 L 566.12 124.5 L 564.87 127 L 566.12 129.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-5"><g><rect x="570" y="120" width="40" height="14" rx="2.1" ry="2.1" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 127px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="120.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-9"><g><path d="M 570 373 L 550 373 L 580 373 L 564.87 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 373 L 566.12 370.5 L 564.87 373 L 566.12 375.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-8"><g><rect x="570" y="366.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 373px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="366.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-11"><g><path d="M 40 209 L 60 209 L 29.49 209 L 44.63 209" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 48.38 209 L 43.38 211.5 L 44.63 209 L 43.38 206.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-10"><g><rect x="0" y="203" width="40" height="12" rx="1.8" ry="1.8" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 209px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="1" y="202.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-12"><g><rect x="240" y="189" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard UI</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="241" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-17"><g><path d="M 230 455 L 250 455 L 220 455 L 235.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 233.88 457.5 L 235.13 455 L 233.88 452.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-18"><g><path d="M 230 455 L 250 455 L 220 455 L 238.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 237.88 455.5 L 238.13 455 L 237.88 454.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-14"><g><rect x="190" y="448.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 455px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="191" y="448.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="240" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="241" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="49.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="51" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="430" y="107" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Search Service</div></div></div></foreignObject><image x="431" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="430" y="353" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard Service</b></div></div></div></foreignObject><image x="431" y="366.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-21"><g><rect x="452.5" y="588.61" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="451" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-23"><g><path d="M 439.5 523.21 C 439.5 518.46 450.69 514.61 464.5 514.61 C 471.13 514.61 477.49 515.52 482.18 517.13 C 486.87 518.74 489.5 520.93 489.5 523.21 L 489.5 570.01 C 489.5 574.76 478.31 578.61 464.5 578.61 C 450.69 578.61 439.5 574.76 439.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 489.5 523.21 C 489.5 527.96 478.31 531.81 464.5 531.81 C 450.69 531.81 439.5 527.96 439.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-24"><g><path d="M 499.5 523.21 C 499.5 518.46 510.69 514.61 524.5 514.61 C 531.13 514.61 537.49 515.52 542.18 517.13 C 546.87 518.74 549.5 520.93 549.5 523.21 L 549.5 570.01 C 549.5 574.76 538.31 578.61 524.5 578.61 C 510.69 578.61 499.5 574.76 499.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 549.5 523.21 C 549.5 527.96 538.31 531.81 524.5 531.81 C 510.69 531.81 499.5 527.96 499.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-25"><g><path d="M 470.5 533.21 C 470.5 528.46 481.69 524.61 495.5 524.61 C 502.13 524.61 508.49 525.52 513.18 527.13 C 517.87 528.74 520.5 530.93 520.5 533.21 L 520.5 580.01 C 520.5 584.76 509.31 588.61 495.5 588.61 C 481.69 588.61 470.5 584.76 470.5 580.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520.5 533.21 C 520.5 537.96 509.31 541.81 495.5 541.81 C 481.69 541.81 470.5 537.96 470.5 533.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-29"><g><path d="M 494.86 481.37 L 494.86 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 494.86 476.12 L 498.36 483.12 L 494.86 481.37 L 491.36 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 494.86 523.88 L 491.36 516.88 L 494.86 518.63 L 498.36 516.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-30"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 497px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="481.5" y="491" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></g></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: #ffffff; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="611px" height="614px" viewBox="-0.5 -0.5 611 614"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: rgb(255, 255, 255);"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 495 428.63 L 495 411 L 380.03 411 L 380.03 171 L 337.51 171 L 337.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 433.88 L 491.5 426.88 L 495 428.63 L 498.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 337.5 148.12 L 341 155.12 L 337.5 153.37 L 334 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 172px; margin-left: 361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="346.5" y="166" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 115 428.63 L 115 411 L 220.03 411 L 220.03 171 L 272.49 171 L 272.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 433.88 L 111.5 426.88 L 115 428.63 L 118.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 272.5 148.12 L 276 155.12 L 272.5 153.37 L 269 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 171px; margin-left: 240px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="225.5" y="165" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 376.37 137 L 388.03 137 L 388.03 331 L 495 331 L 495 346.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 137 L 378.12 133.5 L 376.37 137 L 378.12 140.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 351.88 L 491.5 344.88 L 495 346.63 L 498.5 344.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 295px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="289" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="325" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 305 399.37 L 305 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 394.12 L 308.5 401.12 L 305 399.37 L 301.5 401.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 433.88 L 301.5 426.88 L 305 428.63 L 308.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="290.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="72.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="71" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 82.5 428.63 L 82.5 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 82.5 433.88 L 79 426.88 L 82.5 428.63 L 86 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 411px; margin-left: 83px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">AMQP</div></div></div></foreignObject><image x="67" y="405" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="50" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Data Service</div></div></div></foreignObject><image x="51" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 115 481.37 L 115 500.03 L 114.63 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 476.12 L 118.5 483.12 L 115 481.37 L 111.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.52 523.88 L 111.16 516.81 L 114.63 518.63 L 118.16 516.95 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="100.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 186.37 373 L 233.63 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 181.12 373 L 188.12 369.5 L 186.37 373 L 188.12 376.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 373 L 231.88 376.5 L 233.63 373 L 231.88 369.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 373px; margin-left: 210px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="195.5" y="367" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 115 346.63 L 115 331 L 210.03 331 L 210.03 137 L 233.63 137" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 351.88 L 111.5 344.88 L 115 346.63 L 118.5 344.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 137 L 231.88 140.5 L 233.63 137 L 231.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>AMQP,<br />MQTT</div></div></div></div></foreignObject><image x="173" y="318.5" width="34" height="28.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABzCAYAAABD70qIAAAAAXNSR0IArs4c6QAAFVpJREFUeF7tnQW0XTXThnNxp7gVd3cv7sXdXYsXd3coUqC4Fddixd0pXgoUdy9eoEDhfv+Tv3PWnNwtyd776sms9a2P3rMje/LuZPLOZNLU3NzcbKJEDaRooCkCJGIjSwMRIBEfmRqIAIkAiQCJGCiugTiDFNddQ5SMAGmIYS7+khEgxXXXECUjQBpimIu/ZDBAlltuOfPMM8/UtXj33Xebddddt1AvPvjgAzP77LO3KHvuueea/fbbr1CdutC7775r5pprrhb13HPPPWadddYpVP8bb7xh7r//fjNo0CDz/vvvmy+//NL8/vvvBs5xwgknNJNPPrltc6GFFjJrrbWWWWKJJcxoo40W3FaabjJ5i6YmM9FEE5lJJpnEzDbbbGbJJZe077nUUksFt0+BIIC88847Zp555mnREOAAJEUkTQko97XXXitSZV2ZI444wpx66qmlAfLvv/+aa665xpx99tnmrbfeCurXDDPMYMG+++67m/HHH9+7bBGApFW+yCKLmPPOO8/06NHDu/1ggPTu3dvwZbsy+uijm88++8xMO+20QY3zcJYSXn/9dbPgggsG1ykF+KJnmmkm2zdXQmaQN99802yzzTZm8ODBhftCwRlnnNFccsklZo011vCqp0qA0CCz2AknnGCOPPJIr/aDAPLXX3+Z6aabzvzwww+2csDw1Vdf1Ro66aSTghqWgq4SeIn//vvP/rz//vubc845x/tl3Acfe+wxs8oqq9g/63r5ty9A7rrrLrPllluaP//8s0U/WEpWWmklC8IpppjCjDnmmOa7776zennyySfNJ5980qJMU1OTOeOMM8xBBx2U+16ubqj/hhtuyCz3999/m59//tkw2/P+b7/9dovn+/bta/bZZ5/c9oMAcv3119uvSOTSSy81TN/Dhg2zf5plllnsbIACQsRVwuKLL25eeuklWwVKZ31HMUVkhx12sMsCssACC9TNAD4Aefzxx81qq61mWF60AIrjjz/eLLvsspm2BYPDh3PTTTdZ+0QLIDn44IMzX8vVzdhjj21GjBgRpIqHH37Y7LrrrubTTz+tlRtnnHEMthlLX5542yArrLCCeeqpp2x9Y4wxhvnmm2/MYYcdZi6//PJaG4888kjti81rWH53lQDoTjnllFrxO++806y//vq+1dWe++OPP8xUU01lhg8fbv/Wq1cvc9FFF9V+zwMIswDr9rffflsrwwBdddVVdkYJEYz6DTbYoDb7UpYZ7b777stcbqoACG0BDgxlZjcR9NGvX7/c1/ACiLsTwDLn5R566KG6F9x8883t1xIirhKY/q688kqD/YGg2AEDBoRUaZ+97rrrzLbbbmv/my8GcOy4447eAFl99dUNX58I4HjwwQcNH0oRQYcrrrii/bBEWJqYZcYdd9zEKqsCCJWff/75Zt9996210717d/P555/nvooXQA488EBrvYug/K233tpOvTQkL40SWRImm2yy3IblAVcJZ511luHrP+aYY+wjLC98zaz3IaIHeO211zabbbaZ2X777b0A8uKLL7bYFlax7X7ggQdMz54965abrKWmSoAwE04zzTR1bTOz5C0zuQDB6ME4FVtjggkmsNPueOONZ5WNsdWnT5+a4gESux1fcZXA8rLeeuuZ+eabr1ZF6OAAUl5cjN0rrrjC2kY77bSTF0A23HBDw9ImApfw/PPPB9tXSTrQdhG/s7P58MMPDTtBV6oECHVj08k48m94HGy+LMkFyI033mi22mqrWh0777xznd3BFDnvvPPWfocnCeEJXCUcd9xx5thjj7VEE9MyEsqJnH766dY+QsYaayw7w912221mt912ywXIr7/+aiaddNI6w5Rlk+WzCmHLjMGs5YknnkhcuqoGyKyzzmo++uijWtOPPvqoWXnllcsBBIudFxB59tlnzTLLLFNXKSwd07LIc889Z5ZeemkvfbpKOOqoo8yJJ55o9+sARSSEE2H2EZButNFG5vbbb7f8wx577JELEGwrliQRGElmzKI7qSQloJsXXnih9tOhhx5qTjvttFafQVj6f/zxxyCdZs4g0Mhzzjlnbd3iv4cOHdriRdjywhKKYAxiaPqICxBIHLaGrI8zzzxzrW1fTuSVV14xiy22WK1peAyWrIsvvtjuZETSdjEMFnaBCDbDwIEDfV7F+xm3DQxf/RFKRVXOICy72IsiLLnff/99rr2YCRD26RiNIkzdhxxySAtFMC1jAGFcItDJX3/9tfVL5EkaQCjH9AcXgfhyIlDa7ITcMr4AwW+hAcFMdvTRR+e9RtDv2DfYOSJsx/XupjUAAuF4wAEH1Nr0XbZTAYJxCuJAGQL3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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="50" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="51" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="240" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Identity Service</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="241" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 462.5 435 L 462.49 421 L 308 421 C 308 417.1 302 417.1 302 421 L 302 421 L 147.51 421 L 147.51 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 147.5 433.88 L 144.01 426.88 L 147.51 428.63 L 151.01 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 421px; margin-left: 245px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="230.5" y="415" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="430" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Metadata Service</div></div></div></foreignObject><image x="431" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 376.37 465 L 423.63 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 465 L 378.12 461.5 L 376.37 465 L 378.12 468.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 465 L 421.88 468.5 L 423.63 465 L 421.88 461.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 465px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="459" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 470 195.6 C 470 190.85 481.19 187 495 187 C 501.63 187 507.99 187.91 512.68 189.52 C 517.37 191.13 520 193.32 520 195.6 L 520 242.4 C 520 247.15 508.81 251 495 251 C 481.19 251 470 247.15 470 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520 195.6 C 520 200.35 508.81 204.2 495 204.2 C 481.19 204.2 470 200.35 470 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 226px; margin-left: 471px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><i>mariadb</i></div></div></div></foreignObject><image x="471" y="219.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="452.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">search-db</div></div></div></foreignObject><image x="451" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 280 523.6 C 280 518.85 291.19 515 305 515 C 311.63 515 317.99 515.91 322.68 517.52 C 327.37 519.13 330 521.32 330 523.6 L 330 570.4 C 330 575.15 318.81 579 305 579 C 291.19 579 280 575.15 280 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 523.6 C 330 528.35 318.81 532.2 305 532.2 C 291.19 532.2 280 528.35 280 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 554px; margin-left: 281px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">psql</div></div></div></foreignObject><image x="281" y="547.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="262.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">auth-db</div></div></div></foreignObject><image x="261" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 376.37 117 L 423.63 117" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 117 L 378.12 113.5 L 376.37 117 L 378.12 120.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 117 L 421.88 120.5 L 423.63 117 L 421.88 113.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 233.63 127 L 200.03 127 L 200.03 291 L 186.37 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 127 L 231.88 130.5 L 233.63 127 L 231.88 123.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 181.12 291 L 188.12 287.5 L 186.37 291 L 188.12 294.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="175.5" y="236" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-13"><g><path d="M 305 147 L 305 182.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 187.88 L 301.5 180.88 L 305 182.63 L 308.5 180.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="240" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="241" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 115 264.63 L 115 250.03 L 114.65 235.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 269.88 L 111.5 262.88 L 115 264.63 L 118.5 262.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.53 230.12 L 118.19 237.03 L 114.65 235.37 L 111.19 237.2 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">S3</div></div></div></foreignObject><image x="108.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="50" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Analyse Service</div></div></div></foreignObject><image x="51" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAABECAYAAAD3Lo2pAAAAAXNSR0IArs4c6QAAGyhJREFUeF7tnQn4f1k9xz8jtJJoDy0KLaNCsiulGMlWIyVabDNNFCpb0oZKiVLKTGVX1FimxTDRXlJ2RYulkq0IZSnqvsy9z9w5Pp9zzzn33u/87ve+P8/ze+aZ//ecc895n+2zn1NMJASEgBAQAkJACOwOgVN2N2INWAgIASEgBISAEDAxAFoEQkAICAEhIAR2iIAYgB1OuoYsBISAEBACQkAMgNaAEBACQkAICIEdIiAGYIeTriELASEgBISAEBADoDUgBISAEBACQmCHCIgB2OGka8hCQAgIASEgBMQAaA0IASEgBISAENghAmIAdjjpGxjy9c3sDUE/729mj9/AGNRFIXASENBeOgmzcEL7IAbghE7MzrulQ+t4FsCHmdmNzOzjzOzDzYz/v7SZvaf/e4eZvbH/+7fjGfaJGYn20omZipPXETEAy8/JB5vZ35rZVTJNP9nMzlz+00fTog6tbU/lzczsq8zsy83sEwqH8n4ze62ZPc/Mzjazvymsp2J5BLSXtEJCBMQALL847mBmvz7R7DvN7Bpm9t/Lf/4oWtShtc1pRMp/tJl9xczuv9fMftLMvt3M/nNmW3uvrr209xWQGb8YgOUXx7PM7M4FzSId/UpBuT0W0aG1vVn/fDN7jpldccGu/76Z3dbMYJhFbQhcp8PwpUHVh5jZOW3NqtYxICAGYNlZ5PD7OzO7TEGzHJZfWVBuj0XEAGxr1lH5v8rMPnSFbv+mmX2hmf3vCm2rSSGwawTEACw7/d9gZk8tbBL1/9XN7J8Ly++pmBiA7cz2B5kZkvonZbr8T2b2O2b252b2L2b2vt4h8AZmdpveHJYb8dd2ToQ/sx1I1FMhsA0ExAAsO08vNrPPcZr81e6Q/FLn37+5O/yesmwXjqI1MQDbmcZbm9kLg+5iv8eOjz0fu75HMBB3M7Mn9kyBVwbG4RO3A4l6KgS2gYAYgOXm6bpm9iaz//fE8ls77+Y79h7O6ddeZmafvVwXjqYlMQDbmcofM7P7Bt39pgqN2Keb2YsyZoSbds6Ff7QdWNRTIXDyERADsNwcPdjMHuY09yQzu4+Z/aWZ4ZCTEp7Tb67sxpeY2a85df7HzD7EzAipGohvfn3vTPXxZnaFXg371x3z8Vtm9rRM0p2pbl3JzL7MzD7PzE7tJL1r9VIcoZCYNv7BzH6vV//iHPkfUw32v9cwAN9iZj8atMt84OhUSoSf3TsojKSLGjuiT+61PNjDiXsHG2LemYt/7UND/7RvA+fPfyztlFMOWzvOcfx9Zm9KunK3/pCmwZwwVPpKNMorZnynpOpzzew0pyBqftbaf5U00pf5cSc8Fs0BIYEP6tbYswvbWgsfwhRv7vSBNTbs/cv2fcURmL13OTN7d78W2HMfE+zbq1Y6O/5hYHYBLyKMyK8A1eylKXjpI/4YX9B/mzXHH3PMfn999/sru/XPXmetzyEYQr5zq+6M+tj+O2CJOYk1/rtmdl63/s+vXGNz+nR0dcUALDelqCm5YFMaLo7HmRlZ7FIaHx6lveHCjS6jj+i+867+MoAp+e4J5ywOjMf25caMQ64vH9U5ZX1f5/CICaPU8QtP7kf0WfymvlNzaHHRcuF5jpev6y/jElzZC283s6s5hTm40fB4/eZAfIyZ3aTkI30ZMIfxYu7/vqLepczsnmbGvHIolhBmqW/tGLU/KCncUIaD+BZOPZL6kPinhmCcvqZniGGK+XtLN14Y2xJaGx/2HHsvpR/pmLxv6xketBgwg2OCAYAZIkTyAcFA7t5d1j9bMsg+qRLJkzxCMBibG2v2UvR5Lvnv6pmzEgdn2sEsBHNeywgQTcI58RmFWPyVmX1HBXNY2Ow+iokBWGae4VY9SYuLCY4fD2ZU/S9xPsdGxhmqhj6ll6y9OlwMmB2e0R2gOE+VEuW5XKaIiw7O+9pTBYPfkUqJfohswlSrPbR+vnMw++rgezc2sz8r6Gs0h1TlQOLSHRN7h4sfG3crETECFi8vaIDL9Jm9BFZQ/GJFkMa5YH6xtmJB+ehSpCrrOrqoCpquKnIIfCJtB5ojHIB/KthzAwOA9gAtgke/1K3T0wtHDBMBM+ERbdDWQLV7KW0TZob9jlahltjjMAE/UVCR/fTw7lz4noKyXhF8SPjWlHDR2PxxVhMDsMy8ouY/w2mKnPWD1A/WqDI/2ikHt4vqrJS41P4kKMwFjVT6w6WNjcrdtcvc9guZekQtcIC1HAbjZocDM/pU7aGF1HBB0FiphuUHu6Qz3xm0gWYnfZsADchDGzBOq+AVjxofbUVEqD5hErCDtxJS9F06TcUvtzYQ1INx/LrgN9SzSKNrJ/M5FD6YILwkRzBmmADYk96ZOjAAwMQ8ew6NmInIHlqSHIy14EnItIEGa4x37V4aTyUOzc/vGN3Lz1wz98uY6YamiZ6CiZpD+KOg7RIVIiAGoBCoTDFU4Ej6qMVTumVvqxr+HYkRdVVKtamBSa+Kvc0jUrD+dJ9vvXZ0ODEitUVcNJLFnYJG8XHgYh/8GTig8D3gcPYoxWZcpvbQYh3/Ra85SL/1xxMhakN5VJWooFNCs8MFPSbMAZh88LdIiUP4Bf1Bz+WOXZ5DGTy8CBHqoxn63MxkYS6ItDOv6dpn/QyXD+F4OOV5JgnMMDfsbai1ayMqT7/oX0T0CzMU0vNasfyHwgfmGCYqJcaG1g2nR4/GDECOcbx9b9POzQ3M99sCRgMcUh+W2r00fJvzDD8D/Ho8gskgRwMqeHxdWNv4M3mEBorfIyEHTSXaE48wy+HjA9PD+xF8g/JfHJTHbwDfJlEBAmIACkCaKIIT3LlOGS7CdEOgTuPATqk2NXBuU6Ny5XcIrhrHKpgFLuLbmdmjAmfEoU+RsxtSMNILF1pKXIaMjQ06JjY9KmKvDuroSG3fcmhho/yBYK5gmGAQImKeIlU1mp1Uhfm9vboybY9DioOJi98j0kQjRXp+E5iIiApJKafdQPrmwE8vVhgT8PWk1VJTTwaui/2EbRs7Pb4nOcLXAcbot/txLmUaOCQ+kamJJEgwVoPPA2uNtfDvvVSPMyAmJggGO1qLqLGjiIoBW9YjGkePwAJ8x9Syl6hP3gX8MTzCrwRBAxPWQNwlZ5kZUrhHOAN7viKsGzSjMBEp4bdCnggvEySmN0/LiRDDfi/1G8ku2mP/UQzA/Bkmox9pfVN6ZJfwhIsiJS5j74GUmtTAuU09fA91GhJ5StfsmRDU+R4hoWCLSwnNBRoMj7xLcigX2U3xUsar2JMKWw4tJCMOEiIQUsKuGDEHlMWBC0fIlPBupt00WRNe/F5eBy5cjxkct/tDvZf4+N9wmPv+7gLBUTSlCD8kLy6dSL3OgYrZInVqjMYUTG3RP39jQz4L5h/tCn8wPkiHNREDU+trDXxw0iNnQUSo79ECwGTl6NWdXf1TnQI4m3qRQuOimFWQclNCA4FfTrqfWvYSfksIMN5eoo+YonA09igyh1LWEy4ifwbGQWRRzn8n2hsw4TwqJZpAQAzAvCWCBzpcsCfRoYL1PGCxSXPYp1STGniKAfi5DPfOd5EyIk496gfShRflQHtcepE3O+pfmCGPYEZQ8aXUcmjRBgmXyLmQEpnqUs/scRk8tz0VPPZy712HyAaLLRzzS47wAcGTHDUupiP+i4rYI8rC1Hj7FOYywnVoi9/BPyXCUiMpcqL74c+Reau0PRgZJEu82AkjKwmTPDQ+UwwAjBBJj6YoYjipRxgpqnePkJYJgfNMTzgFEiqZUsteitYNbeeYfX7HZAAz4pFno4dJHTSW4zqo8T1GZ1yG32GIUqpxqJyaq6P+XQzAvOmN1HEkLIkctiIVYE1q4CkGgN9RhUWEVDhW343L8XBIZKtuQQs/gOhQxF6NjX6JQ4s2ovwI/BblW/jI/lAlhCwlmAnvZUdsn8Tgp4QfBCpL/rsE4ZQJM+cRDIsXVTIuG6nH01CxJfpKG5h0cHxFszOH2AtI0WhtkDgjOjQ+OQaASxsv/xIvdBhfzCaeaSzSwIEBKvkoJfKSeykK7UQqZ26HHAPRvCDgEDro7Y+xpg3tGkywRzkchvKEJOJzkzJEaCcQzkrmYs463XxdMQDzpjCSBPEmx9YeEfYwQvlSKk0NnGMA8DHw1Ivpt+DSPQefUqe5UuTu0akmnx4UjqIfWqQWPsElzoXhjQvpyAudihyQkEA5qHFgSikn7RL6hGoSezfqbbRArfZIbMJI6x4hKeYuR+qgyvWy53H5lOYRKJ3noRwe46jBWcu14a3pt9CM0E4UH39ofHIMACYyz4wU4YetniQ3KUW2cspFUQg5gaN2L5HIiAvU0zKwlmvyXUytHRyKxyGL4/L4E0TM77gcjJe3llsSrE319+h+FwPQPqXRxoLrxEs8dzhHKsDS1MC5TV0aURAxLyV51y/d28CRdpF6UMXyEmLk8R+hvDQDwHeI2fdiibG7fprTEdT83quMeB4TvuQR2h3MCiX7B0cwDnU0Kxz6MAWlGRFhIvAMX4OQ0KYkubnfRSql/2giPitw9Cr5RqRaPzQ+OQYABzfmuZQivwnODxjY1DTGxQxT6oXkPTDjn1PLAESOyowL3xfP36l0zGk5BCXCb9cg9jTmTFEGgZIDTAD6CBADjpoqpZJLnA2ObddTAZZwrrlNXWIbps+RGjvHANBfJDKcBFGdz6U1GIDoTQb6ipMUuA8EI0NqUTzZU0JDEyVtoSzqaSIPaolICRyUCCnjQM2FxuFd7jEttd/0ykc+Kku07bWBdganLrzhGROhlZ4zrFcXLQxMV+oQdmh8cgwAEQA4c5YS+wcznCdpe28oYI7CxyUl1g8SML4kHtUyAJi2OBs8wpQH47IUoSWFeVmD0CAQASXKICAGoH15YGO/Xnv1sGZJ4praTe19LJKeIgaAA5zQsigPQAsUazAA9AMHIrQTKRE6NPa0JyzyN5xyxK5zWU3RkAmwdR+hUkXFjxOiR1F66al+lfzOBbz2OwFT/cAXhTnAlk/yqhx5jl2HxidiAGBQvIt8avz4lxAamhImpPTfMaNhTkuJlLveWh/K1Z4VOL3ihOlRTis2NVbvd15CXZKhGH8D59e1tAstYz2RdVoPrhM5mAN2Kkrru0QXSlID125qr1+1DMAUt440w8VJzO44zS9MUpTXey0GgBhlL+0tEuMQjw0mkS0/p1JNseQixbcAFXcLcXkQsumFjiHxEuq3Bn1R76ewRtstbeK3gs03ijTBbEJymrH55ND4RAwAjmiYwGopcmIkIoKxDnk1YL6JsvGSjd0r42NDf2rPChw5yXfg0RP6dLu144zK50IG536D8yrK7Dm37aOpLwagbSqXSFuZ+/JUauDaTT2XASA2GWnLC3fksoeLJ5OX53V7SCfAYZxRdkb6h7/C4HlMopE0WgOHPVSqkXdyNG+os1HTYvNm/mr8IfB6h6nET2FMkZ8GZVAhp/kJ2lbzyanFBcelHkURpJEPh8YnYgBwmptKhOShjD2fsD5vrZBgbFD5Ez+PpJ8SjAJaFBiQiGrPChjDKIb+nD6751IrJmdGK8mpsVQ/dtuOGID6qcdujLTbsuFLvzblyFe7qecyALkkQFNP7uJIx2tpHq2lAeBbfNNz4hsiLbhkmMd0D2ASmFJHT80j6mCcI7F14xyG1iGSbIe2UAenOQyiRCfUSf0Zpvp0qN/BkwQyuceecn0hhCx6whn19Pgtg0PjszQDAA5ReuGxvZ3QSi/HPap6tF05qj0rSNEdpeyFMYhS8Lasr9yjRiU5NVq+qTojBMQA1C+HXOhKfWt+janUwLWbei4DECXYoV3y5+cessFuyCtdh2YAogeTGAvSVaR+JdNbpAKdM79c2KTtxQ/Bk/jQPOBINk6nHD0hTT+ilM1z+lhTF7U06xATBX+sA/7LQzfMeeurbrxaGCVTIg5+HBp2aHzWYACi3BXjUE2y8uHcmlKUp2JcrvasQLOEY6x3N5SYJ2vWUOTYSBs4WXsJ02raV9kJBMQA1C8RkqiwaVMi/7v377kvEMuNXc2jXGrg2k09lwHIeVujCYnSgrK+OLyi9KZragAYM05uY5s//4anNqpmzDipUxWqVFIkl4bp1a+eC5MskfHOIy5PTC0DRb4M/B7lNWjpU0udXLgY9mo0HjnVdPRNGAdCOT3C2W2sCj80PmswAGiLwIvENSnBVLGHvIyihHCSSGdK09JyVuR8K4hgmjKPodXwMmhyThB+OpgK0cJFGUR5hfC0loWpOuUIiAEox4qSLF4Wv+fx2/LISm7z51IDt2zqdKQ1ToAk2yCm26Nc2GLOo5i2cJzDjpvSEuOjTRyksFumRCpeJMn0aWbvNTVvzOwb6nLJkeyGPySW0guPx2C8JDlp6GEuXLQk4ROhfpghsDMTQ85/+YtSD9fthgtfgkOz4RFOmGhZarKxEY7JWouia1Kzx6HxWYMBADvU/WTMTImnxNG0eI/e4EAXJYkat9Oyl3IJlqYSHnGmcUZ6mQA5c/AxGFMUyYFfDIm4crkqED54nXFY18N/o8e4atf30ZcXA1A3xbkc+nCrcK21FD1lmksN3LKp037VMABR1jLaTNWyw3dwpMOWiJQSERqT85wflxgfzeJkRUKV9KUxQso8CQXGIJLOh26iseGwJg3pmDissdVOEfZxpB4vjwLah1QiAp/I7ooEHIVs0Y8o1wNt1mqrvHFNJXJhP7Bncmmph3aZcxxJ06eXh98jhueQ+KzFAEROfuDHevFy4peGcbbspch8xlzgN4MwEL3VwD7wHrWiLk9Hp9EuOf+iKV+oSFsEI4DWcU1N3tQ+38TvYgDqpinKkY03Nt64U+o472s4nEWMQ5QauGVTz2EAchKBl/+eMSF5w8FDSIHeWkPV++AVGQCa9iI2vP4gzSJ5Tkms+Ah4qWmRqnkh8ILMkuIwJ2SQQzIlXon0Qv6iB0+ozzdhAnCGGxNSIx7WUZKVVJVetwsuKk12OrQZqSZl3B6+DTwJzR9jRKLj1T8YKKREtCikxOUS9BJjDW15yXH47ZD4rMUAMG5s/sN+GcaMPwj7BpzHBEPlPaDjzWPrWYHDXyqtD+1zDpJpb/zoD/1E48bT2d4rgoyPviDYjAnTB795GQ4pR7I1HidKE2bxfXx1vMikKcfk1vV+dPXEAJRPKfbZyNmtVHXsfS0nEUZZBVs39fj7NRoAJFBPUh/a4yJClc9/UTuPDye4cbh+7zIijInMhdg4YZ6Gy3OJ8Q19QwWOD8MUkd3Qy+yY1kPFSe511oNHfAssONSGAxxVJRcdSW+8dwpoB0fJyB8EcwXq9IhYJ1yw+DdwGSPdR6r5qZcip3BKf8engcRL3kFc21ZUnkRJMAgRc3YofNZiABh3zqExxaXmgmvdS6wf0l17vgn0h4uciBmYES5vtGdRpAvzxppMGdVhXOTBgFGPCOdDomTQPuA3wJqLMmTyuiChvZL+C3afGIACkPoiuScy5yZVQVqGe/bIs7G3bupx+zUMAOuER4JQDdYQGx9PXzYjl0SOOOSHx1GWGN/4WzkfhqEcNnkOmhJC/YozGiGhSxBtIclGaYGJDoCxiJiO0j6Q9wCMI6fN0nbScqf3nvtL4TFun0sI81r0eiVlD4XPmgwA4aJI1iXERctFV0Jz9hJ7l7DLliyH476d2WlIUefnCGmeJERzCNs/6zt6TnlO20dZVwxA2bSCE6puT6oiZA/1v/dqXFnrFyaP4UL2yEsNPGdTD9+oYQCoA1eNZFua4IbLHyclNj4HCJICr9NFtCYDkPPdoD+MqzaTH6lakTy5fOYQ7wFgVhiH/3nt4TNA2danmnk6GLVpZLudMwbqEhWA9/dUvoPS77B+wJfLoyTH/iHwWZMBABcu9SnVPkwCsfqlNPes4CEnXiFsyXuChg8bf0lOfswg+NCwV1sIjRvrO02m1dLWbuqIASibarhKHOE8WiI7FmYAJBwv1acXezt3UzOOWgaAOkgpONBF6uUBHzYjar1xnn0uTC4w7NMerckAoMbEMzl13Bv6EdmXp1YHPgNohnAojMYVtYE9HJND9ByqVw81+xn9I0QwnSVETDc50YnNb32WuOQ7lGEdw8zg45BmWCxtA20R9mf6jONfDa2Nz9oMAKp9zydmjEHOVORhtcRZAeOOIEJyHs++730XdT99JQy4hjAVYI4rXT+YIs7u99Lar1vWjGMTZcUAlE1TTkWP9H5+WTPZUlEoEJVSj98lNnULA0BfUPPi+Y/DG1IfTAvrCO911LXn9nn4cfRKCSmb+HXi/7mUkXpxvkMCR3ocHsVZYnzpt6P8DfQT7/s5oUNEOuD4iHSOBIwHMpoBnLe4dJFgOZyIr0Y9iT0z99Lg1HJCC8P3eLkNaRC7KPMAE0IoIi8eou7nIuXvkrCHwiRiGuMgx3QBJkRjEOrHJYK/CE8l40CLIyHYcOHDNE5pQy4pfNZmAHACTV88HI8VLSM+JPjVlNKSewlGAHMM644cBThxonmhX2iWYGrRNGE2yCUHm+o75wlpn/GZ4b+MmW+xn1gzCEuYJDGdES5dg8fUt3f1uxiAXU33bgfLhYPHsic1e6/M7RYoDVwICIH9ICAGYD9zveeRkiwEDYNHSBnR++d7xkxjFwJC4MgREANw5BOs4f2fWhzTxKkOFjxf7P27YBMCQkAIHD0CYgCOfop3P0Acisg14BFvAZB9TiQEhIAQ2B0CYgB2N+VHO2DW8jhRDI5DpKo9KxgxyYdwUFvbM/5oAdfAhIAQ2DYCYgC2PX/q/UUIIOnzZjphb3jJ4xmfW9940Y/DFIWlEBACQmBXCIgB2NV0H/VgeVeg9A160o4S+y8SAkJACOwWATEAu536oxt4KQNAQifi0708BUcHigYkBISAEIgQEAOgtXEsCJQwACR0IjvZ3EQzx4KZxiEEhMCOERADsOPJP7Khk6aUFLQ4//E6GRkLycBHVjwyDJIuVI+EHNmkazhCQAi0IyAGoB071RQCQkAICAEhsFkExABsdurUcSEgBISAEBAC7QiIAWjHTjWFgBAQAkJACGwWATEAm506dVwICAEhIASEQDsCYgDasVNNISAEhIAQEAKbRUAMwGanTh0XAkJACAgBIdCOgBiAduxUUwgIASEgBITAZhEQA7DZqVPHhYAQEAJCQAi0IyAGoB071RQCQkAICAEhsFkExABsdurUcSEgBISAEBAC7QiIAWjHTjWFgBAQAkJACGwWATEAm506dVwICAEhIASEQDsCYgDasVNNISAEhIAQEAKbRUAMwGanTh0XAkJACAgBIdCOwAcA2PuNkCLcxoQAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 495 153.37 L 495 180.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 148.12 L 498.5 155.12 L 495 153.37 L 491.5 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 185.88 L 491.5 178.88 L 495 180.63 L 498.5 178.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="481.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 276.37 41 L 305 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 271.12 41 L 278.12 37.5 L 276.37 41 L 278.12 44.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="255" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 255 15 L 255 40 M 255 20 L 240 20 M 255 20 L 270 20 M 255 40 L 240 60 M 255 40 L 270 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Researcher</div></div></div></foreignObject><image x="224" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="225" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 225 532 L 225 557 M 225 537 L 210 537 M 225 537 L 240 537 M 225 557 L 210 577 M 225 557 L 240 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 225px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Database<div>Engineer</div></div></div></div></foreignObject><image x="199.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 305 481.37 L 305 508.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 476.12 L 308.5 483.12 L 305 481.37 L 301.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 513.88 L 301.5 506.88 L 305 508.63 L 308.5 506.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="385" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 385 532 L 385 557 M 385 537 L 370 537 M 385 537 L 400 537 M 385 557 L 370 577 M 385 557 L 400 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 385px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">System<div>Engineer</div></div></div></div></foreignObject><image x="361" y="584.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 59.5 523.6 C 59.5 518.85 70.69 515 84.5 515 C 91.13 515 97.49 515.91 102.18 517.52 C 106.87 519.13 109.5 521.32 109.5 523.6 L 109.5 570.4 C 109.5 575.15 98.31 579 84.5 579 C 70.69 579 59.5 575.15 59.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 109.5 523.6 C 109.5 528.35 98.31 532.2 84.5 532.2 C 70.69 532.2 59.5 528.35 59.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 119.5 523.6 C 119.5 518.85 130.69 515 144.5 515 C 151.13 515 157.49 515.91 162.18 517.52 C 166.87 519.13 169.5 521.32 169.5 523.6 L 169.5 570.4 C 169.5 575.15 158.31 579 144.5 579 C 130.69 579 119.5 575.15 119.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 169.5 523.6 C 169.5 528.35 158.31 532.2 144.5 532.2 C 130.69 532.2 119.5 528.35 119.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 89.5 533.6 C 89.5 528.85 100.69 525 114.5 525 C 121.13 525 127.49 525.91 132.18 527.52 C 136.87 529.13 139.5 531.32 139.5 533.6 L 139.5 580.4 C 139.5 585.15 128.31 589 114.5 589 C 100.69 589 89.5 585.15 89.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 139.5 533.6 C 139.5 538.35 128.31 542.2 114.5 542.2 C 100.69 542.2 89.5 538.35 89.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="40" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 559px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">mariadb-galera</div></div></div></foreignObject><image x="41" y="552.5" width="148" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 210 547 L 196.4 547" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 191.15 547 L 198.15 543.5 L 196.4 547 L 198.15 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="430" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">User Interface</div></div></div></foreignObject><image x="431" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAABECAYAAAD3Lo2pAAAAAXNSR0IArs4c6QAAFX9JREFUeF7tnQXwLTcVxk8p7lBKcadAi7u7FCjuxYpTvDgtpbi7U9ytuFuR4u4U12IFirvdH7M7sy+ck81md+/b+/7fmXnz2neTbPZLsvlyLDuZRAgIASEgBISAENhyCOy05d5YLywEhIAQEAJCQAiYCIAmgRAQAkJACAiBLYiACMAWHHS9shAQAkJACAgBEQDNASEgBISAEBACWxABEYAtOOh6ZSEgBISAEBACIgCaA0JACAgBISAEtiACIgBbcND1ykJACAgBISAERAA0B4SAEBACQkAIbEEERAC24KDrlYWAEChC4Gxmdlszu6yZ7W5mJzGz/5jZH83sZ2b2fTPbp/n/ogZVSAgsCQERgCWNhvoiBITAUhB4oJk93MyO1dOhXc3sV0vptPohBIYgIAIwBK15y57OzH4cPOJzZnbhysef28y+EtT9gJldubJdVRuOwCfN7GJBtTOb2Q+GN6kaMyBwBzM7pLBdEYBCoFRseQiIACxnTEQAljMWc/VkEwnAQc1JuMXkS2Z2/rkAWkC7x26I+CkL+yICUAiUii0PARGA5YyJCMByxmKunmwiAfiqme3ZAWRHJwCXMbOPZCbAu8zss2b2FzM7tZkdIB+AuZaL2p0bARGAuREub18EoByrTS25aQTAMx/t6ATgjquN/XnBBMMn4OBNnXzqtxBIERABWM6cEAFYzljM1ZNNIwCPak64XTx2dAJwPzN7fDABMH3w/hIhsEMgIAKwnGEUAVjOWMzVk00jAN8xs7MmYOzoBADv/8cEEwCV/8/nmhxqVwisGwERgHUjHj9PBGA5YzFXTzaJABB18hkHCBGAuWaH2hUCa0ZABGDNgGcet3QCcEEzu07jAb6HmZ3MzE7UJEb5vZn91My+ZmYfWpV5s5kdNQJaPLEJT+TPJc3sVGZ2ipU3+jHM7JfNs3jO28zsEwOe83kzu4BTHrsu9l3keCsHrwes3uVGZnamlTr4+Gb2JzM74YDnREVrCMCTzOzeToMfXDmrXTH590usQgn3NbNLm9kZmhh2YtSPMLN3m9kLzOy3mffgdLtbxXu+tHluX9WLm9lVVnPk8k3/GFPwpY+M66dX4a5vX435e83sb32NNb8/2cz2L8Dn1qt5g32fuXvSpvxFzOyvmTDZki7kogCYx7zv1c3svI02hTXDHPuDmf2mMSl83MxeOYF2gciFvZpn8jzw5Q9YHt3MA+bg65q1WvJ+Xpm51mdtf1SvEgERgErgZqi2VALAB+UJZoZDWKn8Y/WBf1HjMPWL0kpmtrOZ3cbMCD1jAysRPLbvaWZfLCgMabicU+4pzSbLJv9hM4PsdGV7EgDIyUOdPvO+LZkhQx2b+w17MGDDuYuZvTYoNxcBgKg80swgKCVCPoT7mtkbCgqDjeeY94XOOBLTT2x/KnMRgGM2ODOP2YBLhDXz4hUxuE9FVAHPeFDzzOOWPGyV3fCwFQG5x0AiMPf6LOy6ik2FgAjAVEiOb2dpBIC5wcbPB6lW2FBuYGaccPrkxM3GBOEYKv80s1ua2Wt6Kr5jdcq8hlOGzZMNgpPsrZzftycBAP8nOn36XnOi5DQLCTpPIWiksiW97Uuc8lMTAObQI8zswMK+pcWe2WxS9DmSyGkP/4WzN4QSMurJHASA8TjUzK5U+c70Gw3JkYX1IatoTfBPGCqQDkjAcwsqrmN9FnRDRaZEQARgSjTHtbU0AvAQM3vYuFf6X21Uzqjxv5FpCzUwJOF8I573r5WK86bNxzdqhhPl9Z0fORFjAiDm3VsT25MA3HV1imQjTAW1Oernt5rZtQbi9ucGazabrkxNAKKT95DuPr3R8ER17m5mlEkFzdPpV4QOosTa8mRqAoCJCvNF7ebf9pHMnWSMJNdATshZQF6CEwwB1Cl7r5VJ72kLWJ8jX0PVhyIgAjAUsfnKL4kAkJb2m0EedOz92JPZ0Nnc+ehhN0a9ywfJk8ObC1Ui9Dihofr3hDTIz+lsztg2+eh7JglU3Odq7MleW69uSEL6G5qBn6wueLlT0IftSQDok3dCw66LtiJS5/fNVDC/XVKIjaD1dbiFmZ3DaQSS8Kzk33EMxB+jK/QNjYonXKTDhgPpg4wQaUD5awblsaO/P/gtwocxu/3qHRjzSCAAP0zGnTl81aDC4xz1PD4a7UYdkTWaY92gafpy08Y5Vzb/O2fICX4oUTgi7e3S+A+cNugrvg3va9JL43fAe6URHW1VNGj8jn+AJ+tan31zVr9PjIAIwMSAjmhuSQTgwY3qNn0dPth8pCNHsr0buy1OQqngmPYx59+xD3MngSeoqdmk/p38yAUtqPu90zx1IjLxqhWxuZnzoE81xAE1J/KtZnPi1jdO2TgD4sA2VmqcANnEnh88mBM8N9ax2aFqZ7NDdYzTJO+JfTw6HbLx8m787QlqZW9DLokCQA3+o8ZJNG0b3wVOyJC1VCJzx3cbMoKWJ5UocQ9zBp+P1lESjQkkAmdDfCbYgKnLhtyV2jBAiDC3A3q+K2zGRFXgJNsVnPZwTPU2cUjSaTIT7uVmBknzBJPQTRKnQr71dwu0JbRBdkMIUSrrXJ+Z19VPcyAgAjAHqnVtLokA4MWPx38qbLhv6nm9xzZe9N1ieDyzGeGxnUpkl8cRjNM8H09PONV82/Fa52SMPRSv51Resapz80z//96cBj37eN2obltragJA62CLYyNOb6mw0XIKjNY519yinfFkDAGI7PJsyvgqfD0DZjQfICPvdOrlCFJbHBMKToUlkQW1BCAKm6QPaGkwT3mSSzyESSwlKLTRmjZwNkwFjQb1fhc879lmtl/w2xUa0tT9eZ3rc4o1pjYGICACMACsmYsuiQBw0vc8tgmlelkPDrwHGxInUUID+ZsTqieU5aTozUO0EGSiy4mXqY7yqGL50KXSRwA4EUan7SmGfw4CgPMiquVIIr8HyuMA9oyg4hgCADFDM5EKJ3DU+Tnhd+zoqbx+RRxu7Px7HwFA65MjfWmTtQQAjQLOe56gYfIIGmXxj/E0Y/y2T2DCiOY9ddjcc059aBswd3mS+luse31OscbUxgAERAAGgDVz0SURAE6N3jXBqDg5VfL3FMIHjvhnT3Kn07Z8pJ7EMc7TYOQIAKptwupyHudj33lqAsBp7yyOiaTbTzbNyE+A0DxC1TypJQBoXyB+nuBYiqkiJ4SxYS/HzNMVTrTknkjHJ0cAOPHjz4I6vVRqCUBp+2k5iBKEyZOIoJEvwVPXo2HBrPDrns6gjfPCE1nX+DS0su71WYuh6lUiIAJQCdwM1ZZEAAj/Q2XqCaFDqAVxBCQJD3ZNzzZbAhGqWU7rnpB3nQ0uJ6hCPRXpjwNbbI4A8L7dj19J/4eWmZoA0N9onNq+5TYYTv9sMp7UEgByEXBa9wQbdET4uuUhY54tHSc2vPq7kiMAvMPQCIl1EwD8SyJCTWw/JrWukEQIMpQSJMqwFofk6+ibv+ten3390e8TIyACMDGgI5pbEgHAhojKsmR+4CiHA9FHV6p/stNBCvrCl1qYIBFXG4FZrionnPQklCMAnKh4jzllagKAoxdZ3XKCQ2Zk++bWOzzRPaklALkNdCy25JR44wACgH3dy6GQ68cUBIB1g1c9Wii0SpAwHA/xWylZU23/PAJA3D+RMZ7gu3O9sSB36q97fU7YdTVVgsCQyVjSnsrUI7AkAsBbPLrJLjb0jfAqx1kLj3Q+SKkHf7c9bKMXHfqAwvKchFKv6xwBIAIAh7o5ZWoCEEVWpO+Ac6N3YpyDABAqd/+ZQESDkIYg5jQA13bCE/u6NpYAYJaij/gEjBWPAGCaw0TnCf4r+LFMJeten1P1W+0UIiACUAjUGorNRQCIm4+uMCX8zrP1t6/bZgKsnSdswKj4Sa/rCbkGdp8JW5yr0nsCIgJAHLS3QU7dtakJAKfLkhTIRFIcx3mZOQgAbU65CXW7fYBzU1+OAJQSpO4zxhAA8iiQVnoq8QgAd1REWh9yK9CHqWTd63OqfqudQgRqP+yFzavYAASI3Y6clViItScKnOmiDfgtqw3kuj19ZCMlIcmlBrxLtyibK57qXmgd4WCE+s0hXMCCCrMrEQHA6QwV7dyyFQhALsxsLL5oF9igu5IjAKjLI+/7qC+1BIAU0/jGRIKpDLJGhkJMMq0zI3kaojXoEQDyOxDZ4EnOp6MG+3Wvz5o+qs4IBEQARoA3cdWcrRZbdumlImm3iD+OsqG1OfBLXoWscKhUsdkTIkj63lJBBc1pLL1eNgo3pN2TB7H8pc/0ykUEAKeq9oa4Me331d0KBCBnOirJI9GHYfp7jgCUaki6bdYQAL6jZMb0MifSNs50mEU835ihToAQWy8fAs95YZP9cCiGUfl1r8+p+q12ChEQASgEak3FOIniKOQJH4o+r3ivHrG9pM715DFmhlp1qKAu5+OK/R7nObLk9anySRULgehKlGSEMmdscgQM7VuuvAjAtujMYQLIJbYpySMxdLyXQABySYDIyufdQNm+J9EukZbC0wBwR0CUshdiEKVTHoor5de9Pmv6qDojEBABGAHeDFX5EPBB8CSXtCXqCloFMupFN4URslVy5WrJq7Jhk7aXdK6edoBQQRztuqlno7vceZ6XlaykHyIA/4/AOn0AIHmYljzhcinvauMx47oEArB/kOWS9+L6Ze6yiASv/TSyoS3rEQA0Y6Q19r7d7Q2IY/Ds1l33+pyq32qnEAERgEKg1lQsF39P/DOe7aUhdnQ5yq3Ob9jmMStEKUNrX5nwJ049nuDHgD9DK4SxRVf49l2GUtM/aQC2RW0ODQCJaLBze8LNdd51zDVj2dZZAgHIRT5g348IEe8QXUHNbx4B4N9ztnky/UWJmFrMMAniTJgK3wK+Ca1/wrrX55h5oLoVCIgAVIA2YxWy7EW3nvFYNrB9CxPv7NVcFRt5txNKFN16xrwgKgG1Pneq84fTGyaKEuEyHeqkcqHm8pP23/lYkQqYi1RSIdYZ1WpOIESYIbjg5ajmb/47Sj0sArAtmjUEgDSyJGDKSeQ9ji8IF9zkMtXhi4HfCuPY/RNdQLUEAoD3fZRQCa0Yt+l5gtaMzTzypzmwCcdN6+YS9PQltOJ7AEHwfIpwmsXHYHutz5Jvi8pMiIAIwIRgTtAU48HtYJEZgEcQuofKkTvDPSFdKh8BTtA7Z/qEI59nS8STmI8qKVm7wjOfWvCOXFDCCRBVZSpEOqSnwyjhDHX7Et1EKYujDHAiANuOSI4AkE7Zy6KHKYdTvnebX9s68w9tlieow1GLR8KmR4riVCAD+MGkGrAlEICDV52NTBuRoy3rCxt7e1uhh0eU6XHP5npsrw7XNRP6CyH2JGeu4BbNNFpnneuz4POiIlMiIAIwJZrTtNUXTsRTUNER20+cOxsq6nw2XDL4Ea6Xbt5pz3K3k3FxChtlKpyqyWwWXd1LeTZ/Qgb5yKRyRBDyF13+Qn2eCQlIw6sgNnibRwln0KQc5vRBBGBbUHIEgJS95IL3hEQ3OJZG9yZAQknHHF1FzJ0AXGiTJoki0x8hbt510g9fPY+NNpUlEIBc+mPWJqfqrmaPDZwLe4iMadez9y0muyYmNU9w+Oue1rtluCsALLuX/tD+bZvnercIMl5kLERL05V1rs/gVfXPcyEgAjAXsuPa5aR9z3FNhLVRrXNrGXHJnqAiJL9+lHeA7GCEB/HBwKGPOYTaFnMBJgXvbnOek3NizG021OW2NO52J1MfpglOpqhPPaGt6J50EYBtEcsRAC7t4UbGSNBAMZcgm2gEIF1dIffDIZn6OKwRGcKJlfpsdFFWSC7Lgdx6/i9LIAC7NLdeesmWgACihLaNDZnLm8hP0H57+Q0im9OYcAonOqh7qRPzH6dhyJYnbOTvMbPvNkSMSIQoUoc+sKaiPAbrWp8zffLUbISACMAy5wY2cRx1vOtPx/QYrQGbNOrUnJD8hxN09EEb2gfa4iQRpQUmOgBiUZvsqO0PiVYgN5FjowhAOQEAR+52KBG0UJh3UuE0T+KaMYLtn75E2SyXQAB4v9oESGz8mA8wqfStt/R7TcTFoRNkseyLVFjX+hwzT1S3AgERgArQ1lSFseHUjIdx34ehr0tsvIT0YF9NVXxR3b2bm9tY/GOE+wAwK3TD/7z2MGFQNlJ59vXh8EbtGdk+qS8CUE4AKFmaCz4iABBZtFlRHoq+MUXLhCo7TSDVrbcUAlCzSXadeomGwdyVE+97jQ8Bobw1iawID8VfI71fYXutz775oN8nRkAEYGJAZ2gOuxzmAJKoREmCosey6aK+w7EvchrMdRl1JbZaQoZyDoVeG9j8sfVGV8N6dbD97teEP+1WiCUx0SQ0whO771piEYBhBACnOxwtmYM5iQhAWwf1MiYF1PglAknFeY7503e3/VIIAO+FKYONnBwWOcG3hVM/Tn6tHwXXH3Mb5a6ZitH3mqgM/CP4Rnj2fa9J1P0cMNLrlXP9nnt9lswNlZkQARGACcGcuSk2f9g+WfewlWILh/WTw56PCKpS/hy5irXGCQgHQeLxp4jzJ5EQYYWczrEjsjFw4uFucjZdbPN8qAlpQlWLbZdohlohLIrncVERmc/4sGJnhYQQikjoIOp+HKH4U5obQQRgGAGgNPMOFTEJa7i3gbFhTh3d2LSxbeOfgb05J3xruJcCExR/4ytCKBpzCH8UfAEgqZiLSIzTZ6Zqn7UkAtD2iXTZaL2ItME0gp8EeHE5FqF2hAV6mipIwEENRqw51hbrGV8L5jk5A3ICEcCJmHWzR4MvmjUcEXkepBxNGWYDUhfXylzrs7Y/qleJgAhAJXCqJgSEgBAQAkJgkxEQAdjk0VPfhYAQEAJCQAhUIiACUAmcqgkBISAEhIAQ2GQERAA2efTUdyEgBISAEBAClQiIAFQCp2pCQAgIASEgBDYZARGATR499V0ICAEhIASEQCUCIgCVwKmaEBACQkAICIFNRkAEYJNHT30XAkJACAgBIVCJgAhAJXCqJgSEgBAQAkJgkxEQAdjk0VPfhYAQEAJCQAhUIiACUAmcqgkBISAEhIAQ2GQERAA2efTUdyEgBISAEBAClQiIAFQCp2pCQAgIASEgBDYZARGATR499V0ICAEhIASEQCUCIgCVwKmaEBACQkAICIFNRkAEYJNHT30XAkJACAgBIVCJgAhAJXCqJgSEgBAQAkJgkxEQAdjk0VPfhYAQEAJCQAhUIiACUAmcqgkBISAEhIAQ2GQERAA2efTUdyEgBISAEBAClQiIAFQCp2pCQAgIASEgBDYZARGATR499V0ICAEhIASEQCUCIgCVwKmaEBACQkAICIFNRkAEYJNHT30XAkJACAgBIVCJwH8BXdfFgQPDC+AAAAAASUVORK5CYII="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 333.63 41 L 305 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 338.88 41 L 331.88 44.5 L 333.63 41 L 331.88 37.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="355" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 355 15 L 355 40 M 355 20 L 340 20 M 355 20 L 370 20 M 355 40 L 340 60 M 355 40 L 370 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 355px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Machine</div></div></div></foreignObject><image x="332.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 376.37 127 L 403 127 L 403 291 L 423.63 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 127 L 378.12 123.5 L 376.37 127 L 378.12 130.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 291 L 421.88 294.5 L 423.63 291 L 421.88 287.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 403px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="388.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 423.63 137 L 417 137 L 417 288 C 420.9 288 420.9 294 417 294 L 417 294 L 417 328 C 420.9 328 420.9 334 417 334 L 417 334 L 417 408 C 420.9 408 420.9 414 417 414 L 417 414 L 417 418 C 420.9 418 420.9 424 417 424 L 417 424 L 417 445 L 430 445" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 428.88 137 L 421.88 140.5 L 423.63 137 L 421.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 237px; margin-left: 420px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="405.5" y="231" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-3"><g><path d="M 90 103.6 C 90 98.85 101.19 95 115 95 C 121.63 95 127.99 95.91 132.68 97.52 C 137.37 99.13 140 101.32 140 103.6 L 140 150.4 C 140 155.15 128.81 159 115 159 C 101.19 159 90 155.15 90 150.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 140 103.6 C 140 108.35 128.81 112.2 115 112.2 C 101.19 112.2 90 108.35 90 103.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 134px; margin-left: 91px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">prom</div></div></div></foreignObject><image x="91" y="127.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-4"><g><rect x="72" y="159" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 168px; margin-left: 70px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">metric-db</div></div></div></foreignObject><image x="70" y="161.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-6"><g><path d="M 570 127 L 550.03 127 L 580.03 127 L 564.87 127" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 127 L 566.12 124.5 L 564.87 127 L 566.12 129.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-5"><g><rect x="570" y="120" width="40" height="14" rx="2.1" ry="2.1" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 127px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="120.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-9"><g><path d="M 570 373 L 550.03 373 L 580.03 373 L 564.87 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 373 L 566.12 370.5 L 564.87 373 L 566.12 375.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-8"><g><rect x="570" y="366.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 373px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="366.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-11"><g><path d="M 40 209 L 60.03 209 L 29.51 209 L 44.63 209" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 48.38 209 L 43.38 211.5 L 44.63 209 L 43.38 206.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-10"><g><rect x="0" y="203" width="40" height="12" rx="1.8" ry="1.8" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 209px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="1" y="202.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-12"><g><rect x="240" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard UI</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="241" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-17"><g><path d="M 230 455 L 250.03 455 L 220.03 455 L 235.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 233.88 457.5 L 235.13 455 L 233.88 452.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-18"><g><path d="M 230 455 L 250.03 455 L 220.03 455 L 238.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 237.88 455.5 L 238.13 455 L 237.88 454.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-14"><g><rect x="190" y="448.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 455px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="191" y="448.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="240" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="241" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="49.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="51" y="195" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7t3QW4dU1VB/Bld3cnNhZ2K9iBXdjdKKIYYCuKYic2dqFiYhcWWGCLYisqFnafn+zxGeeb2XHuuefe9+61nud94Ltn9uyZ/8ye+c+qeZxISQQSgUQgEUgEEoHdIfA4u+txdjgRSAQSgUQgEUgEIglAToJEIBFIBBKBRGCHCCQB2OGgZ5cTgUQgEUgEEoEkADkHEoFEIBFIBBKBHSKQBGCHg55dTgQSgUQgEUgEkgDkHEgEEoFEIBFIBHaIQBKAHQ56djkRSAQSgUQgEUgCkHMgEUgEEoFEIBHYIQJJAHY46NnlRCARuPEI/HFEPFunl98ZEW9643ufHVyFQBKAVTBtLvSEEfECEfFCEfE0EfEUEfGkEfGvEfGPEfH3EfF7EfGIiPiLzbXnA4nA9UYg5//Vj08SgKsfg2vfgiQApxsibPttI+ItIuJlI+LxV1b9yIj4voi4f0T83MpnslgicN0QyPl/vUYkCcD1Go9r2ZokABcflqeMiHtGxAdGxBNfsLofjIj3iIg/3FDPvSLiE6ryvxIRL7nh+SyaCFwEgaue/xdp+01+NgnATR7dE/UtCcDFgHzOiPjeiHjRi1Xz/57+q4h4g4h4yMo6f7V5fxKAlcBlsQsjcB3m/4U7cUMrsH48S6dv3z8dMm5ot7NbWxBIArAFrf9f9skjwmb7vMdXMXzyTyLiZSLizxfqfrGDyeHhTZkkAJcwIFnlbRC4DvM/hyURSAQugEASgOPB+/yIeP+Zx/8lIn5i2qA5+nEA5Aj43BHxShFh856Tr4iId18o88kR8VFJAI4fxHzyaASuw/w/uvH5YCKQCETeBnjkJHiyyXvfht6TL4wItvm/nqn/FSPCJi9SoCf/ERHPt+APIIpAmVpSA3DkoOZjqxG4LvN/dYOzYCKQCNwWgdQAHDcr3jwivm3w6DdExNuvrPbpJlv/8wzK3zUiPnfwGxNBz08gCcBK8LPY0Qhch/l/dOPzwUQgEXgsAkkAjpsJH3ZQ599n8OidIuKHN1T7VhHxzU35/46IPz2c7r/mYDr4yOo3PgHPtKHuUvSrI+JdVjzHrnvHg+nitQ6hiS8fEc8YEU8fEU80aTNoNGgdmDZ+JCJ+aUWddZFfjIiX6jzzsVUkw5NExD0iAi7MJbQscido25zwxbAxaTfzyjNM+Rf+MyL+5uD4xCv6Z6eQywdFBIyPETkdvMe/F54crZ7gYA76y8PfHnbon0Qrxu2fq8rlffBcK2/TGfu5Nr1CRLx2RLzGQXvEAc/YwIfjKDPTzx98R777YGL6gcnkdEz/1jxzVfN/qW20Ya8/zeEXnPB56oj4uwmfXz+E6H5PRHzXIWrn0UuVTb9/5uH5D+mU/dHpOyk/vfPhm32vw3i+SER4JxEO/MERcZfBu+4cEQ9c2Q7FPufwHX7QoPybTP0qP58qCsD3aE0z78w/a4Jv63Gn7+oPpvBl8866d+x3pd2XMX4b4N1f0SQAx425zd8i2JM7RISNbq1ImsKW70OSHMg/uQH4DLRyWQRAKJeFxUL3tGsbflgYfmpqO8/iNfJjEfHqnYKfdUiOdLdpk//xw6L40k2ZOQJgwf20iHijNQ2YyvzO5L8h7HKL2PQ/LyKedeEh5M2G8ENTnx6zctEeVYuQfVJEMButkd+PiLvPaKnW1DFX5qrm/6hNtzv88HFTHg4b05L8wzRvzbved1Y/r14EtRXkt8zT+0XEe3bKIAA2TKSjJ1++0SPfGoH4tYLM8Pj/9+qHixIA65I+CXF+5iVAp999V+bdFlLj0cscv5VN32exJADHjftoUVCbj+bLjqt28anLIAAvMZ1an2vx7eMCFkB5EP5toQ4LoRDHVuAFN5qKd+r8PiIAtASecUrZKk4qHCg/deWDCJIT2FqxGEsKxSRj4e7JkrbI9/mJh4X9o9e+tCnHUU+7L3Iq6736quZ/ry3S2n5tRPBL2Co/PWkMaGhGMtJ20ITZuN518uXpPY8A/HJE/NmkjWjLPGrauNeMj7poeHrC56h1SL4IAaBZosnirHyMfOWkDeHHtCSXPX5L79/170kAjht+6nSTvCd/dFCFverMon/cGx/71KkJgA3Ihz5yZtzSVirR121OIe3z/Cacolv5pskEIKdBb072CIBTMVX3421pZKfsO04byFw1VLXffoTJjOpZdkiZHntCG8KcMpLRyXJLl/mQ8CU5pVzV/G/78A4TAVxz6h/136b6ajOaAMS254dj836OSWP37IPKbdoPPZjtvujw7b7PoAytDtPUknxKYw6sy9uof6ap4FgCQGPx4MM38fxLDVr4/QER8ZYL5PMc43fBbtzsx5MAHDe+nPao6kfCJvvxE0mweZ1K2BOLLdzHw87ZCpLwBc0fnULZPWthX/+FBZU/NSe7NhU2tbdNt9g3e3367IG9tJTlIGlDbIVmwIL13gOgWgLAJ+F3B5edqIJp4lsOWgX5FNje33BajHrVs52zPVIL94R24TcHqtdSXh3MG3wN4AonfgEEqRmFfL7KtNj23ksTQrvREydK2ggn2H+a2q+8fvaE/ZY54lRyVfO/bj//C5trj7wKwf3iiXj5Fm1qbOSybJZxqetigqPq7ok5qa5WzEn1mdMjKQQAwWDa6sm9O6G8vXK/MYgY8h30NutjCID9wLfIj6InNBXIQSHq/Hlebqb/zAH3Hfx+rvE71Zy/kfUkATh+WNmPnaDnxCLBWY5zzE9Om+katdiaVnG66S34a6MAfMgjFd+vTU6DFthabLwfs7Bg0X7YgHvy9RHxdp0f3IFgQeCLQH572txsyhyObKockIpYeL908A4OeD0zAnW/hb4nTmdfMvgN6WIrHgkVvVTM9bjKi29jgMWcjE5/SJZ00D3HQSpljpq9ENMPPRDEz+i80CaBLHKIPJVc9fynOenhS+uCgPX8cBAuWqPWZMRcI5snG3YrHPt6c+O/JtLnXQTRQLKQwaeaNmvPItDWWWYgGoNWbKa3XxgU3wYHxp6Yez0fhWMIgLwjI/Ol+pi0WjMELdZ3DA4GHGGZFjnItnKu8TvVfL+R9SQBOH5YfbQ2SM4ya8Vpzambus4GjBQ4NR4jFyEAr3NwKOMJ3xMLFVY/d0sh7QYi0BMniJFDHlvtyCNaXXwInLi+agGQUd89ZrF0Ym/FONGOuJ2xFer9nmlCOePVOiWW59nYqYh7YvO2WI7yPHhmRABGdmebjnk32gzUOfKzQBalrT6VXOX8H4XA6tscmfP7CNtPP2hTPrwDzhzZrOeB0+6cQ6H6lemJCBaOvyOZI69uHe0Rl60EwF5gXvXmK+Iousa30JO3Pnx3zHg9sVbwGanlnON3qvl+I+tJAnCxYbVpOOltIQH1Gy3oTio2NB9Qb+MatfAiBMApiFp49DFTn8+J/v7WdDJvy1ETUkn2TCRLBMCJaXSyr9/D/NELC7RQzT0/6jeNQ8+cMqfqpp3gkT1H4N54wSN6RAAs6D21rhPmaNwKPn7Xz1aMqYX6lHJV898Y25hbYaqi7mcCGIl547ROm1ULs4oTeqslWSIAtFpzpLa8A4kcbaC0THMOpvJ92DRbQTBtzD3ZSgBG80bd1qae6a5+72jO0oBwNK7lnON3yvl+4+pKAnDxIfVhy+jXTvJjarZwY8xsu0tyLAGg/vzbAWmhqhNOtEZV3EtDXNpMlQiTVuYIANMFm+Iaj+glbEa/j95PnS4pUytzJxu5G8Txz4nvi1Mok0BPegQA/sIIe0LrwuQwJ26k5NXe2rqpxmk/To3vVcx/hI0HfivMbcwjSzJSP+tLm9tijgA48SOJyMMaQfB7RHOu3UjJ6HZQER7CUnuylQDMhXYierRkc4IE9cJUHXKYpuoQxXOO35px2W2ZJACnGXo48nj9gMkueRFcLdCSj0gAVH80bUuPJQAWyJFD2NcdEv04Xa+R15z8G3plqfCFR7UyRwDmHIbWtGdNGe0Sn9+Khbx3lbPY+1EI3vsOnMPausV6v9ugcT0CYB6NNDDmlzFaEmSqFy/O2XHOeXWp3tHv55z/QtR6NmVt+8aIMC5Lwkm2l62zR1znCIBvkJZnrbDVt+pwz/If4euCmLcyikLwDGI5MtVtJQBzPkHaRmtyCjn3+J2izTe2jotsVDcWlAt2TEjQ600nEQ4yvSs517xiaTM+lgBI9oNg9IStkVfyGpEcZHTyEdbUOw3MEYDiMb3m3XUZC4qT+CtPWhiLFSesLWaZEQGYay8i5eS2JHN49wjAR2wYg6V3t79z4hKedZly2fOfM2gb8naq/jhNt5n25ggAf4Ke0+WoPez1TGc94RyLwLRijiHbrfDnGEV9KLuVAIyyVSIlPb+ZYzE/9/gd285dPJcE4PKHmYOPhd4Gx+uemvvxV752ziZ+LAGYO9XynudFv0bEXo9MBSOb+tyGKgJglDGv1x5OdswQnAa3bPa9ukYEQOjkyKFx5GzY1t9L9VzK9AiArIY9Z7Q1Y7JUhgahDRFdeuaiv596/gtRO6UzY92/b51SUNd/myMAbfrdNVhxHJYttJXeHSKycso30FsvaDDmQhC3EAD1j7SNbPuIy6nk3ON3qnbfyHqSAJx/WGUsoxlwGmM3a52R6haxBQuB632cxxKAuaQka2x9dfuEOfbisKkLncRbGREA6sxefPZodNyHIK66Z089ZkRHBGCUutg7qNjZ95dkbsHrEQAhZ4jfZcgWDc9lvF+dF53/Tsoc7y5D+OBIZlXLHAGYy+Mwat8oVNNJ2zdTh5MyV/UiYjig+gZEFY1kCwHw3pEpYW1Y8drxOPf4rW3XLsslAbjaYZdcx4I/l8ee+s9G1MqxBEDa0JGddCsBEOfbs51bTHqXFo0IAPUjtf0aMWepgEfez+qggXBysVDWC6oN14m0lREBGDmLeZ5zlkV2SYxtm4SpPNMjAHPjs/Supd9pF5gYroscM//nHDMv2i/5KOp8E+qbIwA9p8GlNrDbc+rrZS9szUri62WhbOX+A1+WutwWAjDnePrwg9noxZc6teH3c4/fhqbtr2gSgKsfcwuBy3RG4V0jz+9jCcCpTABS8I6SGsla5pKeVkYEgIf6XIbBuh6qz5EjnEXPAjOyEW91AhzF1GsP7QOisST8E3q2Xc/1CMBcytetBG2pbdfh963zfy6HxWWkPZ4jAMx5EjNtlZFmqc6kWW557N1zAYOli6y2EAAkvr69su7PKNPg1j6X8ucev2PbuYvnkgCcbpip8pduFhu9zfWucun3hM2W7baVYwnAXGa7LSpiGb7cOtcTmQB7WdpOQQDmkgDJyjbCUTtHJ6qRBsDGPQr1k95VIqclYc938u5JjwDMXbVLJez0dx3lXPN/7lIc93OMIi6OxewyCMAovXBtb3dJTi/0bpSvoO3fFgLg2ZE2b81V3FuwPff4bWnb7somAdg+5LycnW45gflX/r/TIE/0Y2Qu1rfclHcqAjAXvrc2qYm28EC2GfdkRFpOQQBoC0rK4PrdI7NDXYY9s6fOHBGAuexta299HN1wqF09AsCxzAVNPellVTtmvl3kmaue/0xFki/11i5+Icj0KeUyCADnPlkpe34vJVRTHo1eKK0IHn4ES7KVAIy+De8x5u7VOIWce/xO0eYbW0cSgG1Dy1uWV64PuCfsh+yIWwVxGOXPl/ill3b3WA0AdR+Ho57zofhq4X2SdyyJTf79BoV4vvOobuWiBIA6dOT4RBVLJTuSuax+IwIwdyGPvrhJcE58X05sPX8Iz/UIgEx25lhP3CrYu055aaxO9ft1mf+ji3GQQw5tc/kztmJxGQRAG0bfr2/K5UOjebPW72ArAZjzPeGsvOR4KQWz1Ng9ceqvEyydc/y2jveuyicB2D7ccyc6E9tmvjW/v6xyNs2ejNS+owXEh9+7dKSu20YiV0FP1sSKY/Fsg73sedKwcnTqXVZzUQIgHrlXr37wyO8lvyl9nCMsNoxeKKFb/DhB9QSJYgaZu0uezd4VyCMZpQIWK94LvXJXAse5R8/UyZdC2lYakfpfL8nM9tn/2BsKe5ctqetc838uUmJNaJ7rjKm8Ed6CkciVHvG9LAJgU/U9tEL7g/S3F3EpJ1e/S4vWyFYCMJeAak3CI+2GfSu+D6TM3C1yzvFbg9VuyyQB2D70S4ks2PGoh0fXf9ZvtFizD4/CvmxMTuS9Te+BgyxkYvOdIkcbpffPZQN8xHQZ0ByJmctuN3dBzkUJAIcxmPQ8qC3eQiZ7oXlCu8SOz90bL69A70rgUY5zOM6pY5Eki/jcveojAiArIvNDT4RxjjQvystcyNGzFRsdfEbOXmu/hOsw/+cuk6HKdplVveHUfRtp28wffZN3v5bLIgDCIY1JG0ZrwzSvehkDt/jobCUAzBF8ehDMVmQnZVoRFdMT40Hz2fu+EEaEq5Zzjt/aeb3LckkAjht2p7rR7XGlRpdg8O533Sd1HtW1U6aNQSiaxYY6t3epTamjlxyk/MYTvpfO1O9Ou1KIzuV9Z3IY+SxYBJ1Q2lvGnMAtTu0HXdqkj/wiRrnLL0oAvAeeo1MQr31OexyXCDMHciVbWznhw6Q3713t7NrmVly3eq+ZaWKh5rlfq52ZG6hM25CytpoRAYAzImOT6AmTkCRI7YmV9sZ7e9qM0bWxx3wB12H+z6Wu5expjjIJ1GJuivVn026FQyfHzlYuiwB4z8jJlIan1a6Zt+aV2zrXyFYCoM45h1VkxfxqTZXmMHNfjzg4jLgjxfXirZxr/NZgtdsySQCOG3onbIzXieqyhErSRjdK0EFNeM+Zl1Ndu32MzV9720tStN3vI38GHy8tBrWuxQdp4WXfi/svzXCPwFyu+lMQgDnHPO3gXGVstJO9tE5IJHTKptkme/GchdVGT3Ni80XgiIUYEZpLh0qVbANxerNISxAjTJK4AGZ0JfCIAHiOFul+M+NLUyO/gP4aX1EXTr490X4L8UVP/6Xu6zD/XUfsNrzRfLSJIgJwQrKV57haxqXGibbAXOltVJdJAOYcPttxdPqWQGytHEMAaAHM47kcGzZuWhbrA8zmHJ9dMHSPQYPPNX5r8dpluSQAxw+7zdkJv3eaOL7Wxz5p8XLJyFzO87nQwfb9nMqYElpx6mW762Xz29oHp+DRxTmlrlMQAP4NNrS5DIq9tiNUUrDaWOeIk2dbb3sq92NS6CJvTlW9bG7eM0cA/O40L3PaRYTt31yxaJ9Srnr+6wvtDnvyRQS5FTo4GqPLJAA0NQjcmlz7a6/KLlgcQwA8i8C6jbS3XmzBmXaDFnHOofgc47elzbsrmwTgYkPudMnGJd3rqcTplePf6NKQ+j3Kjk59dbkRAVCG5zwSsOQ4OOofD3qZBcVgL8kpCIB3LJ2O23bYBDk9wosa2Elvbu73wu0kmWFWWSvMEOaFxX0U1rdEANhUJYfZ8t66fTQZ1LatXXttH5bKXfX81z6bjJC5Y+6D4LBq7o42f/VfJgFQvzBftxDOiW/MhrzFkfNYAqAdnGmZ0zjBHiPWApv7KFFYXedlj98x7d/NM0kATjPUVHOu76VmX3vRT/1mLBnrtsmMroLttZQan1p7ztHMc3MEwO+cEd1ad9cNKXl93NT9bNGtr8AI1VMRAPWz8TqVL2kv4Kps3cZPnVFNqrtHAHwrd5s8tHvZ2eo+81PgKS/0aZTQRfm1YaO0QUw+1PhrhErbxsJXYC5iYE1da8pc1fwvbaNO5vjY80IftV8kDO2MsZqTyyYAzGo935O6TW5wROS2yEUIgPfwP5E0TM6BNRoKz4hSkLRsLhlXrw+XOX5bMNtd2SQApx1yGyn7slM5u+/tpg2VDbKk2+Rpzlb8yOkkytZsMRrFfi+1kPc6FfWbTadbGyLnJ178FgFX80o9+qCliqYEO1ISIzL6wNbLBu4kaiPxT3t94OrbmhzklARAd5xAnTSkF3Wyh7/Nz8lXvzlRcvrqCS2LZy0+BTNaF1g5UbId94SmhK+DTRkB0wYnNO900uYgxzZfVJ9ztwF699IGVNrgW+Wkpq/+V6ilq5CREXOKKpnfh+tjbRgj35EV0+DoIlcx/+vGSsrFsdamKqEOfDjdck7l22GDQgg5rfHNWCOXTQB8W77TuWvDj0kBfVECULCRdIv2jLlQPL/5bk3gS2GNEQ7sWzPnfTtzjsdLeF/G+C29c9e/JwHY9fBn58+AwJyd06Jv405JBBKBRODsCCQBODvk+cKdIXDfyXTQdlvYIDXrKbPW7Qza7G4ikAhcBIEkABdBL5/dEwJUtVL6MgH45/9LyrOk8qSW7zlTjS5M2hOm2ddEIBG4QgSSAFwh+PnqWwIBzp3U+Gzu7eUt4splGBwJ2yn/jp5IIMTZMCURSAQSgStBIAnAlcCeL72FEJBZUExzTzjacZosSYPqMnIOIAccKVuRkEdipbT/30ITIZuaCNw0BJIA3LQRzf6cGgFhnbzHRXT0REY0cf6y0skIKLOirHxvNHP3gDBEmoWURCARSASuDIEkAFcGfb74FkJAulOx2luzD/a6KCyR6WBNkpRbCKJsaiKQCNxqCCQBuNVGLNt7VQiIL5f4SKz7seLaZ3Hljzm2gnwuEUgEEoFTIZAE4FRIZj17QECKVBn5pC/tXSozwkCyn3tPuf33gFP2MRFIBG4BBJIA3AKDlE28dggIAbzzlJHPpTgiBGRk5C9QsjDKJChDGtNBe4XqtetQNigRSAT2h0ASgP2NefY4EUgEEoFEIBGYvREt4UkEEoFEIBFIBBKBG4pAagBu6MBmtxKBRCARSAQSgTkEkgDk/EgEEoFEIBFIBHaIQBKAHQ56djkRSAQSgUQgEUgCkHMgEUgEEoFEIBHYIQJJAHY46NnlRCARSAQSgUQgCUDOgUQgEUgEEoFEYIcIJAHY4aBnlxOBRCARSAQSgSQAOQcSgUQgEUgEEoEdIpAEYIeDnl1OBBKBRCARSASSAOQcSAQSgURgGYH7RcR7VsW+MiLebeExd0O8Q0S8aUS8ZEQ8fUQ8YUT8Q0T84uGOiDstvzZLJAKXh0ASgMvDNmtOBBKBm4PAQyPiDlV3PigiPm+me88dEQ+MiNsPyvxERLz6zYEne3IrIpAE4FYctWxzIpAInBOBJ4iIxxyudH6i6qWvEhEPHjTiqSLiFyLi+WYa+TkR8cHn7ES+KxFoEUgCkHMiEUgEEoF5BKjvf6kq8l8RYZOnyu/JJ0XERzc//MzBDPAdEfFnE5H4lYh4SAKfCFwlAkkArhL9fHcikAjcCgiw9X951dDfiogXGjT8cSPijyPiWarfvzEi3u5W6Gi2cV8IJAHY13hnbxOBRGA7Ap8fEe+/ckN/mc7J/gUi4ne2vzafSAQuF4EkAJeLb9aeCCQCtz4CPx0Rr1h148Mj4tMH3bprRHx29dtvRMSL3PoQZA9uIgJJAG7iqGafEoFE4FQIUOn//WHDf7KqwteOiB8avOBrptC/8vOXRsR7naoxWU8icEoEkgCcEs2sKxFIBG4aAk7vv9Z0Sjz/owcd/fWIeOHqt/do/AduGj7Zn1sYgSQAt/DgXeOmi5e+85T8xGL4tBHx5BHx35Pn9B9GxK9GxPdPsdIjb+qlLj5vRLz94TQmJOtFD3HZTxcR5vTfTI5YP3dQ3T4oIr43InhuHytPEhGvO/17sYjw3qeMCH/X9r+YErt836Ed3xIR/7Twooc18eFvc1ATf/OKxglHe2REPFtVlm2ZjXmNcET7+qrgT0XEq848eC58NeEVDhvtW02qduFzTxMR/zKN5SMO2POi//YpvG5NX3tlJOZ5k4h4o4h4+Yh45mkcjRdcxeZ/WUQYnyJ3iYivrf7b3H2u6r/bBEFr2qZ/v9cUfOqpXa85zeXnjIinmOaY9v31wZGQ86E5/YBDcqFfXvOiLJMIzCGQBCDnxykRsEl+2mGhfokNlTpJfWxEfMGGZyygbLAyrK2ZwxbbD5nIxobXBPWv5+5xaN8zrHzwrw6bFjtwvdG2j1If37H6owxzNp4lkVWOirkW5OOZlh6cfv/5iHjZqqyN8Hs6z54LX69+rcNGd9+JLK7phk36fSPCSXuLvPEhEx9nPhvrnCCKnxsRHxYR/xER95n+f3lGKN+bVRW0CYKW2vS3E7kp5RCde05OhnWegaV6ENv3jog/WCqYvycCIwTWLJ6JXiKwBoFPiIh7rSk4KPOFjaf1qCohWcjCEx/xLqSBA9caedKJMNQb9ZrnShlx4J8yeOAbIuJtq9/udogr/6wVlUsf+1JNuX9dicUrH1LPOvEXefjhJPninXeeC1/aDH2uvetXQPC/Rf45It7xoEX5tpUP9OLylx5FyBAz2qPXrwojq+Y66SUIWqr3RyryR3Oj/rmEQXP1IZuvFhEcDVMSgc0IJAHYDFk+0EHg3Tsn2N+OiK+aVLfUptSYTjvUrq8zLeC1Klu1VNRipkfy8QdV/sc0PzpR3f+wEFpYveffphhsaVY5Xz1jU/5DD2rfz1wxik56zBi1PGpS1Uvg8ueTSYM6+JWm/tgQaqHO/bHOu5wwP7D6+8cdNBn6NidOyj88FYAlglIEGUIE5sRm+eZVAartVktxLnyddL/rkEmPM10tzBlfN2XYgy+V/fNMG/A7NZn49BcmPPTnBBFDAGr5u4MZhXPeD0bEHx02dJoem/BbHML14PJ4U+HXm+b1s1cP0yR89/Tfnqvnl3Flxihi/n9k827kxfuNH0L3gtXv/37wH/imSStDw0E75h2+GeWYu2jZ/K2Icojcfy7gkD8nArdBIAlAToqLImCR/pPOQuhUO7co8aq22VNDF5kLmfqATu51yVm8h5d2T2RrY5OvNxp25eef2jzqO5t8S0TkdUdQRvZ9G8iPHhy+nqOq1H/bpFqhKSmnSL9Rgd99YSBsOm84lXE65VxWhAmAKWAkNlGba9nY2Ltv14zPOfH91mmzLe1F2qjcaXZGc4YvCR+L2v4umx6NCN+SntB6/HgRry4/AAAQ20lEQVTVb2X891tGhNNzT/hEICfmjux/rcYFGTDfe8IuX5u/3udARr9kUNZdAtIBF0F4zFO+MXOCACCntQZsrQ/JQtX5894QSAKwtxE/fX+dcp2+i/zu5JS2xunOIqs8570iPQcpiyr7tZvUitAEfOKK7nDWs6jWG/OSKaBdyDmg0Sg4oc1J6zBmM9PHf2weYrv94upvS6Fiss456fle1cmO7/RYxGbOUW4k4tL5JRShdmdyKXJOfNnv63fb/BGbUVhd3aeXnpLs1Cdgz1KjtwIr+fjrDRzBfLmZFL6ljh4B9Nucv0W55a/WAnFs5LTXE0SE+r7IO0+arJlh/L+fWq0GvxAakpREYBMCSQA2wZWFOwi0aVKd7mo16BJo1NK8nZkMeDnzdm7lZyev7fJ3HvMW6bXidF0nbhHWxZu/J1SzTqNUrv6x03I2LOr3uXdK//qnTYFeFjh9ru3X1L61T0D7jtrT3OmUMyA1chHZ52x2PUGApKaFMbGJOUXThBQ5F74cKTlkiggp8n4HJ8YvWjuQk/q9aEI8RmtAe9GKOdhGViBxnAiXxLqILNTqec9wvGMW6AmiUZMyBBjmI40Rc1VNSs3HNtxw1E6E+V2m78U3Q6PDYTElEdiEQBKATXBl4Q4CFiJ3oxdxem7VphcBjh2eyrOIsDtagjmVd/u+9jIXvwvhqzfBi7SxPGuzrTdmf+8RAGrmeiNygq03tbotNk2bRVH5UgE7PdZt56hYa2Hq55lImBiKfNTBln7v6r/PiS+nv/oGPKdjGfZGKvzemHi+dphEXuosfeUZeNBOFRmZY0bj3vppKAc3+PXkXQ8RBl9R/bCUAfD3G3MGkvmdp5iEWUcisBaBJABrkcpyIwSoVFs159qwtjWoOnnXdnQLc63OXlOHE1Nr83X6cjI+pVClt/HZ3t1qNaj0a8/tuXh8XuecBIln5DsgtYmFRkGMfCts/kwD7qYnfCWEwdUk5Vz40qy4CQ9JKjJq99yYcNSjZSrChMSnoxYaDqfien2jYaFpWSvCP1tn0beefEp6dbSEQaQHp72RtNEFzFRMAnJYpCQCZ0EgCcBZYL7xL+Es5ZRdi9OQE9OcbXoJGJuVk1I9T72H89cW6Z3MqXeZHU4pbZw+L25Z41qRGKnOJKc/LX6e4S3v9F88zWunMhqAEjfu9MnjvBXObpwgi8jR8BHVf58T3x42nBe3eq9L5FOflJGKZ2063jo0ihgwDlsSTrW+Cl6BaCAcPaHRqZMqzd0X4Hkn/pa0GWvjwzzENyIlEbhUBJIAXCq8u6lcGNKDG9tu6bwwLScvanwL3BYRxld7UTvBtqF5a+qz+NcboWfY63lezwn1/Z2m1K4Ig3As0Qv+2Xzb78ffau9smwK7cyues8CLoCBOq7LutcLTn4MgoUWgtSg25b+syAWNiBNoK/UlNjZBmoC6z+fEV8hhfSUubGg3torx4ARXpHc1Lz+JOrqElsNzW6R1tKM1EcbaM1cYT+GotXZDqKswwzlB2jj/tYIcIgH+MV0sOZ9u6VeWTQT+D4EkADkZToUARzSbbFE39+rlyS/OW2rVnrNf+0y7aZyqreoZ+QDYlG28wrTqnO7HvFuYV23zruuwEZcMfj1NgW+TWrjcJNee3jnTCe8jvYgIqW7Zx4sgUjQItZwTX86RSNeppecDYG7ZrItIyFSThjVtaP0V+F28xuBBPimtpovWBkmbExEDnFPnTFpMAjQFyMJPrml4lkkE1iKQBGAtUlluDQJOQFSfwszkNh+JU6yTrTC+0aUqnpWtbuStv6Y9ozLSp/aIChWveP+LbvzlvXOhXXXfaAPaNLBvUKXp5eFts699FpgNSia/Xh4BeQxKpAQ1Ow1Gq74+F76tyeMiY9c++9WTR3z5O01K20+pe2tH0jXv5/HvFF9EKCW/gJ60fgnyBNTJg5beh1jICzF3L4M6mNrkkOilb156R/6eCNwGgSQAOSkuAwEqcg5T0rVSgddx2/X7LJQ2KeaDVsxN8fNO6qcWKmK25FrE0jthtXn1qX5pNlxcJEzLyV27WrUs8iDZTi1zoV2tl3qbza++L8BmXqvPvUNbXYJEStra8m6mAhqCYmLoPX9OfMXDy6VwGdJmdmx9BLxTxsk2PHOpLbWGRllx9u09DKWONtWwDbo2QSy9q/zOiVRYrW+HuWkkwkJpqJayP659b5bbKQJJAHY68Gfstg3VCYwTmMxsrdAG2MicbmoRQ91m+BNeeBm3oPkOqHjbE5hMgzaYNrSvBx+Pb+aNIlK+6sPIya0+oXtGuF+JVGijCXoJZWov8jYvAnNBfedBD7dz4it9Ls1KEXjOaYguMj2lWK79IXralaX6RRFwPq3l9jNZ+uosjZ755OmCn6X3jH5HmM1FuQwQPxqUVpaiDI59dz63IwSSAOxosK9BV4WwCWnjnV6Lk7UFtnaw6iXVOeYkt6bbVL1UvrW4X6DnoDWqr822N4pPL89/XpPAps6A6N20J2RUT00g6gQ1tC/y2xcbOM1FfZlNef858W2vId5yhfGa8avLiDypIx16UQJLdTJhuTmwiIgLyYtGZI5ppr7Xwvxee1HRUluYhuTacE9Dq53KFMBL6OXvswgkAcgJchUI9PLOtxfn9DYop8Y1p/GtfWrvdHdqFFo255/QvqO1p48y1JXnOO7VFwCVU7r3igooaY9H8et8KMp9ADVJaDevUfa7c+LbEoBTJ4uqx8LGXd8wOLr1cG6OIE0SLhXhvMqpsiciTFpnv7lwwa1zs5SnIRI5IYdEkTnHxGPfk8/tCIEkADsa7GvW1fZuejZNp+IiTj5tpr65i1gu0r22Lezv7U11c/VzsPvNpoAbEuvMcO3zbZy5JDDs+jzWyw1yTpac/3ppXiWpKU5pJeuc71k7hC8Sdnc3FfbknPjaTG2qRXjM87m4DOEPAfsi0vPeYcOLYAfP2m/FvQ3GqyfmyQ9UPzBbIapbshuubV7tGOoZ0Q71PRpr68lyicD/IpAEICfCVSEgfTDVZhFhWja/WupYd3+XEVBc9BbhTLUU7y8qQFKcIkuX87TvZ49tc/kvJSxqPcflmHeio74vyYPucbg29j6DzjKllDh6z2g/xzMOjkXkTKht721V58KX6ae+5Y6GxSVJW1Ix25Btdkuhda0GQO6J+gbBpbnTzkvlXd5ES9QTvhZ8LoogcfUlP0vv2/J765twjH/Dlvdl2RuOQBKAGz7Al9g9Gw7PaB7L1Pdb1OWaJUlKnZyll82uvcNebLbc9mtFeJXTPI97zzqF9k5mbV72LQTAxu2a2lp4Z3Oym0vgYpOw4RfhKGlTLBn9OEfSeIxSw3JO/Izp4XISrCMHen4VLW7nwtc64+6GOiviEjlp28pkIg8/R0v+FlT7PWlNK8ab+nzN/HSaN0faqBW3Lz508L42lwItFm1WT0RlmC/mutsdhfRtEU600kYXGYWzbqkzy+4YgSQAOx78C3RdQhk27rJQOjUJX1or1L8WwBKm5rnelbYIhjjvIo+ZYt9bD+3ee506qWbrNLGjq2Pbq1lHqXnb90h+hFxI6FJnAHTa5dQ4J3INwKCIKAJJg9ytQFyZW9uy27rqLH5O0japelOcC1srdZ0LX+9jDrHxFXF7oUt81mS541TH6dHdBkQYpnj/3oVQHB7b64Fb81JvXKj+haO2qZuZX5C5kbbCGNZ5I3wH9eVY5V3mCOfHoo0QJeJ649Z0NDdnfAv1tb/IkOialETgKASSABwF2+4f4uRk4SoLMkDYpHlfLy3oFktJWYqd2rMjZ6Z20VTWgivWe5ST3Zy2KLpilkd8EafdNvqg/OZkKXSrFir6B8yMNDuzk6jTvox/ErkUWYoAUK51HrPhuxqXOLVy9pq7q4DJgemB2KRoDopToJOhMVq6IvZc+Gqj/tBK1Kdr+Iq0GOXolwOCo6TrmWsR6ld76de/uXSI70SdCZCGhDNkbYYoz5gvvOllSpTICsksVycr87BDJj5hmT3RPuXr78Cm3oa0lmfb1L/MEzQhS6GtiLI5WjuNqrN1nJ2ZrvlTInBbBJIA5Kw4FgG26XZh5r3ulOIk5ZROje1kTAXrRM6JySUo9YKpDA/40WZHLUvFXj/D9ul+AWYE73GasqE6kdsYy415pW8WZCr30UbDtoxQUMEXUefdp9Oc/0+8Q0y707fYfGRHn4TwcRQrok9+H6mplfPteb70yzM2LzJ3PXB5B22G+PO6vSVp0twG2Y73OfAt70SSWrW33AfCHqm2hey55ZDpQ24IWpE29I0tnk1+TmyUTAG1OMGXdLrmAd8QJIkJq5zKzVsE022WRdpMg3Wdbbpl4ylccHSRD22U+ut5JrRQql++GggKUwUMkBAOoLQkcGjvimiTPy1Akj8nArdFIAlAzopjEXAqcapuM+ptqc/ib0Otc9b3nneydaKvTQZr3+MiGKf5pfBBV9O6Zrb9JizmnAiRhFqjYEO5y6QluOPka1C3ySJuQ7OQS+TSiyF/VHXTX/2sTZk9f05aH4JSlpOcDa2QljU4nQNf7YCt5Eq1KWBN+0oZPg+c7pY87IVQCpkbhe713iligvlA1sc6AqTNNFg/i4jUxG+N6YhfikyBhext6X8pi8ggKUsanmPqzmd2hEASgB0N9iV0lTqXFkDYWn2qWXqVzdNG4KS25NVd6pIZjd/Bkm29lJdmWIpWqt2lDaM8QzthcV3qi5OaTaw4hlGl+/8lN3/dfxqKcmlPi4t6Wm3FGv8B9Ygy6KmanbD1e6ucA9/SJhsnbUC55niprUL5aGO2RIBQ57t0CsGcE0SNOQGxYM6hiapDFJGCOoSxrsvmX2sj5rQF9XPMYJ7dGi1gboiWmYvsWMIyf08E/g+BJAA5GU6BgFMuL3YnYfnvnUCpQp3YqVvZSZkHLGDCpKiu/W2rmK9iyqm/eURTqTpdW8Sd8OW/tykyGVi0l/wReu9XHydH72C3RgacptlrHzJpPZzgvLMW+ff5EcDAxmYzQUKod+vMdPUzNrT2hjknO+rdJendQAdT2I8iB5bqPAe+pQ1MQ2zvIkE4MDITwRpubPY2YpohYY1LGqK5fgkdlVXRfJH8iMmFRoefgHHkxS+Mskh7k2DPObWU1a5ayyAvA7+QtSI/AQ0aNT+fGFommgFaJ2NJQ8ZkQLMAhyVfgbXvzXKJwP8ikAQgJ0IikAgkAolAIrBDBJIA7HDQs8uJQCKQCCQCiUASgJwDiUAikAgkAonADhFIArDDQc8uJwKJQCKQCCQCSQByDiQCiUAikAgkAjtEIAnADgc9u5wIJAKJQCKQCCQByDmQCCQCiUAikAjsEIEkADsc9OxyIpAIJAKJQCKQBCDnQCKQCCQCiUAisEMEkgDscNCzy4lAIpAIJAKJQBKAnAOJQCKQCCQCicAOEUgCsMNBzy4nAolAIpAIJAJJAHIOJAKJQCKQCCQCO0QgCcAOBz27nAgkAolAIpAIJAHIOZAIJAKJQCKQCOwQgSQAOxz07HIikAgkAolAIpAEIOdAIpAIJAKJQCKwQwSSAOxw0LPLiUAikAgkAolAEoCcA4lAIpAIJAKJwA4RSAKww0HPLicCiUAikAgkAkkAcg4kAolAIpAIJAI7RCAJwA4HPbucCCQCiUAikAgkAcg5kAgkAolAIpAI7BCBJAA7HPTsciKQCCQCiUAikAQg50AikAgkAolAIrBDBJIA7HDQs8uJQCKQCCQCiUASgJwDiUAikAgkAonADhFIArDDQc8uJwKJQCKQCCQC/wPLH9oIOYaqjgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="430" y="107" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Search Service</div></div></div></foreignObject><image x="431" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="430" y="353" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard Service</b></div></div></div></foreignObject><image x="431" y="366.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-21"><g><rect x="452.5" y="588.61" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="451" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-23"><g><path d="M 439.5 523.21 C 439.5 518.46 450.69 514.61 464.5 514.61 C 471.13 514.61 477.49 515.52 482.18 517.13 C 486.87 518.74 489.5 520.93 489.5 523.21 L 489.5 570.01 C 489.5 574.76 478.31 578.61 464.5 578.61 C 450.69 578.61 439.5 574.76 439.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 489.5 523.21 C 489.5 527.96 478.31 531.81 464.5 531.81 C 450.69 531.81 439.5 527.96 439.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-24"><g><path d="M 499.5 523.21 C 499.5 518.46 510.69 514.61 524.5 514.61 C 531.13 514.61 537.49 515.52 542.18 517.13 C 546.87 518.74 549.5 520.93 549.5 523.21 L 549.5 570.01 C 549.5 574.76 538.31 578.61 524.5 578.61 C 510.69 578.61 499.5 574.76 499.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 549.5 523.21 C 549.5 527.96 538.31 531.81 524.5 531.81 C 510.69 531.81 499.5 527.96 499.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-25"><g><path d="M 470.5 533.21 C 470.5 528.46 481.69 524.61 495.5 524.61 C 502.13 524.61 508.49 525.52 513.18 527.13 C 517.87 528.74 520.5 530.93 520.5 533.21 L 520.5 580.01 C 520.5 584.76 509.31 588.61 495.5 588.61 C 481.69 588.61 470.5 584.76 470.5 580.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520.5 533.21 C 520.5 537.96 509.31 541.81 495.5 541.81 C 481.69 541.81 470.5 537.96 470.5 533.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-29"><g><path d="M 494.86 481.37 L 494.86 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 494.86 476.12 L 498.36 483.12 L 494.86 481.37 L 491.36 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 494.86 523.88 L 491.36 516.88 L 494.86 518.63 L 498.36 516.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-30"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 497px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="481.5" y="491" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACm1JREFUeF7tnAWoFG0Xx881Xrsbu7sTuwsVxU5QTLDF7m4xMRC7CyxssTsudjcGJrZer/fjN3yz3+zszM7uvbvDu/ebAyLuPvOcec7/OX3WsKioqChxKNZIIMwBNNZgqRzEATR24ekAGsvwdAB1AI1tEohl53F8qANoLJNALDuOo6H/b4DeuHFDihYtannsWrVqyeHDhw3XLV++XLp162a5R1hYmCRPnlxSp04tqVKlkmzZsknFihWlUqVKUqZMGfnnn38s9zBa0KFDB1m/fr1Pz8aJE0eSJEkiyZIlU/gXKlRIKleuLI0bN5a0adP6tIcvi65cuSL79u2TCxcuyP379+Xly5fy7ds3iRs3rsI7Xbp0Cu+SJUsqvIsVK+bLttZRrp2AentjAO7Ro4f07dtXMmXK5NPh1EX+AGq2cbx48aRLly4yYcIEyZAhg1/81cV///6V1atXy6xZs+TWrVt+7VG4cGEZPny4tG3bVrh0ZmRpcv8tgKoHQEsHDRqkCBYh+0KBAFTlkyVLFtm/f78gYH/ozp070r59e0EzY0JYi7Vr10qOHDkMt7EE9OPHj7J9+3aPhy9evCjLli1zfe6PyS1RooSMHDnSY09u8KdPn+TDhw/y4sULOX36tFy/fl0iIyM91nKwjRs3CgK2Ij2gCLZp06aGj/EOmL7nz5/LpUuXFDfy48cPt7W5c+eWa9euSeLEia1YK9+zR7NmzeTr168e69OkSSPILnv27JI+fXqJHz++IHM0+OTJk/L69WuPZzD9R44cMTTDloCavfGmTZsU9VfJH0Dr1aun3HJfiMNxcebNmyevXr1yewQfx6H52xvpAZ06daoMGzbMF/by7t07GTBggKxbt85t/ezZs2XgwIGWe1y+fFmJAX79+uW2tkKFCjJ58mSpXr26qQnlcnEZxo8fL2fOnHF7HlCvXr3qcaH/9YCqp0BLevXqpfggLaHt586dkwQJEpgKNyaAqpvWqVPHLegjWMOCeCOsTalSpeTx48euZfi/uXPnSp8+fSwvg7qAhhiXUG/VuAxHjx4VgkmVQgZQ9YWnT5/uoV0EC1OmTAkqoDt37nQz05hKtNcbderUSfF3LmGHhSluonXr1j6DqV1IMDV48GC3Z3fs2KGY85AFlBfv2LGjmwlEOx8+fCiZM2c2FFQgNPTevXuSP39+N00z8u3qArQyb968bv6fCB3XEROqW7euHDp0SNmC9A6Ate4j5DSUg3z58kUJIvCvKmGOJk2aFDRAb9++reSFKpFGEbyZUe/evWXRokWur7lsDx48kIQJE8YET8EnE1M0b95catas6RHphySgSGTMmDEyceJEl3By5cqlaKkRBUJDMW0IUaUaNWoo/suI8HlErFqTzGUziuxjhK7BwyEL6JMnTyRnzpxuR6LikidPHo9jBgLQhg0bKpUdldASs+rXzZs3pUiRIm7vQSXI34JIdMAOWUA5LOkK+aJKlPfatWsXUEDRNooY48aNc+0LWJg+s1LkkiVLlIhcJXwpPtgOCmlAW7VqJVu3bnXJCaGPHTs2RoCS+1EAwAKQllCH1lZ3smbNKseOHRNMvBn179/fLfghiFuzZo0deFrXcs3ewq7CgjcpkMstXLjQtaR79+6ydOlSS0CjI1nKjFSYKCiQsngjfbpilVZF533MnglpDUUbMYcqYW6NuioxreWijYDSpk0bSZo0qaX8GzVqJHv37nWtI3ceMmSI5XOBWBDSgE6bNk0RtEoInMRdTzEFVN0vUaJE0rJlSyW69lZupIJz/Phx12ssWLBASGPsoJAGdNSoUUo9VCWiTm3DQP1cDyjrjIIndX1ERISS61IcIPjZs2eP8m+V6Jdu2LBBmjRpYohRgwYN3GrVdqUsvExIAwowBC0qUTWZMWOGpYb6U5xnM7ovlBZ5Tv2hAT6VjkfVqlU9+FHa27Jli+tzivj4XjsopAFFmHRbVCIgIjCyMrn+AqruR1GdzotK5MGkI/q+7NChQ90uFj519+7dduAZuhpKO4pa5vfv312CAlz6pMECFO0kB9VOG6CJ+FUtrVy5UpluUIn3pGqk7YoEC92Q1VD6qfgqrV97//69YRstEJUilQ9BGMGYSkap0t27d6VAgQJumDE7VLZs2WDh6No32oASTWoDC29Na/2QmD8NbjMJUFelvqoSAQotLiMKJKD6KhDdjwMHDniwZUTk6dOnrs8DWVw4ePCgUACpX7++B9+wiIiIKPwA9Uf+YFbokFsR/qpnz56uZQQCFBuMKNCAhoeHS+nSpZVDqbRr1y5lOi7YgM6fP1/69evnYmNWpNdH4JQJMdWMr8SEcDFoPyXPcuXKKZUx6swqhYWHh0fR9VeJxBnTZTUySaI8c+ZM13Peen2BBPT3799SpUoVZfxRJWqlDGGZTcMFUkMBE1BVMst9ETjgkQKpxNjJqVOnlFHN6FLnzp1l1apVrscZ8yS1Uv1zWGRkZBTzKdre4ubNm4U6qTdCQ7Q1TrPCOHsEClA0kmBDP4ZCVUZ7S/XvHShA//z5I/ny5XMbKSEPHjFihKGomE6cM2eO23f43MWLF3sdxTSTu9G0Bi08rIRLQ/nBL/Ou2oSczjxgmU21MbjEjI1KhO3Pnj0zbQ8FAlAuXNeuXd38JvwBSzvmEUyTSy6q72niprSNby3/z58/KzNF+j4t7gmZ+FJGZD8uElMJ+lzWyCoqQRGjkphdrU8icEFTU6RI4SYj/BfO+M2bN67PrYQaE0BJ6jExaIJ+6o9p+hMnTgglOW8UUw3lHSj3UbTQ/g8GBGbbtm3zyhvAGSgDXC1lzJhRiVWYnGRS3ogAkirV6NGjhfloLVWrVk0IjvSu0RXl6jsXPIwpJpLlBpL3MUrIjC6MVGIUg3FCRkLMSA+o2Vwuz3OpKLPhg7ASVGO0uabKg6ICgZD+wvmiod7mcnke0GihcYE4GymSfqaWNtrZs2dN55i074GPI8V6+/atx+sBCOAULFhQmXLAKjItyEXgsho9U7t2bSWiN7KgLkABDD9kNlZhJCg0g9TBKHzWrvf1ty1er/p/vySgoMTH7bYK3NT9AlWcV/cjCANkbz1R/Vm4oLgMtCq6xNmJntFYs8DKLQ/9+fOnULaix6g1v0YvQOhMcELobEWBAJQDEKjhw/z9GUKgAE2ZMqXSNeEdojvshWZRejx//ryV2FzfE6NQjSJF0U4eGm1gWFh49OiRrFixQmkBkaMSkHAATEL58uWVLkOLFi18Dr/9BZSxTH6Fhlnjl2+YJHhaNZbNJBQdQAlYMOe8A6kBJp6fT0QXSP27IVfqu6RfmFd+8qB2dODLlGDx4sWVFA2+vp492pUin6+Xs9BWCTiA2iru4DNzAA2+jG3l4ABqq7iDz8wBNPgytpWDA6it4g4+MwfQ4MvYVg4OoLaKO/jMHECDL2NbOTiA2iru4DNzAA2+jG3l4ABqq7iDz+x//31G8Hk5HGyQgAOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gZcDqA1CtpOFA6id0raBlwOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gdd/AGTpUcp01/CWAAAAAElFTkSuQmCC"/></switch></g></g></g></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-1"><g><path d="M 280 267.6 C 280 262.85 291.19 259 305 259 C 311.63 259 317.99 259.91 322.68 261.52 C 327.37 263.13 330 265.32 330 267.6 L 330 314.4 C 330 319.15 318.81 323 305 323 C 291.19 323 280 319.15 280 314.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 267.6 C 330 272.35 318.81 276.2 305 276.2 C 291.19 276.2 280 272.35 280 267.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 298px; margin-left: 281px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><i>psql</i></div></div></div></foreignObject><image x="281" y="291.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-2"><g><rect x="262.5" y="323" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 332px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">dashboard-db</div></div></div></foreignObject><image x="261" y="325.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-3"><g><path d="M 305 229 L 305 252.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 257.88 L 301.5 250.88 L 305 252.63 L 308.5 250.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-4"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 241px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="235" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-26"><g><rect x="420" y="505.61" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 558px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">mariadb-galera</div></div></div></foreignObject><image x="421" y="551.5" width="148" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/.docs/images/screenshots/dashboard_ops-logs.png b/.docs/images/screenshots/dashboard_ops-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..806aba0b56db410f1691b69039f4328b155868c7 Binary files /dev/null and b/.docs/images/screenshots/dashboard_ops-logs.png differ diff --git a/.docs/index.md b/.docs/index.md index 00cd33f013139033364eea2e87ae4f6b07084893..b6d018fe867684a3bdad025a0838bb4436a336a1 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.8.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.8.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that cover the entire data life cycle supporting data evolution, -citation and -versioning. It implements the query store of the [RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on precisely diff --git a/.docs/installation.md b/.docs/installation.md index ae807e69d0d980baa972e3010f7a5c0005657a8d..79530f31ee8ee69ffdab2c0078921948229a6db2 100644 --- a/.docs/installation.md +++ b/.docs/installation.md @@ -22,13 +22,10 @@ curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-service ## Requirements -We only support the Debian 12 operating system officially. In theory, any DEB-based operating system (e.g. Ubuntu) -should be compatible. Any modern hardware suffices, we recommend a dedicated virtual machine with the following -settings. +We recommend a dedicated virtual machine with the following system requirements: - min. 8 vCPU cores -- min. 8GB free RAM memory -- min. 200GB free SSD storage +- min. 20GB free RAM memory Since DBRepo is intended to be a publicly available repository, an optional fixed/static IP-address with optional SSL/TLS certificate is recommended. Follow the [secure installation](#secure-installation) guide. diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index c1ded5fc53756dafa2e61d5d725ed08b93d56d4c..f5f8cf5b73fe62fa768ab59b2d353429aee7fdde 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -14,7 +14,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.8.1" \ + --version "1.8.2" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.env b/.env index e50d4f6b5b1c15372029abec7a4fb924a70781ad..821b16a5c08b6577f7aa1728baded9960c24b311 100644 --- a/.env +++ b/.env @@ -1,9 +1,13 @@ +APP_VERSION=1.8 +FLUENTBIT_VERSION=4.0.0 +GRAFANA_VERSION=11.4.0 MARIADB_VERSION=11.3.2 -POSTGRES_VERSION=17.0.0 -KEYCLOAK_VERSION=26.0.4 -RABBITMQ_VERSION=3.13.7 -OPENSEARCH_VERSION=2.10.0 -NGINX_VERSION=1.27.3-alpine3.20-slim +KEYCLOAK_VERSION=26.2.4 +MYSQLD_EXPORTER_VERSION=0.15.1 +NGINX_VERSION=1.28.0 OPENLDAP_VERSION=2.6.8 -SEAWEEDFS_VERSION=3.71.0 -PROMETHEUS_VERSION=2.54.1 \ No newline at end of file +OPENSEARCH_VERSION=2.18.0 +POSTGRES_VERSION=17.0.0 +PROMETHEUS_VERSION=2.54.1 +RABBITMQ_VERSION=3.13.1 +SEAWEEDFS_VERSION=3.87.0 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1b2b65dacf5debe50d1961f4478d1e60861e5e30..dd4b98d03a435025f3df88b1c58f002b884704c7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,9 +12,10 @@ variables: REGCLIENT_VERSION: "0.8.2" BUN_VERSION: "1.1.40" DOC_VERSION: "1.8" - APP_VERSION: "1.8.1" - CHART_VERSION: "1.8.1" - SUPPORTED_VERSIONS: "1.7.3, 1.8.0, 1.8.1" + APP_VERSION: "1.8.2" + CHART_VERSION: "1.8.2" + SUPPORTED_VERSIONS: "1.7.3, 1.8.0, 1.8.1, 1.8.2" + SUPPORTED_ARCH: "linux/amd64" MAINTAINED_SERVICES: "analyse-service, auth-service-init, dashboard-service, dashboard-service-init, data-service, metadata-service, search-db, search-service, search-service-init, storage-service-init, ui" CACHE_FALLBACK_KEY: "${CI_DEFAULT_BRANCH}" # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. @@ -61,7 +62,6 @@ lint-docker-compose: - 'apk add --no-cache bash wget' - 'wget https://github.com/mikefarah/yq/releases/download/v${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq' script: - - "bash .scripts/check-compose.sh" - "diff <(yq '.volumes' docker-compose.yml) <(yq '.volumes' .docker/docker-compose.yml)" - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-analyse-service'" - "IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-auth-db'" @@ -70,10 +70,12 @@ lint-docker-compose: - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-broker-service'" - "IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-dashboard-service'" - "bash .scripts/check-service.sh 'dbrepo-data-db'" + - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-data-db-metrics'" - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-data-service'" - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-gateway-service'" - "IGNORE_VOLUMES=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-identity-service'" - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-metadata-db'" + - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-metadata-db-metrics'" - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-metadata-service'" - "IGNORE_VOLUMES=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-metric-db'" - "bash .scripts/check-service.sh 'dbrepo-search-db'" @@ -154,10 +156,10 @@ build-metadata-service: - master needs: - build-java-lib - dependencies: - - build-java-lib + before_script: + - mvn -f ./lib/java/dbrepo-core/pom.xml -q clean install $MAVEN_OPTS -DskipTests script: - - "mvn -f ./dbrepo-metadata-service/pom.xml clean package $MAVEN_OPTS -DskipTests" + - "mvn -f ./dbrepo-metadata-service/pom.xml -q clean package $MAVEN_OPTS -DskipTests" # Compiled classes are needed for SonarQube in later stages artifacts: when: always @@ -199,11 +201,15 @@ build-java-lib: - merge_requests - master script: - - "mvn -f ./lib/java/dbrepo-core/pom.xml clean install $MAVEN_OPTS -DskipTests" + - "mvn -f ./lib/java/dbrepo-core/pom.xml clean package install $MAVEN_OPTS -DskipTests" + - "mvn deploy:deploy-file $MAVEN_OPTS -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$APP_VERSION.jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$APP_VERSION -Dpackaging=jar -Durl=file:./dbrepo-data-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true" + - "mvn deploy:deploy-file $MAVEN_OPTS -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$APP_VERSION.jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$APP_VERSION -Dpackaging=jar -Durl=file:./dbrepo-metadata-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true" artifacts: when: always paths: - ./lib/java/dbrepo-core/target/classes + - ./dbrepo-data-service/lib + - ./dbrepo-metadata-service/lib build-data-service: image: maven:3-openjdk-${JAVA_VERSION} @@ -215,8 +221,10 @@ build-data-service: - build-java-lib dependencies: - build-java-lib + before_script: + - mvn -f ./lib/java/dbrepo-core/pom.xml -q clean install $MAVEN_OPTS -DskipTests script: - - "mvn -f ./dbrepo-data-service/pom.xml clean package $MAVEN_OPTS -DskipTests" + - "mvn -f ./dbrepo-data-service/pom.xml -q clean package $MAVEN_OPTS -DskipTests" # Compiled classes are needed for SonarQube in later stages artifacts: when: always @@ -263,14 +271,13 @@ build-images: only: - merge_requests - master + variables: + DOCKER_BUILDKIT: 1 before_script: - - "apk add --no-cache make" + - "apk add --no-cache make maven openjdk17-jdk" - echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY_URL script: - - docker build --network=host -t dbrepo-core:build --target build ./lib/java/dbrepo-core - - docker build --network=host -t dbrepo-data-service:build --target build dbrepo-data-service - - docker build --network=host -t dbrepo-metadata-service:build --target build dbrepo-metadata-service - - docker compose build -q --parallel + - make build-images build-helm: image: docker.io/docker:${DOCKER_VERSION}-dind @@ -294,6 +301,7 @@ test-metadata-service: - master needs: - build-java-lib + - build-metadata-service dependencies: - build-java-lib script: @@ -316,11 +324,11 @@ test-data-service: - merge_requests - master needs: + - build-java-lib - build-data-service dependencies: - - build-data-service + - build-java-lib script: - - "mvn -f ./dbrepo-metadata-service/pom.xml clean install -DskipTests $MAVEN_OPTS" - "mvn -f ./dbrepo-data-service/pom.xml clean test verify $MAVEN_OPTS" - "cat ./dbrepo-data-service/report/target/site/jacoco-aggregate/index.html | grep -o 'Total[^%]*%' | sed 's/<.*>/ /; s/Total/Jacoco Coverage Total:/'" artifacts: @@ -345,14 +353,17 @@ test-analyse-service: - build-analyse-service dependencies: - build-analyse-service - script: + before_script: - "pip install pipenv" - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "mkdir -p /var/log/app/service/analyse" + script: - cd ./dbrepo-analyse-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_determine_dt.py tests/test_determine_pk.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always paths: + - /var/log/app/service/analyse/app.log - ./dbrepo-analyse-service/coverage.xml - ./dbrepo-analyse-service/coverage.txt expire_in: 1 days @@ -397,14 +408,17 @@ test-search-service: - build-search-service dependencies: - build-search-service - script: + before_script: - "pip install pipenv" - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "mkdir -p /var/log/app/service/search" + script: - cd ./dbrepo-search-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_app.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always paths: + - /var/log/app/service/search/app.log - ./dbrepo-search-service/coverage.xml - ./dbrepo-search-service/coverage.txt expire_in: 1 days @@ -424,14 +438,17 @@ test-dashboard-service: - build-dashboard-service dependencies: - build-dashboard-service - script: + before_script: - "pip install pipenv" - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "mkdir -p /var/log/app/service/dashboard" + script: - cd ./dbrepo-dashboard-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_integration_app.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always paths: + - /var/log/app/service/dashboard/app.log - ./dbrepo-dashboard-service/coverage.xml - ./dbrepo-dashboard-service/coverage.txt expire_in: 1 days @@ -521,6 +538,8 @@ clean-images: release-images: stage: release image: docker:${DOCKER_VERSION}-dind + variables: + REPOSITORY_URL: $CI_REGISTRY2_URL dependencies: - clean-images - test-analyse-service @@ -534,37 +553,14 @@ release-images: - tags - dev before_script: + - "apk add --no-cache make maven openjdk17-jdk" - "docker logout ${CI_REGISTRY_URL}" - "echo ${CI_REGISTRY_PASSWORD} | docker login --username ${CI_REGISTRY_USER} --password-stdin ${CI_REGISTRY_URL}" - "docker logout ${CI_REGISTRY2_URL}" - "echo ${CI_REGISTRY2_PASSWORD} | docker login --username ${CI_REGISTRY2_USER} --password-stdin ${CI_REGISTRY2_URL}" script: - - docker build --network=host -t dbrepo-core:build --target build ./lib/java/dbrepo-core - - docker build --network=host -t dbrepo-data-service:build --target build dbrepo-data-service - - docker build --network=host -t dbrepo-metadata-service:build --target build dbrepo-metadata-service - - docker compose build -q --parallel - - docker tag dbrepo-analyse-service:latest "${CI_REGISTRY2_URL}/analyse-service:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-auth-service-init:latest "${CI_REGISTRY2_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-dashboard-service:latest "${CI_REGISTRY2_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-dashboard-service-init:latest "${CI_REGISTRY2_URL}/dashboard-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-dashboard-ui:latest "${CI_REGISTRY2_URL}/dashboard-ui:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-data-service:latest "${CI_REGISTRY2_URL}/data-service:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-metadata-service:latest "${CI_REGISTRY2_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-search-service:latest "${CI_REGISTRY2_URL}/search-service:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-search-service-init:latest "${CI_REGISTRY2_URL}/search-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-storage-service-init:latest "${CI_REGISTRY2_URL}/storage-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker tag dbrepo-ui:latest "${CI_REGISTRY2_URL}/ui:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/analyse-service:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/dashboard-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/dashboard-ui:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/data-service:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/search-service:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/search-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/storage-service-init:${APP_VERSION}${BUILD_VERSION}" - - docker push "${CI_REGISTRY2_URL}/ui:${APP_VERSION}${BUILD_VERSION}" + - "make release-images" + - "APP_VERSION=$DOC_VERSION make release-images" release-helm: stage: release diff --git a/.s3cfg b/.s3cfg new file mode 100644 index 0000000000000000000000000000000000000000..5d33284185529b63eca11f14dad396e3b3485cfb --- /dev/null +++ b/.s3cfg @@ -0,0 +1,8 @@ +access_key = seaweedfsadmin +secret_key = seaweedfsadmin +# Setup endpoint +host_base = http://localhost:9000 +host_bucket = dbrepo +use_https = False +# Enable S3 v4 signature APIs +signature_v2 = False \ No newline at end of file diff --git a/.scripts/check-compose.sh b/.scripts/check-compose.sh deleted file mode 100644 index 82f1a5170701886910ca6a36453aeab1ce1be625..0000000000000000000000000000000000000000 --- a/.scripts/check-compose.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -OUTPUT=$(cat .docker/docker-compose.yml | grep "registry.datalab.tuwien.ac.at/.*" | grep -v "$APP_VERSION") -if [ $? -ne 1 ]; then - echo "[ERROR] Some image version(s) differ from APP_VERSION=${APP_VERSION}: ${OUTPUT}" - exit 1 -fi \ No newline at end of file diff --git a/Makefile b/Makefile index 9cea35dc63e1886e3e7e43aa01c1208485434333..2740c01722cf8e0a557e81cf7395a380da399ba4 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.8.1 -CHART_VERSION ?= 1.8.1 +APP_VERSION ?= 1.8.2 +CHART_VERSION ?= 1.8.2 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/dbrepo-analyse-service/Dockerfile b/dbrepo-analyse-service/Dockerfile index 26ea3ce65c2336bfd065e891c8d88ea47aaf73a3..7799c7ddb68ea17a5d2cae3d5237c54941937cd5 100644 --- a/dbrepo-analyse-service/Dockerfile +++ b/dbrepo-analyse-service/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine3.21 +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk --no-cache add \ @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/analyse && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./api ./api diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 8cb9789d513dfc24b559e8990bff52f43e290c35..21f4b613607a25406e35374ec926623732a6d598 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.8.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.8.2.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 44e9a2a7cae7ecc629c663b78a2bd1c50ed23cb7..f4ad8a2bbe8c2a7036f6d394b9dbb5d806d927e7 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e18008deb4793bde6240af86bc1327468c915b17034ddc88114495249b3b2fce" + "sha256": "348b4dab04b3c38faa04d0f821ac6e3fb0005b7a042a8475ec39f673027c48ce" }, "pipfile-spec": 6, "requires": { @@ -16,109 +16,6 @@ ] }, "default": { - "aiohappyeyeballs": { - "hashes": [ - "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", - "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" - }, - "aiohttp": { - "hashes": [ - "sha256:004511d3413737700835e949433536a2fe95a7d0297edd911a1e9705c5b5ea43", - "sha256:0902e887b0e1d50424112f200eb9ae3dfed6c0d0a19fc60f633ae5a57c809656", - "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", - "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", - "sha256:0a950c2eb8ff17361abd8c85987fd6076d9f47d040ebffce67dce4993285e973", - "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", - "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", - "sha256:14461157d8426bcb40bd94deb0450a6fa16f05129f7da546090cebf8f3123b0f", - "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", - "sha256:17ae4664031aadfbcb34fd40ffd90976671fa0c0286e6c4113989f78bebab37a", - "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", - "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", - "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", - "sha256:37dcee4906454ae377be5937ab2a66a9a88377b11dd7c072df7a7c142b63c37c", - "sha256:38bea84ee4fe24ebcc8edeb7b54bf20f06fd53ce4d2cc8b74344c5b9620597fd", - "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", - "sha256:3ad1d59fd7114e6a08c4814983bb498f391c699f3c78712770077518cae63ff7", - "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", - "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", - "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", - "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", - "sha256:4d0c970c0d602b1017e2067ff3b7dac41c98fef4f7472ec2ea26fd8a4e8c2149", - "sha256:54eb3aead72a5c19fad07219acd882c1643a1027fbcdefac9b502c267242f955", - "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", - "sha256:576f5ca28d1b3276026f7df3ec841ae460e0fc3aac2a47cbf72eabcfc0f102e1", - "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", - "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", - "sha256:634d96869be6c4dc232fc503e03e40c42d32cfaa51712aee181e922e61d74814", - "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", - "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", - "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", - "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", - "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", - "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", - "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", - "sha256:776c8e959a01e5e8321f1dec77964cb6101020a69d5a94cd3d34db6d555e01f7", - "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", - "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", - "sha256:7951decace76a9271a1ef181b04aa77d3cc309a02a51d73826039003210bdc86", - "sha256:7ba92a2d9ace559a0a14b03d87f47e021e4fa7681dc6970ebbc7b447c7d4b7cd", - "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", - "sha256:87944bd16b7fe6160607f6a17808abd25f17f61ae1e26c47a491b970fb66d8cb", - "sha256:87a6e922b2b2401e0b0cf6b976b97f11ec7f136bfed445e16384fbf6fd5e8602", - "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", - "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", - "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", - "sha256:92b7ee222e2b903e0a4b329a9943d432b3767f2d5029dbe4ca59fb75223bbe2e", - "sha256:938f756c2b9374bbcc262a37eea521d8a0e6458162f2a9c26329cc87fdf06534", - "sha256:9756d9b9d4547e091f99d554fbba0d2a920aab98caa82a8fb3d3d9bee3c9ae85", - "sha256:98b88a2bf26965f2015a771381624dd4b0839034b70d406dc74fd8be4cc053e3", - "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", - "sha256:a2a450bcce4931b295fc0848f384834c3f9b00edfc2150baafb4488c27953de6", - "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", - "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", - "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", - "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", - "sha256:ad9509ffb2396483ceacb1eee9134724443ee45b92141105a4645857244aecc8", - "sha256:bbcba75fe879ad6fd2e0d6a8d937f34a571f116a0e4db37df8079e738ea95c71", - "sha256:c10d85e81d0b9ef87970ecbdbfaeec14a361a7fa947118817fcea8e45335fa46", - "sha256:c15b2271c44da77ee9d822552201180779e5e942f3a71fb74e026bf6172ff287", - "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", - "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", - "sha256:ccf10f16ab498d20e28bc2b5c1306e9c1512f2840f7b6a67000a517a4b37d5ee", - "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", - "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", - "sha256:d0666afbe984f6933fe72cd1f1c3560d8c55880a0bdd728ad774006eb4241ecd", - "sha256:d07502cc14ecd64f52b2a74ebbc106893d9a9717120057ea9ea1fd6568a747e7", - "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", - "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", - "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", - "sha256:e87fd812899aa78252866ae03a048e77bd11b80fb4878ce27c23cade239b42b2", - "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", - "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", - "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", - "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", - "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", - "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", - "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", - "sha256:fb3d0cc5cdb926090748ea60172fa8a213cec728bd6c54eae18b96040fcd6227", - "sha256:fb46bb0f24813e6cede6cc07b1961d4b04f331f7112a23b5e21f567da4ee50aa", - "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb" - ], - "markers": "python_version >= '3.9'", - "version": "==3.11.16" - }, - "aiosignal": { - "hashes": [ - "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", - "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" - ], - "markers": "python_version >= '3.9'", - "version": "==1.3.2" - }, "annotated-types": { "hashes": [ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", @@ -180,28 +77,28 @@ }, "boto3": { "hashes": [ - "sha256:4390317a1578af73f1514651bd180ba25802dcbe0a23deafa13851d54d3c3203", - "sha256:7b1b1bc69762975824e5a5d570880abebf634f7594f88b3dc175e8800f35be1a" + "sha256:6bbc75bb51be9c5a33d07a4adf13d133c60f77b7c47bef1c46fda90b1297a867", + "sha256:f3a4d79f499f567d327d2d8846d02ad18244d2927f88858a42a2438f52d9a0ef" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.37.33" + "markers": "python_version >= '3.9'", + "version": "==1.38.8" }, "botocore": { "hashes": [ - "sha256:09b213b0d0500040f85c7daee912ea767c724e43ed61909e624c803ff6925222", - "sha256:4a167dfecae51e9140de24067de1c339acde5ade3dad524a4600ac2c72055e23" + "sha256:68d739300cc94232373517b27c5570de6ae6d809a2db644f30219f5c8e0371ce", + "sha256:f6ae08a56fe94e18d2aa223611a3b5e94123315d0cb3cb85764b029b2326c710" ], - "markers": "python_version >= '3.8'", - "version": "==1.37.33" + "markers": "python_version >= '3.9'", + "version": "==1.38.8" }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -278,101 +175,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "click": { "hashes": [ @@ -384,50 +281,52 @@ }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", + "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", + "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", + "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", + "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", + "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", + "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", + "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", + "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", + "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9", + "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", + "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", + "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", + "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", + "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", + "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", + "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", + "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", + "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", + "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", + "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", + "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", + "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", + "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", + "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", + "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", + "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", + "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", + "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", + "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", + "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", + "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", + "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", + "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", + "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", + "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", + "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==44.0.3" }, "dbrepo": { "hashes": [ - "sha256:fd242c3a382193c1dc4227bc505ddb618815dd0c65417922b966b44bb024779e" + "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125" ], - "path": "./lib/dbrepo-1.8.1.tar.gz" + "path": "./lib/dbrepo-1.8.2.tar.gz" }, "events": { "hashes": [ @@ -486,228 +385,113 @@ "markers": "python_version >= '3.9' and python_version < '4'", "version": "==4.7.1" }, - "frozenlist": { - "hashes": [ - "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", - "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", - "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", - "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", - "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", - "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", - "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", - "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", - "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", - "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", - "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", - "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", - "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", - "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", - "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", - "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", - "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", - "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", - "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", - "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", - "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", - "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", - "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", - "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", - "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", - "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", - "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", - "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", - "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", - "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", - "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", - "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", - "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", - "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", - "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", - "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", - "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", - "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", - "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", - "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", - "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", - "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", - "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", - "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", - "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", - "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", - "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", - "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", - "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", - "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", - "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", - "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", - "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", - "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", - "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", - "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", - "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", - "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", - "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", - "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", - "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", - "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", - "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", - "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", - "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", - "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", - "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", - "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", - "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", - "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", - "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", - "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", - "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", - "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", - "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", - "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", - "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", - "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", - "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", - "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", - "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", - "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", - "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", - "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", - "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", - "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", - "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", - "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", - "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", - "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", - "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", - "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, "gevent": { "hashes": [ - "sha256:1c3443b0ed23dcb7c36a748d42587168672953d368f2956b17fad36d43b58836", - "sha256:1d4fadc319b13ef0a3c44d2792f7918cf1bca27cacd4d41431c22e6b46668026", - "sha256:1ea50009ecb7f1327347c37e9eb6561bdbc7de290769ee1404107b9a9cba7cf1", - "sha256:2142704c2adce9cd92f6600f371afb2860a446bfd0be5bd86cca5b3e12130766", - "sha256:351d1c0e4ef2b618ace74c91b9b28b3eaa0dd45141878a964e03c7873af09f62", - "sha256:356b73d52a227d3313f8f828025b665deada57a43d02b1cf54e5d39028dbcf8d", - "sha256:3d882faa24f347f761f934786dde6c73aa6c9187ee710189f12dcc3a63ed4a50", - "sha256:58851f23c4bdb70390f10fc020c973ffcf409eb1664086792c8b1e20f25eef43", - "sha256:68bee86b6e1c041a187347ef84cf03a792f0b6c7238378bf6ba4118af11feaae", - "sha256:7398c629d43b1b6fd785db8ebd46c0a353880a6fab03d1cf9b6788e7240ee32e", - "sha256:816b3883fa6842c1cf9d2786722014a0fd31b6312cca1f749890b9803000bad6", - "sha256:81d918e952954675f93fb39001da02113ec4d5f4921bf5a0cc29719af6824e5d", - "sha256:85329d556aaedced90a993226d7d1186a539c843100d393f2349b28c55131c85", - "sha256:8619d5c888cb7aebf9aec6703e410620ef5ad48cdc2d813dd606f8aa7ace675f", - "sha256:8bd1419114e9e4a3ed33a5bad766afff9a3cf765cb440a582a1b3a9bc80c1aca", - "sha256:92e0d7759de2450a501effd99374256b26359e801b2d8bf3eedd3751973e87f5", - "sha256:92fe5dfee4e671c74ffaa431fd7ffd0ebb4b339363d24d0d944de532409b935e", - "sha256:97e2f3999a5c0656f42065d02939d64fffaf55861f7d62b0107a08f52c984897", - "sha256:9d3b249e4e1f40c598ab8393fc01ae6a3b4d51fc1adae56d9ba5b315f6b2d758", - "sha256:a3d75fa387b69c751a3d7c5c3ce7092a171555126e136c1d21ecd8b50c7a6e46", - "sha256:a5f1701ce0f7832f333dd2faf624484cbac99e60656bfbb72504decd42970f0f", - "sha256:b24d800328c39456534e3bc3e1684a28747729082684634789c2f5a8febe7671", - "sha256:b5efe72e99b7243e222ba0c2c2ce9618d7d36644c166d63373af239da1036bab", - "sha256:b7bfcfe08d038e1fa6de458891bca65c1ada6d145474274285822896a858c870", - "sha256:beede1d1cff0c6fafae3ab58a0c470d7526196ef4cd6cc18e7769f207f2ea4eb", - "sha256:c6b775381f805ff5faf250e3a07c0819529571d19bb2a9d474bee8c3f90d66af", - "sha256:c9c935b83d40c748b6421625465b7308d87c7b3717275acd587eef2bd1c39546", - "sha256:ca845138965c8c56d1550499d6b923eb1a2331acfa9e13b817ad8305dde83d11", - "sha256:d618e118fdb7af1d6c1a96597a5cd6ac84a9f3732b5be8515c6a66e098d498b6", - "sha256:d6c0a065e31ef04658f799215dddae8752d636de2bed61365c358f9c91e7af61", - "sha256:d740206e69dfdfdcd34510c20adcb9777ce2cc18973b3441ab9767cd8948ca8a", - "sha256:d7886b63ebfb865178ab28784accd32f287d5349b3ed71094c86e4d3ca738af5", - "sha256:d9347690f4e53de2c4af74e62d6fabc940b6d4a6cad555b5a379f61e7d3f2a8e", - "sha256:d9ca80711e6553880974898d99357fb649e062f9058418a92120ca06c18c3c59", - "sha256:e24181d172f50097ac8fc272c8c5b030149b630df02d1c639ee9f878a470ba2b", - "sha256:ec68e270543ecd532c4c1d70fca020f90aa5486ad49c4f3b8b2e64a66f5c9274", - "sha256:f43f47e702d0c8e1b8b997c00f1601486f9f976f84ab704f8f11536e3fa144c9", - "sha256:ff96c5739834c9a594db0e12bf59cb3fa0e5102fc7b893972118a3166733d61c" + "sha256:03587078c402aee27231ecaabd81aec1e8b3de2629830fbd4486e2d09e638ddc", + "sha256:0cc1d6093f482547ac522ab1a985429d8c12494518eeca354c956f0ff6de7a94", + "sha256:11bc2374ce3f1db3a243522c4d30b9e86e2dc0f2905f083fff288afa8ef8031f", + "sha256:12b596c027cf546a235231d421473483fdf7fa586d38162d36b07c8efa9081ba", + "sha256:2270a8607661e609c44e4f72811b6380dcfede558041e4ee3134e66753865038", + "sha256:22f33261b32e28433af7a96388ce33b77e903a648fc868b993304af2c1bca05b", + "sha256:43469ed40ea6cfb1c88e8d85a57aa5f52dd6b3b94a2e499752ab7e60a90c7dba", + "sha256:44acca4196d4a174c2b4817642564526898f42f72992dc1818b834b2bbf17582", + "sha256:498f548330c4724e3b0cee0d75551165fc9e4309ae3ddcba3d644aaa866ca9c3", + "sha256:5940174c7d1ffc7bb4b0ea9f2908f4f361eb03ada9e145d3590b8df1e61c379b", + "sha256:63aecf1e43b8d01086ea574ed05f7272ed40c48dd41fa3d061e3c5ca900abcdd", + "sha256:677e5d1c7d0a0b4240644321f10b8e3b36fd4ca5fc1b45d0e4989e6884375537", + "sha256:6c1d1a66a28372d505e0d8f6f1fdb62f7d5b3423e49431f41b99bd9133f006b7", + "sha256:7442b3ffac08f6239d6463ee2943fd9a619b64b2db11cec292acf8caccb70536", + "sha256:75d2fdd24f3948c085d341281648014760f5cb23de9b29f710083e6911b2e605", + "sha256:76c440972ff57eb64e089f85210ccc0fa247ab71cdedff5414c6b86392f7f791", + "sha256:7ffba461458ed28a85a01285ea0e0dc14f883204d17ce5ed82fa839a9d620028", + "sha256:8b90913360b1af058b279160679d804d4917a8661f128b2f7625f8665c39450f", + "sha256:8e740bc08ba4c34951f4bb6351dbe04209416e12d620691fb57e115b218a7818", + "sha256:9100693f2bd8237ce7ce99a2b62da128196d8abcda331049e67ad6afb8cff23a", + "sha256:91408dd197c13ca0f1e0d5cdcc9870c674963bb87a7e370b2884d1426d73834f", + "sha256:95790dd8aeb4ca8df9ac215ec353a29108647797e54daa652a4634ca316f70d4", + "sha256:a7c70ab6d33dfeb43bfe982c636609d8f90506dacaaa1f409a3c43c66d578fb1", + "sha256:b0a656eccd9cb115d01c9bbe55bfe84cf20c8422c495503f41aef747b193c33d", + "sha256:b7ae7ad4ff9c4492d4b633702e35153509b07dc6ffd20f1577076d7647c9caba", + "sha256:b91e862ab0ddecf37ee6e3bf33965ef4c3e38ba9cdc106eef552293caed512f9", + "sha256:c535d96ded6e26b37fadda9242a49fea6308754da5945173940614b7520c07b4", + "sha256:c62bf14557d2cb54f5e3c1ba0a3b3f4b69bf0441081c32d63b205763b495b251", + "sha256:ccbc835939416a7df7834b79c655409a2a9d2deb9bf119b28dedf72a168f7895", + "sha256:cd59c0dbcae2808a1e26e07d3858b5a935635be195c8ea967a4bc32599381523", + "sha256:d68fdf9bff0068367126983d7d85765124c292b4bc3d4d19ed8138335d8426a7", + "sha256:d7999e4d4b3597b706a333f9a7bf2efbd8365cd244312405f33b4870fa3b411d", + "sha256:eb89ed32e2b766fcb1afc52847e33d8c369d2b40f23d4c96977fd092b5a0ea86", + "sha256:f12e570777027f807dc7dc3ea1945ea040befaf1c9485deb6f24d7110009fc12", + "sha256:f735f57bc19d0f8bbc784093cfb7953a9ad66612b05c3ff876ec7951a96d7edd", + "sha256:fdf9aec76a7285b00fb64ec942cd9ff88f8765874a5abf99c4e8c5374b3133e9", + "sha256:fe4a3e3fa3a16ed9b12b6ff0922208ef83287e066e696b82b96d33723d8207f2", + "sha256:feb5f2f44dcdad1a6b80e7ce24e7557ce25d01ff13b7a74ca276d113adf9d4af", + "sha256:ff92408011d78e4ffe297331ff30cded39a3e22845ba237516c646f6a485a241" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==24.11.1" + "version": "==25.4.2" }, "greenlet": { "hashes": [ - "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", - "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", - "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", - "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", - "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", - "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", - "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", - "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", - "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", - "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", - "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", - "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", - "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", - "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", - "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", - "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", - "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", - "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", - "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", - "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", - "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", - "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", - "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", - "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", - "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", - "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", - "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", - "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", - "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", - "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", - "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", - "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", - "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", - "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", - "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", - "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", - "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", - "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", - "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", - "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", - "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", - "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", - "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", - "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", - "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", - "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", - "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", - "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", - "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", - "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", - "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", - "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", - "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", - "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", - "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", - "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", - "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", - "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", - "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", - "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", - "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", - "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", - "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", - "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", - "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", - "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", - "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", - "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", - "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", - "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", - "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", - "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", - "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" + "sha256:04b4ec7f65f0e4a1500ac475c9343f6cc022b2363ebfb6e94f416085e40dea15", + "sha256:05a7490f74e8aabc5f29256765a99577ffde979920a2db1f3676d265a3adba41", + "sha256:063bcf7f8ee28eb91e7f7a8148c65a43b73fbdc0064ab693e024b5a940070145", + "sha256:0ba2811509a30e5f943be048895a983a8daf0b9aa0ac0ead526dfb5d987d80ea", + "sha256:0c68bbc639359493420282d2f34fa114e992a8724481d700da0b10d10a7611b8", + "sha256:0ddda0197c5b46eedb5628d33dad034c455ae77708c7bf192686e760e26d6a0c", + "sha256:175d583f7d5ee57845591fc30d852b75b144eb44b05f38b67966ed6df05c8526", + "sha256:17964c246d4f6e1327edd95e2008988a8995ae3a7732be2f9fc1efed1f1cdf8c", + "sha256:1a750f1046994b9e038b45ae237d68153c29a3a783075211fb1414a180c8324b", + "sha256:1c472adfca310f849903295c351d297559462067f618944ce2650a1878b84123", + "sha256:2273586879affca2d1f414709bb1f61f0770adcabf9eda8ef48fd90b36f15d12", + "sha256:24a496479bc8bd01c39aa6516a43c717b4cee7196573c47b1f8e1011f7c12495", + "sha256:2530bfb0abcd451ea81068e6d0a1aac6dabf3f4c23c8bd8e2a8f579c2dd60d95", + "sha256:3059c6f286b53ea4711745146ffe5a5c5ff801f62f6c56949446e0f6461f8157", + "sha256:3227c6ec1149d4520bc99edac3b9bc8358d0034825f3ca7572165cb502d8f29a", + "sha256:374ffebaa5fbd10919cd599e5cf8ee18bae70c11f9d61e73db79826c8c93d6f9", + "sha256:3ecc9d33ca9428e4536ea53e79d781792cee114d2fa2695b173092bdbd8cd6d5", + "sha256:3f56382ac4df3860ebed8ed838f268f03ddf4e459b954415534130062b16bc32", + "sha256:4245246e72352b150a1588d43ddc8ab5e306bef924c26571aafafa5d1aaae4e8", + "sha256:4339b202ac20a89ccd5bde0663b4d00dc62dd25cb3fb14f7f3034dec1b0d9ece", + "sha256:4818116e75a0dd52cdcf40ca4b419e8ce5cb6669630cb4f13a6c384307c9543f", + "sha256:5193135b3a8d0017cb438de0d49e92bf2f6c1c770331d24aa7500866f4db4017", + "sha256:51a2f49da08cff79ee42eb22f1658a2aed60c72792f0a0a95f5f0ca6d101b1fb", + "sha256:5c12f0d17a88664757e81a6e3fc7c2452568cf460a2f8fb44f90536b2614000b", + "sha256:6079ae990bbf944cf66bea64a09dcb56085815630955109ffa98984810d71565", + "sha256:639a94d001fe874675b553f28a9d44faed90f9864dc57ba0afef3f8d76a18b04", + "sha256:64a4d0052de53ab3ad83ba86de5ada6aeea8f099b4e6c9ccce70fb29bc02c6a2", + "sha256:6dcc6d604a6575c6225ac0da39df9335cc0c6ac50725063fa90f104f3dbdb2c9", + "sha256:7132e024ebeeeabbe661cf8878aac5d2e643975c4feae833142592ec2f03263d", + "sha256:72c9b668454e816b5ece25daac1a42c94d1c116d5401399a11b77ce8d883110c", + "sha256:777c1281aa7c786738683e302db0f55eb4b0077c20f1dc53db8852ffaea0a6b0", + "sha256:7abc0545d8e880779f0c7ce665a1afc3f72f0ca0d5815e2b006cafc4c1cc5840", + "sha256:7b0f3a0a67786facf3b907a25db80efe74310f9d63cc30869e49c79ee3fcef7e", + "sha256:852ef432919830022f71a040ff7ba3f25ceb9fe8f3ab784befd747856ee58530", + "sha256:8b89e5d44f55372efc6072f59ced5ed1efb7b44213dab5ad7e0caba0232c6545", + "sha256:8fe303381e7e909e42fb23e191fc69659910909fdcd056b92f6473f80ef18543", + "sha256:9afa05fe6557bce1642d8131f87ae9462e2a8e8c46f7ed7929360616088a3975", + "sha256:9f4dd4b4946b14bb3bf038f81e1d2e535b7d94f1b2a59fdba1293cd9c1a0a4d7", + "sha256:aa30066fd6862e1153eaae9b51b449a6356dcdb505169647f69e6ce315b9468b", + "sha256:b38d53cf268da963869aa25a6e4cc84c1c69afc1ae3391738b2603d110749d01", + "sha256:b7503d6b8bbdac6bbacf5a8c094f18eab7553481a1830975799042f26c9e101b", + "sha256:c07a0c01010df42f1f058b3973decc69c4d82e036a951c3deaf89ab114054c07", + "sha256:cb5ee928ce5fedf9a4b0ccdc547f7887136c4af6109d8f2fe8e00f90c0db47f5", + "sha256:cc45a7189c91c0f89aaf9d69da428ce8301b0fd66c914a499199cfb0c28420fc", + "sha256:d6668caf15f181c1b82fb6406f3911696975cc4c37d782e19cb7ba499e556189", + "sha256:dbb4e1aa2000852937dd8f4357fb73e3911da426df8ca9b8df5db231922da474", + "sha256:de62b542e5dcf0b6116c310dec17b82bb06ef2ceb696156ff7bf74a7a498d982", + "sha256:e1967882f0c42eaf42282a87579685c8673c51153b845fde1ee81be720ae27ac", + "sha256:e1a40a17e2c7348f5eee5d8e1b4fa6a937f0587eba89411885a36a8e1fc29bd2", + "sha256:e63cd2035f49376a23611fbb1643f78f8246e9d4dfd607534ec81b175ce582c2", + "sha256:e775176b5c203a1fa4be19f91da00fd3bff536868b77b237da3f4daa5971ae5d", + "sha256:e77ae69032a95640a5fe8c857ec7bee569a0997e809570f4c92048691ce4b437", + "sha256:e934591a7a4084fa10ee5ef50eb9d2ac8c4075d5c9cf91128116b5dca49d43b1", + "sha256:e98328b8b8f160925d6b1c5b1879d8e64f6bd8cf11472b7127d579da575b77d9", + "sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==3.1.1" + "markers": "python_version >= '3.9'", + "version": "==3.2.1" }, "gunicorn": { "hashes": [ @@ -760,11 +544,11 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" ], "markers": "python_version >= '3.9'", - "version": "==2024.10.1" + "version": "==2025.4.1" }, "jwt": { "hashes": [ @@ -858,177 +642,67 @@ "markers": "python_version >= '3.8'", "version": "==3.1.3" }, - "multidict": { - "hashes": [ - "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", - "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", - "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", - "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", - "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", - "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", - "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", - "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", - "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", - "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", - "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", - "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", - "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", - "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", - "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", - "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", - "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", - "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", - "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", - "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", - "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", - "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", - "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", - "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", - "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", - "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", - "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", - "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", - "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", - "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", - "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", - "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", - "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", - "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", - "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", - "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", - "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", - "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", - "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", - "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", - "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", - "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", - "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", - "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", - "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", - "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", - "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", - "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", - "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", - "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", - "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", - "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", - "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", - "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", - "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", - "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", - "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", - "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", - "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", - "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", - "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", - "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", - "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", - "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", - "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", - "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", - "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", - "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", - "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", - "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", - "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", - "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", - "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", - "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", - "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", - "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", - "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", - "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", - "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", - "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", - "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", - "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", - "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", - "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", - "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", - "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", - "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", - "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", - "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", - "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", - "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", - "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", - "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", - "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", - "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", - "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", - "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", - "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", - "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", - "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", - "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", - "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", - "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", - "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" - ], - "markers": "python_version >= '3.9'", - "version": "==6.4.3" - }, "numpy": { "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" + "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70", + "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", + "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", + "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c", + "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb", + "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f", + "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", + "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26", + "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", + "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b", + "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", + "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa", + "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", + "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610", + "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1", + "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906", + "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073", + "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", + "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88", + "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", + "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e", + "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", + "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda", + "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", + "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", + "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae", + "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d", + "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3", + "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57", + "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", + "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", + "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", + "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571", + "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54", + "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", + "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", + "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be", + "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8", + "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd", + "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe", + "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a", + "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", + "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b", + "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", + "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282", + "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169", + "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", + "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e", + "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", + "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7", + "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", + "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba", + "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc", + "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051", + "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.2.4" + "version": "==2.2.5" }, "opensearch-py": { "hashes": [ @@ -1041,11 +715,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pandas": { "hashes": [ @@ -1120,110 +794,6 @@ "index": "pypi", "version": "==0.23.2" }, - "propcache": { - "hashes": [ - "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", - "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", - "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf", - "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", - "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5", - "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c", - "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", - "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", - "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", - "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", - "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", - "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42", - "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035", - "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0", - "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e", - "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46", - "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", - "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", - "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", - "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", - "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", - "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", - "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", - "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833", - "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259", - "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136", - "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", - "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", - "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", - "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", - "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f", - "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", - "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", - "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", - "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566", - "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", - "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908", - "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf", - "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", - "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64", - "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", - "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71", - "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", - "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", - "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", - "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5", - "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894", - "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe", - "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", - "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", - "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", - "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", - "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641", - "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", - "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649", - "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", - "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd", - "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", - "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", - "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229", - "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", - "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", - "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", - "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", - "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", - "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294", - "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", - "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", - "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", - "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", - "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", - "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7", - "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", - "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", - "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", - "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", - "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7", - "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519", - "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", - "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180", - "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", - "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", - "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", - "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", - "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", - "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", - "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", - "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6", - "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c", - "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", - "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", - "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98", - "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", - "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", - "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", - "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", - "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", - "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5" - ], - "markers": "python_version >= '3.9'", - "version": "==0.3.1" - }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -1269,117 +839,117 @@ }, "pydantic": { "hashes": [ - "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", - "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" + "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", + "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.11.3" + "version": "==2.11.4" }, "pydantic-core": { "hashes": [ - "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672", - "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", - "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", - "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", - "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", - "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", - "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", - "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5", - "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", - "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", - "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", - "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", - "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", - "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", - "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", - "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", - "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", - "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", - "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", - "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", - "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", - "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", - "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", - "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", - "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", - "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", - "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5", - "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5", - "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", - "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", - "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", - "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", - "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33", - "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", - "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", - "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2", - "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb", - "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", - "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", - "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", - "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", - "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", - "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", - "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", - "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331", - "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396", - "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", - "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea", - "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b", - "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", - "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b", - "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", - "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", - "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", - "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", - "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", - "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", - "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", - "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", - "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599", - "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", - "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", - "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6", - "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d", - "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", - "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5", - "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd", - "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", - "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", - "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", - "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", - "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", - "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", - "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", - "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96", - "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", - "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", - "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824", - "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", - "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", - "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3", - "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568", - "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", - "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", - "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", - "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", - "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad", - "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", - "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", - "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", - "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", - "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", - "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", - "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", - "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", - "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", - "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", - "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", - "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091" + "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", + "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", + "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", + "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", + "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", + "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", + "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", + "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", + "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", + "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", + "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", + "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", + "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", + "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", + "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", + "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", + "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", + "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", + "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", + "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", + "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", + "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", + "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", + "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", + "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", + "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", + "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", + "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", + "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", + "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", + "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", + "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", + "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", + "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", + "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", + "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", + "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", + "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", + "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", + "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", + "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", + "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", + "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", + "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", + "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", + "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", + "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", + "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", + "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", + "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", + "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", + "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", + "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", + "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", + "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", + "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", + "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", + "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", + "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", + "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", + "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", + "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", + "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", + "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", + "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", + "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", + "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", + "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", + "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", + "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", + "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", + "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", + "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", + "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", + "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", + "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", + "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", + "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", + "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", + "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", + "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", + "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", + "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", + "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", + "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", + "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", + "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", + "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", + "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", + "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", + "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", + "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", + "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", + "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", + "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", + "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", + "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", + "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", + "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" ], "markers": "python_version >= '3.9'", - "version": "==2.33.1" + "version": "==2.33.2" }, "pyjwt": { "hashes": [ @@ -1602,19 +1172,19 @@ }, "s3transfer": { "hashes": [ - "sha256:559f161658e1cf0a911f45940552c696735f5c74e64362e515f333ebed87d679", - "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d" + "sha256:35b314d7d82865756edab59f7baebc6b477189e6ab4c53050e28c1de4d9cce18", + "sha256:8ac58bc1989a3fdb7c7f3ee0918a66b160d038a147c7b5db1500930a607e9a1c" ], - "markers": "python_version >= '3.8'", - "version": "==0.11.4" + "markers": "python_version >= '3.9'", + "version": "==0.12.0" }, "setuptools": { "hashes": [ - "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", - "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8" + "sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927", + "sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537" ], "markers": "python_version >= '3.9'", - "version": "==78.1.0" + "version": "==80.3.1" }, "six": { "hashes": [ @@ -1624,22 +1194,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, - "tinydb": { - "hashes": [ - "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", - "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3" - ], - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==4.8.2" - }, - "tuspy": { - "hashes": [ - "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89", - "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==1.1.0" - }, "typing-extensions": { "hashes": [ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", @@ -1680,99 +1234,6 @@ "markers": "python_version >= '3.9'", "version": "==3.1.3" }, - "yarl": { - "hashes": [ - "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", - "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", - "sha256:0626ee31edb23ac36bdffe607231de2cca055ad3a5e2dc5da587ef8bc6a321bc", - "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", - "sha256:0bae32f8ebd35c04d6528cedb4a26b8bf25339d3616b04613b97347f919b76d3", - "sha256:0df9f0221a78d858793f40cbea3915c29f969c11366646a92ca47e080a14f881", - "sha256:0e617d45d03c8dec0dfce6f51f3e1b8a31aa81aaf4a4d1442fdb232bcf0c6d8c", - "sha256:163ff326680de5f6d4966954cf9e3fe1bf980f5fee2255e46e89b8cf0f3418b5", - "sha256:1efbf4d03e6eddf5da27752e0b67a8e70599053436e9344d0969532baa99df53", - "sha256:217f69e60a14da4eed454a030ea8283f8fbd01a7d6d81e57efb865856822489b", - "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", - "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", - "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", - "sha256:30eaf4459df6e91f21b2999d1ee18f891bcd51e3cbe1de301b4858c84385895b", - "sha256:32ba32d0fa23893fd8ea8d05bdb05de6eb19d7f2106787024fd969f4ba5466cb", - "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", - "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", - "sha256:3b77173663e075d9e5a57e09d711e9da2f3266be729ecca0b8ae78190990d260", - "sha256:46ade37911b7c99ce28a959147cb28bffbd14cea9e7dd91021e06a8d2359a5aa", - "sha256:4815ec6d3d68a96557fa71bd36661b45ac773fb50e5cfa31a7e843edb098f060", - "sha256:528e86f5b1de0ad8dd758ddef4e0ed24f5d946d4a1cef80ffb2d4fca4e10f122", - "sha256:545575ecfcd465891b51546c2bcafdde0acd2c62c2097d8d71902050b20e4922", - "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", - "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", - "sha256:57711f1465c06fee8825b95c0b83e82991e6d9425f9a042c3c19070a70ac92bf", - "sha256:57abd66ca913f2cfbb51eb3dbbbac3648f1f6983f614a4446e0802e241441d2a", - "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", - "sha256:5864f539ce86b935053bfa18205fa08ce38e9a40ea4d51b19ce923345f0ed5db", - "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", - "sha256:5a70201dd1e0a4304849b6445a9891d7210604c27e67da59091d5412bc19e51c", - "sha256:5bc503e1c1fee1b86bcb58db67c032957a52cae39fe8ddd95441f414ffbab83e", - "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", - "sha256:66fc1c2926a73a2fb46e4b92e3a6c03904d9bc3a0b65e01cb7d2b84146a8bd3b", - "sha256:67a56b1acc7093451ea2de0687aa3bd4e58d6b4ef6cbeeaad137b45203deaade", - "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", - "sha256:6ba0931b559f1345df48a78521c31cfe356585670e8be22af84a33a39f7b9221", - "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", - "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", - "sha256:75460740005de5a912b19f657848aef419387426a40f581b1dc9fac0eb9addb5", - "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", - "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", - "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", - "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", - "sha256:7e4cb14a6ee5b6649ccf1c6d648b4da9220e8277d4d4380593c03cc08d8fe937", - "sha256:8015a076daf77823e7ebdcba474156587391dab4e70c732822960368c01251e6", - "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", - "sha256:8346ec72ada749a6b5d82bff7be72578eab056ad7ec38c04f668a685abde6af0", - "sha256:85ac908cd5a97bbd3048cca9f1bf37b932ea26c3885099444f34b0bf5d5e9fa6", - "sha256:8b3ade62678ee2c7c10dcd6be19045135e9badad53108f7d2ed14896ee396045", - "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", - "sha256:961c3e401ea7f13d02b8bb7cb0c709152a632a6e14cdc8119e9c6ee5596cd45d", - "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", - "sha256:9973ac95327f5d699eb620286c39365990b240031672b5c436a4cd00539596c5", - "sha256:9ba536b17ecf3c74a94239ec1137a3ad3caea8c0e4deb8c8d2ffe847d870a8c5", - "sha256:9fac2dd1c5ecb921359d9546bc23a6dcc18c6acd50c6d96f118188d68010f497", - "sha256:a251e00e445d2e9df7b827c9843c0b87f58a3254aaa3f162fb610747491fe00f", - "sha256:a39d7b807ab58e633ed760f80195cbd145b58ba265436af35f9080f1810dfe64", - "sha256:a5288adb7c59d0f54e4ad58d86fb06d4b26e08a59ed06d00a1aac978c0e32884", - "sha256:a626c4d9cca298d1be8625cff4b17004a9066330ac82d132bbda64a4c17c18d3", - "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", - "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", - "sha256:aad67c8f13a4b79990082f72ef09c078a77de2b39899aabf3960a48069704973", - "sha256:acf9b92c4245ac8b59bc7ec66a38d3dcb8d1f97fac934672529562bb824ecadb", - "sha256:ada882e26b16ee651ab6544ce956f2f4beaed38261238f67c2a96db748e17741", - "sha256:ae584afe81a1de4c1bb06672481050f0d001cad13163e3c019477409f638f9b7", - "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", - "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", - "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", - "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", - "sha256:c4228978fb59c6b10f60124ba8e311c26151e176df364e996f3f8ff8b93971b5", - "sha256:c515f7dd60ca724e4c62b34aeaa603188964abed2eb66bb8e220f7f104d5a187", - "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", - "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", - "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", - "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", - "sha256:d8717924cf0a825b62b1a96fc7d28aab7f55a81bf5338b8ef41d7a76ab9223e9", - "sha256:d995122dcaf180fd4830a9aa425abddab7c0246107c21ecca2fa085611fa7ce9", - "sha256:dff065a1a8ed051d7e641369ba1ad030d5a707afac54cf4ede7069b959898835", - "sha256:e4807aab1bdeab6ae6f296be46337a260ae4b1f3a8c2fcd373e236b4b2b46efd", - "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", - "sha256:e97d2f0a06b39e231e59ebab0e6eec45c7683b339e8262299ac952707bdf7688", - "sha256:ec2f56edaf476f70b5831bbd59700b53d9dd011b1f77cd4846b5ab5c5eafdb3f", - "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", - "sha256:f228f42f29cc87db67020f7d71624102b2c837686e55317b16e1d3ef2747a993", - "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", - "sha256:f9b92431d8b4d4ca5ccbfdbac95b05a3a6cd70cd73aa62f32f9627acfde7549c", - "sha256:fd4b5fbd7b9dde785cfeb486b8cca211a0b138d4f3a7da27db89a25b3c482e5c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.19.0" - }, "zope.event": { "hashes": [ "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", @@ -1863,11 +1324,11 @@ }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -1944,101 +1405,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "coverage": { "hashes": [ @@ -2160,11 +1621,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pluggy": { "hashes": [ diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index 41e4c128d9fb39fa6fa619745540996ca3037881..abf21202c8dbf6de8020a6e12220c7ed4d3a0820 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -28,17 +28,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "analyse-service", "service_version": "1.8.2"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/analyse/app.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) @@ -59,8 +74,8 @@ swagger_config = { "headers": [], "specs": [ { - "endpoint": "api-analyse", - "route": "/api-analyse.json", + "endpoint": "api-docs", + "route": "/api-docs.json", "rule_filter": lambda rule: rule.endpoint.startswith('actuator') or rule.endpoint.startswith('analyse'), "model_filter": lambda tag: True, # all in } @@ -185,7 +200,7 @@ template = { "info": { "title": "Database Repository Analyse Service API", "description": "Service that analyses data structures", - "version": "1.8.1", + "version": "1.8.2", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -263,7 +278,7 @@ def get_health(): @app.route("/api/analyse/datatypes", methods=["GET"], endpoint="analyse_analyse_datatypes") @metrics.gauge(name='dbrepo_analyse_datatypes', description='Time needed to analyse datatypes of dataset') -@swag_from("as-yml/analyse_datatypes.yml") +@swag_from("/app/as-yml/analyse_datatypes.yml") def analyse_datatypes(): filename: str = request.args.get('filename') separator: str = request.args.get('separator') @@ -280,17 +295,17 @@ def analyse_datatypes(): logging.debug("determine datatype resulted in datatypes %s", res) return Response(res.model_dump_json(), mimetype="application/json"), 202 except OSError as e: - logging.error(f"Failed to determine data types: {e}") + logging.error(f"Failed to determine data types: {str(e).strip()}") return ApiError(status='BAD_REQUEST', message=str(e), code='error.analyse.invalid').model_dump_json(), 400 except ClientError as e: - logging.error(f"Failed to determine separator: {e}") + logging.error(f"Failed to determine separator: {str(e).strip()}") return ApiError(status='NOT_FOUND', message='Failed to find csv', code='error.analyse.missing').model_dump_json(), 404 @app.route("/api/analyse/keys", methods=["GET"], endpoint="analyse_analyse_keys") @metrics.gauge(name='dbrepo_analyse_keys', description='Time needed to analyse keys of dataset') -@swag_from("as-yml/analyse_keys.yml") +@swag_from("/app/as-yml/analyse_keys.yml") def analyse_keys(): filename: str = request.args.get("filename") separator: str = request.args.get('separator') @@ -305,5 +320,5 @@ def analyse_keys(): logging.info(f"Determined list of primary keys: {res}") return Response(dumps(res), mimetype="application/json"), 202 except OSError as e: - logging.error(f"Failed to determine primary key: {e}") + logging.error(f"Failed to determine primary key: {str(e).strip()}") return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid').model_dump_json(), 400 diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz deleted file mode 100644 index e5f5e436784d54abbad74c606400f0029b49f9c0..0000000000000000000000000000000000000000 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz and /dev/null differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl similarity index 78% rename from dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl rename to dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl index 995dfd67a765f19bcd3b5ec867a799248cf1e0af..48beeb5ebf61c7cca654e0ee66343fac70bb4d53 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e3b65b6b93a602ee26c2f4d4c71c2d3cd331211 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..86a1af2af41c44d35a4da7a472c180854f0cd82c Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c03ed275c6da5b2eef3619c59269f398d59c7de Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3.tar.gz differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..5a0dbc7c95592f2e70bed13fa33d85cc6cdf7811 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1dbc78c989362d4d0c3750b1ad942abe46f205dd Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4.tar.gz differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..50bf1b8195987f6f8d23a36f34bc0f912b6fd9b3 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..be8784437f111e2d4a5cdac36baf77605114dfa5 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5.tar.gz differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..8e4c745a2ce782c174d5e1db7eef22d51d26624c Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..279243fd37fe033fe4aa740361b5e9a370516924 Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6.tar.gz differ diff --git a/dbrepo-auth-service/init/Dockerfile b/dbrepo-auth-service/init/Dockerfile index b325b35435431552c9c5898dc03356f556d1f0c2..bd692732d619340ed2f0ee72ca8cbff7189aa6e2 100644 --- a/dbrepo-auth-service/init/Dockerfile +++ b/dbrepo-auth-service/init/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk add --no-cache alpine-sdk \ diff --git a/dbrepo-auth-service/listeners/pom.xml b/dbrepo-auth-service/listeners/pom.xml index e70201b96ac3d853a0274c7f06499d336f1c27cf..d70af41ef988cf4f81fc2f559f3a14d1187f22b1 100644 --- a/dbrepo-auth-service/listeners/pom.xml +++ b/dbrepo-auth-service/listeners/pom.xml @@ -10,7 +10,7 @@ <version>24.0.5</version> </parent> - <groupId>at.tuwien</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>create-event-listener</artifactId> <name>dbrepo-auth-service</name> <version>24.0.5</version> diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java similarity index 81% rename from dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java rename to dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java index c63e88618b792f4d85e52b4aee55c80e1a2f1db8..061c4d78fbb7bbaf2745207f93ad7a1b996c714f 100644 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java +++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java @@ -1,6 +1,7 @@ -package at.tuwien; +package at.ac.tuwien.ifs.dbrepo; -import org.jboss.logging.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; @@ -13,12 +14,13 @@ import java.nio.charset.Charset; import java.util.Base64; public class Client { - private static final Logger log = Logger.getLogger(Client.class); + + private static final Logger log = LoggerFactory.getLogger(Client.class); public static void postService(String data) throws IOException { try { final String urlString = System.getenv("METADATA_SERVICE_ENDPOINT"); - log.debugf("METADATA_SERVICE_ENDPOINT: %s", urlString); + log.debug("env.METADATA_SERVICE_ENDPOINT: {}", urlString); if (urlString == null || urlString.isEmpty()) { throw new IllegalArgumentException("Environment variable METADATA_SERVICE_ENDPOINT is not set or is empty."); } @@ -26,35 +28,31 @@ public class Client { if (systemUsername == null || systemUsername.isEmpty()) { throw new IllegalArgumentException("Environment variable SYSTEM_USERNAME is not set or is empty."); } - log.debugf("SYSTEM_USERNAME: %s", systemUsername); + log.debug("env.SYSTEM_USERNAME: {}", systemUsername); final String systemPassword = System.getenv("SYSTEM_PASSWORD"); if (systemPassword == null || systemPassword.isEmpty()) { throw new IllegalArgumentException("Environment variable SYSTEM_PASSWORD is not set or is empty."); } final URL url = URI.create(urlString + "/api/user").toURL(); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + log.debug("url: {}", url); + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); final String token = systemUsername + ":" + systemPassword; conn.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(token.getBytes( Charset.defaultCharset()))); conn.setRequestProperty("Content-Type", "application/json; utf-8"); - - OutputStream os = conn.getOutputStream(); + final OutputStream os = conn.getOutputStream(); os.write(data.getBytes()); os.flush(); - final int responseCode = conn.getResponseCode(); if (responseCode != HttpURLConnection.HTTP_CREATED && responseCode != HttpURLConnection.HTTP_OK) { throw new RuntimeException("Failed : HTTP error code : " + responseCode); } - final BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String output; - log.debugf("Output from Server .... \n"); while ((output = br.readLine()) != null) { - System.out.println(output); - log.debugf("Input from Server: %s", output); + log.debug("input from server: {}", output); } conn.disconnect(); } catch (IOException e) { diff --git a/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..7b47c0919cf9ac200ecdb203700f807e05a04901 --- /dev/null +++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java @@ -0,0 +1,91 @@ +package at.ac.tuwien.ifs.dbrepo; + +import org.keycloak.events.Event; +import org.keycloak.events.EventListenerProvider; +import org.keycloak.events.EventType; +import org.keycloak.events.admin.AdminEvent; +import org.keycloak.events.admin.OperationType; +import org.keycloak.events.admin.ResourceType; +import org.keycloak.models.KeycloakSession; +import org.keycloak.models.RealmModel; +import org.keycloak.models.RealmProvider; +import org.keycloak.models.UserModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateEventListenerProvider implements EventListenerProvider { + + private static final Logger log = LoggerFactory.getLogger(CreateEventListenerProvider.class); + + private final KeycloakSession session; + private final RealmProvider model; + + public CreateEventListenerProvider(KeycloakSession session) { + this.session = session; + this.model = session.realms(); + } + + @Override + public void onEvent(Event event) { + log.atDebug() + .setMessage("received " + event.getType().toString() + " event") + .addKeyValue("event.type", event.getType()) + .addKeyValue("event.realm_id", event.getRealmId()) + .addKeyValue("event.user_id", event.getUserId()) + .log(); + if (EventType.REGISTER.equals(event.getType()) || EventType.IDENTITY_PROVIDER_FIRST_LOGIN.equals(event.getType())) { + final RealmModel realm = this.model.getRealm(event.getRealmId()); + sendUserData(this.session.users().getUserById(realm, event.getUserId())); + } + } + + @Override + public void onEvent(AdminEvent adminEvent, boolean b) { + log.atDebug() + .setMessage("received admin event") + .addKeyValue("event.realm_id", adminEvent.getRealmId()) + .addKeyValue("event.operation_type", adminEvent.getOperationType()) + .addKeyValue("event.resource_type", adminEvent.getResourceType()) + .addKeyValue("event.resource_path", adminEvent.getResourcePath()) + .log(); + if (ResourceType.USER.equals(adminEvent.getResourceType()) + && OperationType.CREATE.equals(adminEvent.getOperationType())) { + final RealmModel realm = this.model.getRealm(adminEvent.getRealmId()); + sendUserData(this.session.users().getUserById(realm, adminEvent.getResourcePath().substring(6))); + } + } + + private void sendUserData(UserModel user) { + final String userData = "{" + + quoteAttr("id", user.getId()) + ", " + + quoteAttr("username", user.getUsername()) + ", " + + quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " + + quoteAttr("given_name", user.getFirstName()) + ", " + + quoteAttr("family_name", user.getLastName()) + + "}"; + try { + Client.postService(userData); + log.atInfo() + .addKeyValue("id", user.getId()) + .addKeyValue("username", user.getUsername()) + .addKeyValue("ldap_id", user.getFirstAttribute("LDAP_ID")) + .addKeyValue("given_name", user.getFirstName()) + .addKeyValue("family_name", user.getLastName()) + .setMessage("Created new user in metadata service: " + user.getId()) + .log(); + } catch (Exception e) { + log.error("Failed to call metadata service: {}", e.getMessage()); + } + } + + private static String quoteAttr(String key, String value) { + if (value == null || value.isBlank() || value.isEmpty() || value.contentEquals(" ")) { + return "\"" + key + "\": null"; + } + return "\"" + key + "\": \"" + value + "\""; + } + + @Override + public void close() { + } +} diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java similarity index 95% rename from dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java rename to dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java index 61477ffa33169504a3368d11d0750c9c1404e160..5410647bba19c2b1f1ef1f1a62100f9c9ed2b77c 100644 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java +++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java @@ -1,4 +1,4 @@ -package at.tuwien; +package at.ac.tuwien.ifs.dbrepo; import org.keycloak.Config; import org.keycloak.events.EventListenerProvider; diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java deleted file mode 100644 index ea4aa7794b6f26167da704e4c12057cf9d8c5c42..0000000000000000000000000000000000000000 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java +++ /dev/null @@ -1,132 +0,0 @@ -package at.tuwien; - -import org.jboss.logging.Logger; -import org.keycloak.events.Event; -import org.keycloak.events.EventListenerProvider; -import org.keycloak.events.EventType; -import org.keycloak.events.admin.AdminEvent; -import org.keycloak.events.admin.OperationType; -import org.keycloak.events.admin.ResourceType; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RealmModel; -import org.keycloak.models.RealmProvider; -import org.keycloak.models.UserModel; - -import java.util.StringJoiner; - -public class CreateEventListenerProvider implements EventListenerProvider { - - private static final Logger log = Logger.getLogger(CreateEventListenerProvider.class); - - private final KeycloakSession session; - private final RealmProvider model; - - public CreateEventListenerProvider(KeycloakSession session) { - this.session = session; - this.model = session.realms(); - } - - @Override - public void onEvent(Event event) { - if (EventType.REGISTER.equals(event.getType()) || EventType.IDENTITY_PROVIDER_FIRST_LOGIN.equals(event.getType())) { - event.getDetails().forEach((key, value) -> log.debugf("%s : %s", key, value)); - RealmModel realm = this.model.getRealm(event.getRealmId()); - UserModel user = this.session.users().getUserById(realm, event.getUserId()); - sendUserData(user); - } - - } - - @Override - public void onEvent(AdminEvent adminEvent, boolean b) { - log.debug("onEvent(AdminEvent)"); - log.debugf("Resource path: %s", adminEvent.getResourcePath()); - log.debugf("Resource type: %s", adminEvent.getResourceType()); - log.debugf("Operation type: %s", adminEvent.getOperationType()); - log.debugf("AdminEvent.toString(): %s", toString(adminEvent)); - if (ResourceType.USER.equals(adminEvent.getResourceType()) - && OperationType.CREATE.equals(adminEvent.getOperationType())) { - RealmModel realm = this.model.getRealm(adminEvent.getRealmId()); - UserModel user = this.session.users().getUserById(realm, adminEvent.getResourcePath().substring(6)); - - sendUserData(user); - } - } - - private void sendUserData(UserModel user) { - final String userData = "{" + - quoteAttr("id", user.getId()) + ", " + - quoteAttr("username", user.getUsername()) + ", " + - quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " + - quoteAttr("given_name", user.getFirstName()) + ", " + - quoteAttr("family_name", user.getLastName()) + - "}"; - try { - log.debugf("create new user in API: %s", userData); - Client.postService(userData); - } catch (Exception e) { - log.errorf("Failed to call API: %s", e); - } - } - - private static String quoteAttr(String key, String value) { - if (value == null || value.isBlank() || value.isEmpty() || value.contentEquals(" ")) { - return "\"" + key + "\": null"; - } - return "\"" + key + "\": \"" + value + "\""; - } - - @Override - public void close() { - } - - private String toString(Event event) { - final StringJoiner joiner = new StringJoiner(", "); - joiner.add("type=" + event.getType()) - .add("realmId=" + event.getRealmId()) - .add("clientId=" + event.getClientId()) - .add("userId=" + event.getUserId()) - .add("ipAddress=" + event.getIpAddress()); - if (event.getError() != null) { - joiner.add("error=" + event.getError()); - } - if (event.getDetails() != null) { - event.getDetails().forEach((key, value) -> { - if (value == null || !value.contains(" ")) { - joiner.add(key + "=" + value); - } else { - joiner.add(key + "='" + value + "'"); - } - }); - } - return joiner.toString(); - } - - private String toString(AdminEvent event) { - RealmModel realm = this.model.getRealm(event.getRealmId()); - UserModel newRegisteredUser = this.session.users().getUserById(realm, event.getAuthDetails().getUserId()); - - StringJoiner joiner = new StringJoiner(", "); - - joiner.add("operationType=" + event.getOperationType()) - .add("realmId=" + event.getAuthDetails().getRealmId()) - .add("clientId=" + event.getAuthDetails().getClientId()) - .add("userId=" + event.getAuthDetails().getUserId()); - - if (newRegisteredUser != null) { - joiner.add("email=" + newRegisteredUser.getEmail()) - .add("username=" + newRegisteredUser.getUsername()) - .add("firstName=" + newRegisteredUser.getFirstName()) - .add("lastName=" + newRegisteredUser.getLastName()); - } - - joiner.add("ipAddress=" + event.getAuthDetails().getIpAddress()) - .add("resourcePath=" + event.getResourcePath()); - - if (event.getError() != null) { - joiner.add("error=" + event.getError()); - } - - return joiner.toString(); - } -} diff --git a/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory b/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory index df3c5521f0958fed5fadb4f006d8ee6eb50f97c2..da90b255da8add6f57dc05f662b8448353416ffd 100644 --- a/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory +++ b/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory @@ -1 +1 @@ -at.tuwien.CreateEventListenerProviderFactory \ No newline at end of file +at.ac.tuwien.ifs.dbrepo.CreateEventListenerProviderFactory \ No newline at end of file diff --git a/dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java b/dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java similarity index 95% rename from dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java rename to dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java index c3d6ee94ccd764d16d589b33b51d501e2a2a3d82..5374411b132942f277f7f9b4a738404f916c1f36 100644 --- a/dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java +++ b/dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java @@ -1,4 +1,4 @@ -package at.tuwien; +package at.ac.tuwien.ifs.dbrepo; import dasniko.testcontainers.keycloak.KeycloakContainer; import org.testcontainers.images.PullPolicy; diff --git a/dbrepo-dashboard-service/Dockerfile b/dbrepo-dashboard-service/Dockerfile index e739245d3031956fe99203167a25f72b9c06ed3b..62589ba867cf6f48a3d62df3c0759c7611f55738 100644 --- a/dbrepo-dashboard-service/Dockerfile +++ b/dbrepo-dashboard-service/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine3.21 +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk add --no-cache \ @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/dashboard && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./app.py ./app.py diff --git a/dbrepo-dashboard-service/Pipfile b/dbrepo-dashboard-service/Pipfile index 0d2ee8e849a7a12e9c76b6f6806d39e10d1133c5..52e7bf373129b51535c5fb3205b4f537e1f642de 100644 --- a/dbrepo-dashboard-service/Pipfile +++ b/dbrepo-dashboard-service/Pipfile @@ -12,7 +12,7 @@ prometheus-flask-exporter = "*" python-dotenv = "~=1.0" jwt = "~=1.3" pytest = "*" -dbrepo = {path = "./lib/dbrepo-1.8.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.8.2.tar.gz"} gunicorn = "*" pydantic = "*" flask_httpauth = "*" diff --git a/dbrepo-dashboard-service/Pipfile.lock b/dbrepo-dashboard-service/Pipfile.lock index 1d6b73633faa769490bbee929b6c41ea28ea0892..9c02ba5f1c284db4332ebc333a0dd50df26210de 100644 --- a/dbrepo-dashboard-service/Pipfile.lock +++ b/dbrepo-dashboard-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "54007a87aa48b93e0343dc44fcf250d69f76e5ba03f283df6daa1db89bd1d03c" + "sha256": "422a07d8107ead238fa1aaf9e6abfabab2d4eed49e272823aa08e6525708c525" }, "pipfile-spec": 6, "requires": { @@ -16,109 +16,6 @@ ] }, "default": { - "aiohappyeyeballs": { - "hashes": [ - "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", - "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" - }, - "aiohttp": { - "hashes": [ - "sha256:004511d3413737700835e949433536a2fe95a7d0297edd911a1e9705c5b5ea43", - "sha256:0902e887b0e1d50424112f200eb9ae3dfed6c0d0a19fc60f633ae5a57c809656", - "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", - "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", - "sha256:0a950c2eb8ff17361abd8c85987fd6076d9f47d040ebffce67dce4993285e973", - "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", - "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", - "sha256:14461157d8426bcb40bd94deb0450a6fa16f05129f7da546090cebf8f3123b0f", - "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", - "sha256:17ae4664031aadfbcb34fd40ffd90976671fa0c0286e6c4113989f78bebab37a", - "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", - "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", - "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", - "sha256:37dcee4906454ae377be5937ab2a66a9a88377b11dd7c072df7a7c142b63c37c", - "sha256:38bea84ee4fe24ebcc8edeb7b54bf20f06fd53ce4d2cc8b74344c5b9620597fd", - "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", - "sha256:3ad1d59fd7114e6a08c4814983bb498f391c699f3c78712770077518cae63ff7", - "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", - "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", - "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", - "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", - "sha256:4d0c970c0d602b1017e2067ff3b7dac41c98fef4f7472ec2ea26fd8a4e8c2149", - "sha256:54eb3aead72a5c19fad07219acd882c1643a1027fbcdefac9b502c267242f955", - "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", - "sha256:576f5ca28d1b3276026f7df3ec841ae460e0fc3aac2a47cbf72eabcfc0f102e1", - "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", - "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", - "sha256:634d96869be6c4dc232fc503e03e40c42d32cfaa51712aee181e922e61d74814", - "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", - "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", - "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", - "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", - "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", - "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", - "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", - "sha256:776c8e959a01e5e8321f1dec77964cb6101020a69d5a94cd3d34db6d555e01f7", - "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", - "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", - "sha256:7951decace76a9271a1ef181b04aa77d3cc309a02a51d73826039003210bdc86", - "sha256:7ba92a2d9ace559a0a14b03d87f47e021e4fa7681dc6970ebbc7b447c7d4b7cd", - "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", - "sha256:87944bd16b7fe6160607f6a17808abd25f17f61ae1e26c47a491b970fb66d8cb", - "sha256:87a6e922b2b2401e0b0cf6b976b97f11ec7f136bfed445e16384fbf6fd5e8602", - "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", - "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", - "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", - "sha256:92b7ee222e2b903e0a4b329a9943d432b3767f2d5029dbe4ca59fb75223bbe2e", - "sha256:938f756c2b9374bbcc262a37eea521d8a0e6458162f2a9c26329cc87fdf06534", - "sha256:9756d9b9d4547e091f99d554fbba0d2a920aab98caa82a8fb3d3d9bee3c9ae85", - "sha256:98b88a2bf26965f2015a771381624dd4b0839034b70d406dc74fd8be4cc053e3", - "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", - "sha256:a2a450bcce4931b295fc0848f384834c3f9b00edfc2150baafb4488c27953de6", - "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", - "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", - "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", - "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", - "sha256:ad9509ffb2396483ceacb1eee9134724443ee45b92141105a4645857244aecc8", - "sha256:bbcba75fe879ad6fd2e0d6a8d937f34a571f116a0e4db37df8079e738ea95c71", - "sha256:c10d85e81d0b9ef87970ecbdbfaeec14a361a7fa947118817fcea8e45335fa46", - "sha256:c15b2271c44da77ee9d822552201180779e5e942f3a71fb74e026bf6172ff287", - "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", - "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", - "sha256:ccf10f16ab498d20e28bc2b5c1306e9c1512f2840f7b6a67000a517a4b37d5ee", - "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", - "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", - "sha256:d0666afbe984f6933fe72cd1f1c3560d8c55880a0bdd728ad774006eb4241ecd", - "sha256:d07502cc14ecd64f52b2a74ebbc106893d9a9717120057ea9ea1fd6568a747e7", - "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", - "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", - "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", - "sha256:e87fd812899aa78252866ae03a048e77bd11b80fb4878ce27c23cade239b42b2", - "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", - "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", - "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", - "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", - "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", - "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", - "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", - "sha256:fb3d0cc5cdb926090748ea60172fa8a213cec728bd6c54eae18b96040fcd6227", - "sha256:fb46bb0f24813e6cede6cc07b1961d4b04f331f7112a23b5e21f567da4ee50aa", - "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb" - ], - "markers": "python_version >= '3.9'", - "version": "==3.11.16" - }, - "aiosignal": { - "hashes": [ - "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", - "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" - ], - "markers": "python_version >= '3.9'", - "version": "==1.3.2" - }, "annotated-types": { "hashes": [ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", @@ -145,11 +42,11 @@ }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -226,101 +123,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "click": { "hashes": [ @@ -332,50 +229,52 @@ }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", + "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", + "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", + "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", + "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", + "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", + "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", + "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", + "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", + "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9", + "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", + "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", + "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", + "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", + "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", + "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", + "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", + "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", + "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", + "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", + "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", + "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", + "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", + "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", + "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", + "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", + "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", + "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", + "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", + "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", + "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", + "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", + "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", + "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", + "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", + "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", + "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==44.0.3" }, "dbrepo": { "hashes": [ - "sha256:fd242c3a382193c1dc4227bc505ddb618815dd0c65417922b966b44bb024779e" + "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125" ], - "path": "./lib/dbrepo-1.8.1.tar.gz" + "path": "./lib/dbrepo-1.8.2.tar.gz" }, "flasgger": { "hashes": [ @@ -418,104 +317,6 @@ "markers": "python_version >= '3.9' and python_version < '4'", "version": "==4.7.1" }, - "frozenlist": { - "hashes": [ - "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", - "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", - "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", - "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", - "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", - "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", - "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", - "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", - "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", - "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", - "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", - "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", - "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", - "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", - "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", - "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", - "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", - "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", - "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", - "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", - "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", - "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", - "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", - "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", - "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", - "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", - "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", - "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", - "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", - "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", - "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", - "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", - "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", - "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", - "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", - "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", - "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", - "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", - "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", - "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", - "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", - "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", - "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", - "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", - "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", - "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", - "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", - "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", - "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", - "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", - "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", - "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", - "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", - "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", - "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", - "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", - "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", - "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", - "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", - "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", - "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", - "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", - "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", - "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", - "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", - "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", - "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", - "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", - "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", - "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", - "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", - "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", - "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", - "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", - "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", - "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", - "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", - "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", - "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", - "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", - "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", - "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", - "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", - "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", - "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", - "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", - "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", - "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", - "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", - "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", - "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", - "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, "grafana-client": { "hashes": [ "sha256:2477a47b923fd0637947e620b0b777c641af18a3025464fa4505783dbf05dfcc", @@ -536,11 +337,11 @@ }, "h11": { "hashes": [ - "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", - "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" ], - "markers": "python_version >= '3.7'", - "version": "==0.14.0" + "markers": "python_version >= '3.8'", + "version": "==0.16.0" }, "idna": { "hashes": [ @@ -568,105 +369,106 @@ }, "jh2": { "hashes": [ - "sha256:038091480cd1544e9389b0adbb1b1645a797689dcb68ceae7e45eec96ed24497", - "sha256:0c8e336df8ed1687590695f4469f480eeb4159bf13bb6193791c6530fe114b49", - "sha256:0c9bf2d5e4ef45c1686c6f76935e7ca263f5eae4de92bf5d1873a0e737e4eb7d", - "sha256:0faf6e96f74d27b8ca816b40217904891f91b664ed1c0388737949ceb50ac15d", - "sha256:10ea7f497e6226372e1d4fdbf42c8381f4887819a643ab930bff4072ad298d84", - "sha256:11650f7ed77ee1df30f25d6b3b74b2fa1c94124e074fd455abafea3cbc913d53", - "sha256:12ead3ee3e9c7caa00356b528a5cc7fe210fbe2060628af6e19ed76b8416572e", - "sha256:136b3c5b08883681fcb58f12393a5bbfa422d6e2d5ba887e263e776874276bc6", - "sha256:17d6e1691154ea9f726e43dcb717df48e56c66b5a01c90ad675c6494c36e5be1", - "sha256:19cb987915cc0d321746a12f2a693d087ffb721c37ac9a153cc088c57d4d90eb", - "sha256:1cdf15de698c4026e64fd914fead3180e52bf2a7bcbe44a3392404582dbf2d22", - "sha256:1e81e1c64e33506b8508ba5e3c7c139b2577e78b079c2c16a8e7a02a161f1080", - "sha256:2226c76e4ff2149c5d9f94bed22bf9c4f3411d38cc53d4a7ddfbe0899c8b558c", - "sha256:2837412fb7b684c6ce7392c8bc57440c6dbadaf1bde7a53144381f7df7083c1c", - "sha256:293f0f3da3c391e997e0d55fdb85540e98a8b0406622bb4ba57fb7617697f31e", - "sha256:2b9cc6c0239215a349d28c192fa4c4e7a7348eee7980531525c01bffe39eea80", - "sha256:2f3ad679f84ff236a0d7b71ddc4b3c09fe467abee2f1a86671f0cd417be5352b", - "sha256:358cad2f328c52c15756cf32b0ad17afb0d617e7cdfe93d59aa2616966d825b7", - "sha256:3663712305b509f79c002c8c0ca9994f716cadba576f5a59632dda1aec1ca8c6", - "sha256:41794820ccca039ca2ead6245f30b34601dd1456eee5b5dde620672bb989e79d", - "sha256:44b7e64aff542471c474c24f771eae5efd9152da02a12556f7cb7607020e1420", - "sha256:45770eb0990166026538d3c2fd7d92f17cfde13ca6567570c4baec3ce9162936", - "sha256:498060078a4d1b458e9381fefb027d85329397b50d65287712b3d48233e20836", - "sha256:4c2f18f337c2393f84e45e5011c8b02697b81638b1cec49da60a01b9ed067695", - "sha256:5162d6e475d2762035fb8ea25982bcbec6c58715e33bd0951499f743cd90b110", - "sha256:51e8c890bb59008c95b3a552cefd8bd9ce50a7466a6c920a78cf586e885d7449", - "sha256:56ad3839ac6ac5fd3d023cf59d4b04264b74bb4cb44c0780faf51d6b5ff38fbc", - "sha256:5821638ef0d7c973071810a6786f59b305172197f7e7e469a2ce169e7f4978e3", - "sha256:5ac1b2d379f4d40c13dcce537e69704452943cddbe991fd54a84fdb2da9026d5", - "sha256:5b465d4311b0429fe6fa85df8e2cfcb038c9fface95396dd14e838ecabaaadf2", - "sha256:5d8656b98057329bd03d968aac8d5198389cf51517511295cfc4cb827a507e39", - "sha256:5dcfb3e823ef4b91b70b92848570d1d8cfd584304bd2bd54272dc100c9494def", - "sha256:5e40d23ea43f683f3a7c032dde391104f609b05c21b6d284101120b51dbd50c1", - "sha256:63a01522bde161c713f7fa5ee5d850fee6386fc386073490ebcd438f14579cf2", - "sha256:6b2a3d7756035dde13571f4ad232629b78b7f35c2cd5fda7b464079fc697db3a", - "sha256:6b3be1a6bf6c965aea3b4e3a40df9d2c134c516d89c76cf2b6c81f67e6c5c6ed", - "sha256:6c7bea3357f2dc653756e6da55f66cd21c73d3875c8f3dc4e8d196a876252de0", - "sha256:6e6c8e229507cf29333a2f491cbaa7dff5b8a4a3e613af8090ccce9ce3e4f7a0", - "sha256:6fad27f2a63884ee45d491aebec4b1f38752cd6aaccc625038c21e7f43c02c49", - "sha256:71bfef52547c2b8b145897fa8d1b5142bc52313cfa38c0742e0ef755f0d09c60", - "sha256:72370d312323282b1bf74426e53fae861a310d7ae519b419da46673c38e7d147", - "sha256:76c7d36043a9c478b0c846fcec7da5cb095983722473e503e0122ccd170182b5", - "sha256:78d8a81ef51edb9a2f278a6fb278789b49e304b12bb21bccf2fe7e344f71a9fb", - "sha256:798a6b159ce32181a5e7ab7611c17d1080e74a5541fec47f961b728dab25a76f", - "sha256:7e370567f66a57e2c0e3ae2afcc6f126e1d6babd36831cfd0caad279b05c1c88", - "sha256:8004b845f606b95a8b17efa112aa10b327e46e95dcda604a257b4633d4ed45c8", - "sha256:80b20bf9ea4e709b3b9ae364ac298dfa872b084c186e5c1d60b0b79c79a7ee7e", - "sha256:87303f4bb1b493997f911a4f126123ccd2827d3a2e7dd2390cc6143fbc75805b", - "sha256:8d423f4631395b92dceda39f481a463498131ac02a58581124a44495491f715b", - "sha256:94ee262192db50fb9c069a0be7bb1a426fb1b43af26ce12bf4c6c30e13f46b56", - "sha256:960e4be2e7de340300ab4bcc2b45bed46be1d62330575b8265e6602dbcb9a14c", - "sha256:99397d5e1da6b345cec3e6125e2902b0e6864eb8eaa4be43a2013f059c502c93", - "sha256:9abbb8c1bad08817bad62ae1ea76c01bdbd0ee8c827d05f3ba038c9f6d6f14bb", - "sha256:9c0b8fadf80bc70d341032f92702bda1b0ed78c01e9c495f0df701938c99bcf5", - "sha256:9f977da9abae170eebdcf02bda33727c342fad5dcdbc08498bfdfb6cc6c65489", - "sha256:a6be712ca39d5e9c89b705bc9800be36739436fefb8d0b52b2d332f7d6d22a01", - "sha256:aa434418d6ee44b0ba3a5a407bc9e1543cf496328f43f149e9b58f74a63d5c21", - "sha256:ac4f778e32f7de0ba63346893a4af87c2280ffc1783f594a117be51d908a10da", - "sha256:ac85d65ee369c09b2904b55078ad589961e2e2e03c810963d35a26e6a3931425", - "sha256:ad5d78c664d39960435d4162db31117c8945ba74fb0c414e79ba85a8bdeafdec", - "sha256:ad91f57c3485d87a8edee558dafab0f08c716857d748731c0998dcefe9d3fd5f", - "sha256:afd255d42b340036883ca95bded553b29065b064e2fe5db64ad5988517db9694", - "sha256:b1c2c74f100a0c2110a8e30445554ae331860d32f145c60a2a1e1c27702022a2", - "sha256:b49a8c71378d40d43c6a56eaa536d7823baa43c27c93e082aeb60a9717be0c10", - "sha256:b5f52611323e8e35705e6750a760f32165b41c052d22da154ae343871e7cd50d", - "sha256:b6bf99ae529ac359263269710356d3ddb173c15d8f8dc8849ae794ab811e5cd0", - "sha256:ba361bf87c4701f11241be92c99ef5cf916865dd225955cccb2376bf76717b3c", - "sha256:bc351aa2158575e68943d8e1d5531719ad86bf6607776627ed5a1a60657664af", - "sha256:bd6eb7b1e12e4dd0b75cab1b023272f1333494add5ad61deedac738af1ffeede", - "sha256:bf8852595f5e2d2b072e24c29394b5aca7fba96ecc8656d56660535f9e9872c9", - "sha256:c1dd66541569a2bdbe92589cc96a89f470b20d168f2238fd463e1b59ee3e2d49", - "sha256:c36a7a004cba4e370d0675826eeefe4e42a256638b6b1432263ddb4af317bc02", - "sha256:c886cda61da4d39010be84802bed11bc75f03e8a6094cc18016957a2c80254d4", - "sha256:cc7aa83946f80c66a5d2dea7e165f15aa3eb21e7b74b24d8f850afc0d44bb00e", - "sha256:cea9c4bef70d1358bafec6019164abce362f4de15d79d1ecd64ae31c1749d77a", - "sha256:cfe1951e80869695857986be104a40a1e7fa8ec7de05f86bcbd7bd20854be764", - "sha256:d36cf6f139da3279644794fcfda18af425c8bb122ef9c2e7c762a937bbf7b0f4", - "sha256:d81308faaa9393b7e6ed20718d465c4c2b73c24d5e4826024961acf4b87b1524", - "sha256:db51ea1f9c5ac790848bc271fcdf4108ad1b77a77c6949a96320477962cf7ba5", - "sha256:dd05c18c920a15e00d7a52df37bffd3930fe2c004c690f9422b20e12077e6dbd", - "sha256:df05918a11e1db0198d00486e36673b4b4a89390e4458ff9479b4908dde357ac", - "sha256:e4c31dccf6be131709e545d0258eb5b75c5fac304857ad3976331c6740e8b9d6", - "sha256:e60954d673040430802b29fe5bba698e262182b5ba5f302ff4458e39f8101881", - "sha256:e60e2d2c88a0552e61c37172fe377f6a8abf479130a445314886de4a360ba940", - "sha256:e786f773ddc153846b2ebdb854011cfd1f7c874b8ee79cced3706801341c9f5d", - "sha256:e7cd91548fb95b69edd376f5204e27115ac7d093ec7d80066123a5bdb31c71d9", - "sha256:eaef2ea4f5602aefaaf3d6e8235f3b9ffde35aff15aac1c16cc802f6bbf0a3b5", - "sha256:ec8c5ea93a03775fbadd08462200cf34ce617ec75a032abfa44fd6d3a00e5424", - "sha256:eddeb8574bc9d9abb8491d4a46b60e553c2cea235b80373756acb06568101175", - "sha256:eeb300b0e4b428aab2f70d785cad4306529262af6de8c8c5fe6a4b41a674a434", - "sha256:f39d71ece8e97cf069e4154868eaac1256b133fe23e0459829432e4bb6406472", - "sha256:f4840ddad2b9d53710e92361391944da89e3576641a290066a1719520059247c", - "sha256:f70723a00bcbce0f9a216853139955be45da35741335eb3afead304e77662560", - "sha256:f829cf2ba5b553e6529d6238928c07096f1feb47f4ad536b7f06bca6cc77173f", - "sha256:f96386910467725895f7972939a6faabd6e96b1de0cc2c092e4bd2c40e956e25", - "sha256:fe259a9d6f555bc79aed9bb4b9a7fff73db443b4c483e4a81a428c8a2860428b" + "sha256:02015fd68d73cfbe623c7ee93130dd8be53f9eed5cd644fce12d298929c6a15d", + "sha256:0fc980bc55ec4de7b696aab45b1e8d89465608f48f1ba06db1184c2cb8e4ff82", + "sha256:1005f57c2866305432588fb001e6ac9f99258cf2620ff1f93f6eae2c164db403", + "sha256:11909c2a63d342bf84211673ced4ea1a7c701362a375e1e2308e613535ba9865", + "sha256:12c9a67a94c7b0b1bc15f90e57647f5b73e3d8e67a117f649c67b7aa71664ee8", + "sha256:162396cc26bdab52818b9c2926fe75533b0dc6dfc0db90779807159eff896c22", + "sha256:1643f6ba8f9fbb03b933cca8dd84bec19f3f33acab513e57e083ebe9462a4ef3", + "sha256:16cbfcb2f9934e7693eef985f1e4bf64ff1d533dbc9cca4554a7e24804170e4d", + "sha256:1a52ef916d076842ba1252fc9d0fe78ec0ea93d4b2985ae46b3b0f05e6b3348f", + "sha256:1e9ff345926c4ac650acea101463b4f8468f5069dda136366585ff7ce4aac38c", + "sha256:1ed0cf5558d4d8cbb2b8a407295ba101a79686ff452fb2ab5fac1c6b9ef40d79", + "sha256:20b3d8eb3469c2c368cced0da918b4e8ff8e91f2a48810b8242dd8a8ff0de0da", + "sha256:2138ad06e011cb0ebc00f7485377888f0c6f076b1aa21f167d7cd5adf8f85ca5", + "sha256:23df2b4433ebf275e096c66fd4fe2a27d8d802fcab8ac49ec856a168808b7ad4", + "sha256:28b5a1c3aa84f09ab2b004cb9e16bc13a798933607806bb5ec5a38e1406d7e19", + "sha256:2a76f29548199744b210308aac184d897bfda4ec7300ce1d4b9a498874aeceab", + "sha256:2b2768b896e0351328a7f6377d77d21deadef5a50afd84bc66995a8323faf921", + "sha256:2f2f8fba36fd9c9463cc55a27957735f46e9b4d3551d4bb7fd9539749d141647", + "sha256:33bf11c9f6b6308823147e8d8da0828b5e7f330399a5b12c08c586e798119195", + "sha256:3451a18af56eb324b438721107922bead16a6427935a7f33cdf66423f7579b39", + "sha256:34f88cff35a18b7b74579ab08272fdf0a4ef92fcd119fedda010d0e234339bcc", + "sha256:36e26dbfcee621001a6abeabc9e24a38c347f63c630d20557d98de427305ac0b", + "sha256:37cb6b97e577fb4079a3b37ae6037ceb16ea6f267b0d94a1aaddb15e07217390", + "sha256:39da0fb5f29bae4158052c4515d38d0c1636dac484d2fd1a621ff76d206d217d", + "sha256:3b51280e4721f761d753da5b8c1c66db60b52f1ac239f808049bdc3676bb49a1", + "sha256:40276a7aec8f1c3e8f9363d58ce8e6272e8c8bb6253cb9a602aa8023e359c977", + "sha256:423a64f75d4a9dd619054eb0574b94feb93a5fc9dc3173e97e3d469a12e979a2", + "sha256:4bed27b58c97ceb8dcdba6506ba266f39d67736ee5ab33ad19573d983b4969d3", + "sha256:514bbd814696a39579cfda789ac830b7e1ab6e3409dcc06aab7a161ca0a81000", + "sha256:557c23250afa4a1432fecd14818d3ee1e46d9b229c292b6214083789bdfb135e", + "sha256:5756c58005a2773cd692beaa9ad31a2f15781a1ffd1cd6346bbce7072bd1b280", + "sha256:579985e10c39df85246d8386484abf3315cb3802a0e1fde09923ac1f8810f5bc", + "sha256:5fb48c8cb7b24a1f4122de052a482bec46e58626cf3f1fd0ca0accbd9fd97d3c", + "sha256:5feec0be4b56987c4c68be7d39f696177d714a70a35c93a68776a1dd6116d314", + "sha256:601f8a1ac81e2a4d830acd6d1d248b32e9e34a6d3dc0987f7b0af60c1427dc4b", + "sha256:6056d8c64a3863327859b5999eb8e83b7ef591db276148c0724da33e83659c18", + "sha256:607f5fbb92132e61959904c25a88f381be4559b566e03243ce5f71332f40e14b", + "sha256:65a7a4efc2a937af2b00f8d47812b4b665ce7a1e5bf91c9741166c5804f6ff2b", + "sha256:6639f549083a17a902fa51116882962708f2e44180cebd0d311548383fbfa616", + "sha256:66ca52ffdfd19e16f2a05b3761a013337b2d937385be52ebbeec6906dc68b316", + "sha256:6d1d55d29fdb8721b6d590cd5167c2d78d94ee0020e3bd2887cefeae90b4f3b5", + "sha256:6e61235c0f24cb2c4ee8d9d57efea80c412e9f12627704c2924e8f8097ddc2f5", + "sha256:7066220730be2da6b5e85a5a12b60728fab3eee79265de7f65effbdcc3af17a3", + "sha256:71fe5094f89c1b9147eae3662e6b92dae845a583e06e603bc4d79f9cc3f20693", + "sha256:747d0e9e3200cb883f2f8c2a8a7b7ec150e5f84e966c921d50e5194b8db81594", + "sha256:7b72ed5aaa1f4160d9ebed48013194b92baf3a14dfa22b2fd113b17c976c34d5", + "sha256:7bb2e761ce3692e54a2c61b8e57f0abdd970a653114ca5c3a12acae4f167199d", + "sha256:7c74fc0fab0d903f4736972f64e0f277f632e9766d4558911fd46abfe955e231", + "sha256:7d9d4d83fbf75362d0986ee4305ec85eb06ed124e299d38af5ed4eb20ed0cc74", + "sha256:7f87be4eff3f1e6821ce0ae085126aba46b77895d6aaa3a5bf2c6157fd121923", + "sha256:88aba8ef44162c96083690952e6ddde1b044957125ac67e3b92a87fd72407eff", + "sha256:88d2bbcbdb149101f0f211aa870ce18dfb563f62f10eecf834101c8b9cbcd145", + "sha256:88db9078be359ccdea973c99ab88a0312012d40fe2878ff106dfe3fe918bf5b2", + "sha256:8aa82f946aebf69b38f0537fb51577284d0caa351ce096a0401ed27129ae9b3c", + "sha256:9794c6b1ff04d8d6d1764e7490b34fc5a3435583672ca5466f39fa3640dafe54", + "sha256:98c4613061269dd0c201441e31d83bbf36493fe1482648f31fd62628346af1e7", + "sha256:9c6cc4f3d4d237184030ffd3721a8f59fde97f5f1cdab1547d2bb0b093250427", + "sha256:9dd0faae92a299f0b960d46aef675df2c118e26299ae9ebac4ec7051fa227c35", + "sha256:9f5d30e46bd8a01b646825a2157a4cb1d98c8eb01ffe80ac379ed791ca639687", + "sha256:a35be731dc0889c2689c66c05023390e026bdbbfdb47da214d99bd1e1c25f8bb", + "sha256:a54d437f3bd120f0d2971ea990e665d3487e252f2453618fd98196404a04f90b", + "sha256:a86b2ddd8e1671f24111fbcfb1db7fd2b6bf4cf6ad7966c370e3bc5342a51977", + "sha256:aaa3ddabe69cd09c7d2cc5b06ff428125ecb47a04d3ac1941ff86017b87f4063", + "sha256:ad37a22911f1e87b53b236efd02dcf17c23dd7de87b0f079e971a14d33c0866c", + "sha256:af00e2a680e89ceb8cf41d221a4d639be4c4212a2c7ab933155b727fd3dacbac", + "sha256:b02dfe24a1c4b2169e182d12a0b52516809fb608252dc384d437b99ef4b84de0", + "sha256:b6c7a988fe6b4310d045147966c5f82bb1493f3a2c8b1d9580e7c872ed80faaf", + "sha256:b75fbdb62ddeb6aecaebb9bc601ff75b36d2b69cc8e5841d75c375b96f02ea7a", + "sha256:b7fcc7a55a11ce4f2d588cb0b9746b8f3b753d080326e7b8395b3398ae0c0188", + "sha256:ba2de41d4946fb2ddde7af9b55b31fba0f8c6a26f15d7e281e59221337d6b37d", + "sha256:bc8c07c8ceea477e7a10d899eacb2c0cf4c59d595c9316a6b5c2063378d34f20", + "sha256:bec06ebc7d37beba62503c955d90580cfa1e5fff2b44f05cebecf2378b7f54b1", + "sha256:c3f3e88960a265116b8a972fc7ceb5b534b5a1730d581cd5fbedea90212f79de", + "sha256:c595c46f2fe39f235a463796c2ff80889a5d61c99db94235c8d2d7f654f04fa3", + "sha256:c725e40e881b8e35381a4d2667f4c3ad978929fb890c1822f8524e3d6846ad49", + "sha256:c90c141a4edd6ac99780b77abe7132d48d5e0fee7741ba2e217a53a503833441", + "sha256:ca2381a51ea8c1261c70ca33181c6557aacd8a06bea73d27dbef053243fe8ca7", + "sha256:cb063308aeb5f103f1c82526b02fbdb464a0b42f00ebf927dc9dd8b76b37bfda", + "sha256:cb843586cac2e0663804777ca5efa5d7b565bcd824da9b2ee1e98cfbd7d8382a", + "sha256:ce5707b2876e421080fdfb9d89752a1d111f57d8f3cddba57c24d93f17aa2074", + "sha256:d6802287d937f2cdb7ff8ca47c7994d4f8c06b7f0b67f138b8a3152de3c624cf", + "sha256:daa2010e0c1c1de21c0e6128571f609e690fcfcb174f75090b8863c16b3aa12c", + "sha256:db35002d92896783277c88d3aac6b9d33cdd65f2323dc786100a661723cf442f", + "sha256:e1adb17a5614d372d2b42b876542ba7a790e77cbbd674620aa920eaa27483165", + "sha256:e2ec53d084a147a6092ad748406310b3789ea252b3a007c8653c71cad9656d8d", + "sha256:e2fea0793376ab9aeb3258d1c192e0ceebd9b51a2f699379224d4f2ca473645d", + "sha256:e409f64962ab74da170fb9085ba17668c9e8da3efa6b4dc5e6084dca702954a1", + "sha256:e7bb595e9d9eeeef45d630766fd3d8c926a25b907631fc0f36411f5f576bb960", + "sha256:e852f812ea8323e269722653ba1bef6a9e5b9e496d5c8e52178b83d3ae435791", + "sha256:f1137d66f4f0670a21d8f146f7cce7282ca20dac8705b11c0bf0d9ac450ad206", + "sha256:f2f5e0cbbac4d158b68e2706a18c5494c0c72908f5d572f934ae6b440cf917cc", + "sha256:f3d028980542939c54e604488530c592fb172c6f48bc5262ba9ac205e8f5b5a7", + "sha256:fa57efb9974a3a36d3396212a43d7a8c68a4de616587cdb36ea2e1ff4164fe07", + "sha256:fb910f4d0791417dc983649145b6d18fd61fd7e7ca019635b79e30acf4daa1cd", + "sha256:fb91f22b639642dd2bac71ac40a7e8082470c9647db7003fdbe63e7ee9db851e", + "sha256:fdddba0689058f3faa5e7ffaaf039aac62dc528ec3e5f031a1e5a81392737237", + "sha256:fec6c5019a22848d092fcfc63cccee76b64ec7b1c7d5495b0b524c17327917ff" ], "markers": "python_version >= '3.7'", - "version": "==5.0.8" + "version": "==5.0.9" }, "jinja2": { "hashes": [ @@ -686,11 +488,11 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" ], "markers": "python_version >= '3.9'", - "version": "==2024.10.1" + "version": "==2025.4.1" }, "jwt": { "hashes": [ @@ -775,116 +577,6 @@ "markers": "python_version >= '3.8'", "version": "==3.1.3" }, - "multidict": { - "hashes": [ - "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", - "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", - "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", - "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", - "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", - "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", - "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", - "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", - "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", - "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", - "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", - "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", - "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", - "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", - "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", - "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", - "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", - "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", - "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", - "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", - "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", - "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", - "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", - "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", - "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", - "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", - "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", - "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", - "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", - "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", - "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", - "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", - "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", - "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", - "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", - "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", - "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", - "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", - "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", - "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", - "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", - "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", - "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", - "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", - "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", - "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", - "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", - "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", - "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", - "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", - "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", - "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", - "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", - "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", - "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", - "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", - "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", - "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", - "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", - "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", - "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", - "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", - "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", - "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", - "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", - "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", - "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", - "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", - "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", - "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", - "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", - "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", - "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", - "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", - "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", - "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", - "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", - "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", - "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", - "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", - "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", - "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", - "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", - "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", - "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", - "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", - "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", - "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", - "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", - "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", - "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", - "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", - "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", - "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", - "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", - "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", - "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", - "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", - "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", - "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", - "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", - "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", - "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", - "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" - ], - "markers": "python_version >= '3.9'", - "version": "==6.4.3" - }, "niquests": { "hashes": [ "sha256:68e0a7e9f338466b3606945fffd11f75e3c90af7498aa9336ef03812323b7e36", @@ -895,72 +587,72 @@ }, "numpy": { "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" + "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70", + "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", + "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", + "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c", + "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb", + "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f", + "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", + "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26", + "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", + "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b", + "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", + "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa", + "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", + "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610", + "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1", + "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906", + "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073", + "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", + "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88", + "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", + "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e", + "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", + "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda", + "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", + "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", + "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae", + "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d", + "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3", + "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57", + "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", + "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", + "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", + "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571", + "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54", + "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", + "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", + "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be", + "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8", + "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd", + "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe", + "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a", + "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", + "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b", + "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", + "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282", + "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169", + "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", + "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e", + "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", + "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7", + "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", + "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba", + "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc", + "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051", + "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175" ], "markers": "python_version >= '3.10'", - "version": "==2.2.4" + "version": "==2.2.5" }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pandas": { "hashes": [ @@ -1042,110 +734,6 @@ "index": "pypi", "version": "==0.23.2" }, - "propcache": { - "hashes": [ - "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", - "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", - "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf", - "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", - "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5", - "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c", - "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", - "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", - "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", - "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", - "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", - "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42", - "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035", - "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0", - "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e", - "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46", - "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", - "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", - "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", - "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", - "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", - "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", - "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", - "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833", - "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259", - "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136", - "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", - "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", - "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", - "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", - "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f", - "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", - "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", - "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", - "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566", - "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", - "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908", - "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf", - "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", - "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64", - "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", - "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71", - "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", - "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", - "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", - "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5", - "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894", - "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe", - "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", - "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", - "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", - "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", - "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641", - "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", - "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649", - "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", - "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd", - "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", - "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", - "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229", - "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", - "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", - "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", - "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", - "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", - "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294", - "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", - "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", - "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", - "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", - "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", - "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7", - "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", - "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", - "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", - "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", - "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7", - "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519", - "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", - "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180", - "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", - "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", - "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", - "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", - "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", - "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", - "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", - "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6", - "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c", - "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", - "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", - "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98", - "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", - "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", - "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", - "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", - "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", - "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5" - ], - "markers": "python_version >= '3.9'", - "version": "==0.3.1" - }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -1156,117 +744,117 @@ }, "pydantic": { "hashes": [ - "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", - "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" + "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", + "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==2.11.3" + "version": "==2.11.4" }, "pydantic-core": { "hashes": [ - "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672", - "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", - "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", - "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", - "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", - "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", - "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", - "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5", - "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", - "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", - "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", - "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", - "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", - "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", - "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", - "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", - "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", - "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", - "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", - "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", - "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", - "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", - "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", - "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", - "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", - "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", - "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5", - "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5", - "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", - "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", - "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", - "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", - "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33", - "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", - "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", - "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2", - "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb", - "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", - "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", - "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", - "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", - "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", - "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", - "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", - "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331", - "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396", - "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", - "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea", - "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b", - "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", - "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b", - "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", - "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", - "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", - "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", - "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", - "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", - "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", - "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", - "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599", - "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", - "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", - "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6", - "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d", - "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", - "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5", - "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd", - "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", - "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", - "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", - "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", - "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", - "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", - "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", - "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96", - "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", - "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", - "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824", - "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", - "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", - "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3", - "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568", - "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", - "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", - "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", - "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", - "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad", - "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", - "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", - "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", - "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", - "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", - "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", - "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", - "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", - "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", - "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", - "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", - "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091" + "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", + "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", + "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", + "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", + "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", + "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", + "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", + "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", + "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", + "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", + "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", + "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", + "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", + "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", + "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", + "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", + "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", + "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", + "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", + "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", + "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", + "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", + "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", + "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", + "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", + "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", + "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", + "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", + "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", + "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", + "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", + "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", + "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", + "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", + "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", + "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", + "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", + "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", + "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", + "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", + "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", + "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", + "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", + "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", + "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", + "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", + "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", + "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", + "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", + "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", + "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", + "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", + "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", + "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", + "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", + "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", + "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", + "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", + "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", + "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", + "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", + "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", + "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", + "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", + "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", + "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", + "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", + "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", + "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", + "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", + "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", + "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", + "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", + "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", + "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", + "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", + "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", + "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", + "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", + "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", + "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", + "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", + "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", + "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", + "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", + "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", + "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", + "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", + "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", + "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", + "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", + "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", + "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", + "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", + "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", + "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", + "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", + "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", + "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" ], "markers": "python_version >= '3.9'", - "version": "==2.33.1" + "version": "==2.33.2" }, "pyjwt": { "hashes": [ @@ -1370,104 +958,104 @@ }, "qh3": { "hashes": [ - "sha256:0125a69720b3a436fbf3ce1f5e4c7a8b48858360e037bfab19cd16465d9fe325", - "sha256:0561f53b5d3727d2306762ee9d03381763febf34bab2ced8490ad57c6facb025", - "sha256:0af6d7b5a02da5e53f2534c051e05f7a895c4842735d2d83e546962534fbfe7a", - "sha256:0b9d66f05d396b7ab49aabbd7ecfa8248e2be6afac49dda80cd5ddcc509a5183", - "sha256:121ddb3d5b98a4a91636b1609d5de5e3026dbe45b8c2036bce38be5827be2e49", - "sha256:1ec470854283a88364549019aa59eb0a97f3d394cee4df90a7279fd9ec11b8ff", - "sha256:1fac05a823b7d244a44b5f1e14c8afa45488e8b9bfc7bf4f3e7f7bbe82b3f7be", - "sha256:20b6f7423ce21649aefb0cc5085620c2a9fedcce5ae8c3d85fb65b0e8814706a", - "sha256:236e9fda8ebab9f8295a9161a02c387d21a9f08d87da1880ff26c983c84db073", - "sha256:23dd497adb4278680c25bcdaebadbe04e6b2a8922e6e9d61e2697452a1a762ac", - "sha256:266a000569966f44005a43002ac6bbadd82e48f9edab2c024a41210dc2f3e7c1", - "sha256:2759963b4c6882d935bdf0acbaeed7d3ad60ccdcf9445481ca9681f534d30907", - "sha256:2bae7c280599ee9c97406d165ede9a1f7a54a59d4770d0d4d951e85132adc192", - "sha256:30778f9028ed4dbff9d395e14b0665358446dd1c0797f8053eb71b6bdb7f7ed5", - "sha256:334955044a5d9458521f054748d8fa6830d3cea4c5af8803846d1211536375f1", - "sha256:390ee1a67c377cdb3b97e4d12da1898fd2d0355fa56296df980e8a559a943182", - "sha256:393a3a63c6b6ea92663ed6009d9fd317d03dd5054e68f43428eb4f683ef1bd64", - "sha256:3cb8ea722dc62e953437163a2d28251b9588210e96e629847e66b845bc28ca9d", - "sha256:3cc67e18046d274b38a77331b776d07087e1f96ee31525a977798fa975a653ed", - "sha256:3d2ebe0176e82104aa19bf25b4cdb9630bb5e3d7cb7771d18a474d34927f39e9", - "sha256:40bb818fbaa01cdfcbe9db4bc1deb43ecd5461d2a124af2ceeb2adf4ddfff605", - "sha256:446a4f6adfb41aa769083417e9eaed89f5af5b60051a4ffab4aa78aecd966f3a", - "sha256:446d288ce2c29c542f86ce13912c15a862571455c0bbb067ec2e7966ea90d55a", - "sha256:48e2cabaa621ae34cd98caaf1b114fb6ce893ef5d222189eff1edea285073519", - "sha256:4d9911d8684a5f45e4f18a744577386e60287cf18a0196dff88ffe9152410ba4", - "sha256:4e5bdb8ac8a6770fa6c4940bee92db6c1eebce51ef856a65038207dfb84013d9", - "sha256:50f8dd5b7423eb3c8cc74d0fd9b5df1214afe3bc9b86f9043d9721d5e722ea78", - "sha256:51a55d1a1b21c54ed67c65bf6f9a4e8aabb616579518062f4d7c0ea883fdfa34", - "sha256:537386ab886915d9a7abb5c7754aeef8e07ac04a23c5a3cc6a0a9a9f2c0fc6ec", - "sha256:55b9cdffa46ef9ad2478e5cd38bfc2d582da07a40a75dc4d02a44499409a983b", - "sha256:56a444ddc7b8ca670c81b333639a8a059b0eef34801ee528a4598b1e130b99c9", - "sha256:5d6eb5574be188181f8af56e2593daeca26c81d805752a5589039d7e1abb7e04", - "sha256:5dd7b2cc5169ac63e2e3b2ce913e5a8ff88da1f3658bbfdf1d0defef4e8f071e", - "sha256:5efca680dcce979355cd4f11b1270383869a21ac57b7b54a7074b2d0ad732acd", - "sha256:5f26bf8f7d3af25baae0e54523304d205f187643b60f1cb002356dbf81a6a6e8", - "sha256:62c1c38258ddb949f068cd1b5b19a6f33d3020d1864b5aafef7e5ddad04ed3ce", - "sha256:6d82486d855b03423b7ccb1c176b511a490568de3565b5632d139f092f7d6852", - "sha256:70c26db8495acd44adab970df902a5446566eb5e10265b6bceb417cae051a1d8", - "sha256:7172f94689f75f5bdf71656707af138b6429496ce6943839e2b275dadd270e7e", - "sha256:72d883bf3048375aaa6283a8c7dfa98764ec014466589408b66a7b520b5bd08b", - "sha256:7417e76526930a81db7dffe9b7178ca8d62f470aabe98264d131222404a77b11", - "sha256:799c20c623802eb9d74d0de7b698bc9822b8949d724728cfad3d787b3f076973", - "sha256:79ca66272b93ad9605e1f510a2f98660a2e5afce395d27ec877e41e6db718562", - "sha256:7af0facc1843e390752dbffa34975ed6ebfa0d614e87f2b21730b81e324524b6", - "sha256:7c7509a10cfb8d0b7f611c598c9a22154505b4cf653fab5900378807958db611", - "sha256:802ca75ed7c79c7e2bf7ce92c038006b8c458dccbd4922fac05044ae7e6db9fb", - "sha256:8688dfc27bfff0e0caaece83e9b1b29605a41fb582df924a9b5486cf19d667fb", - "sha256:8b70f085cbfd5685e4d923d451302934897a0c9e8707e1dd9c4955aaea254f87", - "sha256:8dd09a4559fc689a52b9712e4887fcf5f930633d14a463de05380bd01da27529", - "sha256:8e84916b4b1a7f397de0ff9870baff5a5b5b59841a55d3e3ae5759d3b490f653", - "sha256:91d6a93b5c370d014f87b50a28e6cda6b2391eb8e4c6129f431e0797b721d396", - "sha256:9c4d198f84d77931f2a20339f746d8e9f3d9f202b85c680797945efda2cdb122", - "sha256:a0ad122255a9600918af163d55c62d2df5364967faa29f1256bf46e6b565cd5b", - "sha256:a3cd011751106526fe7fd7dfebc6381ce360fc82a67a030eaa88f374d589570d", - "sha256:a4143112727ebfa554c6b484bc4b84344c68137af77159fca28360f52ee65880", - "sha256:a527160ccbb9dedb233aa477a59c33b15fd59516c5774657e2d5686296f18528", - "sha256:ab29da155e5d858b4f5d1f52726bbf183b737bf96b5dc35e45ce5bd7e8fcef41", - "sha256:acf34cd529a0499abc5eef651baf25f6eed42c35d878872bbfd07fbf7e9a85f6", - "sha256:b22c709f5774d9fe6b25c4369fe1e6e5c80c47fa97e5a782a0a82c781c45b580", - "sha256:b26c3de5a2cb48480e62ded0c46f58143791b57a2031b954e116a21f6a810a14", - "sha256:b46946d5f60bbc43ae31f267cf607443de63c33d8b3b516bc2c0ee34dbeadde9", - "sha256:b5104913760767bab5369f7fc283cdb8a6cdf3da38ef645af14411e4096456f3", - "sha256:b72d0b5b3e9d2aa3cf8cf689b2dce7eed401d8bd7e1adabd224d5ae41bb1c873", - "sha256:b811e388e48e386f7f35005c6f3cfa099ddf1eb35f0592dc6266dfb7e53e1760", - "sha256:cf1fef4feaba719974aa4421acbf373f83669b2c4c51747415076f40ff380de3", - "sha256:d1a21656bb7ff6150e8a6dd4eb6327221521b9942239e7ea7d62660185b1114a", - "sha256:d28a94ce57860103b2e2a1aae071fdd47c2c6b84ac88f18ef1eb4e47fb59f9cd", - "sha256:d482c8d92e137f7227aebe4f49c9add93cdb0ae032bf0a8a00bdda5157239483", - "sha256:d637c80cf19b2738413f2b694d3b3a69f0a2d68eb00489bb51b9dd8b78e8e8ee", - "sha256:d74018ef46ea1ec16b8561d1a3f7dd4c8628b6e3f63b80d364e8bbea0bae1de3", - "sha256:d7ac6781c945b05f06cb237ef99ef63b21f578e973dcda72b363931d5c4bf453", - "sha256:d7b35a5d79eb78ca2bb8490f4a3c6948dd5c6e9c8884241edb8597c0c4135fc4", - "sha256:d7e71a3e2d0116408d1f7a86b415014677fa4d6c3a873cf7344123abaf97792e", - "sha256:da5b5bdbfc2bfc2ed8af4dbd03a7dd1612acf64ca62ca1b4fca1292807bbedcd", - "sha256:dc0eee7abd896f0e8d483d7d129b1ff201bc6a358b2a6b6e41f95af41c62956d", - "sha256:df1866347cab2b97e427d61540342b58461797ca30a573a4ee19dd9ddd932fd8", - "sha256:e29c30106bccef52764ca5003be91001a28c132ff47a03caadc9ed33e66d5156", - "sha256:e44345527484f7cf0674788c78d44820bd499d04c42bff7984fd1f9bbf962964", - "sha256:e462cb1a4ba08cc17da3e7f6431d666518ef38b256322812a47272f8c4157e88", - "sha256:e4b607940929d9151c3d3bcce4d02cbebdc246a17afd16dfa32d2ae1ab1fdc01", - "sha256:e7f9ee153dd48804d0c3070c7c52f8863cf7e903ddecc5646a1e1798b2e41389", - "sha256:e948de73b71a35910aee9e62acbabf56c7ecba29da83e99f740bd37d36672d41", - "sha256:ea099fba44dc4ee54254fc9c9d9a51beea62f5d25266dc2b0eb3e1762505704e", - "sha256:ea238a5e3e140104917781c4cabaad42e26a2ddc973899f2d3af295c4cc9e061", - "sha256:ed5c9c36dc3a6ebf0981bd1e03cecebb4d51c58bce95485172666e3dcbc0973c", - "sha256:f2f119969e68bb7dc599c19768424894d65700ed2f35966fb5199a453a1086bb", - "sha256:f3082c67d6a7e3333e2232054831dbf64f2b18ae2df05fdcd76e483d306e7f01", - "sha256:f455446bd7425b17f3f6a6d915c784e83cf058259f58573db5413b7507acf586", - "sha256:f45d81e4e16cfce039788c0e44f8a5ad57fd6d303799a98866a3ad28bf9eeccf", - "sha256:f46929f9a4eae5f95fc8a2be1ed123c5e2f48621128ebdd296a77936328e59e7", - "sha256:f52d237553488dcf07f0a6297a5f3497ea3a616e996176840c4cb2c47765b9fd", - "sha256:f6e4d1f11e119673a0ae79ee749a93907d8e932cd3172d9885c4663511e6cdac", - "sha256:fc7d0b3ec1130eade130abf8434a319f86fe4a3d85861ab4b6fe08fc09b6497a", - "sha256:ff0a911de71092966df1abfa6a35180f703fe81e01dc317729132f89e22d6c46", - "sha256:ff222c695872ada25369a3ee4e3e3a0fb4ecfe4396aef3900789a0f128a24f16" + "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111", + "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46", + "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337", + "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41", + "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2", + "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846", + "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d", + "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff", + "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf", + "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075", + "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac", + "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e", + "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6", + "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4", + "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865", + "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff", + "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072", + "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52", + "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435", + "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735", + "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f", + "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517", + "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57", + "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244", + "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74", + "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976", + "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3", + "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36", + "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663", + "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956", + "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6", + "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca", + "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d", + "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b", + "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908", + "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147", + "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d", + "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590", + "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652", + "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c", + "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568", + "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2", + "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f", + "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b", + "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522", + "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70", + "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339", + "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163", + "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099", + "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20", + "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be", + "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a", + "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203", + "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85", + "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404", + "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede", + "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf", + "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972", + "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6", + "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d", + "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65", + "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435", + "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb", + "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97", + "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c", + "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34", + "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d", + "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df", + "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35", + "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2", + "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822", + "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1", + "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca", + "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d", + "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66", + "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4", + "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38", + "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88", + "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504", + "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4", + "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93", + "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e", + "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8", + "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58", + "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857", + "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a", + "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9", + "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70", + "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91", + "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416", + "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0", + "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f", + "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869", + "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943", + "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d" ], "markers": "python_version >= '3.7'", - "version": "==1.4.4" + "version": "==1.5.1" }, "referencing": { "hashes": [ @@ -1613,22 +1201,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, - "tinydb": { - "hashes": [ - "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", - "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3" - ], - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==4.8.2" - }, - "tuspy": { - "hashes": [ - "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89", - "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==1.1.0" - }, "typing-extensions": { "hashes": [ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", @@ -1663,11 +1235,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:2468dbd8902f5696070f6cef78bacdc9448c49f974e94917d49fc07c31c704af", - "sha256:e5cf749b7861d3006d9cead2ac742f0f9d8880022b62799689cb2c4134dede6f" + "sha256:642b235a89cbddb7a3c6703a11fd0255473231be791214fd01abd465371ea8fb", + "sha256:a4f2a94da920f62f4c957931d3a1cc364efdd0fbb984624db7ad7347aa27afad" ], "markers": "python_version >= '3.7'", - "version": "==2.12.917" + "version": "==2.12.920" }, "verlib2": { "hashes": [ @@ -1780,207 +1352,114 @@ ], "markers": "python_version >= '3.9'", "version": "==3.1.3" - }, - "yarl": { - "hashes": [ - "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", - "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", - "sha256:0626ee31edb23ac36bdffe607231de2cca055ad3a5e2dc5da587ef8bc6a321bc", - "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", - "sha256:0bae32f8ebd35c04d6528cedb4a26b8bf25339d3616b04613b97347f919b76d3", - "sha256:0df9f0221a78d858793f40cbea3915c29f969c11366646a92ca47e080a14f881", - "sha256:0e617d45d03c8dec0dfce6f51f3e1b8a31aa81aaf4a4d1442fdb232bcf0c6d8c", - "sha256:163ff326680de5f6d4966954cf9e3fe1bf980f5fee2255e46e89b8cf0f3418b5", - "sha256:1efbf4d03e6eddf5da27752e0b67a8e70599053436e9344d0969532baa99df53", - "sha256:217f69e60a14da4eed454a030ea8283f8fbd01a7d6d81e57efb865856822489b", - "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", - "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", - "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", - "sha256:30eaf4459df6e91f21b2999d1ee18f891bcd51e3cbe1de301b4858c84385895b", - "sha256:32ba32d0fa23893fd8ea8d05bdb05de6eb19d7f2106787024fd969f4ba5466cb", - "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", - "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", - "sha256:3b77173663e075d9e5a57e09d711e9da2f3266be729ecca0b8ae78190990d260", - "sha256:46ade37911b7c99ce28a959147cb28bffbd14cea9e7dd91021e06a8d2359a5aa", - "sha256:4815ec6d3d68a96557fa71bd36661b45ac773fb50e5cfa31a7e843edb098f060", - "sha256:528e86f5b1de0ad8dd758ddef4e0ed24f5d946d4a1cef80ffb2d4fca4e10f122", - "sha256:545575ecfcd465891b51546c2bcafdde0acd2c62c2097d8d71902050b20e4922", - "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", - "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", - "sha256:57711f1465c06fee8825b95c0b83e82991e6d9425f9a042c3c19070a70ac92bf", - "sha256:57abd66ca913f2cfbb51eb3dbbbac3648f1f6983f614a4446e0802e241441d2a", - "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", - "sha256:5864f539ce86b935053bfa18205fa08ce38e9a40ea4d51b19ce923345f0ed5db", - "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", - "sha256:5a70201dd1e0a4304849b6445a9891d7210604c27e67da59091d5412bc19e51c", - "sha256:5bc503e1c1fee1b86bcb58db67c032957a52cae39fe8ddd95441f414ffbab83e", - "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", - "sha256:66fc1c2926a73a2fb46e4b92e3a6c03904d9bc3a0b65e01cb7d2b84146a8bd3b", - "sha256:67a56b1acc7093451ea2de0687aa3bd4e58d6b4ef6cbeeaad137b45203deaade", - "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", - "sha256:6ba0931b559f1345df48a78521c31cfe356585670e8be22af84a33a39f7b9221", - "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", - "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", - "sha256:75460740005de5a912b19f657848aef419387426a40f581b1dc9fac0eb9addb5", - "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", - "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", - "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", - "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", - "sha256:7e4cb14a6ee5b6649ccf1c6d648b4da9220e8277d4d4380593c03cc08d8fe937", - "sha256:8015a076daf77823e7ebdcba474156587391dab4e70c732822960368c01251e6", - "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", - "sha256:8346ec72ada749a6b5d82bff7be72578eab056ad7ec38c04f668a685abde6af0", - "sha256:85ac908cd5a97bbd3048cca9f1bf37b932ea26c3885099444f34b0bf5d5e9fa6", - "sha256:8b3ade62678ee2c7c10dcd6be19045135e9badad53108f7d2ed14896ee396045", - "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", - "sha256:961c3e401ea7f13d02b8bb7cb0c709152a632a6e14cdc8119e9c6ee5596cd45d", - "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", - "sha256:9973ac95327f5d699eb620286c39365990b240031672b5c436a4cd00539596c5", - "sha256:9ba536b17ecf3c74a94239ec1137a3ad3caea8c0e4deb8c8d2ffe847d870a8c5", - "sha256:9fac2dd1c5ecb921359d9546bc23a6dcc18c6acd50c6d96f118188d68010f497", - "sha256:a251e00e445d2e9df7b827c9843c0b87f58a3254aaa3f162fb610747491fe00f", - "sha256:a39d7b807ab58e633ed760f80195cbd145b58ba265436af35f9080f1810dfe64", - "sha256:a5288adb7c59d0f54e4ad58d86fb06d4b26e08a59ed06d00a1aac978c0e32884", - "sha256:a626c4d9cca298d1be8625cff4b17004a9066330ac82d132bbda64a4c17c18d3", - "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", - "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", - "sha256:aad67c8f13a4b79990082f72ef09c078a77de2b39899aabf3960a48069704973", - "sha256:acf9b92c4245ac8b59bc7ec66a38d3dcb8d1f97fac934672529562bb824ecadb", - "sha256:ada882e26b16ee651ab6544ce956f2f4beaed38261238f67c2a96db748e17741", - "sha256:ae584afe81a1de4c1bb06672481050f0d001cad13163e3c019477409f638f9b7", - "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", - "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", - "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", - "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", - "sha256:c4228978fb59c6b10f60124ba8e311c26151e176df364e996f3f8ff8b93971b5", - "sha256:c515f7dd60ca724e4c62b34aeaa603188964abed2eb66bb8e220f7f104d5a187", - "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", - "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", - "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", - "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", - "sha256:d8717924cf0a825b62b1a96fc7d28aab7f55a81bf5338b8ef41d7a76ab9223e9", - "sha256:d995122dcaf180fd4830a9aa425abddab7c0246107c21ecca2fa085611fa7ce9", - "sha256:dff065a1a8ed051d7e641369ba1ad030d5a707afac54cf4ede7069b959898835", - "sha256:e4807aab1bdeab6ae6f296be46337a260ae4b1f3a8c2fcd373e236b4b2b46efd", - "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", - "sha256:e97d2f0a06b39e231e59ebab0e6eec45c7683b339e8262299ac952707bdf7688", - "sha256:ec2f56edaf476f70b5831bbd59700b53d9dd011b1f77cd4846b5ab5c5eafdb3f", - "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", - "sha256:f228f42f29cc87db67020f7d71624102b2c837686e55317b16e1d3ef2747a993", - "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", - "sha256:f9b92431d8b4d4ca5ccbfdbac95b05a3a6cd70cd73aa62f32f9627acfde7549c", - "sha256:fd4b5fbd7b9dde785cfeb486b8cca211a0b138d4f3a7da27db89a25b3c482e5c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.19.0" } }, "develop": { "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "coverage": { "hashes": [ @@ -2078,11 +1557,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pluggy": { "hashes": [ diff --git a/dbrepo-dashboard-service/app.py b/dbrepo-dashboard-service/app.py index fafca139f43f7763a3757a4a33c24c31a3456c0c..8e4fb0e8ccd9c8bc01c5c557f616f2b28e7afd55 100644 --- a/dbrepo-dashboard-service/app.py +++ b/dbrepo-dashboard-service/app.py @@ -29,17 +29,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "dashboard-service", "service_version": "1.8.2"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/dashboard/app.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) @@ -60,8 +75,8 @@ swagger_config = { "headers": [], "specs": [ { - "endpoint": "api-dashboard", - "route": "/api-dashboard.json", + "endpoint": "api-docs", + "route": "/api-docs.json", "rule_filter": lambda rule: True, "model_filter": lambda tag: True, # all in } @@ -191,7 +206,7 @@ def health(): @app.route("/api/dashboard", methods=["POST"], endpoint="create_dashboard") @metrics.gauge(name='dbrepo_create_dashboard', description='Time needed to create dashboard') -@swag_from("ds-yml/create_dashboard.yml") +@swag_from("/app/ds-yml/create_dashboard.yml") @auth.login_required(role=['system']) def create_dashboard(): for parameter in [param for param in ['is_public', 'is_schema_public', 'owner_username', 'database_name'] if @@ -220,14 +235,14 @@ def create_dashboard(): @app.route("/api/dashboard/<string:uid>", methods=["PUT"], endpoint="update_dashboard") @metrics.gauge(name='dbrepo_update_dashboard', description='Time needed to update dashboard') -@swag_from("ds-yml/update_dashboard.yml") +@swag_from("/app/ds-yml/update_dashboard.yml") @auth.login_required(role=['system']) def update_dashboard(uid: str): logging.debug(f'endpoint update dashboard, uid={uid}') try: database = Database.model_validate(request.json) except ValidationError as e: - logging.error(f'Model malformed: {e}') + logging.error(f'Model malformed: {str(e).strip()}') return Response(ApiError(status='BAD_REQUEST', message='Invalid database format', code='error.database.malformed').model_dump_json(), 400, headers) try: diff --git a/dbrepo-dashboard-service/init.Dockerfile b/dbrepo-dashboard-service/init.Dockerfile index 487e3e280e245e8f01a2a2caf0c8bf202765bc0c..a7f6beecd2cc19ca3ac47f99769f8c48f3be4a33 100644 --- a/dbrepo-dashboard-service/init.Dockerfile +++ b/dbrepo-dashboard-service/init.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine3.21 +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk add --no-cache \ @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/dashboard && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./init.py ./init.py diff --git a/dbrepo-dashboard-service/init.py b/dbrepo-dashboard-service/init.py index 54c01f55ebc063e0b97a4ce799ba4d529e1a5627..7c7a585b0a179a88bcd1a9334f1257ae0a64901b 100644 --- a/dbrepo-dashboard-service/init.py +++ b/dbrepo-dashboard-service/init.py @@ -18,17 +18,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "dashboard-service-init", "service_version": "1.8.2"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/dashboard/init.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz deleted file mode 100644 index e5f5e436784d54abbad74c606400f0029b49f9c0..0000000000000000000000000000000000000000 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz and /dev/null differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl similarity index 78% rename from dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl rename to dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl index 995dfd67a765f19bcd3b5ec867a799248cf1e0af..48beeb5ebf61c7cca654e0ee66343fac70bb4d53 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e3b65b6b93a602ee26c2f4d4c71c2d3cd331211 Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..86a1af2af41c44d35a4da7a472c180854f0cd82c Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c03ed275c6da5b2eef3619c59269f398d59c7de Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3.tar.gz differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..5a0dbc7c95592f2e70bed13fa33d85cc6cdf7811 Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1dbc78c989362d4d0c3750b1ad942abe46f205dd Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4.tar.gz differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..50bf1b8195987f6f8d23a36f34bc0f912b6fd9b3 Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..be8784437f111e2d4a5cdac36baf77605114dfa5 Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5.tar.gz differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..8e4c745a2ce782c174d5e1db7eef22d51d26624c Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..279243fd37fe033fe4aa740361b5e9a370516924 Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6.tar.gz differ diff --git a/dbrepo-dashboard-ui/Dockerfile b/dbrepo-dashboard-ui/Dockerfile deleted file mode 100644 index daf9ef46dd808a99eb6bb776945f014cdf6f9c8f..0000000000000000000000000000000000000000 --- a/dbrepo-dashboard-ui/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM docker.io/bitnami/grafana:11.5.3 AS runtime -LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" - -COPY --chown=grafana:grafana ./grafana.ini ./conf/grafana.ini -COPY --chown=grafana:grafana ./ldap.toml ./conf/ldap.toml -COPY --chown=grafana:grafana ./dashboards /app/dashboards -COPY --chown=grafana:grafana ./provisioning ./conf/provisioning diff --git a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json index 6ce787d4560b063971bff8255b63b96b055ca9b8..dc3d570df03df3c485aa9ed64caadaf2b1e75c03 100644 --- a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json +++ b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json @@ -18,7 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, - "id": 3, + "id": 4, "links": [ { "asDropdown": false, @@ -30,11 +30,12 @@ "title": "Docs", "tooltip": "", "type": "link", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/" } ], "panels": [ { + "collapsed": false, "gridPos": { "h": 1, "w": 24, @@ -42,6 +43,7 @@ "y": 0 }, "id": 34, + "panels": [], "title": "tl;dr", "type": "row" }, @@ -110,7 +112,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -180,7 +182,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -248,7 +250,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -316,7 +318,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -432,7 +434,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -478,7 +480,7 @@ }, "gridPos": { "h": 7, - "w": 8, + "w": 12, "x": 0, "y": 4 }, @@ -503,10 +505,12 @@ "values": false }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -524,6 +528,104 @@ "title": "Popular Data Sources", "type": "piechart" }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 4 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "SeaweedFS_s3_request_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{type}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "S3 Requests", + "type": "timeseries" + }, { "collapsed": false, "gridPos": { @@ -597,7 +699,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -679,7 +781,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -716,8 +818,16 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "green", + "value": 2 } ] }, @@ -749,7 +859,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -786,8 +896,12 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -819,7 +933,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -858,7 +972,7 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null } ] @@ -879,6 +993,7 @@ "graphMode": "none", "justifyMode": "auto", "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -890,7 +1005,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -957,6 +1072,12 @@ "id": 20, "options": { "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, @@ -973,7 +1094,7 @@ "sizing": "auto", "valueMode": "color" }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1012,6 +1133,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1070,10 +1192,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1113,7 +1237,7 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Quality of Service", + "description": "", "fieldConfig": { "defaults": { "mappings": [], @@ -1122,93 +1246,13 @@ "thresholds": { "mode": "absolute", "steps": [ - { - "color": "purple" - }, { "color": "red", - "value": 0 - }, - { - "color": "orange", - "value": 60 - }, - { - "color": "#EAB839", - "value": 80 + "value": null }, { "color": "green", - "value": 100 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 23 - }, - "id": 32, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.4.9", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_channels*100/rabbitmq_channel_consumers", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Services Running", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Broker Service QoS", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "description": "", - "fieldConfig": { - "defaults": { - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" + "value": 1 } ] }, @@ -1219,7 +1263,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 4, + "x": 0, "y": 23 }, "id": 29, @@ -1240,7 +1284,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1277,7 +1321,12 @@ "mode": "absolute", "steps": [ { - "color": "blue" + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -1288,7 +1337,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 8, + "x": 4, "y": 23 }, "id": 30, @@ -1309,7 +1358,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1346,7 +1395,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1369,7 +1419,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 12, + "x": 8, "y": 23 }, "id": 35, @@ -1390,7 +1440,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1427,7 +1477,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1450,7 +1501,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 16, + "x": 12, "y": 23 }, "id": 36, @@ -1471,7 +1522,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1508,7 +1559,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1531,7 +1583,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 20, + "x": 16, "y": 23 }, "id": 37, @@ -1552,7 +1604,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1592,6 +1644,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1622,7 +1675,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, @@ -1676,11 +1730,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1702,72 +1757,41 @@ "title": "Throughput", "type": "timeseries" }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 33 - }, - "id": 2, - "panels": [], - "title": "REST API", - "type": "row" - }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "thresholds" }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" + "mappings": [ + { + "options": { + "0": { + "index": 0, + "text": "DOWN" + }, + "1": { + "index": 1, + "text": "UP" + } + }, + "type": "value" } - }, - "mappings": [], + ], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green" + "color": "red", + "value": null }, { - "color": "red", - "value": 80 + "color": "green", + "value": 1 } ] } @@ -1777,23 +1801,35 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 34 + "x": 12, + "y": 26 }, - "id": 23, + "id": 16, "options": { + "displayMode": "basic", "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": true + "showLegend": false }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1801,63 +1837,89 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "code", - "expr": "process_open_fds\n", + "editorMode": "builder", + "expr": "up", "fullMetaSearch": false, + "hide": false, "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "process_open_fds", + "refId": "A", "useBackend": false } ], - "title": "File Descriptors", - "type": "timeseries" + "title": "Service QoS", + "type": "bargauge" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 2, + "panels": [], + "title": "REST API", + "type": "row" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "fillOpacity": 70, + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "0": { - "index": 0, - "text": "DOWN" - }, - "1": { - "index": 1, - "text": "UP" - } - }, - "type": "value" + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ], + }, + "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red" + "color": "green", + "value": null }, { - "color": "green", - "value": 1 + "color": "red", + "value": 80 } ] } @@ -1867,24 +1929,24 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, + "x": 0, "y": 34 }, - "id": 16, + "id": 23, "options": { - "colWidth": 0.9, "legend": { + "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, - "rowHeight": 0.9, - "showValue": "auto", "tooltip": { - "mode": "single", + "hideZeros": false, + "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1892,25 +1954,27 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "builder", - "expr": "up", + "editorMode": "code", + "expr": "process_open_fds\n", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "A", + "refId": "process_open_fds", "useBackend": false } ], - "title": "Service QoS", - "type": "status-history" + "title": "File Descriptors", + "type": "timeseries" }, { "datasource": { + "default": true, "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -1923,6 +1987,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -1953,11 +2018,12 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, - "unit": "none" + "unit": "decbytes" }, "overrides": [ { @@ -2025,10 +2091,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 41 + "x": 12, + "y": 34 }, - "id": 6, + "id": 7, "options": { "legend": { "calcs": [], @@ -2037,11 +2103,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -2050,27 +2117,25 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "process_cpu_usage", + "expr": "sum by(instance) (jvm_memory_used_bytes)", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": true, + "includeNullMetadata": false, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "process_cpu_usage", + "refId": "A", "useBackend": false } ], - "title": "CPU Usage", + "title": "JVM Memory Usage", "type": "timeseries" }, { "datasource": { - "default": true, "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -2083,6 +2148,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2113,11 +2179,12 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, - "unit": "decbytes" + "unit": "none" }, "overrides": [ { @@ -2185,10 +2252,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, + "x": 0, "y": 41 }, - "id": 7, + "id": 6, "options": { "legend": { "calcs": [], @@ -2197,11 +2264,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -2210,18 +2278,18 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "sum by(instance) (jvm_memory_used_bytes)", + "expr": "process_cpu_usage", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "A", + "refId": "process_cpu_usage", "useBackend": false } ], - "title": "JVM Memory Usage", + "title": "CPU Usage", "type": "timeseries" }, { @@ -2229,55 +2297,110 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Top 10 by frequency of access", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } }, "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, "unit": "reqps" }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 18, - "options": { - "displayLabels": [ - "percent" - ], - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "right", - "showLegend": false, - "values": [] - }, - "pieType": "pie", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "tooltip": { - "mode": "single", - "sort": "none" + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*search-service.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*analyse-service.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 41 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -2285,54 +2408,43 @@ "uid": "dbrepometrics0" }, "editorMode": "code", - "expr": "topk(10, rate(dbrepo_table_data_get_total[$__range]))", + "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{method}} {{instance}} ({{status}})", "range": true, "refId": "A" } ], - "title": "Popular Datasources", - "type": "piechart" + "title": "Failed API Requests", + "type": "timeseries" }, { "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "fixed" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "", + "axisLabel": "Count", "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 25, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, + "lineWidth": 1, "scaleDistribution": { "type": "linear" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, "thresholdsStyle": { "mode": "off" } @@ -2342,17 +2454,55 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] - }, - "unit": "reqps" + } }, "overrides": [ { "matcher": { - "id": "byRegexp", - "options": "/.*search-service.*/" + "id": "byFrameRefID", + "options": "200" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "200s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "300s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" }, "properties": [ { @@ -2361,34 +2511,368 @@ "fixedColor": "orange", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "400s" } ] }, { "matcher": { - "id": "byRegexp", - "options": "/.*analyse-service.*/" + "id": "byFrameRefID", + "options": "500" }, "properties": [ { "id": "color", "value": { - "fixedColor": "super-light-orange", + "fixedColor": "red", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "500s" } ] } ] }, "gridPos": { - "h": 7, + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 43, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "normal", + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=200 AND <300)", + "queryType": "lucene", + "refId": "200", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=300 AND <400)", + "queryType": "lucene", + "refId": "300", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=400 AND <500)", + "queryType": "lucene", + "refId": "400", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: >=500", + "queryType": "lucene", + "refId": "500", + "timeField": "@timestamp" + } + ], + "title": "HTTP Status Codes over Time", + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": {}, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "200" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "500" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 8, "w": 12, "x": 12, "y": 48 }, - "id": 19, + "id": 44, "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "status: >=400", + "queryType": "lucene", + "refId": "ERROR", + "timeField": "@timestamp" + } + ], + "title": "REST API Errors", + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 39, + "panels": [], + "title": "Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 41, + "options": { + "alertThreshold": true, "legend": { "calcs": [], "displayMode": "list", @@ -2396,30 +2880,155 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", - "instant": false, - "legendFormat": "{{method}} {{instance}} ({{status}})", - "range": true, + "expr": "sum(SeaweedFS_volumeServer_volumes) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_max_volumes)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" } ], - "title": "Failed API Requests", + "title": "Volume Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 42, + "options": { + "alertThreshold": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" + } + ], + "title": "Used Disk Space by Collection and Type", "type": "timeseries" } ], - "refresh": "1m", - "schemaVersion": 39, + "preload": false, + "refresh": "5m", + "schemaVersion": 40, "tags": [ "ui", "dashboard", @@ -2434,13 +3043,13 @@ "list": [] }, "time": { - "from": "now-1h", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "DBRepo", "uid": "bdz20owu8zn5se", - "version": 8, + "version": 1, "weekStart": "" } \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/keycloak.json b/dbrepo-dashboard-ui/dashboards/System/keycloak.json new file mode 100644 index 0000000000000000000000000000000000000000..aa5e2a8c572b6a5273bb9c89c908b3adff857dfa --- /dev/null +++ b/dbrepo-dashboard-ui/dashboards/System/keycloak.json @@ -0,0 +1,2393 @@ +{ + "__inputs": [], + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.2.0" + }, + { + "type": "panel", + "id": "grafana-piechart-panel", + "name": "Pie Chart", + "version": "1.6.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + }, + { + "datasource": "-- Grafana --", + "enable": true, + "iconColor": "rgba(0, 211, 255, 1)", + "iconSize": 0, + "lineColor": "", + "name": "Annotations & Alerts", + "query": "", + "showLine": false, + "tags": null, + "tagsField": "", + "textField": "", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 10441, + "graphTooltip": 1, + "id": null, + "iteration": 1624395370240, + "links": [], + "panels": [ + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})\n", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Current Memory HEAP", + "type": "gauge" + }, + "datasource": { + "default": true, + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory HEAP", + "type": "gauge" + }, + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 2, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 12, + "isNew": false, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 70, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_max)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "sum(jvm_memory_bytes_committed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Comitted", + "refId": "C" + }, + { + "expr": "sum(jvm_memory_bytes_used)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Used", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (realm)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per REALM", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "title": "Logins Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 7 + }, + "id": 44, + "interval": null, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "pluginVersion": "7.2.0", + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Registrations Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 12, + "x": 6, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (client_id)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Logins Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Under graph", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_registrations) by (client_id)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "timeFrom": null, + "title": "Registrations Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Registrations Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 6, + "y": 14 + }, + "hiddenSeries": false, + "id": 46, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (code)(increase(keycloak_response_errors_total[30m]))", + "interval": "", + "legendFormat": "{{code}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "4xx and 5xx Responses", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:98", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:99", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 1, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:160", + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "$$hashKey": "object:161", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 7, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{dbrepo }} {{error}}", + "refId": "A" + }, + { + "expr": "sum by (realm) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dialog-test\"} [30m]))", + "interval": "", + "legendFormat": "{{sum by dbrepo}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 18, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per CLIENT on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 21, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Sum by {{realm}}", + "refId": "A" + }, + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "{{error}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 33, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 19, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 22, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + }, + { + "expr": "sum by (realm)(increase(keycloak_registrations{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "Sum by {{realm}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per CLIENT on relm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 34, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 35, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"GET\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"GET\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 54 + }, + "hideTimeOverride": false, + "id": 39, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"GET\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"GET\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"GET\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 62 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 36, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"POST\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"POST\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 62 + }, + "hideTimeOverride": false, + "id": 40, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"POST\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"POST\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"POST\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 70 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 37, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"HEAD\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"HEAD\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 70 + }, + "hideTimeOverride": false, + "id": 41, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"HEAD\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"HEAD\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"HEAD\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 78 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 38, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"PUT\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"PUT\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 78 + }, + "hideTimeOverride": false, + "id": 42, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"PUT\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"PUT\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"PUT\" method was served in 100ms or below", + "type": "gauge" + } + ], + "refresh": "5m", + "schemaVersion": 26, + "style": "dark", + "tags": ["provisioned", "auth"], + "templating": { + "list": [ + { + "datasource": "prometheus", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Keycloak - Overview", + "uid": "keycloak-dashboard", + "version": 6, + "description": "Dashboard of Keycloak metrics exported with Keycloak Metrics SPI\r\n\r\nhttps://github.com/aerogear/keycloak-metrics-spi" +} \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/mariadb.json b/dbrepo-dashboard-ui/dashboards/System/mariadb.json new file mode 100644 index 0000000000000000000000000000000000000000..b6297de19c2dcd0c179c49a8c616ab2f230caf6b --- /dev/null +++ b/dbrepo-dashboard-ui/dashboards/System/mariadb.json @@ -0,0 +1,1377 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "mariadb galera cluster overview. metrics from mysqld exporter.", + "editable": true, + "gnetId": 13106, + "graphTooltip": 0, + "id": null, + "iteration": 1601970485064, + "links": [], + "panels": [ + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [ + { + "from": "", + "id": 0, + "text": "UP", + "to": "", + "type": 1, + "value": "1" + }, + { + "from": "", + "id": 1, + "text": "DOWN", + "to": "", + "type": 1, + "value": "0" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 0 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byType", + "options": "number" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "color-background" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + { + "id": "custom.width", + "value": 200 + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_up", + "format": "table", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Service Status", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "instance", + "Value" + ] + } + } + } + ], + "type": "table" + }, + { + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byType", + "options": "number" + }, + "properties": [ + { + "id": "unit", + "value": "s" + }, + { + "id": "custom.width", + "value": 200 + }, + { + "id": "custom.displayMode", + "value": "color-background" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 80 + } + ] + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 4, + "options": { + "showHeader": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_global_status_uptime", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Service Uptime", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "instance", + "Value" + ] + } + } + } + ], + "type": "table" + }, + { + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "max": 3, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 1.0001 + }, + { + "color": "green", + "value": 2.0001 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 5 + }, + "id": 6, + "options": { + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_global_status_wsrep_cluster_size", + "format": "time_series", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Cluster Size", + "transformations": [ + { + "id": "labelsToFields", + "options": { + "valueLabel": "instance" + } + } + ], + "type": "gauge" + }, + { + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 5 + }, + "id": 8, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_global_status_wsrep_cluster_status", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Cluster Status", + "transformations": [ + { + "id": "labelsToFields", + "options": { + "valueLabel": "instance" + } + } + ], + "transparent": true, + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 10 + }, + "hiddenSeries": false, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(mysql_global_status_queries[1m])", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Current QPS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 10 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "mysql_global_status_max_used_connections", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Current - {{ instance }}", + "refId": "A" + }, + { + "expr": "mysql_global_variables_max_connections", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mysql Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 17 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "write", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_innodb_data_reads[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "reads - {{ instance }}", + "refId": "A" + }, + { + "expr": "irate(mysql_global_status_innodb_data_writes[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "write - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "mysql disk reads vs writes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 17 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/sent/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_bytes_received[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "received - {{ instance }}", + "refId": "A" + }, + { + "expr": "irate(mysql_global_status_bytes_sent[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "sent - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "mysql network received vs sent", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 24 + }, + "hiddenSeries": false, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "topk(5, rate(mysql_global_status_commands_total[5m]))", + "interval": "", + "legendFormat": "Com_{{ command }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Top Command Counters", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "decimals": 2, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 32 + }, + "hiddenSeries": false, + "id": 20, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(mysql_global_status_opened_files[1m])", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL File Openings", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "decimals": 2, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 32 + }, + "hiddenSeries": false, + "id": 22, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "mysql_global_status_open_files", + "interval": "", + "legendFormat": "Open Files - {{ instance }}", + "refId": "A" + }, + { + "expr": "mysql_global_variables_open_files_limit", + "interval": "", + "legendFormat": "Open Files Limit - {{ instance }}", + "refId": "B" + }, + { + "expr": "mysql_global_status_innodb_num_open_files", + "interval": "", + "legendFormat": "InnoDB Open Files - {{ instance }}", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL Open Files", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "decimals": 1, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 40 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_slow_queries[1m])", + "interval": "", + "legendFormat": "Slow Queries on {{ instance }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL Slow Queries", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:94", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:95", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 40 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_aborted_connects[1m])", + "interval": "", + "legendFormat": "Aborted Connects (attempts) on - {{ instance }}", + "refId": "A" + }, + { + "expr": "irate(mysql_global_status_aborted_clients[1m])", + "interval": "", + "legendFormat": "Aborted Clients (timeout) on - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL Aborted Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:206", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:207", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "5m", + "schemaVersion": 26, + "style": "dark", + "tags": ["provisioned", "galera", "mariadb"], + "templating": { + "list": [ + { + "datasource": "prometheus", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "MariaDB Galera - Overview", + "uid": "pXgz0qFGk", + "version": 2 +} \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json b/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json index 6958b05e83f7e1437a024b70a37a75063b9848f8..fbaaf04ba0f7b32f7da9a10ac3edbafab23f273a 100644 --- a/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json +++ b/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json @@ -8053,10 +8053,10 @@ "type": "timeseries" } ], - "refresh": "15s", + "refresh": "24h", "schemaVersion": 34, "style": "dark", - "tags": ["rabbitmq", "amqp", "mqtt"], + "tags": ["provisioned", "rabbitmq"], "templating": { "list": [ { @@ -8133,7 +8133,7 @@ ] }, "time": { - "from": "now-15m", + "from": "now-3h", "to": "now" }, "timepicker": { @@ -8157,7 +8157,7 @@ ] }, "timezone": "", - "title": "Broker Service", + "title": "RabbitMQ - Overview", "uid": "Kn5xm-gZk", "version": 20220805, "weekStart": "", diff --git a/dbrepo-dashboard-ui/grafana.ini b/dbrepo-dashboard-ui/grafana.ini index f0d0539a1ec2644c9d6caa1adb9ef437a7dd0431..83dc5eb81ee8a490aa7690d5c6835a9a0200fe04 100644 --- a/dbrepo-dashboard-ui/grafana.ini +++ b/dbrepo-dashboard-ui/grafana.ini @@ -1,5 +1,12 @@ # order of config evaluation is grafana.ini < defaults.ini +[database] +type = postgres +host = dashboard-db:5432 +name = ${DASHBOARD_DB_NAME} +user = ${DASHBOARD_DB_USERNAME} +password = ${DASHBOARD_DB_PASSWORD} + [security] disable_initial_admin_creation = true diff --git a/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3b26f0a4746712c597b90799f5004aab23d31b51 --- /dev/null +++ b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml @@ -0,0 +1,14 @@ +apiVersion: 1 + +datasources: + - name: dbrepo-opensearch + uid: dbrepoopensearch0 + type: grafana-opensearch-datasource + basicAuth: false + url: http://search-db:9200 + jsonData: + flavor: "opensearch" + logLevelField: "level" + logMessageField: "message" + timeField: "@timestamp" + version: "2.19.0" diff --git a/dbrepo-data-db/metrics.cnf b/dbrepo-data-db/metrics.cnf new file mode 100644 index 0000000000000000000000000000000000000000..10dd32998a5aab20ed52756e1e1678c9cd281d27 --- /dev/null +++ b/dbrepo-data-db/metrics.cnf @@ -0,0 +1,3 @@ +[client] +user=readonly +password=readonly \ No newline at end of file diff --git a/dbrepo-data-service/.gitignore b/dbrepo-data-service/.gitignore index d39a47ee0fab72fbe4fd7f5ae968ff2f3bc3de78..3e5eeee0c8f132e1eae76cc90a3f0a418ef5f407 100644 --- a/dbrepo-data-service/.gitignore +++ b/dbrepo-data-service/.gitignore @@ -7,6 +7,9 @@ target/ ### Environment ### .env +### local repo ### +lib/at/ + ### Generated ### ready mapping.xml diff --git a/dbrepo-data-service/Dockerfile b/dbrepo-data-service/Dockerfile index 7468f1c568d033c86d60579ed2c35576bcaac736..32cdfc7d7a8b0f5b463012b22fe00591d7018f7f 100644 --- a/dbrepo-data-service/Dockerfile +++ b/dbrepo-data-service/Dockerfile @@ -1,38 +1,40 @@ ###### FIRST STAGE ###### -FROM dbrepo-core:build AS dependency -LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" - -###### SECOND STAGE ###### -FROM maven:3-amazoncorretto-17 AS build +FROM --platform=$BUILDPLATFORM maven:3-amazoncorretto-17 AS build LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" COPY ./pom.xml ./ RUN mvn -fn dependency:go-offline -COPY --from=dependency /root/.m2/repository/at/ac/tuwien/ifs/dbrepo /root/.m2/repository/at/ac/tuwien/ifs/dbrepo - +COPY ./lib ./lib COPY ./querystore ./querystore COPY ./report ./report COPY ./rest-service ./rest-service COPY ./services ./services # Make sure it compiles -RUN mvn -fn clean package -DskipTests +RUN mvn -q clean package -DskipTests -###### THIRD STAGE ###### -FROM amazoncorretto:17-alpine3.19 AS runtime +###### SECOND STAGE ###### +FROM --platform=$BUILDPLATFORM amazoncorretto:17-alpine3.21 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" -RUN apk add --no-cache curl bash jq +RUN apk --no-cache add \ + bash \ + curl \ + jq WORKDIR /app -RUN adduser -D dbrepo --uid 1001 +RUN mkdir -p /var/log/app/service/data && \ + chown -R 1001:1001 /var/log/app/service/data + +RUN adduser -D dbrepo --uid 1001 && \ + chown -R 1001:1001 /app USER 1001 -COPY --from=build --chown=1001 ./rest-service/target/rest-service-*.jar ./data-service.jar +COPY --from=build --chown=1001 ./rest-service/target/*service-*.jar ./data-service.jar # non-root port EXPOSE 8080 diff --git a/dbrepo-data-service/README.md b/dbrepo-data-service/README.md index 68c317174da2f9c5936f70f40f9d74ad7f7d4130..f15c7ff746b07a158bbddd6fc0c2fc4facb6f457 100644 --- a/dbrepo-data-service/README.md +++ b/dbrepo-data-service/README.md @@ -1,5 +1,14 @@ # Data Service +## Build + +Before testing, it is recommended to (re-)build the `MapStruct` mappers in case they were modified using the `package` +target: + +```shell +mvn clean package +``` + ## Test Run all unit and integration tests and create an HTML+TXT coverage report located in the `report` module: diff --git a/helm/dbrepo/hack/tls/.gitkeep b/dbrepo-data-service/lib/.gitkeep similarity index 100% rename from helm/dbrepo/hack/tls/.gitkeep rename to dbrepo-data-service/lib/.gitkeep diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 6f67e74b7043a9df43bd38d0a5a2bbd3cd4e1050..948ef796727fe72b26e26efbcd0c16b4ca13c2b7 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -13,10 +13,10 @@ <url>https://www.tuwien.ac.at</url> </organization> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> - <artifactId>dbrepo-data-service</artifactId> - <name>dbrepo-data-service</name> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>data-service</artifactId> + <name>data-service</name> + <version>1.8.2</version> <description>Service that manages the data</description> @@ -96,11 +96,7 @@ <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> + <version>1.8.2</version> </dependency> <!-- Spark --> <dependency> @@ -140,6 +136,13 @@ <artifactId>hadoop-aws</artifactId> <version>${hadoop.version}</version> </dependency> + <!-- Api --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> <!-- Data Source --> <dependency> <groupId>org.mariadb.jdbc</groupId> @@ -236,6 +239,13 @@ <artifactId>amqp-client</artifactId> <version>${rabbitmq.version}</version> </dependency> + <!-- Api --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> <!-- Testing --> <dependency> <groupId>org.springframework</groupId> @@ -330,6 +340,16 @@ </plugins> </build> + <repositories> + <repository> + <id>dbrepo-maven-repo</id> + <url>file:///${project.basedir}/lib</url> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <licenses> <license> <name>Apache-2.0</name> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index 5f58c03d52f654815cbe7f631f42e00c3ace2e42..a873911cb20e40c05d42739f803651f47a03d350 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> - <artifactId>dbrepo-data-service</artifactId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>data-service</artifactId> + <version>1.8.2</version> </parent> - <artifactId>dbrepo-data-service-querystore</artifactId> - <name>dbrepo-data-service-querystore</name> - <version>1.8.1</version> + <name>querystore</name> + <artifactId>querystore</artifactId> + <version>1.8.2</version> <dependencies/> diff --git a/dbrepo-data-service/querystore/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/querystore/Query.java b/dbrepo-data-service/querystore/src/main/java/at/ac/tuwien/ifs/dbrepo/querystore/Query.java similarity index 97% rename from dbrepo-data-service/querystore/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/querystore/Query.java rename to dbrepo-data-service/querystore/src/main/java/at/ac/tuwien/ifs/dbrepo/querystore/Query.java index 15b96d573982197526ba2ee18ccb8d2d75b43ea5..d6432a40a7b6ba6b252d07b9d6f81c18d2bc008f 100644 --- a/dbrepo-data-service/querystore/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/querystore/Query.java +++ b/dbrepo-data-service/querystore/src/main/java/at/ac/tuwien/ifs/dbrepo/querystore/Query.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.querystore; +package at.ac.tuwien.ifs.dbrepo.querystore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index 54eb9dae65f3ab60239db3f63c39e68ee49206d4..97bdf9f50c596c93ae5b13e9e66c248824c571f1 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -4,14 +4,15 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> - <artifactId>dbrepo-data-service</artifactId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>data-service</artifactId> + <version>1.8.2</version> </parent> + <name>report</name> <artifactId>report</artifactId> - <name>dbrepo-data-service-report</name> - <version>1.8.1</version> + <version>1.8.2</version> + <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules @@ -19,14 +20,14 @@ <dependencies> <dependency> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>rest-service</artifactId> - <version>${project.version}</version> + <version>1.8.2</version> </dependency> <dependency> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>${project.version}</version> + <version>1.8.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index a51ca9424440f89b6ff240832741e4fd4f7f9d23..5386a2bc5ea62f37645eefe340c0291527cc4590 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -4,20 +4,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> - <artifactId>dbrepo-data-service</artifactId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>data-service</artifactId> + <version>1.8.2</version> </parent> + <name>rest-service</name> <artifactId>rest-service</artifactId> - <name>dbrepo-data-service-rest-service</name> - <version>1.8.1</version> + <version>1.8.2</version> <dependencies> <dependency> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.8.1</version> + <version>1.8.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/DataServiceApplication.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java similarity index 89% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/DataServiceApplication.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java index 91a377e1f1a3e8b659091ddadffd9ff38e2d1427..1a1087f2a1c97b9577d7ebebaccc6135ab3b10a5 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/DataServiceApplication.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo; +package at.ac.tuwien.ifs.dbrepo; import lombok.extern.log4j.Log4j2; import org.springframework.boot.SpringApplication; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/SwaggerConfig.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SwaggerConfig.java similarity index 97% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/SwaggerConfig.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SwaggerConfig.java index 176f3449eebf415c01b0f7785e3e49c2cbbc5dcb..7c1ce104da5e022ce0cb788326799be997917079 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/SwaggerConfig.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SwaggerConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/AccessEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java similarity index 98% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/AccessEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java index 10961b435915fb531ed11c40e0956652a00140f5..70b3e59616d1e73244efe290abe633abcc7d9186 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/AccessEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java @@ -1,12 +1,12 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.database.CreateAccessDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.AccessService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.AccessService; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java similarity index 88% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/DatabaseEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java index 8ddaf80c102090af32254fc20ad8a9f8954d2084..34f42725c0f1e0f31afa345b2e359a31d288c202 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/DatabaseEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; @@ -7,11 +7,11 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MetadataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.AccessService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.ContainerService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; +import at.ac.tuwien.ifs.dbrepo.service.AccessService; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.ContainerService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -36,18 +36,18 @@ import java.util.UUID; @RequestMapping(path = "/api/database") public class DatabaseEndpoint extends RestEndpoint { + private final DataMapper dataMapper; private final CacheService cacheService; private final AccessService accessService; - private final MetadataMapper metadataMapper; private final DatabaseService databaseService; private final ContainerService containerService; @Autowired - public DatabaseEndpoint(CacheService cacheService, AccessService accessService, DatabaseService databaseService, - ContainerService containerService, MetadataMapper metadataMapper) { + public DatabaseEndpoint(DataMapper dataMapper, CacheService cacheService, AccessService accessService, + DatabaseService databaseService, ContainerService containerService) { + this.dataMapper = dataMapper; this.cacheService = cacheService; this.accessService = accessService; - this.metadataMapper = metadataMapper; this.databaseService = databaseService; this.containerService = containerService; } @@ -93,8 +93,8 @@ public class DatabaseEndpoint extends RestEndpoint { try { final DatabaseDto database = containerService.createDatabase(container, data); containerService.createQueryStore(container, data.getInternalName()); - accessService.create(database, metadataMapper.createDatabaseDtoToPrivilegedUserDto(data), AccessTypeDto.WRITE_ALL); - accessService.create(database, metadataMapper.createDatabaseDtoToReadonlyUserDto(data), AccessTypeDto.READ); + accessService.create(database, dataMapper.createDatabaseDtoToPrivilegedUserDto(data), AccessTypeDto.WRITE_ALL); + accessService.create(database, dataMapper.createDatabaseDtoToReadonlyUserDto(data), AccessTypeDto.READ); return ResponseEntity.status(HttpStatus.CREATED) .body(database); } catch (SQLException e) { diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/RestEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/RestEndpoint.java similarity index 98% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/RestEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/RestEndpoint.java index 778d38f30fed356bd0e96898e3d0020c5088505b..c8f1e8db6b1f4e132a4a3c4c9c3732aefa189721 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/RestEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/RestEndpoint.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDetailsDto; import org.apache.spark.sql.Dataset; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java similarity index 97% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/SubsetEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java index a66f6f22d9d26d3b24e9b5b3ddf8d126724924f6..bf48f8f25a248b16944cdd5009f1dfa292f942db 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/SubsetEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; @@ -9,13 +9,13 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryPersistDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.SubsetDto; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.SubsetService; -import at.ac.tuwien.ac.at.ifs.dbrepo.validation.EndpointValidator; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.service.StorageService; +import at.ac.tuwien.ifs.dbrepo.service.SubsetService; +import at.ac.tuwien.ifs.dbrepo.validation.EndpointValidator; import io.micrometer.observation.annotation.Observed; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.headers.Header; @@ -86,7 +86,7 @@ public class SubsetEndpoint extends RestEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Failed to find database in metadata database or query in query store of the data database", + description = "Failed to find database or user in metadata database or query in query store of the data database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -100,7 +100,7 @@ public class SubsetEndpoint extends RestEndpoint { @RequestParam(name = "persisted", required = false) Boolean filterPersisted, Principal principal) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, - QueryNotFoundException, NotAllowedException, MetadataServiceException { + QueryNotFoundException, NotAllowedException, MetadataServiceException, UserNotFoundException { log.debug("endpoint find subsets in database, databaseId={}, filterPersisted={}", databaseId, filterPersisted); final DatabaseDto database = cacheService.getDatabase(databaseId); if (!database.getIsPublic()) { diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java similarity index 99% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/TableEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java index ad401670f2043a7b9d745d60dc0bc8fad1761116..8ea36ff682ace6f66d1744662668b485f61cbc9a 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -9,10 +9,10 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.validation.EndpointValidator; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.*; +import at.ac.tuwien.ifs.dbrepo.validation.EndpointValidator; import io.micrometer.observation.annotation.Observed; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.headers.Header; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/UploadEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java similarity index 96% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/UploadEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java index 83e2b875d547b3df5b981d76f478d7505e2852e8..b7a88fc3f7c63116689dbbe26d4466ed43e0160b 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/UploadEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java @@ -1,10 +1,10 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.api.file.UploadResponseDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; +import at.ac.tuwien.ifs.dbrepo.service.StorageService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/ViewEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java similarity index 98% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/ViewEndpoint.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java index 09e971a205383bbc2c9f8f529c2fe269f6c69caf..b589d66a06fadd7543ca103217dca41085f6f0a9 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoints/ViewEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoints; +package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.CreateViewDto; @@ -8,9 +8,9 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableStatisticDto; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.validation.EndpointValidator; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.*; +import at.ac.tuwien.ifs.dbrepo.validation.EndpointValidator; import io.micrometer.observation.annotation.Observed; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.headers.Header; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/handlers/ApiExceptionHandler.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java similarity index 99% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/handlers/ApiExceptionHandler.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java index 012123f67142ddc16e22a1373bb72c04d052b45b..6aea3e878221c6766a76d8e1e245b54ac3e1a089 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/handlers/ApiExceptionHandler.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.handlers; +package at.ac.tuwien.ifs.dbrepo.handlers; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/validation/EndpointValidator.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java similarity index 96% rename from dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/validation/EndpointValidator.java rename to dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java index d505a8d36ec58cdab91dbaef07913a27dc3b38f3..009c3b0b3fe5ced4ee469a3d9512d4e92927d3ce 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/validation/EndpointValidator.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.validation; +package at.ac.tuwien.ifs.dbrepo.validation; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -6,9 +6,9 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.FilterDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.FilterTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.SubsetDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.RestEndpoint; +import at.ac.tuwien.ifs.dbrepo.endpoints.RestEndpoint; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index 41d23f4c7f6cdf97c8c6ebef2becd2f6d82cce8b..70ad1bde9ca32afd7106597922e5be6d3bee637e 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -48,11 +48,17 @@ server: tomcat: max-swallow-size: -1 logging: - pattern.console: "%d %highlight(%-5level) %msg%n" + file: + name: /var/log/app/service/data/app.log level: root: warn - at.ac.tuwien.ac.at.ifs.dbrepo.: "${LOG_LEVEL:info}" + at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug + pattern: + console: "%d %highlight(%-5level) %msg%n" + structured: + format: + file: ecs dbrepo: endpoints: metadataService: "${METADATA_SERVICE_ENDPOINT:http://metadata-service:8080}" diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java similarity index 99% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java index af4f12dc84bce16f9f13f50447206b258c4ff6d8..eed50bf5fb3995d322f7aea2c679cfa719e1ce22 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java similarity index 98% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java index 215d0aa146c248a7dde7dff8ecd13fd0f84e5ec3..6a6fbc7476b719be47fa0c17e49e82c65c623c0a 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariaDbContainerConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java similarity index 94% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java index 4068421d4fd9e1580b56c40ee5c0ac20672083db..eee4b27b4456a696680bb69b3dda49056f493707 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MariadbConfigTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java @@ -1,6 +1,6 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeAll; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java index 99d01e5db0ee8ecece70595f38dae2a9f66d5169..725814004440115e255b67d31ecfe977f80e42fd 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java @@ -1,19 +1,19 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoint; +package at.ac.tuwien.ifs.dbrepo.endpoint; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.AccessEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.AccessService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.endpoints.AccessEndpoint; +import at.ac.tuwien.ifs.dbrepo.service.AccessService; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithMockUser; @@ -32,10 +32,10 @@ public class AccessEndpointUnitTest extends BaseTest { @Autowired private AccessEndpoint accessEndpoint; - @MockBean + @MockitoBean private CacheService credentialService; - @MockBean + @MockitoBean private AccessService accessService; @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java similarity index 94% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java index 1ced03dff9e9dfc2cb3d0f6820a6947838e45dcd..431d88d72c651875e587aadf3737d95c59715acb 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java @@ -1,24 +1,24 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoint; +package at.ac.tuwien.ifs.dbrepo.endpoint; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.DatabaseEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.AccessService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.ContainerService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.endpoints.DatabaseEndpoint; +import at.ac.tuwien.ifs.dbrepo.service.AccessService; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.ContainerService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; @@ -37,16 +37,16 @@ public class DatabaseEndpointUnitTest extends BaseTest { @Autowired private DatabaseEndpoint databaseEndpoint; - @MockBean + @MockitoBean private ContainerService containerService; - @MockBean + @MockitoBean private AccessService accessService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService credentialService; @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java similarity index 95% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java index e6f5235539bb88e4b6018e301b9097ab74b95b36..8aa9327c8b8ba1a22d934a97543c769b11dfcca2 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoint; +package at.ac.tuwien.ifs.dbrepo.endpoint; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; @@ -6,12 +6,12 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryPersistDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.SubsetDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.SubsetEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.SubsetService; +import at.ac.tuwien.ifs.dbrepo.endpoints.SubsetEndpoint; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.service.StorageService; +import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.Dataset; @@ -21,11 +21,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; @@ -49,43 +49,47 @@ public class SubsetEndpointUnitTest extends BaseTest { @Autowired private SparkSession sparkSession; - @MockBean + @MockitoBean private SubsetService subsetService; - @MockBean + @MockitoBean private HttpServletRequest httpServletRequest; - @MockBean + @MockitoBean private StorageService storageService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService cacheService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; @Test @WithAnonymousUser public void list_publicDataPrivateSchemaAnonymous_succeeds() throws QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, SQLException, MetadataServiceException, - DatabaseUnavailableException, NotAllowedException { + DatabaseUnavailableException, NotAllowedException, UserNotFoundException { /* mock */ when(subsetService.findAll(DATABASE_3_PRIVILEGED_DTO, null)) .thenReturn(List.of(QUERY_3_DTO, QUERY_4_DTO, QUERY_5_DTO)); /* test */ - generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null); + final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null); + assertEquals(3, response.size()); + assertEquals(QUERY_3_DTO, response.get(0)); + assertEquals(QUERY_4_DTO, response.get(1)); + assertEquals(QUERY_5_DTO, response.get(2)); } @Test @WithMockUser(username = USER_3_USERNAME) public void list_publicDataPrivateSchema_succeeds() throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, SQLException, - MetadataServiceException { + MetadataServiceException, UserNotFoundException { /* mock */ when(cacheService.getAccess(DATABASE_3_ID, USER_3_ID)) @@ -96,6 +100,12 @@ public class SubsetEndpointUnitTest extends BaseTest { /* test */ final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, USER_3_PRINCIPAL); assertEquals(6, response.size()); + assertEquals(QUERY_1_DTO, response.get(0)); + assertEquals(QUERY_2_DTO, response.get(1)); + assertEquals(QUERY_3_DTO, response.get(2)); + assertEquals(QUERY_4_DTO, response.get(3)); + assertEquals(QUERY_5_DTO, response.get(4)); + assertEquals(QUERY_6_DTO, response.get(5)); } @Test @@ -111,7 +121,7 @@ public class SubsetEndpointUnitTest extends BaseTest { @Test @WithMockUser(username = USER_3_USERNAME) public void list_publicDataAndPrivateSchemaUnavailable_fails() throws SQLException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException { + DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, UserNotFoundException { /* mock */ when(cacheService.getDatabase(DATABASE_3_ID)) @@ -698,7 +708,7 @@ public class SubsetEndpointUnitTest extends BaseTest { protected List<QueryDto> generic_list(UUID databaseId, DatabaseDto database, Principal principal) throws NotAllowedException, DatabaseUnavailableException, QueryNotFoundException, DatabaseNotFoundException, - RemoteUnavailableException, MetadataServiceException { + RemoteUnavailableException, MetadataServiceException, UserNotFoundException { /* mock */ if (database != null) { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java similarity index 99% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/TableEndpointUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java index 74fa52e20e8fba16a0ba5ee994e66439d207fbca..70ef32af913b44111ae91a8c9b0eb98be1c84390 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoint; +package at.ac.tuwien.ifs.dbrepo.endpoint; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -8,12 +8,12 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.*; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.TableEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.SubsetService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.TableService; +import at.ac.tuwien.ifs.dbrepo.endpoints.TableEndpoint; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.service.SubsetService; +import at.ac.tuwien.ifs.dbrepo.service.TableService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.Dataset; @@ -26,7 +26,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; @@ -54,22 +54,22 @@ public class TableEndpointUnitTest extends BaseTest { @Autowired private SparkSession sparkSession; - @MockBean + @MockitoBean private HttpServletRequest httpServletRequest; - @MockBean + @MockitoBean private TableService tableService; - @MockBean + @MockitoBean private SubsetService subsetService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService credentialService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; public static Stream<Arguments> size_arguments() { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java index e8e1f2f461c13a6392916fc3c68e11d3aa6aac8a..5660e073f0f71a9928330130a738af0899e97f03 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java @@ -1,14 +1,14 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.endpoint; +package at.ac.tuwien.ifs.dbrepo.endpoint; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.ViewEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.SubsetService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.ViewService; +import at.ac.tuwien.ifs.dbrepo.endpoints.ViewEndpoint; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.service.SubsetService; +import at.ac.tuwien.ifs.dbrepo.service.ViewService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.Dataset; @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithAnonymousUser; @@ -38,19 +38,19 @@ import static org.mockito.Mockito.*; @ExtendWith(SpringExtension.class) public class ViewEndpointUnitTest extends BaseTest { - @MockBean + @MockitoBean private ViewService viewService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService credentialService; - @MockBean + @MockitoBean private HttpServletRequest httpServletRequest; - @MockBean + @MockitoBean private SubsetService subsetService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/InterceptorUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java similarity index 91% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/InterceptorUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java index fefc38887a4e288fd32ea6d136f2ce5595c334a2..f36754f0b2460dfc8666c07351a7e88790ca7d61 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/InterceptorUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.gateway; +package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; @@ -22,7 +22,7 @@ import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) public class InterceptorUnitTest extends BaseTest { - @MockBean + @MockitoBean @Qualifier("keycloakRestTemplate") private RestTemplate restTemplate; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java similarity index 99% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java index b7b8d29337088b950cf2c3e019b6573afa1f83ba..751c5248c1655dee2440521441a50d1bc9d50324 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.gateway; +package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -15,7 +15,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.*; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.web.client.HttpClientErrorException; @@ -35,7 +35,7 @@ import static org.mockito.Mockito.when; @ExtendWith(SpringExtension.class) public class MetadataServiceGatewayUnitTest extends BaseTest { - @MockBean + @MockitoBean @Qualifier("internalRestTemplate") private RestTemplate internalRestTemplate; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java similarity index 99% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java index a576c566d0919684b7d56c174774e6f4018d3dcb..ede6492560b8f0e76e3a329ef7561c6137d97cd7 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.handlers; +package at.ac.tuwien.ifs.dbrepo.handlers; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java similarity index 88% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java index a9eaa533fe339a990996496dca2449eff0f45609..c87cd5fd49066b15b326b7d4ddf8f0eda3ec6b17 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java @@ -1,13 +1,13 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.listener; +package at.ac.tuwien.ifs.dbrepo.listener; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.MetadataServiceException; import at.ac.tuwien.ifs.dbrepo.core.exception.RemoteUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -15,7 +15,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.core.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.test.annotation.DirtiesContext; @@ -28,7 +28,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import java.sql.SQLException; import java.util.HashMap; -import static at.ac.tuwien.ac.at.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; +import static at.ac.tuwien.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; @@ -40,7 +40,7 @@ import static org.mockito.Mockito.when; @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class DefaultListenerIntegrationTest extends BaseTest { - @MockBean + @MockitoBean private CacheService credentialService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListenerUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java similarity index 91% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListenerUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java index d65af08386063b438e6143f4ca727f22e2f6c412..72aba7246361b328fee630a1972bc53c431799e5 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListenerUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java @@ -1,14 +1,14 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.listener; +package at.ac.tuwien.ifs.dbrepo.listener; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.core.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -19,7 +19,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import java.util.HashMap; -import static at.ac.tuwien.ac.at.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; +import static at.ac.tuwien.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.doThrow; @@ -29,7 +29,7 @@ import static org.mockito.Mockito.doThrow; @Testcontainers public class DefaultListenerUnitTest { - @MockBean + @MockitoBean private CacheService credentialService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java index f7afcd67ea3794dc8773ce9aaf0030239358a095..b85c3935ff93d56d6eae8b4b86356f18d3b33394 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mapper; +package at.ac.tuwien.ifs.dbrepo.mapper; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java index 41cdce04d667f0d7aee1700022841af9ed9245f2..7d8c74437a1204dda49c7f18bdaba94ff668d01e 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mvc; +package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java similarity index 98% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java index 6c2e84044b27a87e2971e860abfb6c2c594d3793..102b50fe745bbe265b9e63d7a41a23008050b2ef 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java @@ -1,7 +1,7 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mvc; +package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.*; +import at.ac.tuwien.ifs.dbrepo.endpoints.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java similarity index 94% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java index 6f0e20b900fc3b4de0bd362eba9fbde0f41f8f0b..956e09e7d684ceb0dce1282a997f7c9dbf0641be 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java @@ -1,15 +1,15 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mvc; +package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.ImportDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryPersistDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TupleDeleteDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TupleDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TupleUpdateDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MetricsConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.SubsetEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.TableEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.endpoints.ViewEndpoint; -import at.ac.tuwien.ac.at.ifs.dbrepo.listener.DefaultListener; +import at.ac.tuwien.ifs.dbrepo.config.MetricsConfig; +import at.ac.tuwien.ifs.dbrepo.endpoints.SubsetEndpoint; +import at.ac.tuwien.ifs.dbrepo.endpoints.TableEndpoint; +import at.ac.tuwien.ifs.dbrepo.endpoints.ViewEndpoint; +import at.ac.tuwien.ifs.dbrepo.listener.DefaultListener; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import io.micrometer.observation.tck.TestObservationRegistry; import jakarta.servlet.http.HttpServletRequest; @@ -30,7 +30,7 @@ import org.springframework.test.web.servlet.MockMvc; import java.util.HashMap; import java.util.List; -import static at.ac.tuwien.ac.at.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; +import static at.ac.tuwien.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; import static io.micrometer.observation.tck.TestObservationRegistryAssert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java similarity index 90% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java index 42c53604853db64899793cb94da9b31ed4b6f83a..69d41cf983863859dd42a85c3380102776bd00f8 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java @@ -1,7 +1,7 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mvc; +package at.ac.tuwien.ifs.dbrepo.mvc; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.SubsetService; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.Test; @@ -10,7 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; @@ -27,10 +27,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureObservability public class SubsetEndpointMvcTest extends BaseTest { - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; - @MockBean + @MockitoBean private SubsetService subsetService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/AccessServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java similarity index 96% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/AccessServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java index 8f4e3af0341110380ac8f23ed6332c088277aad9..0834d8a34ce72be9e8dd2b22d8d49694fdf1d2ae 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/AccessServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java @@ -1,8 +1,8 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ContainerServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java similarity index 95% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ContainerServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java index 281002e157b5685bec2b16eabbbbcac6da2e8fcc..24f8be45f54d5ffc0a4e41f25e546fd8186e71e5 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ContainerServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java @@ -1,8 +1,8 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.QueryStoreCreateException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CredentialServiceUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java similarity index 98% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CredentialServiceUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java index 885a8f4de97c84e8ce513ea853a31fbaeaa1a5a5..4fcafa9e86525537d69186898a2ce4dfcfaa6d4e 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CredentialServiceUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -7,8 +7,8 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.impl.CacheServiceImpl; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.impl.CacheServiceImpl; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; @@ -16,7 +16,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; @@ -32,7 +32,7 @@ public class CredentialServiceUnitTest extends BaseTest { @Autowired private CacheServiceImpl credentialService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; @BeforeEach diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java similarity index 99% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java index b2648eda53086fb79d63cf65c47442b141a8adfd..db1b29a29e5a4c720969c35b7778c29df347ccfc 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; @@ -16,8 +16,8 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.unique.Unique import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/QueueServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java similarity index 89% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/QueueServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java index 3ffe3a88216c0ef71c0259a5340bf17de0dad004..594cb113ad0f897f58a62fe14e17779c802047ef 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/QueueServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java @@ -1,13 +1,13 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.MetadataServiceException; import at.ac.tuwien.ifs.dbrepo.core.exception.RemoteUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableNotFoundException; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.impl.QueueServiceRabbitMqImpl; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.impl.QueueServiceRabbitMqImpl; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeAll; @@ -16,7 +16,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.junit.jupiter.Container; @@ -37,7 +37,7 @@ public class QueueServiceIntegrationTest extends BaseTest { @Autowired private QueueServiceRabbitMqImpl queueService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; @Container diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java index 1ebd52e3b8fae44aaf84b21a1d4d576001431181..4f1c6efe40329961c213a463c1aa2fccb2168a33 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java @@ -1,6 +1,6 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; +import at.ac.tuwien.ifs.dbrepo.config.S3Config; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; @@ -28,11 +28,9 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MinIOContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; -import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import java.io.*; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java similarity index 93% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/SubsetServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java index 0e1f9c4f428a832d84a7d130e5c3c095ac630ca5..597d8812013f8899ce9ebf4a4d0734b1ede1894c 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/SubsetServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java @@ -1,11 +1,11 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.*; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.Dataset; @@ -18,7 +18,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.junit.jupiter.Container; @@ -44,7 +44,7 @@ public class SubsetServiceIntegrationTest extends BaseTest { @Autowired private SubsetService subsetService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; public static Stream<Arguments> create_arguments() { @@ -66,8 +66,9 @@ public class SubsetServiceIntegrationTest extends BaseTest { } @Test - public void findAll_succeeds() throws SQLException, QueryNotFoundException, RemoteUnavailableException, - MetadataServiceException, DatabaseNotFoundException, InterruptedException { + public void findAll_succeeds() throws SQLException, QueryNotFoundException, + RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException, + UserNotFoundException { /* test */ final List<QueryDto> response = findAll_generic(null); @@ -77,8 +78,9 @@ public class SubsetServiceIntegrationTest extends BaseTest { } @Test - public void findAll_onlyPersisted_succeeds() throws SQLException, QueryNotFoundException, - RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { + public void findAll_onlyPersisted_succeeds() throws SQLException, QueryNotFoundException, + RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException, + UserNotFoundException { /* test */ final List<QueryDto> response = findAll_generic(true); @@ -88,7 +90,8 @@ public class SubsetServiceIntegrationTest extends BaseTest { @Test public void findAll_onlyNonPersisted_succeeds() throws SQLException, QueryNotFoundException, - RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { + RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException, + UserNotFoundException { /* test */ final List<QueryDto> response = findAll_generic(false); @@ -303,7 +306,7 @@ public class SubsetServiceIntegrationTest extends BaseTest { protected List<QueryDto> findAll_generic(Boolean filterPersisted) throws SQLException, QueryNotFoundException, RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, - InterruptedException { + InterruptedException, UserNotFoundException { /* pre-condition */ Thread.sleep(1000) /* wait for test container some more */; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java similarity index 98% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/TableServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java index 2dc7fd8bcaf489e04f92a5d7be05083eaf1e7c88..8029dc3081fdb0187decf6028f18a5214448af0b 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java @@ -1,11 +1,11 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.ImportDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.*; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnStatisticDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.S3Config; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import com.google.common.io.Files; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java similarity index 89% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ViewServiceIntegrationTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java index 86152366f8ea417e2bba972ba83b67b891936021..55776ac7118544b10e7c090f8805dfc853d8cf89 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ViewServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java @@ -1,7 +1,7 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.ViewMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/FileUtils.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/FileUtils.java similarity index 84% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/FileUtils.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/FileUtils.java index e105d6839d03b21431ac651f00391ac8a9b55800..2642b56b96adbda28db3cf8c54f05667a8ab2679 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/FileUtils.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/FileUtils.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.utils; +package at.ac.tuwien.ifs.dbrepo.utils; import java.io.File; import java.io.IOException; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/MariaDbUtilTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/MariaDbUtilTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/MariaDbUtilTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/MariaDbUtilTest.java index 8a5dcd8ca75d3b4c772d1437f2105e55f7fd9fd8..6880f744d565e592b54baa99e7c1f41601e1edbf 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/MariaDbUtilTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/MariaDbUtilTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.utils; +package at.ac.tuwien.ifs.dbrepo.utils; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnTypeDto; import org.junit.jupiter.api.Test; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/RabbitMqUtils.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/RabbitMqUtils.java similarity index 92% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/RabbitMqUtils.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/RabbitMqUtils.java index f7a9b615c4723fbf36b366e1729886570734b1ac..a85d61b8b3e33c50674f990136541a668a8db724 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/RabbitMqUtils.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/RabbitMqUtils.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.utils; +package at.ac.tuwien.ifs.dbrepo.utils; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/validation/EndpointValidatorUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java similarity index 97% rename from dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/validation/EndpointValidatorUnitTest.java rename to dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java index fba1ee837d90c1f8840686145734c4033ee26455..f63c7618bc3b3583a8e69dfcd7cc8b5f01387185 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ac/at/ifs/dbrepo/validation/EndpointValidatorUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.validation; +package at.ac.tuwien.ifs.dbrepo.validation; import at.ac.tuwien.ifs.dbrepo.core.exception.PaginationException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; diff --git a/dbrepo-data-service/rest-service/src/test/resources/application.properties b/dbrepo-data-service/rest-service/src/test/resources/application.properties index 8f658cab55bae085a012cce3706c4908b964451d..5086a6175bbd3c73974bba6d99725bddc3fa7459 100644 --- a/dbrepo-data-service/rest-service/src/test/resources/application.properties +++ b/dbrepo-data-service/rest-service/src/test/resources/application.properties @@ -24,7 +24,7 @@ spring.sql.init.schema-locations=classpath*:init/schema.sql spring.jpa.hibernate.ddl-auto=create # log -logging.level.at.ac.tuwien.ac.at.ifs.dbrepo.=trace +logging.level.at.ac.tuwien.ifs.dbrepo.=trace # rabbitmq spring.rabbitmq.host=localhost diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index 8d8d0a8edbbe4762a9f303d60854e3970746af93..99f93df1faeff9721765963546b43848a8e3eda5 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -4,20 +4,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> - <artifactId>dbrepo-data-service</artifactId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>data-service</artifactId> + <version>1.8.2</version> </parent> + <name>services</name> <artifactId>services</artifactId> - <name>dbrepo-data-service-services</name> - <version>1.8.1</version> + <version>1.8.2</version> <dependencies> <dependency> - <groupId>at.ac.tuwien.ac.at.ifs.dbrepo</groupId> - <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>querystore</artifactId> + <version>1.8.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MetadataMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MetadataMapper.java deleted file mode 100644 index b5cd8286cd5b4f1560f83b391b4498b122d2c18f..0000000000000000000000000000000000000000 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MetadataMapper.java +++ /dev/null @@ -1,88 +0,0 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mapper; - -import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; -import at.ac.tuwien.ifs.dbrepo.core.api.container.image.ImageDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableBriefDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnDto; -import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; -import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierDto; -import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; -import at.ac.tuwien.ifs.dbrepo.core.api.user.UserBriefDto; -import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; -import org.keycloak.representations.AccessTokenResponse; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; - -import java.util.UUID; - -@Mapper(componentModel = "spring", imports = {DatabaseDto.class, ContainerDto.class, ImageDto.class}) -public interface MetadataMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MetadataMapper.class); - - ContainerDto containerDtoToContainerDto(ContainerDto data); - - @Mappings({ - @Mapping(target = "id", source = "userId"), - @Mapping(target = "username", source = "privilegedUsername"), - @Mapping(target = "password", source = "privilegedPassword"), - }) - UserDto createDatabaseDtoToPrivilegedUserDto(CreateDatabaseDto data); - - @Mappings({ - @Mapping(target = "username", source = "readonlyUsername"), - @Mapping(target = "password", source = "readonlyPassword"), - }) - UserDto createDatabaseDtoToReadonlyUserDto(CreateDatabaseDto data); - - DatabaseBriefDto databaseDtoToDatabaseBriefDto(DatabaseDto data); - - ColumnDto viewColumnDtoToColumnDto(ViewColumnDto data); - - ViewColumnDto columnDtoToViewColumnDto(ColumnDto data); - - TableDto tableDtoToTableDto(TableDto data); - - ViewDto viewDtoToViewDto(ViewDto data); - - ContainerDto ContainerDtoToContainerDto(ContainerDto data); - - UserDto userDtoToUserDto(UserDto data); - - @Mappings({ - @Mapping(target = "accessToken", source = "token") - }) - TokenDto accessTokenResponseToTokenDto(AccessTokenResponse data); - - UserBriefDto userDtoToUserBriefDto(UserDto data); - - TableBriefDto tableDtoToTableBriefDto(TableDto data); - - IdentifierBriefDto identifierDtoToIdentifierBriefDto(IdentifierDto data); - - default String metricToUri(String baseUrl, UUID databaseId, UUID tableId, UUID subsetId, UUID viewId) { - final StringBuilder uri = new StringBuilder(baseUrl) - .append("/database/") - .append(databaseId); - if (tableId != null) { - uri.append("/table/") - .append(tableId); - } else if (subsetId != null) { - uri.append("/subset/") - .append(subsetId); - } else if (viewId != null) { - uri.append("/view/") - .append(viewId); - } - log.trace("count uri: {}", uri); - return uri.toString(); - } - -} diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/AuthTokenFilter.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java similarity index 99% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/AuthTokenFilter.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java index 2073c384e8722066dfbf627f2dd3fdea16f96d48..1e748a391b887c52769dabfdf74eef5a992ac4fc 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/AuthTokenFilter.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.auth; +package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.auth.RealmAccessDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDetailsDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/BasicAuthenticationProvider.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java similarity index 93% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/BasicAuthenticationProvider.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java index b1811dfbf6618433506c770b3eef567f95819003..5ab64107cd4dc80be7b16a8db0db4815372cc3fc 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/BasicAuthenticationProvider.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java @@ -1,7 +1,7 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.auth; +package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CredentialService; +import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/InternalRequestInterceptor.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java similarity index 90% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/InternalRequestInterceptor.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java index 07cf01cc6f26e373f49fa735aa2f2aa99d719bd4..09076f95b993b17f2b53112d96ceb8bd6c4a5dae 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/auth/InternalRequestInterceptor.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java @@ -1,8 +1,8 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.auth; +package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.GatewayConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CredentialService; +import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; +import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/CacheConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/CacheConfig.java similarity index 97% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/CacheConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/CacheConfig.java index 0c8120565a57ce6e4ab06290a29a26f092245182..a40030b8b4dd89e82c5190f060ae970b03f39cb2 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/CacheConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/CacheConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/GatewayConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java similarity index 88% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/GatewayConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java index 09e9a249ffbac16a1b500830ccf1c12572a37cec..12bd674a50388badc118535f9192609adf95d130 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/GatewayConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java @@ -1,7 +1,7 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; -import at.ac.tuwien.ac.at.ifs.dbrepo.auth.InternalRequestInterceptor; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CredentialService; +import at.ac.tuwien.ifs.dbrepo.auth.InternalRequestInterceptor; +import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/JacksonConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java similarity index 95% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/JacksonConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java index b3e0c0a96630826b7d501a377b0c56fc204771c7..567d223eb31cedc2fb0445854e8da2509f212905 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/JacksonConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/KeycloakConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/KeycloakConfig.java similarity index 95% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/KeycloakConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/KeycloakConfig.java index 3d006a366568b5000bfd4a0de9555df3351390f8..36077309f8ae54654eef4d9fa66d272f42ff4a62 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/KeycloakConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/KeycloakConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; import org.keycloak.admin.client.Keycloak; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MetricsConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java similarity index 92% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MetricsConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java index 32774b8c16ff2c9866b63dfc0559134106fe008f..4be6cd10e66137817f4a0b4b91ec81a723886648 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/MetricsConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.aop.ObservedAspect; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/QueryConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java similarity index 94% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/QueryConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java index 3b5541d741a65fae1ca485f35be4acb225f09a98..eed47bdf467947c821b2c8ef0be0dfbd4fdbe385 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/QueryConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/RabbitConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java similarity index 95% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/RabbitConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java index 2ea4260c335dfb438dd44ce25c48f4c069c1116f..347aca691a734badc1fc9eb9bce86bbc29758bed 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/RabbitConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java @@ -1,6 +1,6 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; -import at.ac.tuwien.ac.at.ifs.dbrepo.listener.DefaultListener; +import at.ac.tuwien.ifs.dbrepo.listener.DefaultListener; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.springframework.amqp.rabbit.connection.ConnectionFactory; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java similarity index 96% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java index c9f8a5d49bc9efcf38b2314a50c4b0540f083d47..e9d1aa41a966c9d907007d7228c6ac72e81f67b6 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/S3Config.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/SparkConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java similarity index 97% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/SparkConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java index 223df5b1c063312642f8b0dc20247d7863f87dbb..fe9421f2d0746087375e5568f81258b20500a52b 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/SparkConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; import lombok.extern.log4j.Log4j2; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/WebSecurityConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/WebSecurityConfig.java similarity index 94% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/WebSecurityConfig.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/WebSecurityConfig.java index a834ed2d8081dfd3ebcdb69e6dcec3eb57790f04..432326ff78619f58773e06b720c3f24fd9b8a6e5 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/config/WebSecurityConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/WebSecurityConfig.java @@ -1,8 +1,8 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.config; +package at.ac.tuwien.ifs.dbrepo.config; -import at.ac.tuwien.ac.at.ifs.dbrepo.auth.AuthTokenFilter; -import at.ac.tuwien.ac.at.ifs.dbrepo.auth.BasicAuthenticationProvider; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CredentialService; +import at.ac.tuwien.ifs.dbrepo.auth.AuthTokenFilter; +import at.ac.tuwien.ifs.dbrepo.auth.BasicAuthenticationProvider; +import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; import io.swagger.v3.oas.annotations.security.SecurityScheme; import jakarta.servlet.http.HttpServletResponse; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/KeycloakGateway.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGateway.java similarity index 85% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/KeycloakGateway.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGateway.java index 0577b6a5a9be291e2b723d3b735c9d496b2ccbc2..3d46ddfd9103906023fa4adcb72d72017fd3a7a5 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/KeycloakGateway.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGateway.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.gateway; +package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import org.springframework.security.authentication.BadCredentialsException; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/MetadataServiceGateway.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGateway.java similarity index 99% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/MetadataServiceGateway.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGateway.java index 01634718c749778a65f046066e5cb8d1ac879a7a..c2f901c3cb25d5a923748e9109a2fc6075a45075 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/MetadataServiceGateway.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGateway.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.gateway; +package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java similarity index 77% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java index e3a439a3765d11b6c9b3080e15608bd55622d4ae..b5b623551137187b33b28e1157f6b6463229db0f 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java @@ -1,9 +1,9 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.gateway.impl; +package at.ac.tuwien.ifs.dbrepo.gateway.impl; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.KeycloakConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.KeycloakGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MetadataMapper; +import at.ac.tuwien.ifs.dbrepo.config.KeycloakConfig; +import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; import jakarta.ws.rs.NotAuthorizedException; import lombok.extern.log4j.Log4j2; import org.keycloak.OAuth2Constants; @@ -17,13 +17,13 @@ import org.springframework.stereotype.Service; @Service public class KeycloakGatewayImpl implements KeycloakGateway { + private final DataMapper dataMapper; private final KeycloakConfig keycloakConfig; - private final MetadataMapper metadataMapper; @Autowired - public KeycloakGatewayImpl(KeycloakConfig keycloakConfig, MetadataMapper metadataMapper) { + public KeycloakGatewayImpl(DataMapper dataMapper, KeycloakConfig keycloakConfig) { + this.dataMapper = dataMapper; this.keycloakConfig = keycloakConfig; - this.metadataMapper = metadataMapper; } @Override @@ -40,7 +40,7 @@ public class KeycloakGatewayImpl implements KeycloakGateway { .username(username) .password(password) .build()) { - return metadataMapper.accessTokenResponseToTokenDto(userKeycloak.tokenManager() + return dataMapper.accessTokenResponseToTokenDto(userKeycloak.tokenManager() .getAccessToken()); } catch (NotAuthorizedException e) { log.error("Failed to obtain user token: {}", e.getMessage()); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java similarity index 95% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java index 292b5bba4a023d4f21d43d043346dfeba4875add..7175151c109419f76d89f4f25c9a1a0912075d9e 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.gateway.impl; +package at.ac.tuwien.ifs.dbrepo.gateway.impl; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -8,9 +8,9 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.GatewayConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MetadataMapper; +import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -31,16 +31,16 @@ import java.util.UUID; @Service public class MetadataServiceGatewayImpl implements MetadataServiceGateway { - private final RestTemplate internalRestTemplate; + private final DataMapper dataMapper; private final GatewayConfig gatewayConfig; - private final MetadataMapper metadataMapper; + private final RestTemplate internalRestTemplate; @Autowired - public MetadataServiceGatewayImpl(@Qualifier("internalRestTemplate") RestTemplate internalRestTemplate, - GatewayConfig gatewayConfig, MetadataMapper metadataMapper) { - this.internalRestTemplate = internalRestTemplate; + public MetadataServiceGatewayImpl(DataMapper dataMapper, GatewayConfig gatewayConfig, + @Qualifier("internalRestTemplate") RestTemplate internalRestTemplate) { + this.dataMapper = dataMapper; this.gatewayConfig = gatewayConfig; - this.metadataMapper = metadataMapper; + this.internalRestTemplate = internalRestTemplate; } @Override @@ -74,7 +74,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find container with id {}: body is empty", containerId); throw new MetadataServiceException("Failed to find container with id " + containerId + ": body is empty"); } - final ContainerDto container = metadataMapper.containerDtoToContainerDto(response.getBody()); + final ContainerDto container = dataMapper.containerDtoToContainerDto(response.getBody()); container.setHost(response.getHeaders().get("X-Host").get(0)); container.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0))); container.setUsername(response.getHeaders().get("X-Username").get(0)); @@ -147,7 +147,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find table with id {}: body is empty", id); throw new MetadataServiceException("Failed to find table with id " + id + ": body is empty"); } - final TableDto table = metadataMapper.tableDtoToTableDto(response.getBody()); + final TableDto table = dataMapper.tableDtoToTableDto(response.getBody()); table.setLastRetrieved(Instant.now()); return table; } @@ -175,7 +175,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find view with id {}: body is empty", id); throw new MetadataServiceException("Failed to find view with id " + id + ": body is empty"); } - final ViewDto view = metadataMapper.viewDtoToViewDto(response.getBody()); + final ViewDto view = dataMapper.viewDtoToViewDto(response.getBody()); view.setLastRetrieved(Instant.now()); return view; } @@ -210,7 +210,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway { log.error("Failed to find user with id {}: body is empty", userId); throw new MetadataServiceException("Failed to find user with id " + userId + ": body is empty"); } - final UserDto user = metadataMapper.userDtoToUserDto(response.getBody()); + final UserDto user = dataMapper.userDtoToUserDto(response.getBody()); user.setUsername(response.getHeaders().get("X-Username").get(0)); user.setPassword(response.getHeaders().get("X-Password").get(0)); user.setLastRetrieved(Instant.now()); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListener.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java similarity index 95% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListener.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java index 59e34fbe65db283c936b84e64cf7d34b78c86fcd..436cadc3d3e63680b0953cf3633a54b60faa33b4 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/listener/DefaultListener.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.listener; +package at.ac.tuwien.ifs.dbrepo.listener; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; @@ -6,8 +6,8 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.MetadataServiceException; import at.ac.tuwien.ifs.dbrepo.core.exception.RemoteUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableNotFoundException; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.QueueService; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.QueueService; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.observation.annotation.Observed; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java similarity index 89% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/DataMapper.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java index 5408f338b2ea5b423bec09c7af2fd35e3e9831ee..065e8f140e76e1f793a831a907a1832be77deb6c 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java @@ -1,8 +1,11 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mapper; +package at.ac.tuwien.ifs.dbrepo.mapper; +import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.*; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.*; @@ -13,12 +16,19 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.foreign.Forei import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.foreign.ReferenceTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.primary.PrimaryKeyDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.unique.UniqueDto; +import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; +import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierDto; +import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserBriefDto; +import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.TableNotFoundException; import org.apache.hadoop.shaded.com.google.common.hash.Hashing; import org.apache.hadoop.shaded.org.apache.commons.io.FileUtils; import org.jetbrains.annotations.NotNull; +import org.keycloak.representations.AccessTokenResponse; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import java.io.File; import java.io.IOException; @@ -42,15 +52,64 @@ public interface DataMapper { DateTimeFormatter mariaDbFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.SSSSSS]") .withZone(ZoneId.of("UTC")); - /* redundant */ - ColumnBriefDto columnDtoToColumnBriefDto(ColumnDto data); + ContainerDto containerDtoToContainerDto(ContainerDto data); - /* redundant */ - TableBriefDto tableDtoToTableBriefDto(TableDto data); + @Mappings({ + @Mapping(target = "id", source = "userId"), + @Mapping(target = "username", source = "privilegedUsername"), + @Mapping(target = "password", source = "privilegedPassword"), + }) + UserDto createDatabaseDtoToPrivilegedUserDto(CreateDatabaseDto data); + + @Mappings({ + @Mapping(target = "username", source = "readonlyUsername"), + @Mapping(target = "password", source = "readonlyPassword"), + }) + UserDto createDatabaseDtoToReadonlyUserDto(CreateDatabaseDto data); + + DatabaseBriefDto databaseDtoToDatabaseBriefDto(DatabaseDto data); - /* redundant */ ColumnDto viewColumnDtoToColumnDto(ViewColumnDto data); + ViewColumnDto columnDtoToViewColumnDto(ColumnDto data); + + TableDto tableDtoToTableDto(TableDto data); + + ViewDto viewDtoToViewDto(ViewDto data); + + UserDto userDtoToUserDto(UserDto data); + + @Mappings({ + @Mapping(target = "accessToken", source = "token") + }) + TokenDto accessTokenResponseToTokenDto(AccessTokenResponse data); + + UserBriefDto userDtoToUserBriefDto(UserDto data); + + TableBriefDto tableDtoToTableBriefDto(TableDto data); + + IdentifierBriefDto identifierDtoToIdentifierBriefDto(IdentifierDto data); + + default String metricToUri(String baseUrl, UUID databaseId, UUID tableId, UUID subsetId, UUID viewId) { + final StringBuilder uri = new StringBuilder(baseUrl) + .append("/database/") + .append(databaseId); + if (tableId != null) { + uri.append("/table/") + .append(tableId); + } else if (subsetId != null) { + uri.append("/subset/") + .append(subsetId); + } else if (viewId != null) { + uri.append("/view/") + .append(viewId); + } + log.trace("count uri: {}", uri); + return uri.toString(); + } + + ColumnBriefDto columnDtoToColumnBriefDto(ColumnDto data); + ForeignKeyBriefDto foreignKeyDtoToForeignKeyBriefDto(ForeignKeyDto data); default String rabbitMqTupleToInsertOrUpdateQuery(String databaseName, TableDto table, Map<String, Object> data) { @@ -198,6 +257,7 @@ public interface DataMapper { final QueryDto subset = QueryDto.builder() .id(UUID.fromString(data.getString(1))) .query(data.getString(4)) + .queryNormalized(data.getString(4)) .queryHash(data.getString(5)) .resultHash(data.getString(6)) .resultNumber(data.getLong(7)) diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java similarity index 99% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MariaDbMapper.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java index 7895c902e70964fb6aee68927bd40a6b798e58a8..336c88cc8d794662da2935531efc0e5e9d284155 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.mapper; +package at.ac.tuwien.ifs.dbrepo.mapper; import at.ac.tuwien.ifs.dbrepo.core.api.container.image.OperatorDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; @@ -15,7 +15,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.CreateTableColumnDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.utils.MariaDbUtil; +import at.ac.tuwien.ifs.dbrepo.utils.MariaDbUtil; import org.jooq.*; import org.jooq.Record; import org.jooq.conf.ParamType; @@ -39,7 +39,7 @@ import java.util.stream.Collectors; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.name; -@Mapper(componentModel = "spring", uses = {MetadataMapper.class, DataMapper.class}) +@Mapper(componentModel = "spring", uses = {DataMapper.class, DataMapper.class}) public interface MariaDbMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MariaDbMapper.class); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/AccessService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/AccessService.java similarity index 97% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/AccessService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/AccessService.java index 18b821f86d15a0ba12ad1d7cbdac3568ef363405..966aafa6080861e4f88831c238a881d297245128 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/AccessService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/AccessService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CacheService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/CacheService.java similarity index 98% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CacheService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/CacheService.java index 3304ab8e1df25b69bb7d01d5cc434617753ac8d3..efe211491f13cad1c3d824a86b66e71672614e7b 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CacheService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/CacheService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -25,7 +25,7 @@ public interface CacheService { * @throws RemoteUnavailableException The remote service is not available. * @throws MetadataServiceException The remote service returned invalid data. */ - DatabaseDto getDatabase(UUID id, Boolean forceReload) throws DatabaseNotFoundException, RemoteUnavailableException, + DatabaseDto getDatabase(UUID id, boolean forceReload) throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException; /** diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ContainerService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/ContainerService.java similarity index 96% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ContainerService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/ContainerService.java index 4baf82c7d2bdc2839e20fb73a737ce0f454518b5..a38bc6688bc7680d71a6a10cb51c209a171d73e0 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ContainerService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/ContainerService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CredentialService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/CredentialService.java similarity index 90% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CredentialService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/CredentialService.java index b1da6ede1169a9ae26483c56a7e0c888f4c161eb..4a54849006fa031872af1b1aa43938036e3ac243 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/CredentialService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/CredentialService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/DatabaseService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseService.java similarity index 98% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/DatabaseService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseService.java index 3f9a8778aa4bc168270115b9f9e0ffaaedd5c8cd..6fc9e273df1c9a4d757ab73fced91a0e2378b6a7 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/DatabaseService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/QueueService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/QueueService.java similarity index 92% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/QueueService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/QueueService.java index dfeb996755a4b400338e131ad0b5613dc51df8f8..2a53210f314d3b826b7d336a759380bdecd47f51 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/QueueService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/QueueService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java similarity index 98% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java index 88a3fd4d2901e642ab7674988f3f776d687a30b1..19540194abbb08be71fe741e5d0b9586ec992e47 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/StorageService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/SubsetService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java similarity index 98% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/SubsetService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java index 7b85908a764908c095326abab61330a7f52f2920..a7ee9b1ca08d2c3389efad0d07f9959bfaa5fb7c 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/SubsetService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; @@ -63,7 +63,7 @@ public interface SubsetService { * @throws MetadataServiceException The Metadata Service responded unexpected. */ List<QueryDto> findAll(DatabaseDto database, Boolean filterPersisted) throws SQLException, - QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException; + QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException, UserNotFoundException; /** * Executes a subset query without saving it. diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/TableService.java similarity index 99% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/TableService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/TableService.java index 6cc72d52ec2605b3bcea73a0c5348bd2177048b2..f2b246eb8b457d5ec4f337e51cc0a5a8ec723ff3 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/TableService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/TableService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.ImportDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ViewService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/ViewService.java similarity index 96% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ViewService.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/ViewService.java index b2041019713b89a953405b5c8e4bcd3ccc4dc008..60bd5dd180c6f5d4f4f2a1c8332a328586c3078e 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/ViewService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/ViewService.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service; +package at.ac.tuwien.ifs.dbrepo.service; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java similarity index 86% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java index 4f1cc7ac6504efe64bfb1ed515cd55e9ccf15fe0..7e02560b78df6a481014433adde1b8952e7286af 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java @@ -1,11 +1,11 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.AccessService; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.AccessService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -42,22 +42,22 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseCreateUserQuery(user.getUsername(), user.getPassword())) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* grant access */ final String grants = access != AccessTypeDto.READ ? grantDefaultWrite : grantDefaultRead; start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants)) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* grant query store */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantProcedureQuery(user.getUsername(), "store_query")) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* apply access rights */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -81,7 +81,7 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants)) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* apply access rights */ connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()); connection.commit(); @@ -105,12 +105,12 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseRevokePrivilegesQuery(user.getUsername())) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* apply access rights */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/CacheServiceImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java similarity index 96% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/CacheServiceImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java index 44fbfa36f45b965fbb38384a10b9158365e3356b..1ad95511304912d1b4304e0bcbd1d94e1a162b87 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/CacheServiceImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; @@ -8,9 +8,9 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableStatisticDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.TableService; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.TableService; import com.github.benmanes.caffeine.cache.Cache; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -51,7 +51,7 @@ public class CacheServiceImpl implements CacheService { } @Override - public DatabaseDto getDatabase(UUID id, Boolean forceReload) throws DatabaseNotFoundException, RemoteUnavailableException, + public DatabaseDto getDatabase(UUID id, boolean forceReload) throws DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException { if (!forceReload) { final DatabaseDto cacheDatabase = databaseCache.getIfPresent(id); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java similarity index 85% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java index 8a61a05af51f4a1834bd384e0928933de510b75d..ad1719cb13f9263beb4315b65aec081439c55dd0 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; @@ -6,11 +6,12 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserBriefDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.QueryStoreCreateException; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.RabbitConfig; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.ContainerService; +import at.ac.tuwien.ifs.dbrepo.config.RabbitConfig; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.ContainerService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; +import org.apache.logging.log4j.message.MapMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -40,7 +41,7 @@ public class ContainerServiceMariaDbImpl extends DataConnector implements Contai final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseCreateDatabaseQuery(data.getInternalName())) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -73,19 +74,19 @@ public class ContainerServiceMariaDbImpl extends DataConnector implements Contai long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateTableRawQuery()) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateHashTableProcedureRawQuery()) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateStoreQueryProcedureRawQuery()) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateInternalStoreQueryProcedureRawQuery()) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/CredentialServiceImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java similarity index 89% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/CredentialServiceImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java index ed9420a984154b84c50cebbacdd704c8f2262ea5..9d708e28d87e963370920e2f1e2cdf2ea71049d1 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/CredentialServiceImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java @@ -1,9 +1,9 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; -import at.ac.tuwien.ac.at.ifs.dbrepo.auth.AuthTokenFilter; +import at.ac.tuwien.ifs.dbrepo.auth.AuthTokenFilter; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.KeycloakGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.CredentialService; +import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; +import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import com.github.benmanes.caffeine.cache.Cache; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/DataConnector.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java similarity index 94% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/DataConnector.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java index cb476e79ecfb4168c7565226b93d186ee6e32ebb..1100b0e7b98adf975e59c23e61ea4cd9e76ebf19 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/DataConnector.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; @@ -14,6 +14,8 @@ import java.sql.SQLException; @Service public abstract class DataConnector { + public static final String EXECUTED_STATEMENT_MS = "executed statement in {} ms"; + public ComboPooledDataSource getDataSource(ContainerDto container, String databaseName) { final ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setJdbcUrl(getJdbcUrl(container, databaseName)); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java similarity index 90% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java index f4a496b3861ea80e3180f2dbadb689b8a4a32897..5db0fd57136161caf87c6038f201102aafc8c294 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java @@ -1,9 +1,8 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.DataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MetadataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; @@ -31,14 +30,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas private final DataMapper dataMapper; private final MariaDbMapper mariaDbMapper; - private final MetadataMapper metadataMapper; @Autowired - public DatabaseServiceMariaDbImpl(DataMapper dataMapper, MariaDbMapper mariaDbMapper, - MetadataMapper metadataMapper) { + public DatabaseServiceMariaDbImpl(DataMapper dataMapper, MariaDbMapper mariaDbMapper) { this.dataMapper = dataMapper; this.mariaDbMapper = mariaDbMapper; - this.metadataMapper = metadataMapper; } @Override @@ -53,7 +49,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement1.setString(2, viewName); log.trace("1={}, 2={}", database.getInternalName(), viewName); final ResultSet resultSet1 = statement1.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); if (!resultSet1.next()) { throw new ViewNotFoundException("Failed to find view in the information schema"); } @@ -67,7 +63,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement2.setString(2, view.getInternalName()); log.trace("1={}, 2={}", database.getInternalName(), view.getInternalName()); final ResultSet resultSet2 = statement2.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); TableDto tmp = TableDto.builder() .columns(new LinkedList<>()) .build(); @@ -76,7 +72,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas } view.setColumns(tmp.getColumns() .stream() - .map(metadataMapper::columnDtoToViewColumnDto) + .map(dataMapper::columnDtoToViewColumnDto) .toList()); view.getColumns() .forEach(column -> column.setDatabaseId(database.getId())); @@ -99,7 +95,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateTableRawQuery(database.getInternalName(), data)) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -141,7 +137,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.viewCreateRawQuery(view.getInternalName(), query)) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* select view columns */ final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); statement2.setString(1, database.getInternalName()); @@ -175,7 +171,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement.setString(1, database.getInternalName()); final long start = System.currentTimeMillis(); final ResultSet resultSet1 = statement.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); while (resultSet1.next()) { final String viewName = resultSet1.getString(1); if (viewName.length() == 64) { @@ -212,7 +208,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseTablesSelectRawQuery()); statement.setString(1, database.getInternalName()); final ResultSet resultSet1 = statement.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); while (resultSet1.next()) { final String tableName = resultSet1.getString(1); if (database.getTables().stream().anyMatch(t -> t.getInternalName().equals(tableName))) { @@ -247,7 +243,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement1.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); TableDto table = dataMapper.schemaResultSetToTable(database, statement1.executeQuery()); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); /* obtain columns metadata */ start = System.currentTimeMillis(); final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); @@ -255,7 +251,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement2.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet2 = statement2.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); while (resultSet2.next()) { table = dataMapper.resultSetToTable(resultSet2, table); } @@ -266,7 +262,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement3.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet3 = statement3.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); while (resultSet3.next()) { final String clause = resultSet3.getString(1); table.getConstraints() @@ -281,11 +277,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement4.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet4 = statement4.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); while (resultSet4.next()) { table = dataMapper.resultSetToConstraint(resultSet4, table); for (UniqueDto uk : table.getConstraints().getUniques()) { - uk.setTable(metadataMapper.tableDtoToTableBriefDto(table)); + uk.setTable(dataMapper.tableDtoToTableBriefDto(table)); final TableDto tmpTable = table; uk.getColumns() .forEach(column -> { @@ -319,7 +315,7 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseSetPasswordQuery(data.getUsername(), data.getPassword())) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java similarity index 79% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java index e6ad806daa7ba53ab8a4816e7c7130e15d77f7eb..190863696306b1942036a85cf9f7c95847e2f745 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java @@ -1,11 +1,10 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnDto; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.DataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MetadataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.QueueService; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; +import at.ac.tuwien.ifs.dbrepo.service.QueueService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -22,12 +21,10 @@ import java.util.Optional; public class QueueServiceRabbitMqImpl extends DataConnector implements QueueService { private final DataMapper dataMapper; - private final MetadataMapper metadataMapper; @Autowired - public QueueServiceRabbitMqImpl(DataMapper dataMapper, MetadataMapper metadataMapper) { + public QueueServiceRabbitMqImpl(DataMapper dataMapper) { this.dataMapper = dataMapper; - this.metadataMapper = metadataMapper; } @Override @@ -38,7 +35,7 @@ public class QueueServiceRabbitMqImpl extends DataConnector implements QueueServ final int[] idx = new int[]{1}; final PreparedStatement preparedStatement = connection.prepareStatement( dataMapper.rabbitMqTupleToInsertOrUpdateQuery(database.getInternalName(), - metadataMapper.tableDtoToTableDto(table), data)); + dataMapper.tableDtoToTableDto(table), data)); for (Map.Entry<String, Object> entry : data.entrySet()) { final Optional<ColumnDto> optional = table.getColumns().stream().filter(c -> c.getInternalName().equals(entry.getKey())).findFirst(); if (optional.isEmpty()) { @@ -50,7 +47,7 @@ public class QueueServiceRabbitMqImpl extends DataConnector implements QueueServ } final long start = System.currentTimeMillis(); preparedStatement.executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); log.trace("successfully inserted tuple"); } finally { dataSource.close(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java similarity index 97% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java index 90bd2312d8e332fd1984d8199e1ef8cc0900177d..d29f5e2a2dc8c864402c4d0d66c4ab7de336461b 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/StorageServiceS3Impl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java @@ -1,7 +1,7 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; -import at.ac.tuwien.ac.at.ifs.dbrepo.config.S3Config; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; +import at.ac.tuwien.ifs.dbrepo.config.S3Config; +import at.ac.tuwien.ifs.dbrepo.service.StorageService; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; @@ -9,7 +9,6 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableMalformedException; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.RandomStringUtils; -import org.apache.james.mime4j.dom.datetime.DateTime; import org.apache.spark.sql.*; import org.apache.spark.sql.catalyst.ExtendedAnalysisException; import org.apache.spark.sql.types.StructField; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java similarity index 89% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java index d19e18e52a676dfa74d7d6c12f5f3fccb5bee5ad..a9e1a07213a728c8338b2f11574da7a257dbcbe7 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java @@ -1,16 +1,16 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.SubsetDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.DataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MetadataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.SubsetService; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.Dataset; @@ -35,18 +35,15 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer private final DataMapper dataMapper; private final SparkSession sparkSession; private final MariaDbMapper mariaDbMapper; - private final MetadataMapper metadataMapper; private final MetadataServiceGateway metadataServiceGateway; @Autowired public SubsetServiceMariaDbImpl(DSLContext context, DataMapper dataMapper, MariaDbMapper mariaDbMapper, - SparkSession sparkSession, MetadataMapper metadataMapper, - MetadataServiceGateway metadataServiceGateway) { + SparkSession sparkSession, MetadataServiceGateway metadataServiceGateway) { this.context = context; this.dataMapper = dataMapper; this.sparkSession = sparkSession; this.mariaDbMapper = mariaDbMapper; - this.metadataMapper = metadataMapper; this.metadataServiceGateway = metadataServiceGateway; } @@ -86,7 +83,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer @Override public List<QueryDto> findAll(DatabaseDto database, Boolean filterPersisted) throws SQLException, - QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException { + QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException, UserNotFoundException { final List<IdentifierBriefDto> identifiers = metadataServiceGateway.getIdentifiers(database.getId(), null); final ComboPooledDataSource dataSource = getDataSource(database); final Connection connection = dataSource.getConnection(); @@ -98,7 +95,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer log.trace("filter persisted only {}", filterPersisted); } final ResultSet resultSet = statement.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); final List<QueryDto> queries = new LinkedList<>(); while (resultSet.next()) { final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); @@ -106,6 +103,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer .filter(i -> i.getType().equals(IdentifierTypeDto.SUBSET)) .filter(i -> i.getQueryId().equals(query.getId())) .toList()); + query.setOwner(dataMapper.userDtoToUserBriefDto(metadataServiceGateway.getUserById(query.getOwner() + .getId()))); + query.setType(QueryTypeDto.QUERY); + query.setDatabaseId(database.getId()); + queries.add(query); } log.info("Find {} queries", queries.size()); @@ -127,7 +129,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final long start = System.currentTimeMillis(); final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.countRawSelectQuery(statement, timestamp)) .executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); return mariaDbMapper.resultSetToNumber(resultSet); } catch (SQLException e) { log.error("Failed to map object: {}", e.getMessage()); @@ -147,13 +149,14 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final PreparedStatement preparedStatement = connection.prepareStatement(mariaDbMapper.queryStoreFindQueryRawQuery()); preparedStatement.setString(1, String.valueOf(queryId)); final ResultSet resultSet = preparedStatement.executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); if (!resultSet.next()) { throw new QueryNotFoundException("Failed to find query"); } final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); - query.setOwner(metadataMapper.userDtoToUserBriefDto(metadataServiceGateway.getUserById(query.getOwner() + query.setOwner(dataMapper.userDtoToUserBriefDto(metadataServiceGateway.getUserById(query.getOwner() .getId()))); + query.setType(QueryTypeDto.QUERY); query.setDatabaseId(database.getId()); return query; } catch (SQLException e) { @@ -184,7 +187,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer callableStatement.setTimestamp(3, Timestamp.from(timestamp)); callableStatement.registerOutParameter(4, Types.VARCHAR); callableStatement.executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); queryId = UUID.fromString(callableStatement.getString(4)); callableStatement.close(); log.info("Stored query with id {} in database with name {}", queryId, database.getInternalName()); @@ -211,7 +214,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer preparedStatement.setBoolean(1, persist); preparedStatement.setString(2, String.valueOf(queryId)); preparedStatement.executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); } catch (SQLException e) { log.error("Failed to (un-)persist query: {}", e.getMessage()); throw new QueryStorePersistException("Failed to (un-)persist query", e); @@ -229,7 +232,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreDeleteStaleQueriesRawQuery()) .executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); } catch (SQLException e) { log.error("Failed to delete stale queries: {}", e.getMessage()); throw new QueryStoreGCException("Failed to delete stale queries: " + e.getMessage(), e); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java similarity index 94% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java index f337cc8b1b7c4b32c00364e29d2050d23c75de44..1ca0da14d8e87972dc58eedc1e139f1da8b62451 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.ImportDto; @@ -7,12 +7,12 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnStatisticDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnTypeDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.DataMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.DatabaseService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.StorageService; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.TableService; -import at.ac.tuwien.ac.at.ifs.dbrepo.utils.MariaDbUtil; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; +import at.ac.tuwien.ifs.dbrepo.service.StorageService; +import at.ac.tuwien.ifs.dbrepo.service.TableService; +import at.ac.tuwien.ifs.dbrepo.utils.MariaDbUtil; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.apache.spark.sql.AnalysisException; @@ -70,7 +70,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi statistic = dataMapper.resultSetToTableStatistic(resultSet); statistic.setTotalColumns(Long.parseLong("" + tmpTable.getColumns() .size())); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); statistic.setAvgRowLength(tmpTable.getAvgRowLength()); statistic.setDataLength(tmpTable.getDataLength()); statistic.setMaxDataLength(tmpTable.getMaxDataLength()); @@ -110,7 +110,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi statement.setString(1, data.getDescription()); } statement.executeUpdate(); - log.debug("executed statement in {} ms", System.currentTimeMillis() - start); + log.debug(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -132,7 +132,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi connection.prepareStatement(mariaDbMapper.dropTableRawQuery(database.getInternalName(), table.getInternalName())) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -156,7 +156,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectHistoryRawQuery( database.getInternalName(), table.getInternalName(), size)) .executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); history = dataMapper.resultSetToTableHistory(resultSet); connection.commit(); } catch (SQLException e) { @@ -182,7 +182,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( database.getInternalName(), tableName, timestamp)) .executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); queryResult = mariaDbMapper.resultSetToNumber(resultSet); connection.commit(); } catch (SQLException e) { @@ -270,7 +270,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -315,7 +315,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -352,7 +352,7 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java similarity index 90% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java index 3122e6fc8b4c5e7d26ff080d2857fdf7bde3847d..5b8f2017aaaa13c02cad9252bed36d8686abec04 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java @@ -1,11 +1,11 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.service.impl; +package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.exception.QueryMalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.ViewMalformedException; -import at.ac.tuwien.ac.at.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ac.at.ifs.dbrepo.service.ViewService; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.ViewService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; @@ -37,7 +37,7 @@ public class ViewServiceMariaDbImpl extends DataConnector implements ViewService connection.prepareStatement(mariaDbMapper.dropViewRawQuery(database.getInternalName(), view.getInternalName())) .execute(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -61,7 +61,7 @@ public class ViewServiceMariaDbImpl extends DataConnector implements ViewService final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( database.getInternalName(), view.getInternalName(), timestamp)) .executeQuery(); - log.trace("executed statement in {} ms", System.currentTimeMillis() - start); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); queryResult = mariaDbMapper.resultSetToNumber(resultSet); connection.commit(); } catch (SQLException e) { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/MariaDbUtil.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/utils/MariaDbUtil.java similarity index 97% rename from dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/MariaDbUtil.java rename to dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/utils/MariaDbUtil.java index 78f51fee877670f656c594e28e9b91f485177c62..8e27a151d31f75cc745607767cdd842c3df0f355 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ac/at/ifs/dbrepo/utils/MariaDbUtil.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/utils/MariaDbUtil.java @@ -1,4 +1,4 @@ -package at.ac.tuwien.ac.at.ifs.dbrepo.utils; +package at.ac.tuwien.ifs.dbrepo.utils; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnTypeDto; diff --git a/dbrepo-gateway-service/README.md b/dbrepo-gateway-service/README.md deleted file mode 100644 index 025b6a81ed37ba5bf21a05b71e14923604385e5f..0000000000000000000000000000000000000000 --- a/dbrepo-gateway-service/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Gateway Service - -NGINX, test the syntax/regex with https://nginx.viraptor.info/ \ No newline at end of file diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index 0ee5bfdfb5fb5c8950e61fff324abc4044a5bc1d..153d6fb7f50444c94fbcd2a29371f12833d20d6d 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -4,8 +4,6 @@ map $http_upgrade $connection_upgrade { '' close; } -client_max_body_size 20G; - proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; diff --git a/dbrepo-metadata-db/metrics.cnf b/dbrepo-metadata-db/metrics.cnf new file mode 100644 index 0000000000000000000000000000000000000000..10dd32998a5aab20ed52756e1e1678c9cd281d27 --- /dev/null +++ b/dbrepo-metadata-db/metrics.cnf @@ -0,0 +1,3 @@ +[client] +user=readonly +password=readonly \ No newline at end of file diff --git a/dbrepo-metadata-service/.dockerignore b/dbrepo-metadata-service/.dockerignore index fcdfe8de55e91b3b65fcf598c5980ae256087910..00e85186720976c4dc73fcb71829996845c4fed6 100644 --- a/dbrepo-metadata-service/.dockerignore +++ b/dbrepo-metadata-service/.dockerignore @@ -1 +1 @@ -rest-service/src/main/resources/*.csv \ No newline at end of file +rest-service/src/main/resources/*.csv diff --git a/dbrepo-metadata-service/.gitignore b/dbrepo-metadata-service/.gitignore index d39a47ee0fab72fbe4fd7f5ae968ff2f3bc3de78..3e5eeee0c8f132e1eae76cc90a3f0a418ef5f407 100644 --- a/dbrepo-metadata-service/.gitignore +++ b/dbrepo-metadata-service/.gitignore @@ -7,6 +7,9 @@ target/ ### Environment ### .env +### local repo ### +lib/at/ + ### Generated ### ready mapping.xml diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile index 8d01865d85a0d1cad2cad9f2f7849a655b9e0259..f9bb4cb4da6a136acde726f8cfdf97df07ed1b5e 100644 --- a/dbrepo-metadata-service/Dockerfile +++ b/dbrepo-metadata-service/Dockerfile @@ -1,17 +1,12 @@ ###### FIRST STAGE ###### -FROM dbrepo-core:build AS dependency -LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" - -###### SECOND STAGE ###### -FROM maven:3-amazoncorretto-17 AS build +FROM --platform=$BUILDPLATFORM maven:3-amazoncorretto-17 AS build LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" COPY ./pom.xml ./ RUN mvn -fn dependency:go-offline -COPY --from=dependency /root/.m2/repository/at/ac/tuwien/ifs/dbrepo /root/.m2/repository/at/ac/tuwien/ifs/dbrepo - +COPY ./lib ./lib COPY ./oai ./oai COPY ./report ./report COPY ./repositories ./repositories @@ -19,25 +14,32 @@ COPY ./rest-service ./rest-service COPY ./services ./services # Make sure it compiles -RUN mvn -fn clean package -DskipTests +RUN mvn -q clean package -DskipTests -###### THIRD STAGE ###### -FROM amazoncorretto:17-alpine3.19 AS runtime +###### SECOND STAGE ###### +FROM --platform=$BUILDPLATFORM amazoncorretto:17-alpine3.21 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" -RUN apk add --no-cache curl bash jq +RUN apk --no-cache add \ + bash \ + curl \ + jq WORKDIR /app -RUN adduser -D dbrepo --uid 1001 +RUN mkdir -p /var/log/app/service/metadata && \ + chown -R 1001:1001 /var/log/app + +RUN adduser -D dbrepo --uid 1001 && \ + chown -R 1001:1001 /app USER 1001 -COPY --from=build --chown=1001 ./rest-service/target/dbrepo-metadata-service-rest-service-*.jar ./metadata-service.jar +COPY --from=build --chown=1001 ./rest-service/target/*service*.jar ./metadata-service.jar # non-root port EXPOSE 8080 -ENV JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" +ENV JAVA_OPTS="" ENTRYPOINT exec java $JAVA_OPTS -jar ./metadata-service.jar \ No newline at end of file diff --git a/dbrepo-metadata-service/README.md b/dbrepo-metadata-service/README.md index 7160f7bbbc743d2bb6425773566c98eb86005143..64e71fbdfb77e345d3e0453a1ac740605b6675c1 100644 --- a/dbrepo-metadata-service/README.md +++ b/dbrepo-metadata-service/README.md @@ -1,5 +1,14 @@ # Metadata Service +## Build + +Before testing, it is recommended to (re-)build the `MapStruct` mappers in case they were modified using the `package` +target: + +```shell +mvn clean package +``` + ## Test Run all unit and integration tests and create an HTML+TXT coverage report located in the `report` module: diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/AffiliationDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/AffiliationDto.java deleted file mode 100644 index 807c03f48df24d122757da14161f0b98404ba5c1..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/AffiliationDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.tuwien.api.doi; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class AffiliationDto { - - @Schema(example = "ISE, TU Wien, Data Science Research Unit, Vienna, Austria") - private String name; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/AuthorDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/AuthorDto.java deleted file mode 100644 index 8f8bbb61ffc64341119614f7de3395c40beac92e..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/AuthorDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class AuthorDto { - - @Schema(example = "Weise") - private String family; - - @Schema(example = "Martin") - private String given; - - @JsonProperty("ORCID") - @Schema(example = "http://orcid.org/0000-0003-4216-302X") - private String orcid; - - @Schema(example = "first") - private String sequence; - - private List<AffiliationDto> affiliation; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/DoiDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/DoiDto.java deleted file mode 100644 index af0cd5bcc64bf8797c81197fb6e9abc0cede6a7f..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/DoiDto.java +++ /dev/null @@ -1,82 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class DoiDto { - - @NotNull - @Schema(example = "https://doi.org/10.5334/dsj-2022-004") - private String id; - - @NotNull - private TimeRepresentationDto indexed; - - private TimeRepresentationDto deposited; - - private TimeRepresentationDto issued; - - private TimeRepresentationDto published; - - @JsonProperty("DOI") - @Schema(example = "10.5334/dsj-2022-004") - private String doi; - - @NotNull - @Schema(example = "dataset") - private String type; - - private List<AuthorDto> author; - - @Schema(example = "Crossref") - private String source; - - @Schema(example = "DBRepo: A Data Repository System for Research Data in Databases") - private String title; - - @Schema(example = "10.1109") - private String prefix; - - @Schema(example = "21") - private String volume; - - @JsonProperty("is-referenced-by-count") - @Schema(example = "0") - private Integer isReferencedByCount; - - @JsonProperty("reference-count") - @Schema(example = "28") - private Integer referenceCount; - - @Schema(example = "IEEE") - private String publisher; - - @Schema(example = "322-331") - private String page; - - private String member; - - @Schema(example = "2024 IEEE International Conference on Big Data (BigData)") - private String event; - - private List<ReferenceDto> reference; - - private Integer score; - - @JsonProperty("URL") - private String url; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/LicenseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/LicenseDto.java deleted file mode 100644 index 32f5ffcd2aced054dfffd72a44a79b9994a6658b..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/LicenseDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class LicenseDto { - - private TimeRepresentationDto start; - - @JsonProperty("content-version") - @Schema(example = "stm-asf") - private String contentVersion; - - @JsonProperty("delay-in-days") - @Schema(example = "0") - private Integer delayInDays; - - @JsonProperty("URL") - @Schema(example = "https://doi.org/10.15223/policy-029") - private String url; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/LinkDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/LinkDto.java deleted file mode 100644 index 5f70696091c7cf14abb0c717627f18a1e3eff9de..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/LinkDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class LinkDto { - - @JsonProperty("URL") - @Schema(example = "http://xplorestaging.ieee.org/ielx8/10824975/10824942/10825401.pdf?arnumber=10825401") - private String url; - - @JsonProperty("content-type") - @Schema(example = "unspecified") - private String contentType; - - @JsonProperty("content-version") - @Schema(example = "vor") - private String contentVersion; - - @JsonProperty("intended-application") - @Schema(example = "similarity-checking") - private String intendedApplication; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ReferenceDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ReferenceDto.java deleted file mode 100644 index 9458c0f9192a2f6fa71adad4e910b4e8e7b609ef..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ReferenceDto.java +++ /dev/null @@ -1,55 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -import java.util.List; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class ReferenceDto { - - @NotNull - @Schema(example = "ref1") - private String key; - - @JsonProperty("doi-asserted-by") - @Schema(example = "publisher") - private String doiAssertedBy; - - @JsonProperty("DOI") - @Schema(example = "10.1038/sdata.2016.18") - private String doi; - - @Schema(example = "2024") - private String year; - - @JsonProperty("article-title") - @Schema(example = "The Dryad Data Repository: a Singapore Framework metadata Architecture in a DSpace Environment") - private String articleTitle; - - @JsonProperty("volume-title") - @Schema(example = "Proceedings of the 2008 International Conference on Dublin Core and Metadata Applications") - private String volumeTitle; - - @JsonProperty("journal-title") - @Schema(example = "Libraries Research Publications") - private String journalTitle; - - @Schema(example = "Witt") - private String author; - - @JsonProperty("first-page") - @Schema(example = "157") - private String firstPage; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ResourceDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ResourceDto.java deleted file mode 100644 index a2543c2834def88d4ae0421d92dcc1efd34ddaf7..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ResourceDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class ResourceDto { - - private ResourceRepresentationDto primary; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ResourceRepresentationDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ResourceRepresentationDto.java deleted file mode 100644 index bf2312a6488a27498b83bd8039064d4c0badd75b..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/ResourceRepresentationDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class ResourceRepresentationDto { - - @JsonProperty("URL") - private String url; - -} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/TimeRepresentationDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/TimeRepresentationDto.java deleted file mode 100644 index fe649217e9b6b963138b38702abf39b539ba8d08..0000000000000000000000000000000000000000 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/doi/TimeRepresentationDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package at.tuwien.api.doi; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import lombok.extern.jackson.Jacksonized; - -import java.time.Instant; -import java.util.List; - -@Getter -@Setter -@Builder -@EqualsAndHashCode -@NoArgsConstructor -@AllArgsConstructor -@Jacksonized -@ToString -public class TimeRepresentationDto { - - @JsonProperty("date-parts") - @Schema(example = "[[2025,1,18]]") - private List<List<Integer>> dateParts; - - @JsonProperty("date-time") - @Schema(example = "2021-03-12T15:26:21Z") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssX", timezone = "UTC") - private Instant dateTime; - - private Long timestamp; - -} diff --git a/dbrepo-metadata-service/lib/.gitkeep b/dbrepo-metadata-service/lib/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index d14d0bcf615c86d94b1d9d28e8748a574454e274..94a25b78ef0d2a57cbff12b106f52c73123c22f2 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -4,14 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service</artifactId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>metadata-service</artifactId> + <version>1.8.2</version> </parent> - <artifactId>dbrepo-metadata-service-oai</artifactId> - <name>dbrepo-metadata-service-oai</name> - <version>1.8.1</version> + <name>oai</name> + <artifactId>oai</artifactId> + <version>1.8.2</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 313d6d0db530caa829e6325cef263d1077b954e8..2567b704b2819f92ff56995743990787833e49e2 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -13,13 +13,13 @@ <url>https://www.tuwien.ac.at</url> </organization> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service</artifactId> - <name>dbrepo-metadata-service</name> - <version>1.8.1</version> - + <name>metadata-service</name> <description>Service that manages the metadata</description> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>metadata-service</artifactId> + <version>1.8.2</version> + <packaging>pom</packaging> <modules> <module>oai</module> @@ -69,11 +69,7 @@ <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> + <version>1.8.2</version> </dependency> <!-- Data Source --> <dependency> @@ -168,6 +164,13 @@ <artifactId>amqp-client</artifactId> <version>${rabbitmq.version}</version> </dependency> + <!-- Api --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> <!-- Testing --> <dependency> <groupId>org.springframework</groupId> @@ -181,7 +184,6 @@ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> </dependency> <dependency> <groupId>com.h2database</groupId> @@ -274,6 +276,19 @@ </plugins> </build> + <repositories> + <repository> + <id>dbrepo-maven-repo</id> + <url>file:///${project.basedir}/lib</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <licenses> <license> <name>Apache-2.0</name> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 847272f66f1606d6b89feb26444367f1a458514e..ffbe87d0cce2489b32f0de0773a1a6969190020d 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -4,25 +4,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>metadata-service</artifactId> + <version>1.8.2</version> </parent> - <artifactId>dbrepo-metadata-service-report</artifactId> - <name>dbrepo-metadata-service-report</name> - <version>1.8.1</version> + <name>report</name> + <artifactId>report</artifactId> + <version>1.8.2</version> <dependencies> <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-rest-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-services</artifactId> - <version>${project.version}</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>services</artifactId> + <version>1.8.2</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 4f9850d3d3d84719c8a3f696d1b5af165e7fe6e1..10458ac4cdb92ea34e0b976376a0226d479b4be1 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -4,27 +4,21 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>metadata-service</artifactId> + <version>1.8.2</version> </parent> - <artifactId>dbrepo-metadata-service-repositories</artifactId> - <name>dbrepo-metadata-service-repositories</name> - <version>1.8.1</version> + <name>repositories</name> + <artifactId>repositories</artifactId> + <version>1.8.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> + <artifactId>oai</artifactId> + <version>1.8.2</version> </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-oai</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> </project> diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/DatabaseRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/DatabaseRepository.java index 2d61108679fffd08c13660d63e91a5e9a1127050..5f1feb7e2df2a75fdfdb84ef05cd111a8dfe1413 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/DatabaseRepository.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/DatabaseRepository.java @@ -5,7 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; -import java.util.Optional; import java.util.UUID; @Repository diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java index 4011a8d1683329af5181d387b6031cefa8fd461b..35eebe00f36c175043984c5d277aae7dcebaa3ab 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java @@ -11,6 +11,8 @@ import java.util.UUID; @Repository public interface IdentifierRepository extends JpaRepository<Identifier, UUID> { + List<Identifier> findAll(); + /** * Finds identifiers by given database id. * diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index 0f1abad18e9b440507b45b9328dc2d9b8f669050..bbc8d1e069d529a5fc9b5f85a6f378229b1b81d3 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -4,25 +4,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>metadata-service</artifactId> + <version>1.8.2</version> </parent> - <artifactId>dbrepo-metadata-service-rest-service</artifactId> - <name>dbrepo-metadata-service-rest</name> - <version>1.8.1</version> + <name>rest-service</name> + <artifactId>rest-service</artifactId> + <version>1.8.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-services</artifactId> - <version>${project.version}</version> + <artifactId>services</artifactId> + <version>1.8.2</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml index 492aafb6c558a28956190e5c48f198b9e1f333ae..72fd264e48ab00e4c305d3d98db7036b30a0a75a 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml @@ -42,11 +42,17 @@ management: server: port: 8080 logging: - pattern.console: "%d %highlight(%-5level) %msg%n" + file: + name: /var/log/app/service/metadata/app.log level: root: warn at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug + pattern: + console: "%d %highlight(%-5level) %msg%n" + structured: + format: + file: ecs dbrepo: datacite: url: "${DATACITE_URL:https://api.datacite.org}" diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index db32fbe9ccf05163d56472d2a3bdfda25f9571f4..ccc6c60cfb220016e4eb13f6fa2decc949292049 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -4,30 +4,25 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <artifactId>dbrepo-metadata-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.8.1</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>metadata-service</artifactId> + <version>1.8.2</version> </parent> - <artifactId>dbrepo-metadata-service-services</artifactId> - <name>dbrepo-metadata-service-services</name> - <version>1.8.1</version> + <name>services</name> + <artifactId>services</artifactId> + <version>1.8.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> + <artifactId>oai</artifactId> + <version>1.8.2</version> </dependency> <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-oai</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-service-repositories</artifactId> - <version>${project.version}</version> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> + <artifactId>repositories</artifactId> + <version>1.8.2</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java index 5c109633183eb1d62f4a560e878140d15d75a6cd..e5bf8efa9bd8ad202bf3f82d9a087106ca35dd73 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java @@ -1,5 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; +import at.ac.tuwien.ifs.dbrepo.config.DataCiteConfig; +import at.ac.tuwien.ifs.dbrepo.config.EndpointConfig; import at.ac.tuwien.ifs.dbrepo.core.api.datacite.DataCiteBody; import at.ac.tuwien.ifs.dbrepo.core.api.datacite.DataCiteData; import at.ac.tuwien.ifs.dbrepo.core.api.datacite.doi.DataCiteCreateDoi; @@ -9,8 +11,6 @@ import at.ac.tuwien.ifs.dbrepo.core.api.identifier.BibliographyTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.CreateIdentifierDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierSaveDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; -import at.ac.tuwien.ifs.dbrepo.config.DataCiteConfig; -import at.ac.tuwien.ifs.dbrepo.config.EndpointConfig; import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database; import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.Identifier; import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.IdentifierStatusType; @@ -128,18 +128,25 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService { final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBasicAuth(dataCiteConfig.getUsername(), dataCiteConfig.getPassword()); + final DataCiteCreateDoi attributes = metadataMapper.identifierToDataCiteCreateDoi(identifier, + endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(), + dataCiteConfig.getPrefix(), event); final HttpEntity<DataCiteBody<DataCiteCreateDoi>> request = new HttpEntity<>( DataCiteBody.<DataCiteCreateDoi>builder() .data(DataCiteData.<DataCiteCreateDoi>builder() .type("dois") - .attributes(metadataMapper.identifierToDataCiteCreateDoi(identifier, - endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(), - dataCiteConfig.getPrefix(), event)) + .attributes(attributes) .build()) .build(), headers ); final String url = dataCiteConfig.getUrl() + "/dois"; + log.atDebug() + .setMessage("register doi from datacite url: " + url) + .addKeyValue("type", "dois") + .addKeyValue("event", event) + .addKeyValue("attributes", attributes) + .log(); log.trace("request doi from url {}", url); try { final ResponseEntity<DataCiteBody<DataCiteDoi>> response = restTemplate.exchange(url, HttpMethod.POST, @@ -148,15 +155,26 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService { log.error("Failed to mint doi: {}", response); throw new ExternalServiceException("Failed to mint doi: " + response.getBody()); } - return response.getBody() + final String doi = response.getBody() .getData() .getAttributes() .getDoi(); + log.atInfo() + .setMessage("Saved doi: " + doi) + .addKeyValue("doi", doi) + .log(); + return doi; } catch (HttpClientErrorException e) { - log.error("Failed to mint doi: malformed metadata: {}", e.getMessage()); - throw new MalformedException("Failed to mint doi: malformed metadata: " + e.getMessage(), e); + log.atError() + .setMessage("Failed to mint doi") + .setCause(e) + .log(); + throw new MalformedException("Failed to mint doi: " + e.getMessage(), e); } catch (RestClientException e) { - log.error("Failed to mint doi: {}", e.getMessage()); + log.atError() + .setMessage("Failed to mint doi") + .setCause(e) + .log(); throw new DataServiceConnectionException("Failed to mint doi: " + e.getMessage(), e); } } diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java index f8b2c273e8c9032a103b327f84892528aad7826f..c04d388f8ce4142bacb609b8f62098383fc99303 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java @@ -1,11 +1,11 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; +import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.BibliographyTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.CreateIdentifierDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierSaveDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; -import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig; import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database; import at.ac.tuwien.ifs.dbrepo.core.entity.database.LanguageType; import at.ac.tuwien.ifs.dbrepo.core.entity.database.View; @@ -22,6 +22,7 @@ import at.ac.tuwien.ifs.dbrepo.service.IdentifierService; import at.ac.tuwien.ifs.dbrepo.service.ViewService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; +import org.slf4j.spi.LoggingEventBuilder; import org.springframework.core.io.InputStreamResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -150,7 +151,10 @@ public class IdentifierServiceImpl implements IdentifierService { identifier = identifierRepository.save(identifier); /* update in search service */ searchServiceGateway.update(identifier.getDatabase()); - log.info("Published identifier with id {}", identifier.getId()); + log.atInfo() + .setMessage("Published identifier") + .addKeyValue("id", identifier.getId()) + .log(); return identifier; } @@ -280,10 +284,14 @@ public class IdentifierServiceImpl implements IdentifierService { public Identifier save(Identifier identifier) throws DataServiceException, DataServiceConnectionException, ViewNotFoundException, DatabaseNotFoundException, QueryNotFoundException, SearchServiceException, SearchServiceConnectionException { + LoggingEventBuilder loggingBuilder = log.atDebug() + .setMessage("save identifier") + .addKeyValue("type", identifier.getType()) + .addKeyValue("database_id", identifier.getDatabase().getId()); /* save identifier */ switch (identifier.getType()) { case SUBSET -> { - log.debug("identifier type: subset with id {}", identifier.getQueryId()); + loggingBuilder = loggingBuilder.addKeyValue("query_id", identifier.getQueryId()); final QueryDto query = dataServiceGateway.findQuery(identifier.getDatabase().getId(), identifier.getQueryId()); identifier.setQuery(query.getQuery()); identifier.setQueryId(query.getId()); @@ -294,16 +302,16 @@ public class IdentifierServiceImpl implements IdentifierService { identifier.setResultHash(query.getResultHash()); } case VIEW -> { - log.debug("identifier type: view with id {}", identifier.getViewId()); + loggingBuilder = loggingBuilder.addKeyValue("view_id", identifier.getViewId()); final View view = viewService.findById(identifier.getDatabase(), identifier.getViewId()); identifier.setViewId(view.getId()); identifier.setQuery(view.getQuery()); identifier.setQueryNormalized(view.getQuery()); identifier.setQueryHash(view.getQueryHash()); } - case DATABASE -> log.debug("identifier type: database with id {}", identifier.getDatabase().getId()); - case TABLE -> log.debug("identifier type: table with id {}", identifier.getTableId()); + case TABLE -> loggingBuilder = loggingBuilder.addKeyValue("table_id", identifier.getTableId()); } + loggingBuilder.log(); /* save identifier in metadata database */ final Identifier out = identifierRepository.save(identifier); /* update in search database */ @@ -327,7 +335,6 @@ public class IdentifierServiceImpl implements IdentifierService { final String body = templateEngine.process("record_oai_datacite.xml", context) .replaceAll("\\s+", " "); final InputStreamResource resource = new InputStreamResource(IOUtils.toInputStream(body, Charset.defaultCharset())); - log.debug("mapped file stream {}", resource.getDescription()); return resource; } @@ -366,7 +373,10 @@ public class IdentifierServiceImpl implements IdentifierService { .getIdentifiers() .remove(identifier); searchServiceGateway.update(identifier.getDatabase()); - log.info("Deleted identifier with id {}", identifier.getId()); + log.atInfo() + .setMessage("Deleted identifier") + .addKeyValue("id", identifier.getId()) + .log(); } public IdentifierTitle preferTitle(List<IdentifierTitle> titles) { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java index f93dacc21c112d9bdbd1be6f511c0d89829ea836..351b61e82de310ccdef35830986dd8f4d9ee1f7e 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java @@ -13,6 +13,7 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.nio.charset.StandardCharsets; import java.util.List; @@ -33,11 +34,13 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional(readOnly = true) public List<User> findAll() { return userRepository.findAll(); } @Override + @Transactional(readOnly = true) public User findByUsername(String username) throws UserNotFoundException { final Optional<User> optional = userRepository.findByUsername(username); if (optional.isEmpty()) { @@ -48,11 +51,13 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional(readOnly = true) public List<User> findAllInternalUsers() { return userRepository.findAllInternal(); } @Override + @Transactional(readOnly = true) public User findById(UUID id) throws UserNotFoundException { final Optional<User> optional = userRepository.findById(id); if (optional.isEmpty()) { @@ -63,6 +68,7 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional public User create(CreateUserDto data) { /* create at authentication service */ final String passwordHash = "*" + DigestUtils.sha1Hex(DigestUtils.sha1(RandomStringUtils.randomAlphabetic(40) @@ -86,6 +92,7 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional public User modify(User user, UserUpdateDto data) throws UserNotFoundException, AuthServiceException { user.setFirstname(data.getFirstname()); user.setLastname(data.getLastname()); diff --git a/dbrepo-metric-db/prometheus.yml b/dbrepo-metric-db/prometheus.yml index 333420ee559caa20e420b86bec5f2d08a881ef43..e5e5252e9de64de24de1b73b9caf9cf7a6d77cdd 100644 --- a/dbrepo-metric-db/prometheus.yml +++ b/dbrepo-metric-db/prometheus.yml @@ -1,5 +1,6 @@ global: scrape_interval: 1m + scrape_timeout: 10s rule_files: [] @@ -12,8 +13,25 @@ scrape_configs: - job_name: 'java actuator scrape' metrics_path: '/actuator/prometheus' static_configs: - - targets: ['data-service:8080', 'metadata-service:8080'] + - targets: + - data-service:8080 + - metadata-service:8080 - job_name: 'metrics scrape' metrics_path: '/metrics' static_configs: - - targets: ['ui:3000', 'auth-service:9000', 'analyse-service:8080', 'search-service:8080', 'storage-service:9090', 'dashboard-service:8080', 'dashboard-ui:3000', 'broker-service:15692'] + - targets: + - analyse-service:8080 + - auth-service:9000 + - broker-service:15692 + - data-db-metrics:9104 + - dashboard-service:8080 + - dashboard-ui:3000 + - metadata-db-metrics:9104 + - search-service:8080 + - storage-service:9090 + - ui:3000 + - job_name: 'realm scrape' + metrics_path: '/realms/dbrepo/metrics' + static_configs: + - targets: + - auth-service:8080 diff --git a/dbrepo-search-service/Dockerfile b/dbrepo-search-service/Dockerfile index 03660245769c484057c002c56ffc60e94370a8ee..c290684944d7ff48d177f21c728cbb4d1ee760fc 100644 --- a/dbrepo-search-service/Dockerfile +++ b/dbrepo-search-service/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine3.21 +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk add --no-cache \ @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/search && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./friendly_names_overrides.json ./friendly_names_overrides.json diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index 8b070aae40a403e2335fd61e557aeb4bf6d359a6..99ece7bda6961c60b13e34bc6e9c38b791867c1b 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -17,7 +17,7 @@ flask_httpauth = "*" jwt = "~=1.3" rdflib = "*" grafana-client = "*" -dbrepo = {path = "./lib/dbrepo-1.8.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.8.2.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index f1a9ee3b80de1100685dc150dc50c22f7dc9d404..65fe75dd41218de10e1b573db8c386163a3cef08 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5fdbe53734156bd7a407865df89d565d0a9c253c4fbf452d7cdaf2caef73f85b" + "sha256": "81c685d7b8966e019d5e9f0821ae592ec36dae0ab851cc342bcbb1b173e69cc0" }, "pipfile-spec": 6, "requires": { @@ -16,109 +16,6 @@ ] }, "default": { - "aiohappyeyeballs": { - "hashes": [ - "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", - "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" - }, - "aiohttp": { - "hashes": [ - "sha256:004511d3413737700835e949433536a2fe95a7d0297edd911a1e9705c5b5ea43", - "sha256:0902e887b0e1d50424112f200eb9ae3dfed6c0d0a19fc60f633ae5a57c809656", - "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", - "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", - "sha256:0a950c2eb8ff17361abd8c85987fd6076d9f47d040ebffce67dce4993285e973", - "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", - "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", - "sha256:14461157d8426bcb40bd94deb0450a6fa16f05129f7da546090cebf8f3123b0f", - "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", - "sha256:17ae4664031aadfbcb34fd40ffd90976671fa0c0286e6c4113989f78bebab37a", - "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", - "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", - "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", - "sha256:37dcee4906454ae377be5937ab2a66a9a88377b11dd7c072df7a7c142b63c37c", - "sha256:38bea84ee4fe24ebcc8edeb7b54bf20f06fd53ce4d2cc8b74344c5b9620597fd", - "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", - "sha256:3ad1d59fd7114e6a08c4814983bb498f391c699f3c78712770077518cae63ff7", - "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", - "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", - "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", - "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", - "sha256:4d0c970c0d602b1017e2067ff3b7dac41c98fef4f7472ec2ea26fd8a4e8c2149", - "sha256:54eb3aead72a5c19fad07219acd882c1643a1027fbcdefac9b502c267242f955", - "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", - "sha256:576f5ca28d1b3276026f7df3ec841ae460e0fc3aac2a47cbf72eabcfc0f102e1", - "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", - "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", - "sha256:634d96869be6c4dc232fc503e03e40c42d32cfaa51712aee181e922e61d74814", - "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", - "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", - "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", - "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", - "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", - "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", - "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", - "sha256:776c8e959a01e5e8321f1dec77964cb6101020a69d5a94cd3d34db6d555e01f7", - "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", - "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", - "sha256:7951decace76a9271a1ef181b04aa77d3cc309a02a51d73826039003210bdc86", - "sha256:7ba92a2d9ace559a0a14b03d87f47e021e4fa7681dc6970ebbc7b447c7d4b7cd", - "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", - "sha256:87944bd16b7fe6160607f6a17808abd25f17f61ae1e26c47a491b970fb66d8cb", - "sha256:87a6e922b2b2401e0b0cf6b976b97f11ec7f136bfed445e16384fbf6fd5e8602", - "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", - "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", - "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", - "sha256:92b7ee222e2b903e0a4b329a9943d432b3767f2d5029dbe4ca59fb75223bbe2e", - "sha256:938f756c2b9374bbcc262a37eea521d8a0e6458162f2a9c26329cc87fdf06534", - "sha256:9756d9b9d4547e091f99d554fbba0d2a920aab98caa82a8fb3d3d9bee3c9ae85", - "sha256:98b88a2bf26965f2015a771381624dd4b0839034b70d406dc74fd8be4cc053e3", - "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", - "sha256:a2a450bcce4931b295fc0848f384834c3f9b00edfc2150baafb4488c27953de6", - "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", - "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", - "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", - "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", - "sha256:ad9509ffb2396483ceacb1eee9134724443ee45b92141105a4645857244aecc8", - "sha256:bbcba75fe879ad6fd2e0d6a8d937f34a571f116a0e4db37df8079e738ea95c71", - "sha256:c10d85e81d0b9ef87970ecbdbfaeec14a361a7fa947118817fcea8e45335fa46", - "sha256:c15b2271c44da77ee9d822552201180779e5e942f3a71fb74e026bf6172ff287", - "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", - "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", - "sha256:ccf10f16ab498d20e28bc2b5c1306e9c1512f2840f7b6a67000a517a4b37d5ee", - "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", - "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", - "sha256:d0666afbe984f6933fe72cd1f1c3560d8c55880a0bdd728ad774006eb4241ecd", - "sha256:d07502cc14ecd64f52b2a74ebbc106893d9a9717120057ea9ea1fd6568a747e7", - "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", - "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", - "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", - "sha256:e87fd812899aa78252866ae03a048e77bd11b80fb4878ce27c23cade239b42b2", - "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", - "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", - "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", - "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", - "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", - "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", - "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", - "sha256:fb3d0cc5cdb926090748ea60172fa8a213cec728bd6c54eae18b96040fcd6227", - "sha256:fb46bb0f24813e6cede6cc07b1961d4b04f331f7112a23b5e21f567da4ee50aa", - "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb" - ], - "markers": "python_version >= '3.9'", - "version": "==3.11.16" - }, - "aiosignal": { - "hashes": [ - "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", - "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" - ], - "markers": "python_version >= '3.9'", - "version": "==1.3.2" - }, "annotated-types": { "hashes": [ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", @@ -145,11 +42,11 @@ }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -226,101 +123,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "click": { "hashes": [ @@ -332,50 +229,52 @@ }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", + "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", + "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", + "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", + "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", + "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", + "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", + "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", + "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", + "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9", + "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", + "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", + "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", + "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", + "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", + "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", + "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", + "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", + "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", + "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", + "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", + "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", + "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", + "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", + "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", + "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", + "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", + "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", + "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", + "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", + "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", + "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", + "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", + "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", + "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", + "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", + "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==44.0.3" }, "dbrepo": { "hashes": [ - "sha256:fd242c3a382193c1dc4227bc505ddb618815dd0c65417922b966b44bb024779e" + "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125" ], - "path": "./lib/dbrepo-1.8.1.tar.gz" + "path": "./lib/dbrepo-1.8.2.tar.gz" }, "events": { "hashes": [ @@ -433,104 +332,6 @@ "markers": "python_version >= '3.8'", "version": "==3.1.1" }, - "frozenlist": { - "hashes": [ - "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", - "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", - "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", - "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", - "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", - "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", - "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", - "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", - "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", - "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", - "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", - "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", - "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", - "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", - "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", - "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", - "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", - "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", - "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", - "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", - "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", - "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", - "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", - "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", - "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", - "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", - "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", - "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", - "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", - "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", - "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", - "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", - "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", - "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", - "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", - "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", - "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", - "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", - "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", - "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", - "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", - "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", - "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", - "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", - "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", - "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", - "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", - "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", - "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", - "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", - "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", - "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", - "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", - "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", - "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", - "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", - "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", - "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", - "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", - "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", - "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", - "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", - "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", - "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", - "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", - "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", - "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", - "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", - "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", - "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", - "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", - "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", - "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", - "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", - "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", - "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", - "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", - "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", - "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", - "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", - "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", - "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", - "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", - "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", - "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", - "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", - "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", - "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", - "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", - "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", - "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", - "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, "grafana-client": { "hashes": [ "sha256:2477a47b923fd0637947e620b0b777c641af18a3025464fa4505783dbf05dfcc", @@ -542,82 +343,64 @@ }, "greenlet": { "hashes": [ - "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", - "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", - "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", - "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", - "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", - "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", - "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", - "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", - "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", - "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", - "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", - "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", - "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", - "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", - "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", - "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", - "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", - "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", - "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", - "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", - "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", - "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", - "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", - "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", - "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", - "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", - "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", - "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", - "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", - "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", - "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", - "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", - "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", - "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", - "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", - "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", - "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", - "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", - "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", - "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", - "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", - "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", - "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", - "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", - "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", - "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", - "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", - "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", - "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", - "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", - "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", - "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", - "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", - "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", - "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", - "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", - "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", - "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", - "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", - "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", - "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", - "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", - "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", - "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", - "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", - "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", - "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", - "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", - "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", - "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", - "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", - "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", - "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" + "sha256:04b4ec7f65f0e4a1500ac475c9343f6cc022b2363ebfb6e94f416085e40dea15", + "sha256:05a7490f74e8aabc5f29256765a99577ffde979920a2db1f3676d265a3adba41", + "sha256:063bcf7f8ee28eb91e7f7a8148c65a43b73fbdc0064ab693e024b5a940070145", + "sha256:0ba2811509a30e5f943be048895a983a8daf0b9aa0ac0ead526dfb5d987d80ea", + "sha256:0c68bbc639359493420282d2f34fa114e992a8724481d700da0b10d10a7611b8", + "sha256:0ddda0197c5b46eedb5628d33dad034c455ae77708c7bf192686e760e26d6a0c", + "sha256:175d583f7d5ee57845591fc30d852b75b144eb44b05f38b67966ed6df05c8526", + "sha256:17964c246d4f6e1327edd95e2008988a8995ae3a7732be2f9fc1efed1f1cdf8c", + "sha256:1a750f1046994b9e038b45ae237d68153c29a3a783075211fb1414a180c8324b", + "sha256:1c472adfca310f849903295c351d297559462067f618944ce2650a1878b84123", + "sha256:2273586879affca2d1f414709bb1f61f0770adcabf9eda8ef48fd90b36f15d12", + "sha256:24a496479bc8bd01c39aa6516a43c717b4cee7196573c47b1f8e1011f7c12495", + "sha256:2530bfb0abcd451ea81068e6d0a1aac6dabf3f4c23c8bd8e2a8f579c2dd60d95", + "sha256:3059c6f286b53ea4711745146ffe5a5c5ff801f62f6c56949446e0f6461f8157", + "sha256:3227c6ec1149d4520bc99edac3b9bc8358d0034825f3ca7572165cb502d8f29a", + "sha256:374ffebaa5fbd10919cd599e5cf8ee18bae70c11f9d61e73db79826c8c93d6f9", + "sha256:3ecc9d33ca9428e4536ea53e79d781792cee114d2fa2695b173092bdbd8cd6d5", + "sha256:3f56382ac4df3860ebed8ed838f268f03ddf4e459b954415534130062b16bc32", + "sha256:4245246e72352b150a1588d43ddc8ab5e306bef924c26571aafafa5d1aaae4e8", + "sha256:4339b202ac20a89ccd5bde0663b4d00dc62dd25cb3fb14f7f3034dec1b0d9ece", + "sha256:4818116e75a0dd52cdcf40ca4b419e8ce5cb6669630cb4f13a6c384307c9543f", + "sha256:5193135b3a8d0017cb438de0d49e92bf2f6c1c770331d24aa7500866f4db4017", + "sha256:51a2f49da08cff79ee42eb22f1658a2aed60c72792f0a0a95f5f0ca6d101b1fb", + "sha256:5c12f0d17a88664757e81a6e3fc7c2452568cf460a2f8fb44f90536b2614000b", + "sha256:6079ae990bbf944cf66bea64a09dcb56085815630955109ffa98984810d71565", + "sha256:639a94d001fe874675b553f28a9d44faed90f9864dc57ba0afef3f8d76a18b04", + "sha256:64a4d0052de53ab3ad83ba86de5ada6aeea8f099b4e6c9ccce70fb29bc02c6a2", + "sha256:6dcc6d604a6575c6225ac0da39df9335cc0c6ac50725063fa90f104f3dbdb2c9", + "sha256:7132e024ebeeeabbe661cf8878aac5d2e643975c4feae833142592ec2f03263d", + "sha256:72c9b668454e816b5ece25daac1a42c94d1c116d5401399a11b77ce8d883110c", + "sha256:777c1281aa7c786738683e302db0f55eb4b0077c20f1dc53db8852ffaea0a6b0", + "sha256:7abc0545d8e880779f0c7ce665a1afc3f72f0ca0d5815e2b006cafc4c1cc5840", + "sha256:7b0f3a0a67786facf3b907a25db80efe74310f9d63cc30869e49c79ee3fcef7e", + "sha256:852ef432919830022f71a040ff7ba3f25ceb9fe8f3ab784befd747856ee58530", + "sha256:8b89e5d44f55372efc6072f59ced5ed1efb7b44213dab5ad7e0caba0232c6545", + "sha256:8fe303381e7e909e42fb23e191fc69659910909fdcd056b92f6473f80ef18543", + "sha256:9afa05fe6557bce1642d8131f87ae9462e2a8e8c46f7ed7929360616088a3975", + "sha256:9f4dd4b4946b14bb3bf038f81e1d2e535b7d94f1b2a59fdba1293cd9c1a0a4d7", + "sha256:aa30066fd6862e1153eaae9b51b449a6356dcdb505169647f69e6ce315b9468b", + "sha256:b38d53cf268da963869aa25a6e4cc84c1c69afc1ae3391738b2603d110749d01", + "sha256:b7503d6b8bbdac6bbacf5a8c094f18eab7553481a1830975799042f26c9e101b", + "sha256:c07a0c01010df42f1f058b3973decc69c4d82e036a951c3deaf89ab114054c07", + "sha256:cb5ee928ce5fedf9a4b0ccdc547f7887136c4af6109d8f2fe8e00f90c0db47f5", + "sha256:cc45a7189c91c0f89aaf9d69da428ce8301b0fd66c914a499199cfb0c28420fc", + "sha256:d6668caf15f181c1b82fb6406f3911696975cc4c37d782e19cb7ba499e556189", + "sha256:dbb4e1aa2000852937dd8f4357fb73e3911da426df8ca9b8df5db231922da474", + "sha256:de62b542e5dcf0b6116c310dec17b82bb06ef2ceb696156ff7bf74a7a498d982", + "sha256:e1967882f0c42eaf42282a87579685c8673c51153b845fde1ee81be720ae27ac", + "sha256:e1a40a17e2c7348f5eee5d8e1b4fa6a937f0587eba89411885a36a8e1fc29bd2", + "sha256:e63cd2035f49376a23611fbb1643f78f8246e9d4dfd607534ec81b175ce582c2", + "sha256:e775176b5c203a1fa4be19f91da00fd3bff536868b77b237da3f4daa5971ae5d", + "sha256:e77ae69032a95640a5fe8c857ec7bee569a0997e809570f4c92048691ce4b437", + "sha256:e934591a7a4084fa10ee5ef50eb9d2ac8c4075d5c9cf91128116b5dca49d43b1", + "sha256:e98328b8b8f160925d6b1c5b1879d8e64f6bd8cf11472b7127d579da575b77d9", + "sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22" ], - "markers": "python_version >= '3.7'", - "version": "==3.1.1" + "markers": "python_version >= '3.9'", + "version": "==3.2.1" }, "gunicorn": { "hashes": [ @@ -630,11 +413,11 @@ }, "h11": { "hashes": [ - "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", - "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" ], - "markers": "python_version >= '3.7'", - "version": "==0.14.0" + "markers": "python_version >= '3.8'", + "version": "==0.16.0" }, "idna": { "hashes": [ @@ -654,105 +437,106 @@ }, "jh2": { "hashes": [ - "sha256:038091480cd1544e9389b0adbb1b1645a797689dcb68ceae7e45eec96ed24497", - "sha256:0c8e336df8ed1687590695f4469f480eeb4159bf13bb6193791c6530fe114b49", - "sha256:0c9bf2d5e4ef45c1686c6f76935e7ca263f5eae4de92bf5d1873a0e737e4eb7d", - "sha256:0faf6e96f74d27b8ca816b40217904891f91b664ed1c0388737949ceb50ac15d", - "sha256:10ea7f497e6226372e1d4fdbf42c8381f4887819a643ab930bff4072ad298d84", - "sha256:11650f7ed77ee1df30f25d6b3b74b2fa1c94124e074fd455abafea3cbc913d53", - "sha256:12ead3ee3e9c7caa00356b528a5cc7fe210fbe2060628af6e19ed76b8416572e", - "sha256:136b3c5b08883681fcb58f12393a5bbfa422d6e2d5ba887e263e776874276bc6", - "sha256:17d6e1691154ea9f726e43dcb717df48e56c66b5a01c90ad675c6494c36e5be1", - "sha256:19cb987915cc0d321746a12f2a693d087ffb721c37ac9a153cc088c57d4d90eb", - "sha256:1cdf15de698c4026e64fd914fead3180e52bf2a7bcbe44a3392404582dbf2d22", - "sha256:1e81e1c64e33506b8508ba5e3c7c139b2577e78b079c2c16a8e7a02a161f1080", - "sha256:2226c76e4ff2149c5d9f94bed22bf9c4f3411d38cc53d4a7ddfbe0899c8b558c", - "sha256:2837412fb7b684c6ce7392c8bc57440c6dbadaf1bde7a53144381f7df7083c1c", - "sha256:293f0f3da3c391e997e0d55fdb85540e98a8b0406622bb4ba57fb7617697f31e", - "sha256:2b9cc6c0239215a349d28c192fa4c4e7a7348eee7980531525c01bffe39eea80", - "sha256:2f3ad679f84ff236a0d7b71ddc4b3c09fe467abee2f1a86671f0cd417be5352b", - "sha256:358cad2f328c52c15756cf32b0ad17afb0d617e7cdfe93d59aa2616966d825b7", - "sha256:3663712305b509f79c002c8c0ca9994f716cadba576f5a59632dda1aec1ca8c6", - "sha256:41794820ccca039ca2ead6245f30b34601dd1456eee5b5dde620672bb989e79d", - "sha256:44b7e64aff542471c474c24f771eae5efd9152da02a12556f7cb7607020e1420", - "sha256:45770eb0990166026538d3c2fd7d92f17cfde13ca6567570c4baec3ce9162936", - "sha256:498060078a4d1b458e9381fefb027d85329397b50d65287712b3d48233e20836", - "sha256:4c2f18f337c2393f84e45e5011c8b02697b81638b1cec49da60a01b9ed067695", - "sha256:5162d6e475d2762035fb8ea25982bcbec6c58715e33bd0951499f743cd90b110", - "sha256:51e8c890bb59008c95b3a552cefd8bd9ce50a7466a6c920a78cf586e885d7449", - "sha256:56ad3839ac6ac5fd3d023cf59d4b04264b74bb4cb44c0780faf51d6b5ff38fbc", - "sha256:5821638ef0d7c973071810a6786f59b305172197f7e7e469a2ce169e7f4978e3", - "sha256:5ac1b2d379f4d40c13dcce537e69704452943cddbe991fd54a84fdb2da9026d5", - "sha256:5b465d4311b0429fe6fa85df8e2cfcb038c9fface95396dd14e838ecabaaadf2", - "sha256:5d8656b98057329bd03d968aac8d5198389cf51517511295cfc4cb827a507e39", - "sha256:5dcfb3e823ef4b91b70b92848570d1d8cfd584304bd2bd54272dc100c9494def", - "sha256:5e40d23ea43f683f3a7c032dde391104f609b05c21b6d284101120b51dbd50c1", - "sha256:63a01522bde161c713f7fa5ee5d850fee6386fc386073490ebcd438f14579cf2", - "sha256:6b2a3d7756035dde13571f4ad232629b78b7f35c2cd5fda7b464079fc697db3a", - "sha256:6b3be1a6bf6c965aea3b4e3a40df9d2c134c516d89c76cf2b6c81f67e6c5c6ed", - "sha256:6c7bea3357f2dc653756e6da55f66cd21c73d3875c8f3dc4e8d196a876252de0", - "sha256:6e6c8e229507cf29333a2f491cbaa7dff5b8a4a3e613af8090ccce9ce3e4f7a0", - "sha256:6fad27f2a63884ee45d491aebec4b1f38752cd6aaccc625038c21e7f43c02c49", - "sha256:71bfef52547c2b8b145897fa8d1b5142bc52313cfa38c0742e0ef755f0d09c60", - "sha256:72370d312323282b1bf74426e53fae861a310d7ae519b419da46673c38e7d147", - "sha256:76c7d36043a9c478b0c846fcec7da5cb095983722473e503e0122ccd170182b5", - "sha256:78d8a81ef51edb9a2f278a6fb278789b49e304b12bb21bccf2fe7e344f71a9fb", - "sha256:798a6b159ce32181a5e7ab7611c17d1080e74a5541fec47f961b728dab25a76f", - "sha256:7e370567f66a57e2c0e3ae2afcc6f126e1d6babd36831cfd0caad279b05c1c88", - "sha256:8004b845f606b95a8b17efa112aa10b327e46e95dcda604a257b4633d4ed45c8", - "sha256:80b20bf9ea4e709b3b9ae364ac298dfa872b084c186e5c1d60b0b79c79a7ee7e", - "sha256:87303f4bb1b493997f911a4f126123ccd2827d3a2e7dd2390cc6143fbc75805b", - "sha256:8d423f4631395b92dceda39f481a463498131ac02a58581124a44495491f715b", - "sha256:94ee262192db50fb9c069a0be7bb1a426fb1b43af26ce12bf4c6c30e13f46b56", - "sha256:960e4be2e7de340300ab4bcc2b45bed46be1d62330575b8265e6602dbcb9a14c", - "sha256:99397d5e1da6b345cec3e6125e2902b0e6864eb8eaa4be43a2013f059c502c93", - "sha256:9abbb8c1bad08817bad62ae1ea76c01bdbd0ee8c827d05f3ba038c9f6d6f14bb", - "sha256:9c0b8fadf80bc70d341032f92702bda1b0ed78c01e9c495f0df701938c99bcf5", - "sha256:9f977da9abae170eebdcf02bda33727c342fad5dcdbc08498bfdfb6cc6c65489", - "sha256:a6be712ca39d5e9c89b705bc9800be36739436fefb8d0b52b2d332f7d6d22a01", - "sha256:aa434418d6ee44b0ba3a5a407bc9e1543cf496328f43f149e9b58f74a63d5c21", - "sha256:ac4f778e32f7de0ba63346893a4af87c2280ffc1783f594a117be51d908a10da", - "sha256:ac85d65ee369c09b2904b55078ad589961e2e2e03c810963d35a26e6a3931425", - "sha256:ad5d78c664d39960435d4162db31117c8945ba74fb0c414e79ba85a8bdeafdec", - "sha256:ad91f57c3485d87a8edee558dafab0f08c716857d748731c0998dcefe9d3fd5f", - "sha256:afd255d42b340036883ca95bded553b29065b064e2fe5db64ad5988517db9694", - "sha256:b1c2c74f100a0c2110a8e30445554ae331860d32f145c60a2a1e1c27702022a2", - "sha256:b49a8c71378d40d43c6a56eaa536d7823baa43c27c93e082aeb60a9717be0c10", - "sha256:b5f52611323e8e35705e6750a760f32165b41c052d22da154ae343871e7cd50d", - "sha256:b6bf99ae529ac359263269710356d3ddb173c15d8f8dc8849ae794ab811e5cd0", - "sha256:ba361bf87c4701f11241be92c99ef5cf916865dd225955cccb2376bf76717b3c", - "sha256:bc351aa2158575e68943d8e1d5531719ad86bf6607776627ed5a1a60657664af", - "sha256:bd6eb7b1e12e4dd0b75cab1b023272f1333494add5ad61deedac738af1ffeede", - "sha256:bf8852595f5e2d2b072e24c29394b5aca7fba96ecc8656d56660535f9e9872c9", - "sha256:c1dd66541569a2bdbe92589cc96a89f470b20d168f2238fd463e1b59ee3e2d49", - "sha256:c36a7a004cba4e370d0675826eeefe4e42a256638b6b1432263ddb4af317bc02", - "sha256:c886cda61da4d39010be84802bed11bc75f03e8a6094cc18016957a2c80254d4", - "sha256:cc7aa83946f80c66a5d2dea7e165f15aa3eb21e7b74b24d8f850afc0d44bb00e", - "sha256:cea9c4bef70d1358bafec6019164abce362f4de15d79d1ecd64ae31c1749d77a", - "sha256:cfe1951e80869695857986be104a40a1e7fa8ec7de05f86bcbd7bd20854be764", - "sha256:d36cf6f139da3279644794fcfda18af425c8bb122ef9c2e7c762a937bbf7b0f4", - "sha256:d81308faaa9393b7e6ed20718d465c4c2b73c24d5e4826024961acf4b87b1524", - "sha256:db51ea1f9c5ac790848bc271fcdf4108ad1b77a77c6949a96320477962cf7ba5", - "sha256:dd05c18c920a15e00d7a52df37bffd3930fe2c004c690f9422b20e12077e6dbd", - "sha256:df05918a11e1db0198d00486e36673b4b4a89390e4458ff9479b4908dde357ac", - "sha256:e4c31dccf6be131709e545d0258eb5b75c5fac304857ad3976331c6740e8b9d6", - "sha256:e60954d673040430802b29fe5bba698e262182b5ba5f302ff4458e39f8101881", - "sha256:e60e2d2c88a0552e61c37172fe377f6a8abf479130a445314886de4a360ba940", - "sha256:e786f773ddc153846b2ebdb854011cfd1f7c874b8ee79cced3706801341c9f5d", - "sha256:e7cd91548fb95b69edd376f5204e27115ac7d093ec7d80066123a5bdb31c71d9", - "sha256:eaef2ea4f5602aefaaf3d6e8235f3b9ffde35aff15aac1c16cc802f6bbf0a3b5", - "sha256:ec8c5ea93a03775fbadd08462200cf34ce617ec75a032abfa44fd6d3a00e5424", - "sha256:eddeb8574bc9d9abb8491d4a46b60e553c2cea235b80373756acb06568101175", - "sha256:eeb300b0e4b428aab2f70d785cad4306529262af6de8c8c5fe6a4b41a674a434", - "sha256:f39d71ece8e97cf069e4154868eaac1256b133fe23e0459829432e4bb6406472", - "sha256:f4840ddad2b9d53710e92361391944da89e3576641a290066a1719520059247c", - "sha256:f70723a00bcbce0f9a216853139955be45da35741335eb3afead304e77662560", - "sha256:f829cf2ba5b553e6529d6238928c07096f1feb47f4ad536b7f06bca6cc77173f", - "sha256:f96386910467725895f7972939a6faabd6e96b1de0cc2c092e4bd2c40e956e25", - "sha256:fe259a9d6f555bc79aed9bb4b9a7fff73db443b4c483e4a81a428c8a2860428b" + "sha256:02015fd68d73cfbe623c7ee93130dd8be53f9eed5cd644fce12d298929c6a15d", + "sha256:0fc980bc55ec4de7b696aab45b1e8d89465608f48f1ba06db1184c2cb8e4ff82", + "sha256:1005f57c2866305432588fb001e6ac9f99258cf2620ff1f93f6eae2c164db403", + "sha256:11909c2a63d342bf84211673ced4ea1a7c701362a375e1e2308e613535ba9865", + "sha256:12c9a67a94c7b0b1bc15f90e57647f5b73e3d8e67a117f649c67b7aa71664ee8", + "sha256:162396cc26bdab52818b9c2926fe75533b0dc6dfc0db90779807159eff896c22", + "sha256:1643f6ba8f9fbb03b933cca8dd84bec19f3f33acab513e57e083ebe9462a4ef3", + "sha256:16cbfcb2f9934e7693eef985f1e4bf64ff1d533dbc9cca4554a7e24804170e4d", + "sha256:1a52ef916d076842ba1252fc9d0fe78ec0ea93d4b2985ae46b3b0f05e6b3348f", + "sha256:1e9ff345926c4ac650acea101463b4f8468f5069dda136366585ff7ce4aac38c", + "sha256:1ed0cf5558d4d8cbb2b8a407295ba101a79686ff452fb2ab5fac1c6b9ef40d79", + "sha256:20b3d8eb3469c2c368cced0da918b4e8ff8e91f2a48810b8242dd8a8ff0de0da", + "sha256:2138ad06e011cb0ebc00f7485377888f0c6f076b1aa21f167d7cd5adf8f85ca5", + "sha256:23df2b4433ebf275e096c66fd4fe2a27d8d802fcab8ac49ec856a168808b7ad4", + "sha256:28b5a1c3aa84f09ab2b004cb9e16bc13a798933607806bb5ec5a38e1406d7e19", + "sha256:2a76f29548199744b210308aac184d897bfda4ec7300ce1d4b9a498874aeceab", + "sha256:2b2768b896e0351328a7f6377d77d21deadef5a50afd84bc66995a8323faf921", + "sha256:2f2f8fba36fd9c9463cc55a27957735f46e9b4d3551d4bb7fd9539749d141647", + "sha256:33bf11c9f6b6308823147e8d8da0828b5e7f330399a5b12c08c586e798119195", + "sha256:3451a18af56eb324b438721107922bead16a6427935a7f33cdf66423f7579b39", + "sha256:34f88cff35a18b7b74579ab08272fdf0a4ef92fcd119fedda010d0e234339bcc", + "sha256:36e26dbfcee621001a6abeabc9e24a38c347f63c630d20557d98de427305ac0b", + "sha256:37cb6b97e577fb4079a3b37ae6037ceb16ea6f267b0d94a1aaddb15e07217390", + "sha256:39da0fb5f29bae4158052c4515d38d0c1636dac484d2fd1a621ff76d206d217d", + "sha256:3b51280e4721f761d753da5b8c1c66db60b52f1ac239f808049bdc3676bb49a1", + "sha256:40276a7aec8f1c3e8f9363d58ce8e6272e8c8bb6253cb9a602aa8023e359c977", + "sha256:423a64f75d4a9dd619054eb0574b94feb93a5fc9dc3173e97e3d469a12e979a2", + "sha256:4bed27b58c97ceb8dcdba6506ba266f39d67736ee5ab33ad19573d983b4969d3", + "sha256:514bbd814696a39579cfda789ac830b7e1ab6e3409dcc06aab7a161ca0a81000", + "sha256:557c23250afa4a1432fecd14818d3ee1e46d9b229c292b6214083789bdfb135e", + "sha256:5756c58005a2773cd692beaa9ad31a2f15781a1ffd1cd6346bbce7072bd1b280", + "sha256:579985e10c39df85246d8386484abf3315cb3802a0e1fde09923ac1f8810f5bc", + "sha256:5fb48c8cb7b24a1f4122de052a482bec46e58626cf3f1fd0ca0accbd9fd97d3c", + "sha256:5feec0be4b56987c4c68be7d39f696177d714a70a35c93a68776a1dd6116d314", + "sha256:601f8a1ac81e2a4d830acd6d1d248b32e9e34a6d3dc0987f7b0af60c1427dc4b", + "sha256:6056d8c64a3863327859b5999eb8e83b7ef591db276148c0724da33e83659c18", + "sha256:607f5fbb92132e61959904c25a88f381be4559b566e03243ce5f71332f40e14b", + "sha256:65a7a4efc2a937af2b00f8d47812b4b665ce7a1e5bf91c9741166c5804f6ff2b", + "sha256:6639f549083a17a902fa51116882962708f2e44180cebd0d311548383fbfa616", + "sha256:66ca52ffdfd19e16f2a05b3761a013337b2d937385be52ebbeec6906dc68b316", + "sha256:6d1d55d29fdb8721b6d590cd5167c2d78d94ee0020e3bd2887cefeae90b4f3b5", + "sha256:6e61235c0f24cb2c4ee8d9d57efea80c412e9f12627704c2924e8f8097ddc2f5", + "sha256:7066220730be2da6b5e85a5a12b60728fab3eee79265de7f65effbdcc3af17a3", + "sha256:71fe5094f89c1b9147eae3662e6b92dae845a583e06e603bc4d79f9cc3f20693", + "sha256:747d0e9e3200cb883f2f8c2a8a7b7ec150e5f84e966c921d50e5194b8db81594", + "sha256:7b72ed5aaa1f4160d9ebed48013194b92baf3a14dfa22b2fd113b17c976c34d5", + "sha256:7bb2e761ce3692e54a2c61b8e57f0abdd970a653114ca5c3a12acae4f167199d", + "sha256:7c74fc0fab0d903f4736972f64e0f277f632e9766d4558911fd46abfe955e231", + "sha256:7d9d4d83fbf75362d0986ee4305ec85eb06ed124e299d38af5ed4eb20ed0cc74", + "sha256:7f87be4eff3f1e6821ce0ae085126aba46b77895d6aaa3a5bf2c6157fd121923", + "sha256:88aba8ef44162c96083690952e6ddde1b044957125ac67e3b92a87fd72407eff", + "sha256:88d2bbcbdb149101f0f211aa870ce18dfb563f62f10eecf834101c8b9cbcd145", + "sha256:88db9078be359ccdea973c99ab88a0312012d40fe2878ff106dfe3fe918bf5b2", + "sha256:8aa82f946aebf69b38f0537fb51577284d0caa351ce096a0401ed27129ae9b3c", + "sha256:9794c6b1ff04d8d6d1764e7490b34fc5a3435583672ca5466f39fa3640dafe54", + "sha256:98c4613061269dd0c201441e31d83bbf36493fe1482648f31fd62628346af1e7", + "sha256:9c6cc4f3d4d237184030ffd3721a8f59fde97f5f1cdab1547d2bb0b093250427", + "sha256:9dd0faae92a299f0b960d46aef675df2c118e26299ae9ebac4ec7051fa227c35", + "sha256:9f5d30e46bd8a01b646825a2157a4cb1d98c8eb01ffe80ac379ed791ca639687", + "sha256:a35be731dc0889c2689c66c05023390e026bdbbfdb47da214d99bd1e1c25f8bb", + "sha256:a54d437f3bd120f0d2971ea990e665d3487e252f2453618fd98196404a04f90b", + "sha256:a86b2ddd8e1671f24111fbcfb1db7fd2b6bf4cf6ad7966c370e3bc5342a51977", + "sha256:aaa3ddabe69cd09c7d2cc5b06ff428125ecb47a04d3ac1941ff86017b87f4063", + "sha256:ad37a22911f1e87b53b236efd02dcf17c23dd7de87b0f079e971a14d33c0866c", + "sha256:af00e2a680e89ceb8cf41d221a4d639be4c4212a2c7ab933155b727fd3dacbac", + "sha256:b02dfe24a1c4b2169e182d12a0b52516809fb608252dc384d437b99ef4b84de0", + "sha256:b6c7a988fe6b4310d045147966c5f82bb1493f3a2c8b1d9580e7c872ed80faaf", + "sha256:b75fbdb62ddeb6aecaebb9bc601ff75b36d2b69cc8e5841d75c375b96f02ea7a", + "sha256:b7fcc7a55a11ce4f2d588cb0b9746b8f3b753d080326e7b8395b3398ae0c0188", + "sha256:ba2de41d4946fb2ddde7af9b55b31fba0f8c6a26f15d7e281e59221337d6b37d", + "sha256:bc8c07c8ceea477e7a10d899eacb2c0cf4c59d595c9316a6b5c2063378d34f20", + "sha256:bec06ebc7d37beba62503c955d90580cfa1e5fff2b44f05cebecf2378b7f54b1", + "sha256:c3f3e88960a265116b8a972fc7ceb5b534b5a1730d581cd5fbedea90212f79de", + "sha256:c595c46f2fe39f235a463796c2ff80889a5d61c99db94235c8d2d7f654f04fa3", + "sha256:c725e40e881b8e35381a4d2667f4c3ad978929fb890c1822f8524e3d6846ad49", + "sha256:c90c141a4edd6ac99780b77abe7132d48d5e0fee7741ba2e217a53a503833441", + "sha256:ca2381a51ea8c1261c70ca33181c6557aacd8a06bea73d27dbef053243fe8ca7", + "sha256:cb063308aeb5f103f1c82526b02fbdb464a0b42f00ebf927dc9dd8b76b37bfda", + "sha256:cb843586cac2e0663804777ca5efa5d7b565bcd824da9b2ee1e98cfbd7d8382a", + "sha256:ce5707b2876e421080fdfb9d89752a1d111f57d8f3cddba57c24d93f17aa2074", + "sha256:d6802287d937f2cdb7ff8ca47c7994d4f8c06b7f0b67f138b8a3152de3c624cf", + "sha256:daa2010e0c1c1de21c0e6128571f609e690fcfcb174f75090b8863c16b3aa12c", + "sha256:db35002d92896783277c88d3aac6b9d33cdd65f2323dc786100a661723cf442f", + "sha256:e1adb17a5614d372d2b42b876542ba7a790e77cbbd674620aa920eaa27483165", + "sha256:e2ec53d084a147a6092ad748406310b3789ea252b3a007c8653c71cad9656d8d", + "sha256:e2fea0793376ab9aeb3258d1c192e0ceebd9b51a2f699379224d4f2ca473645d", + "sha256:e409f64962ab74da170fb9085ba17668c9e8da3efa6b4dc5e6084dca702954a1", + "sha256:e7bb595e9d9eeeef45d630766fd3d8c926a25b907631fc0f36411f5f576bb960", + "sha256:e852f812ea8323e269722653ba1bef6a9e5b9e496d5c8e52178b83d3ae435791", + "sha256:f1137d66f4f0670a21d8f146f7cce7282ca20dac8705b11c0bf0d9ac450ad206", + "sha256:f2f5e0cbbac4d158b68e2706a18c5494c0c72908f5d572f934ae6b440cf917cc", + "sha256:f3d028980542939c54e604488530c592fb172c6f48bc5262ba9ac205e8f5b5a7", + "sha256:fa57efb9974a3a36d3396212a43d7a8c68a4de616587cdb36ea2e1ff4164fe07", + "sha256:fb910f4d0791417dc983649145b6d18fd61fd7e7ca019635b79e30acf4daa1cd", + "sha256:fb91f22b639642dd2bac71ac40a7e8082470c9647db7003fdbe63e7ee9db851e", + "sha256:fdddba0689058f3faa5e7ffaaf039aac62dc528ec3e5f031a1e5a81392737237", + "sha256:fec6c5019a22848d092fcfc63cccee76b64ec7b1c7d5495b0b524c17327917ff" ], "markers": "python_version >= '3.7'", - "version": "==5.0.8" + "version": "==5.0.9" }, "jinja2": { "hashes": [ @@ -772,11 +556,11 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" ], "markers": "python_version >= '3.9'", - "version": "==2024.10.1" + "version": "==2025.4.1" }, "jwt": { "hashes": [ @@ -861,116 +645,6 @@ "markers": "python_version >= '3.8'", "version": "==3.1.3" }, - "multidict": { - "hashes": [ - "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", - "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", - "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", - "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", - "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", - "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", - "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", - "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", - "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", - "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", - "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", - "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", - "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", - "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", - "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", - "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", - "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", - "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", - "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", - "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", - "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", - "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", - "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", - "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", - "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", - "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", - "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", - "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", - "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", - "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", - "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", - "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", - "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", - "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", - "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", - "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", - "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", - "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", - "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", - "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", - "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", - "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", - "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", - "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", - "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", - "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", - "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", - "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", - "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", - "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", - "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", - "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", - "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", - "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", - "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", - "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", - "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", - "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", - "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", - "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", - "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", - "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", - "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", - "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", - "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", - "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", - "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", - "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", - "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", - "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", - "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", - "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", - "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", - "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", - "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", - "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", - "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", - "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", - "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", - "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", - "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", - "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", - "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", - "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", - "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", - "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", - "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", - "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", - "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", - "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", - "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", - "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", - "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", - "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", - "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", - "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", - "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", - "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", - "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", - "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", - "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", - "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", - "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", - "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" - ], - "markers": "python_version >= '3.9'", - "version": "==6.4.3" - }, "niquests": { "hashes": [ "sha256:68e0a7e9f338466b3606945fffd11f75e3c90af7498aa9336ef03812323b7e36", @@ -981,64 +655,64 @@ }, "numpy": { "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" + "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70", + "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", + "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", + "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c", + "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb", + "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f", + "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", + "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26", + "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", + "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b", + "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", + "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa", + "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", + "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610", + "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1", + "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906", + "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073", + "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", + "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88", + "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", + "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e", + "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", + "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda", + "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", + "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", + "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae", + "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d", + "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3", + "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57", + "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", + "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", + "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", + "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571", + "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54", + "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", + "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", + "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be", + "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8", + "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd", + "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe", + "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a", + "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", + "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b", + "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", + "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282", + "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169", + "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", + "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e", + "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", + "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7", + "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", + "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba", + "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc", + "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051", + "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175" ], "markers": "python_version >= '3.10'", - "version": "==2.2.4" + "version": "==2.2.5" }, "opensearch-py": { "hashes": [ @@ -1051,11 +725,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pandas": { "hashes": [ @@ -1129,110 +803,6 @@ "index": "pypi", "version": "==0.23.2" }, - "propcache": { - "hashes": [ - "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", - "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", - "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf", - "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", - "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5", - "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c", - "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", - "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", - "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", - "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", - "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", - "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42", - "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035", - "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0", - "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e", - "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46", - "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", - "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", - "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", - "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", - "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", - "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", - "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", - "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833", - "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259", - "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136", - "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", - "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", - "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", - "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", - "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f", - "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", - "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", - "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", - "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566", - "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", - "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908", - "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf", - "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", - "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64", - "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", - "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71", - "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", - "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", - "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", - "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5", - "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894", - "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe", - "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", - "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", - "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", - "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", - "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641", - "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", - "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649", - "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", - "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd", - "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", - "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", - "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229", - "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", - "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", - "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", - "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", - "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", - "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294", - "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", - "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", - "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", - "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", - "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", - "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7", - "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", - "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", - "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", - "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", - "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7", - "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519", - "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", - "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180", - "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", - "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", - "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", - "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", - "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", - "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", - "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", - "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6", - "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c", - "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", - "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", - "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98", - "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", - "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", - "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", - "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", - "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", - "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5" - ], - "markers": "python_version >= '3.9'", - "version": "==0.3.1" - }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -1243,116 +813,116 @@ }, "pydantic": { "hashes": [ - "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", - "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" + "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", + "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb" ], "markers": "python_version >= '3.9'", - "version": "==2.11.3" + "version": "==2.11.4" }, "pydantic-core": { "hashes": [ - "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672", - "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", - "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", - "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", - "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", - "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", - "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", - "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5", - "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", - "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", - "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", - "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", - "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", - "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", - "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", - "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", - "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", - "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", - "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", - "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", - "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", - "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", - "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", - "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", - "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", - "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", - "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5", - "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5", - "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", - "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", - "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", - "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", - "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33", - "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", - "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", - "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2", - "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb", - "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", - "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", - "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", - "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", - "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", - "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", - "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", - "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331", - "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396", - "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", - "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea", - "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b", - "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", - "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b", - "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", - "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", - "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", - "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", - "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", - "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", - "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", - "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", - "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599", - "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", - "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", - "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6", - "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d", - "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", - "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5", - "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd", - "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", - "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", - "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", - "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", - "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", - "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", - "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", - "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96", - "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", - "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", - "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824", - "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", - "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", - "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3", - "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568", - "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", - "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", - "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", - "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", - "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad", - "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", - "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", - "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", - "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", - "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", - "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", - "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", - "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", - "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", - "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", - "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", - "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091" + "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", + "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", + "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", + "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", + "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", + "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", + "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", + "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", + "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", + "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", + "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", + "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", + "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", + "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", + "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", + "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", + "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", + "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", + "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", + "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", + "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", + "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", + "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", + "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", + "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", + "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", + "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", + "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", + "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", + "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", + "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", + "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", + "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", + "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", + "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", + "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", + "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", + "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", + "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", + "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", + "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", + "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", + "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", + "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", + "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", + "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", + "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", + "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", + "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", + "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", + "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", + "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", + "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", + "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", + "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", + "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", + "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", + "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", + "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", + "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", + "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", + "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", + "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", + "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", + "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", + "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", + "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", + "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", + "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", + "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", + "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", + "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", + "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", + "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", + "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", + "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", + "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", + "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", + "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", + "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", + "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", + "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", + "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", + "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", + "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", + "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", + "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", + "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", + "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", + "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", + "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", + "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", + "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", + "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", + "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", + "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", + "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", + "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", + "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" ], "markers": "python_version >= '3.9'", - "version": "==2.33.1" + "version": "==2.33.2" }, "pyjwt": { "hashes": [ @@ -1455,104 +1025,104 @@ }, "qh3": { "hashes": [ - "sha256:0125a69720b3a436fbf3ce1f5e4c7a8b48858360e037bfab19cd16465d9fe325", - "sha256:0561f53b5d3727d2306762ee9d03381763febf34bab2ced8490ad57c6facb025", - "sha256:0af6d7b5a02da5e53f2534c051e05f7a895c4842735d2d83e546962534fbfe7a", - "sha256:0b9d66f05d396b7ab49aabbd7ecfa8248e2be6afac49dda80cd5ddcc509a5183", - "sha256:121ddb3d5b98a4a91636b1609d5de5e3026dbe45b8c2036bce38be5827be2e49", - "sha256:1ec470854283a88364549019aa59eb0a97f3d394cee4df90a7279fd9ec11b8ff", - "sha256:1fac05a823b7d244a44b5f1e14c8afa45488e8b9bfc7bf4f3e7f7bbe82b3f7be", - "sha256:20b6f7423ce21649aefb0cc5085620c2a9fedcce5ae8c3d85fb65b0e8814706a", - "sha256:236e9fda8ebab9f8295a9161a02c387d21a9f08d87da1880ff26c983c84db073", - "sha256:23dd497adb4278680c25bcdaebadbe04e6b2a8922e6e9d61e2697452a1a762ac", - "sha256:266a000569966f44005a43002ac6bbadd82e48f9edab2c024a41210dc2f3e7c1", - "sha256:2759963b4c6882d935bdf0acbaeed7d3ad60ccdcf9445481ca9681f534d30907", - "sha256:2bae7c280599ee9c97406d165ede9a1f7a54a59d4770d0d4d951e85132adc192", - "sha256:30778f9028ed4dbff9d395e14b0665358446dd1c0797f8053eb71b6bdb7f7ed5", - "sha256:334955044a5d9458521f054748d8fa6830d3cea4c5af8803846d1211536375f1", - "sha256:390ee1a67c377cdb3b97e4d12da1898fd2d0355fa56296df980e8a559a943182", - "sha256:393a3a63c6b6ea92663ed6009d9fd317d03dd5054e68f43428eb4f683ef1bd64", - "sha256:3cb8ea722dc62e953437163a2d28251b9588210e96e629847e66b845bc28ca9d", - "sha256:3cc67e18046d274b38a77331b776d07087e1f96ee31525a977798fa975a653ed", - "sha256:3d2ebe0176e82104aa19bf25b4cdb9630bb5e3d7cb7771d18a474d34927f39e9", - "sha256:40bb818fbaa01cdfcbe9db4bc1deb43ecd5461d2a124af2ceeb2adf4ddfff605", - "sha256:446a4f6adfb41aa769083417e9eaed89f5af5b60051a4ffab4aa78aecd966f3a", - "sha256:446d288ce2c29c542f86ce13912c15a862571455c0bbb067ec2e7966ea90d55a", - "sha256:48e2cabaa621ae34cd98caaf1b114fb6ce893ef5d222189eff1edea285073519", - "sha256:4d9911d8684a5f45e4f18a744577386e60287cf18a0196dff88ffe9152410ba4", - "sha256:4e5bdb8ac8a6770fa6c4940bee92db6c1eebce51ef856a65038207dfb84013d9", - "sha256:50f8dd5b7423eb3c8cc74d0fd9b5df1214afe3bc9b86f9043d9721d5e722ea78", - "sha256:51a55d1a1b21c54ed67c65bf6f9a4e8aabb616579518062f4d7c0ea883fdfa34", - "sha256:537386ab886915d9a7abb5c7754aeef8e07ac04a23c5a3cc6a0a9a9f2c0fc6ec", - "sha256:55b9cdffa46ef9ad2478e5cd38bfc2d582da07a40a75dc4d02a44499409a983b", - "sha256:56a444ddc7b8ca670c81b333639a8a059b0eef34801ee528a4598b1e130b99c9", - "sha256:5d6eb5574be188181f8af56e2593daeca26c81d805752a5589039d7e1abb7e04", - "sha256:5dd7b2cc5169ac63e2e3b2ce913e5a8ff88da1f3658bbfdf1d0defef4e8f071e", - "sha256:5efca680dcce979355cd4f11b1270383869a21ac57b7b54a7074b2d0ad732acd", - "sha256:5f26bf8f7d3af25baae0e54523304d205f187643b60f1cb002356dbf81a6a6e8", - "sha256:62c1c38258ddb949f068cd1b5b19a6f33d3020d1864b5aafef7e5ddad04ed3ce", - "sha256:6d82486d855b03423b7ccb1c176b511a490568de3565b5632d139f092f7d6852", - "sha256:70c26db8495acd44adab970df902a5446566eb5e10265b6bceb417cae051a1d8", - "sha256:7172f94689f75f5bdf71656707af138b6429496ce6943839e2b275dadd270e7e", - "sha256:72d883bf3048375aaa6283a8c7dfa98764ec014466589408b66a7b520b5bd08b", - "sha256:7417e76526930a81db7dffe9b7178ca8d62f470aabe98264d131222404a77b11", - "sha256:799c20c623802eb9d74d0de7b698bc9822b8949d724728cfad3d787b3f076973", - "sha256:79ca66272b93ad9605e1f510a2f98660a2e5afce395d27ec877e41e6db718562", - "sha256:7af0facc1843e390752dbffa34975ed6ebfa0d614e87f2b21730b81e324524b6", - "sha256:7c7509a10cfb8d0b7f611c598c9a22154505b4cf653fab5900378807958db611", - "sha256:802ca75ed7c79c7e2bf7ce92c038006b8c458dccbd4922fac05044ae7e6db9fb", - "sha256:8688dfc27bfff0e0caaece83e9b1b29605a41fb582df924a9b5486cf19d667fb", - "sha256:8b70f085cbfd5685e4d923d451302934897a0c9e8707e1dd9c4955aaea254f87", - "sha256:8dd09a4559fc689a52b9712e4887fcf5f930633d14a463de05380bd01da27529", - "sha256:8e84916b4b1a7f397de0ff9870baff5a5b5b59841a55d3e3ae5759d3b490f653", - "sha256:91d6a93b5c370d014f87b50a28e6cda6b2391eb8e4c6129f431e0797b721d396", - "sha256:9c4d198f84d77931f2a20339f746d8e9f3d9f202b85c680797945efda2cdb122", - "sha256:a0ad122255a9600918af163d55c62d2df5364967faa29f1256bf46e6b565cd5b", - "sha256:a3cd011751106526fe7fd7dfebc6381ce360fc82a67a030eaa88f374d589570d", - "sha256:a4143112727ebfa554c6b484bc4b84344c68137af77159fca28360f52ee65880", - "sha256:a527160ccbb9dedb233aa477a59c33b15fd59516c5774657e2d5686296f18528", - "sha256:ab29da155e5d858b4f5d1f52726bbf183b737bf96b5dc35e45ce5bd7e8fcef41", - "sha256:acf34cd529a0499abc5eef651baf25f6eed42c35d878872bbfd07fbf7e9a85f6", - "sha256:b22c709f5774d9fe6b25c4369fe1e6e5c80c47fa97e5a782a0a82c781c45b580", - "sha256:b26c3de5a2cb48480e62ded0c46f58143791b57a2031b954e116a21f6a810a14", - "sha256:b46946d5f60bbc43ae31f267cf607443de63c33d8b3b516bc2c0ee34dbeadde9", - "sha256:b5104913760767bab5369f7fc283cdb8a6cdf3da38ef645af14411e4096456f3", - "sha256:b72d0b5b3e9d2aa3cf8cf689b2dce7eed401d8bd7e1adabd224d5ae41bb1c873", - "sha256:b811e388e48e386f7f35005c6f3cfa099ddf1eb35f0592dc6266dfb7e53e1760", - "sha256:cf1fef4feaba719974aa4421acbf373f83669b2c4c51747415076f40ff380de3", - "sha256:d1a21656bb7ff6150e8a6dd4eb6327221521b9942239e7ea7d62660185b1114a", - "sha256:d28a94ce57860103b2e2a1aae071fdd47c2c6b84ac88f18ef1eb4e47fb59f9cd", - "sha256:d482c8d92e137f7227aebe4f49c9add93cdb0ae032bf0a8a00bdda5157239483", - "sha256:d637c80cf19b2738413f2b694d3b3a69f0a2d68eb00489bb51b9dd8b78e8e8ee", - "sha256:d74018ef46ea1ec16b8561d1a3f7dd4c8628b6e3f63b80d364e8bbea0bae1de3", - "sha256:d7ac6781c945b05f06cb237ef99ef63b21f578e973dcda72b363931d5c4bf453", - "sha256:d7b35a5d79eb78ca2bb8490f4a3c6948dd5c6e9c8884241edb8597c0c4135fc4", - "sha256:d7e71a3e2d0116408d1f7a86b415014677fa4d6c3a873cf7344123abaf97792e", - "sha256:da5b5bdbfc2bfc2ed8af4dbd03a7dd1612acf64ca62ca1b4fca1292807bbedcd", - "sha256:dc0eee7abd896f0e8d483d7d129b1ff201bc6a358b2a6b6e41f95af41c62956d", - "sha256:df1866347cab2b97e427d61540342b58461797ca30a573a4ee19dd9ddd932fd8", - "sha256:e29c30106bccef52764ca5003be91001a28c132ff47a03caadc9ed33e66d5156", - "sha256:e44345527484f7cf0674788c78d44820bd499d04c42bff7984fd1f9bbf962964", - "sha256:e462cb1a4ba08cc17da3e7f6431d666518ef38b256322812a47272f8c4157e88", - "sha256:e4b607940929d9151c3d3bcce4d02cbebdc246a17afd16dfa32d2ae1ab1fdc01", - "sha256:e7f9ee153dd48804d0c3070c7c52f8863cf7e903ddecc5646a1e1798b2e41389", - "sha256:e948de73b71a35910aee9e62acbabf56c7ecba29da83e99f740bd37d36672d41", - "sha256:ea099fba44dc4ee54254fc9c9d9a51beea62f5d25266dc2b0eb3e1762505704e", - "sha256:ea238a5e3e140104917781c4cabaad42e26a2ddc973899f2d3af295c4cc9e061", - "sha256:ed5c9c36dc3a6ebf0981bd1e03cecebb4d51c58bce95485172666e3dcbc0973c", - "sha256:f2f119969e68bb7dc599c19768424894d65700ed2f35966fb5199a453a1086bb", - "sha256:f3082c67d6a7e3333e2232054831dbf64f2b18ae2df05fdcd76e483d306e7f01", - "sha256:f455446bd7425b17f3f6a6d915c784e83cf058259f58573db5413b7507acf586", - "sha256:f45d81e4e16cfce039788c0e44f8a5ad57fd6d303799a98866a3ad28bf9eeccf", - "sha256:f46929f9a4eae5f95fc8a2be1ed123c5e2f48621128ebdd296a77936328e59e7", - "sha256:f52d237553488dcf07f0a6297a5f3497ea3a616e996176840c4cb2c47765b9fd", - "sha256:f6e4d1f11e119673a0ae79ee749a93907d8e932cd3172d9885c4663511e6cdac", - "sha256:fc7d0b3ec1130eade130abf8434a319f86fe4a3d85861ab4b6fe08fc09b6497a", - "sha256:ff0a911de71092966df1abfa6a35180f703fe81e01dc317729132f89e22d6c46", - "sha256:ff222c695872ada25369a3ee4e3e3a0fb4ecfe4396aef3900789a0f128a24f16" + "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111", + "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46", + "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337", + "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41", + "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2", + "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846", + "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d", + "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff", + "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf", + "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075", + "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac", + "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e", + "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6", + "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4", + "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865", + "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff", + "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072", + "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52", + "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435", + "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735", + "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f", + "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517", + "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57", + "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244", + "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74", + "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976", + "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3", + "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36", + "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663", + "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956", + "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6", + "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca", + "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d", + "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b", + "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908", + "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147", + "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d", + "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590", + "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652", + "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c", + "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568", + "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2", + "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f", + "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b", + "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522", + "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70", + "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339", + "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163", + "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099", + "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20", + "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be", + "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a", + "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203", + "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85", + "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404", + "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede", + "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf", + "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972", + "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6", + "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d", + "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65", + "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435", + "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb", + "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97", + "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c", + "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34", + "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d", + "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df", + "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35", + "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2", + "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822", + "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1", + "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca", + "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d", + "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66", + "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4", + "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38", + "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88", + "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504", + "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4", + "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93", + "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e", + "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8", + "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58", + "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857", + "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a", + "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9", + "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70", + "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91", + "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416", + "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0", + "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f", + "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869", + "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943", + "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d" ], "markers": "python_version >= '3.7'", - "version": "==1.4.4" + "version": "==1.5.1" }, "rdflib": { "hashes": [ @@ -1779,22 +1349,6 @@ "markers": "python_version >= '3.7'", "version": "==0.41.2" }, - "tinydb": { - "hashes": [ - "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", - "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3" - ], - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==4.8.2" - }, - "tuspy": { - "hashes": [ - "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89", - "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==1.1.0" - }, "typing-extensions": { "hashes": [ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", @@ -1829,11 +1383,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:2468dbd8902f5696070f6cef78bacdc9448c49f974e94917d49fc07c31c704af", - "sha256:e5cf749b7861d3006d9cead2ac742f0f9d8880022b62799689cb2c4134dede6f" + "sha256:642b235a89cbddb7a3c6703a11fd0255473231be791214fd01abd465371ea8fb", + "sha256:a4f2a94da920f62f4c957931d3a1cc364efdd0fbb984624db7ad7347aa27afad" ], "markers": "python_version >= '3.7'", - "version": "==2.12.917" + "version": "==2.12.920" }, "verlib2": { "hashes": [ @@ -1946,109 +1500,16 @@ ], "markers": "python_version >= '3.9'", "version": "==3.1.3" - }, - "yarl": { - "hashes": [ - "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", - "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", - "sha256:0626ee31edb23ac36bdffe607231de2cca055ad3a5e2dc5da587ef8bc6a321bc", - "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", - "sha256:0bae32f8ebd35c04d6528cedb4a26b8bf25339d3616b04613b97347f919b76d3", - "sha256:0df9f0221a78d858793f40cbea3915c29f969c11366646a92ca47e080a14f881", - "sha256:0e617d45d03c8dec0dfce6f51f3e1b8a31aa81aaf4a4d1442fdb232bcf0c6d8c", - "sha256:163ff326680de5f6d4966954cf9e3fe1bf980f5fee2255e46e89b8cf0f3418b5", - "sha256:1efbf4d03e6eddf5da27752e0b67a8e70599053436e9344d0969532baa99df53", - "sha256:217f69e60a14da4eed454a030ea8283f8fbd01a7d6d81e57efb865856822489b", - "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", - "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", - "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", - "sha256:30eaf4459df6e91f21b2999d1ee18f891bcd51e3cbe1de301b4858c84385895b", - "sha256:32ba32d0fa23893fd8ea8d05bdb05de6eb19d7f2106787024fd969f4ba5466cb", - "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", - "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", - "sha256:3b77173663e075d9e5a57e09d711e9da2f3266be729ecca0b8ae78190990d260", - "sha256:46ade37911b7c99ce28a959147cb28bffbd14cea9e7dd91021e06a8d2359a5aa", - "sha256:4815ec6d3d68a96557fa71bd36661b45ac773fb50e5cfa31a7e843edb098f060", - "sha256:528e86f5b1de0ad8dd758ddef4e0ed24f5d946d4a1cef80ffb2d4fca4e10f122", - "sha256:545575ecfcd465891b51546c2bcafdde0acd2c62c2097d8d71902050b20e4922", - "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", - "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", - "sha256:57711f1465c06fee8825b95c0b83e82991e6d9425f9a042c3c19070a70ac92bf", - "sha256:57abd66ca913f2cfbb51eb3dbbbac3648f1f6983f614a4446e0802e241441d2a", - "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", - "sha256:5864f539ce86b935053bfa18205fa08ce38e9a40ea4d51b19ce923345f0ed5db", - "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", - "sha256:5a70201dd1e0a4304849b6445a9891d7210604c27e67da59091d5412bc19e51c", - "sha256:5bc503e1c1fee1b86bcb58db67c032957a52cae39fe8ddd95441f414ffbab83e", - "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", - "sha256:66fc1c2926a73a2fb46e4b92e3a6c03904d9bc3a0b65e01cb7d2b84146a8bd3b", - "sha256:67a56b1acc7093451ea2de0687aa3bd4e58d6b4ef6cbeeaad137b45203deaade", - "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", - "sha256:6ba0931b559f1345df48a78521c31cfe356585670e8be22af84a33a39f7b9221", - "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", - "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", - "sha256:75460740005de5a912b19f657848aef419387426a40f581b1dc9fac0eb9addb5", - "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", - "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", - "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", - "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", - "sha256:7e4cb14a6ee5b6649ccf1c6d648b4da9220e8277d4d4380593c03cc08d8fe937", - "sha256:8015a076daf77823e7ebdcba474156587391dab4e70c732822960368c01251e6", - "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", - "sha256:8346ec72ada749a6b5d82bff7be72578eab056ad7ec38c04f668a685abde6af0", - "sha256:85ac908cd5a97bbd3048cca9f1bf37b932ea26c3885099444f34b0bf5d5e9fa6", - "sha256:8b3ade62678ee2c7c10dcd6be19045135e9badad53108f7d2ed14896ee396045", - "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", - "sha256:961c3e401ea7f13d02b8bb7cb0c709152a632a6e14cdc8119e9c6ee5596cd45d", - "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", - "sha256:9973ac95327f5d699eb620286c39365990b240031672b5c436a4cd00539596c5", - "sha256:9ba536b17ecf3c74a94239ec1137a3ad3caea8c0e4deb8c8d2ffe847d870a8c5", - "sha256:9fac2dd1c5ecb921359d9546bc23a6dcc18c6acd50c6d96f118188d68010f497", - "sha256:a251e00e445d2e9df7b827c9843c0b87f58a3254aaa3f162fb610747491fe00f", - "sha256:a39d7b807ab58e633ed760f80195cbd145b58ba265436af35f9080f1810dfe64", - "sha256:a5288adb7c59d0f54e4ad58d86fb06d4b26e08a59ed06d00a1aac978c0e32884", - "sha256:a626c4d9cca298d1be8625cff4b17004a9066330ac82d132bbda64a4c17c18d3", - "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", - "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", - "sha256:aad67c8f13a4b79990082f72ef09c078a77de2b39899aabf3960a48069704973", - "sha256:acf9b92c4245ac8b59bc7ec66a38d3dcb8d1f97fac934672529562bb824ecadb", - "sha256:ada882e26b16ee651ab6544ce956f2f4beaed38261238f67c2a96db748e17741", - "sha256:ae584afe81a1de4c1bb06672481050f0d001cad13163e3c019477409f638f9b7", - "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", - "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", - "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", - "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", - "sha256:c4228978fb59c6b10f60124ba8e311c26151e176df364e996f3f8ff8b93971b5", - "sha256:c515f7dd60ca724e4c62b34aeaa603188964abed2eb66bb8e220f7f104d5a187", - "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", - "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", - "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", - "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", - "sha256:d8717924cf0a825b62b1a96fc7d28aab7f55a81bf5338b8ef41d7a76ab9223e9", - "sha256:d995122dcaf180fd4830a9aa425abddab7c0246107c21ecca2fa085611fa7ce9", - "sha256:dff065a1a8ed051d7e641369ba1ad030d5a707afac54cf4ede7069b959898835", - "sha256:e4807aab1bdeab6ae6f296be46337a260ae4b1f3a8c2fcd373e236b4b2b46efd", - "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", - "sha256:e97d2f0a06b39e231e59ebab0e6eec45c7683b339e8262299ac952707bdf7688", - "sha256:ec2f56edaf476f70b5831bbd59700b53d9dd011b1f77cd4846b5ab5c5eafdb3f", - "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", - "sha256:f228f42f29cc87db67020f7d71624102b2c837686e55317b16e1d3ef2747a993", - "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", - "sha256:f9b92431d8b4d4ca5ccbfdbac95b05a3a6cd70cd73aa62f32f9627acfde7549c", - "sha256:fd4b5fbd7b9dde785cfeb486b8cca211a0b138d4f3a7da27db89a25b3c482e5c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.19.0" } }, "develop": { "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -2125,101 +1586,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "coverage": { "hashes": [ @@ -2293,44 +1754,46 @@ }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", + "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", + "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", + "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", + "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", + "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", + "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", + "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", + "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", + "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9", + "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", + "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", + "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", + "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", + "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", + "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", + "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", + "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", + "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", + "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", + "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", + "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", + "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", + "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", + "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", + "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", + "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", + "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", + "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", + "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", + "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", + "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", + "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", + "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", + "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", + "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", + "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==44.0.3" }, "docker": { "hashes": [ @@ -2381,11 +1844,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pluggy": { "hashes": [ diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py index 5d4f8b09decf600860293753ee0fbd044a9fdf6b..ef577429b79ee647d2daf9221d9a445964780863 100644 --- a/dbrepo-search-service/app.py +++ b/dbrepo-search-service/app.py @@ -29,17 +29,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "search-service", "service_version": "1.8.2"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/search/app.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) @@ -60,8 +75,8 @@ swagger_config = { "headers": [], "specs": [ { - "endpoint": "api-search", - "route": "/api-search.json", + "endpoint": "api-docs", + "route": "/api-docs.json", "rule_filter": lambda rule: rule.endpoint.startswith('search'), "model_filter": lambda tag: True, # all in } @@ -169,7 +184,7 @@ template = { "info": { "title": "Database Repository Search Service API", "description": "Service that searches the search database", - "version": "1.8.1", + "version": "1.8.2", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -281,7 +296,7 @@ def health(): @app.route("/api/search/<string:index>", methods=["GET"], endpoint="search_get_index") @metrics.gauge(name='dbrepo_search_index_list', description='Time needed to list search index') -@swag_from("os-yml/get_index.yml") +@swag_from("/app/os-yml/get_index.yml") def get_index(index: str): """ returns all entries in a specific index @@ -305,7 +320,7 @@ def get_index(index: str): @app.route("/api/search/<string:field_type>/fields", methods=["GET"], endpoint="search_get_index_fields") @metrics.gauge(name='dbrepo_search_type_list', description='Time needed to list search types') -@swag_from("os-yml/get_fields.yml") +@swag_from("/app/os-yml/get_fields.yml") def get_fields(field_type: str): """ returns a list of attributes of the data for a specific index. @@ -324,7 +339,7 @@ def get_fields(field_type: str): @app.route("/api/search", methods=["GET"], endpoint="search_fuzzy_search") @metrics.gauge(name='dbrepo_search_fuzzy', description='Time needed to search fuzzy') -@swag_from("os-yml/get_fuzzy_search.yml") +@swag_from("/app/os-yml/get_fuzzy_search.yml") def get_fuzzy_search(): """ Main endpoint for fuzzy searching. @@ -347,7 +362,7 @@ def get_fuzzy_search(): @app.route("/api/search/<string:field_type>", methods=["POST"], endpoint="search_post_general_search") @metrics.gauge(name='dbrepo_search_type', description='Time needed to search by type') -@swag_from("os-yml/post_general_search.yml") +@swag_from("/app/os-yml/post_general_search.yml") def post_general_search(field_type): """ Main endpoint for fuzzy searching. @@ -430,8 +445,8 @@ def save_database(database_id: str): try: payload = Database.model_validate(request.json) except ValidationError as e: - logging.error(f"Failed to validate: {e}") - return ApiError(status='BAD_REQUEST', message=f'Malformed payload: {e}', + logging.error(f"Failed to validate: {str(e).strip()}") + return ApiError(status='BAD_REQUEST', message=f'Malformed payload: {str(e).strip()}', code='search.general.missing').model_dump(), 400 search_client().save_database(database_id, payload) return Response(), 202, headers diff --git a/dbrepo-search-service/init.Dockerfile b/dbrepo-search-service/init.Dockerfile index cf4cb94d85e4e8c707e6305278a17a7a3cdbfc8e..231e8d85513adb62beac7c208b2fa97a4924ec37 100644 --- a/dbrepo-search-service/init.Dockerfile +++ b/dbrepo-search-service/init.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine3.21 +FROM --platform=$BUILDPLATFORM python:3.11-alpine3.21 LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk add --no-cache \ @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/search && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./database.json ./database.json diff --git a/dbrepo-search-service/init.py b/dbrepo-search-service/init.py index 48a59538e01fc232fe49675db5692cb21c2f8942..798b59b9df4e02303ac72d6268be4e63bc42c99d 100644 --- a/dbrepo-search-service/init.py +++ b/dbrepo-search-service/init.py @@ -19,17 +19,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "search-service-init", "service_version": "1.8.2"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/search/init.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) diff --git a/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz deleted file mode 100644 index e5f5e436784d54abbad74c606400f0029b49f9c0..0000000000000000000000000000000000000000 Binary files a/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz and /dev/null differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl similarity index 78% rename from dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl rename to dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl index 995dfd67a765f19bcd3b5ec867a799248cf1e0af..48beeb5ebf61c7cca654e0ee66343fac70bb4d53 100644 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e3b65b6b93a602ee26c2f4d4c71c2d3cd331211 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..86a1af2af41c44d35a4da7a472c180854f0cd82c Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc3.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c03ed275c6da5b2eef3619c59269f398d59c7de Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc3.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..5a0dbc7c95592f2e70bed13fa33d85cc6cdf7811 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc4.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1dbc78c989362d4d0c3750b1ad942abe46f205dd Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc4.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..50bf1b8195987f6f8d23a36f34bc0f912b6fd9b3 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc5.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..be8784437f111e2d4a5cdac36baf77605114dfa5 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc5.tar.gz differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..8e4c745a2ce782c174d5e1db7eef22d51d26624c Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc6.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..279243fd37fe033fe4aa740361b5e9a370516924 Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.8.2rc6.tar.gz differ diff --git a/dbrepo-storage-service/init/Dockerfile b/dbrepo-storage-service/init/Dockerfile index d064d048b84444610d3c342b302811dd2044a681..7ea74cddf1e5d1ca5fe686aee621c5f988756560 100644 --- a/dbrepo-storage-service/init/Dockerfile +++ b/dbrepo-storage-service/init/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/python:3.11-alpine3.21 AS runtime +FROM --platform=$BUILDPLATFORM docker.io/python:3.11-alpine3.21 AS runtime LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" RUN apk --no-cache add \ @@ -7,6 +7,9 @@ RUN apk --no-cache add \ WORKDIR /app +RUN mkdir -p /var/log/app/service/storage && \ + chown -R 1001:1001 /var/log/app/service/storage + RUN adduser -D dbrepo --uid 1001 COPY --chown=1001 --chmod=0744 ./init.sh /app/init.sh diff --git a/dbrepo-storage-service/init/init.sh b/dbrepo-storage-service/init/init.sh index b112f70ac8cae6b6dae0612bf2e0d0bb7c6f5f27..f40712e81be5e7030c4c3988896411e8fde7f36a 100644 --- a/dbrepo-storage-service/init/init.sh +++ b/dbrepo-storage-service/init/init.sh @@ -10,12 +10,18 @@ use_https = False signature_v2 = False EOF +function log() { + echo "{\"@timestamp\":\"$(date --rfc-3339='seconds')\", \"log.level\": \"$1\", \"message\": \"$2\"}" >> /var/log/app/service/storage/init.log +} + # create bucket if s3cmd --config=/app/.s3cfg ls | grep -q "s3://${S3_BUCKET}"; then - echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip." + echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip" + log "INFO" "Bucket s3://${S3_BUCKET} already exists, skip" else if ! s3cmd --config=/app/.s3cfg mb s3://${S3_BUCKET}; then echo "[ERROR] Failed to create bucket s3://${S3_BUCKET}" + log "ERROR" "Failed to create bucket s3://${S3_BUCKET}" fi fi diff --git a/dbrepo-ui-new/requirements.txt b/dbrepo-ui-new/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..607fa97eb38239c11fda50d1f7c58625e98635e7 --- /dev/null +++ b/dbrepo-ui-new/requirements.txt @@ -0,0 +1,37 @@ +aiohappyeyeballs==2.4.4 +aiohttp==3.11.11 +aiosignal==1.3.2 +annotated-types==0.7.0 +attrs==24.3.0 +blinker==1.8.2 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.7 +colorama==0.4.6 +dbrepo==1.6.0 +Flask==3.0.3 +frozenlist==1.5.0 +idna==3.10 +itsdangerous==2.2.0 +Jinja2==3.1.4 +MarkupSafe==2.1.5 +multidict==6.1.0 +numpy==2.2.1 +pandas==2.2.3 +pika==1.3.2 +propcache==0.2.1 +pydantic==2.10.5 +pydantic_core==2.27.2 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +pytz==2024.2 +requests==2.32.3 +six==1.17.0 +tinydb==4.8.2 +tuspy==1.1.0 +typing_extensions==4.12.2 +tzdata==2024.2 +urllib3==2.3.0 +watchdog==5.0.2 +Werkzeug==3.0.4 +yarl==1.18.3 diff --git a/dbrepo-ui/Dockerfile b/dbrepo-ui/Dockerfile index f76a3d75043932d833865c7d402f8c70abb8f810..966b7dbb3d1a17085732e852bcc64de713655586 100644 --- a/dbrepo-ui/Dockerfile +++ b/dbrepo-ui/Dockerfile @@ -1,4 +1,5 @@ -FROM oven/bun:1.1.40-alpine AS build +###### FIRST STAGE ###### +FROM --platform=$BUILDPLATFORM oven/bun:1.1.40-alpine AS build WORKDIR /app @@ -25,7 +26,8 @@ COPY ./nuxt.config.ts ./nuxt.config.ts RUN bun run build -FROM node:22.9.0-alpine3.20 AS runtime +###### SECOND STAGE ###### +FROM --platform=$BUILDPLATFORM node:22.9.0-alpine3.20 AS runtime ARG APP_VERSION="latest" ARG COMMIT="" diff --git a/dbrepo-ui/bun.lockb b/dbrepo-ui/bun.lockb index a4bc73dcd16c8e4a59a34fd431a7acf3a20627fa..d455f25e4329f14f8ca9973e541a3a5a1bba5281 100755 Binary files a/dbrepo-ui/bun.lockb and b/dbrepo-ui/bun.lockb differ diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index d6b9c138853e9638ad5291bfd30ccf6b6da09e07..f7cb3b3eb09a7d708a4cef5dce9d9e402ad7fc0b 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -152,7 +152,6 @@ <v-checkbox v-model="c.unique" :disabled="disabled || c.type === 'serial'" - :hidden="c.primary_key" :label="$t('pages.table.subpages.schema.unique.label')" /> </v-col> <v-col @@ -169,7 +168,6 @@ </v-col> </v-row> <v-row - v-if="columns.length !== 0" dense> <v-col> <v-btn @@ -182,8 +180,7 @@ @click="addColumn()" /> </v-col> </v-row> - <v-row - v-if="columns.length !== 0"> + <v-row> <v-col> <v-btn color="secondary" @@ -252,7 +249,7 @@ export default { return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal }, showPrimaryKeyWarning () { - if (this.columns.length === 0) { + if (this.disabled) { return false } return this.columns.filter(c => c.primary_key).length === 0 diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index 7267242288c5eadaf184fdb1afe4e485a03f78dc..5784905294da2842c18aa9779e191a34f3c4ab76 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -56,7 +56,7 @@ <v-spacer /> <v-btn variant="plain" - :text="commitShort" + :text="commit" size="x-small" prepend-icon="mdi-source-commit" :href="`https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/commit/${commit}`" /> @@ -249,9 +249,6 @@ export default { commit () { return this.$config.public.commit }, - commitShort () { - return this.$config.public.commit.substr(0, 8) - }, error () { if (this.identifier) { return null diff --git a/dbrepo-ui/package-lock.json b/dbrepo-ui/package-lock.json deleted file mode 100644 index 52dbae9ae9248f8c70c251817a101b95ecf42ed9..0000000000000000000000000000000000000000 --- a/dbrepo-ui/package-lock.json +++ /dev/null @@ -1,12446 +0,0 @@ -{ - "name": "dbrepo-ui", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "dbrepo-ui", - "hasInstallScript": true, - "dependencies": { - "@artmizu/nuxt-prometheus": "^2.4.0", - "@date-fns/utc": "^2.1.0", - "@fontsource/open-sans": "^5.0.24", - "@mdi/font": "^7.4.47", - "@nuxtjs/robots": "^3.0.0", - "@nuxtjs/sitemap": "^5.2.0", - "@pinia/nuxt": "^0.5.1", - "ace-builds": "^1.32.6", - "axios": "^1.6.7", - "buffer": "^6.0.3", - "chart.js": "^4.4.1", - "date-fns": "^3.3.1", - "http-status-codes": "^2.3.0", - "jwt-decode": "^4.0.0", - "merkle-json": "^2.6.0", - "moment": "^2.30.1", - "nuxt": "^3.10.3", - "nuxt-oidc-auth": "^1.0.0-beta.5", - "parse-md": "^3.0.3", - "pinia": "^2.1.7", - "qs": "^6.11.2", - "sql-formatter": "^15.2.0", - "tus-js-client": "^4.0.1", - "vue": "^3.4.21", - "vue-axios": "^3.5.2", - "vue-chartjs": "^5.3.0", - "vue-meta": "^2.4.0", - "vue-toast-notification": "^3.1.2", - "vue3-ace-editor": "^2.2.4", - "vuetify": "^3.7.2" - }, - "devDependencies": { - "@nuxtjs/i18n": "^8.1.1", - "@pinia-plugin-persistedstate/nuxt": "^1.2.0", - "@types/qs": "^6.9.12", - "sass": "^1.71.0", - "vite-plugin-vuetify": "^2.0.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz", - "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==", - "dependencies": { - "package-manager-detector": "^0.2.8", - "tinyexec": "^0.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", - "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@artmizu/nuxt-prometheus": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@artmizu/nuxt-prometheus/-/nuxt-prometheus-2.4.0.tgz", - "integrity": "sha512-scLoSmOXN2SAGOkO/eFFN1MvfLUcj/FLN7cXCda5xQnHfHTKL3ac2BHgeyv4ylleirnOwYfWzco/KQXx2WixHQ==", - "dependencies": { - "@mswjs/interceptors": "^0.28.4", - "@nuxt/kit": "^3.11.2", - "consola": "^3.2.3", - "defu": "^6.1.2", - "h3": "^1.7.1", - "prom-client": "^14.2.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", - "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", - "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.26.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", - "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", - "dependencies": { - "@babel/types": "^7.26.9" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", - "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/standalone": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.9.tgz", - "integrity": "sha512-UTeQKy0kzJwWRe55kT1uK4G9H6D0lS6G4207hCU/bDaOhA5t2aC0qHN6GmID0Axv3OFLNXm27NdqcWp+BXcGtA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", - "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", - "dependencies": { - "mime": "^3.0.0" - }, - "engines": { - "node": ">=16.13" - } - }, - "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@date-fns/utc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.0.tgz", - "integrity": "sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@fontsource/open-sans": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/open-sans/-/open-sans-5.1.1.tgz", - "integrity": "sha512-Wfio5om0XH24ZUu6FfW4r50e4xLdoLzvd8midtqUFT2unniyWQj6GJ05RW1YQsHp4Sug3i+agFBIxEmYQzUHSg==" - }, - "node_modules/@iconify-json/carbon": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.2.7.tgz", - "integrity": "sha512-nqEjicnNdb3CnY21MsTr9DfU8JBkP9C8hup1bCe4zvpLKjcU9YRmYChUbqZYBP4P+BL5NdrprTSN+B7qJg3H3Q==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/logos": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@iconify-json/logos/-/logos-1.2.4.tgz", - "integrity": "sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/ri": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@iconify-json/ri/-/ri-1.2.5.tgz", - "integrity": "sha512-kWGimOXMZrlYusjBKKXYOWcKhbOHusFsmrmRGmjS7rH0BpML5A9/fy8KHZqFOwZfC4M6amObQYbh8BqO5cMC3w==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/tabler": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.16.tgz", - "integrity": "sha512-gjvKz38+aOxfZtRvycYrASYipCsHRbCZ/Df49T0tfPntT0ur+qsgJ7PxCM4JF/Xs6+n3JkaFdiUz/N4ZZxDKdQ==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" - }, - "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", - "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", - "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "mlly": "^1.7.4" - } - }, - "node_modules/@iconify/utils/node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@iconify/utils/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@iconify/utils/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@intlify/bundle-utils": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.5.1.tgz", - "integrity": "sha512-UovJl10oBIlmYEcWw+VIHdKY5Uv5sdPG0b/b6bOYxGLln3UwB75+2dlc0F3Fsa0RhoznQ5Rp589/BZpABpE4Xw==", - "dev": true, - "dependencies": { - "@intlify/message-compiler": "^9.4.0", - "@intlify/shared": "^9.4.0", - "acorn": "^8.8.2", - "escodegen": "^2.1.0", - "estree-walker": "^2.0.2", - "jsonc-eslint-parser": "^2.3.0", - "magic-string": "^0.30.0", - "mlly": "^1.2.0", - "source-map-js": "^1.0.1", - "yaml-eslint-parser": "^1.2.2" - }, - "engines": { - "node": ">= 14.16" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - } - } - }, - "node_modules/@intlify/bundle-utils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@intlify/core": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/core/-/core-9.14.2.tgz", - "integrity": "sha512-/YsYOtRdKn2RbIz9FjYdb4ZntcB7hJmlfHjMRrRXOH2rJE9T5kdYCTS+LS75xQkRCeHFdAmjGMADuoy4HYpHfA==", - "dev": true, - "dependencies": { - "@intlify/core-base": "9.14.2", - "@intlify/shared": "9.14.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/core-base": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.2.tgz", - "integrity": "sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==", - "dev": true, - "dependencies": { - "@intlify/message-compiler": "9.14.2", - "@intlify/shared": "9.14.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/h3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@intlify/h3/-/h3-0.5.0.tgz", - "integrity": "sha512-cgfrtD3qu3BPJ47gfZ35J2LJpI64Riic0K8NGgid5ilyPXRQTNY7mXlT/B+HZYQg1hmBxKa5G5HJXyAZ4R2H5A==", - "dev": true, - "dependencies": { - "@intlify/core": "^9.8.0", - "@intlify/utils": "^0.12.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/message-compiler": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.2.tgz", - "integrity": "sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==", - "dev": true, - "dependencies": { - "@intlify/shared": "9.14.2", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/shared": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.2.tgz", - "integrity": "sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/unplugin-vue-i18n": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-3.0.1.tgz", - "integrity": "sha512-q1zJhA/WpoLBzAAuKA5/AEp0e+bMOM10ll/HxT4g1VAw/9JhC4TTobP9KobKH90JMZ4U2daLFlYQfKNd29lpqw==", - "dev": true, - "dependencies": { - "@intlify/bundle-utils": "^7.4.0", - "@intlify/shared": "^9.4.0", - "@rollup/pluginutils": "^5.1.0", - "@vue/compiler-sfc": "^3.2.47", - "debug": "^4.3.3", - "fast-glob": "^3.2.12", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "pathe": "^1.0.0", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2", - "unplugin": "^1.1.0" - }, - "engines": { - "node": ">= 14.16" - }, - "peerDependencies": { - "petite-vue-i18n": "*", - "vue-i18n": "*", - "vue-i18n-bridge": "*" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vue-i18n-bridge": { - "optional": true - } - } - }, - "node_modules/@intlify/unplugin-vue-i18n/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/@intlify/utils": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@intlify/utils/-/utils-0.12.0.tgz", - "integrity": "sha512-yCBNcuZQ49iInqmWC2xfW0rgEQyNtCM8C8KcWKTXxyscgUE1+48gjLgZZqP75MjhlApxwph7ZMWLqyABkSgxQA==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/fs-minipass/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", - "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", - "dependencies": { - "consola": "^3.2.3", - "detect-libc": "^2.0.0", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^2.6.7", - "nopt": "^8.0.0", - "semver": "^7.5.3", - "tar": "^7.4.0" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@mdi/font": { - "version": "7.4.47", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", - "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==" - }, - "node_modules/@miyaneee/rollup-plugin-json5": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@miyaneee/rollup-plugin-json5/-/rollup-plugin-json5-1.2.0.tgz", - "integrity": "sha512-JjTIaXZp9WzhUHpElrqPnl1AzBi/rvRs065F71+aTmlqvTMVkdbjZ8vfFl4nRlgJy+TPBw69ZK4pwFdmOAt4aA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "json5": "^2.2.3" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.28.4", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.28.4.tgz", - "integrity": "sha512-xQpXZswUUG+V+7bD/L2hZUC5mvxW1BPba2yI5yhRq+IpEXFPEGYzUuJUuvJBELyG7RLCxgrOjmqzeE5hgqa0aQ==", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@netlify/functions": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.2.tgz", - "integrity": "sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==", - "dependencies": { - "@netlify/serverless-functions-api": "1.26.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@netlify/node-cookies": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@netlify/node-cookies/-/node-cookies-0.1.0.tgz", - "integrity": "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==", - "engines": { - "node": "^14.16.0 || >=16.0.0" - } - }, - "node_modules/@netlify/serverless-functions-api": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz", - "integrity": "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==", - "dependencies": { - "@netlify/node-cookies": "^0.1.0", - "urlpattern-polyfill": "8.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxt/cli": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.22.2.tgz", - "integrity": "sha512-Xtu3Loe3fVLvOE1/NC/SrE6Buu7Aj6qrnu3hewAfamUyZ7mVUBOsJ5ScUhofSK2L6muGPvS3R1PisuJMFbdexg==", - "dependencies": { - "c12": "^2.0.2", - "chokidar": "^4.0.3", - "citty": "^0.1.6", - "clipboardy": "^4.0.0", - "consola": "^3.4.0", - "defu": "^6.1.4", - "fuse.js": "^7.1.0", - "giget": "^1.2.4", - "h3": "^1.15.0", - "httpxy": "^0.1.7", - "jiti": "^2.4.2", - "listhen": "^1.9.0", - "nypm": "^0.5.2", - "ofetch": "^1.4.1", - "ohash": "^2.0.2", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "semver": "^7.7.1", - "std-env": "^3.8.0", - "tinyexec": "^0.3.2", - "ufo": "^1.5.4" - }, - "bin": { - "nuxi": "bin/nuxi.mjs", - "nuxi-ng": "bin/nuxi.mjs", - "nuxt": "bin/nuxi.mjs", - "nuxt-cli": "bin/nuxi.mjs" - }, - "engines": { - "node": "^16.10.0 || >=18.0.0" - } - }, - "node_modules/@nuxt/cli/node_modules/ohash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.4.tgz", - "integrity": "sha512-ac+SFwzhdHb0hp48/dbR7Jta39qfbuj7t3hApd9uyHS8bisHTfVzSEvjOVgV0L3zG7VR2/7JjkSGimP75D+hOQ==" - }, - "node_modules/@nuxt/devalue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", - "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==" - }, - "node_modules/@nuxt/devtools": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-1.7.0.tgz", - "integrity": "sha512-uvnjt5Zowkz7tZmnks2cGreg1XZIiSyVzQ2MYiRXACodlXcwJ0dpUS3WTxu8BR562K+772oRdvKie9AQlyZUgg==", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@nuxt/devtools-kit": "1.7.0", - "@nuxt/devtools-wizard": "1.7.0", - "@nuxt/kit": "^3.15.0", - "@vue/devtools-core": "7.6.8", - "@vue/devtools-kit": "7.6.8", - "birpc": "^0.2.19", - "consola": "^3.3.1", - "cronstrue": "^2.52.0", - "destr": "^2.0.3", - "error-stack-parser-es": "^0.1.5", - "execa": "^7.2.0", - "fast-npm-meta": "^0.2.2", - "flatted": "^3.3.2", - "get-port-please": "^3.1.2", - "hookable": "^5.5.3", - "image-meta": "^0.2.1", - "is-installed-globally": "^1.0.0", - "launch-editor": "^2.9.1", - "local-pkg": "^0.5.1", - "magicast": "^0.3.5", - "nypm": "^0.4.1", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.1", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.6.3", - "simple-git": "^3.27.0", - "sirv": "^3.0.0", - "tinyglobby": "^0.2.10", - "unimport": "^3.14.5", - "vite-plugin-inspect": "~0.8.9", - "vite-plugin-vue-inspector": "^5.3.1", - "which": "^3.0.1", - "ws": "^8.18.0" - }, - "bin": { - "devtools": "cli.mjs" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/@nuxt/devtools-kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.7.0.tgz", - "integrity": "sha512-+NgZ2uP5BuneqvQbe7EdOEaFEDy8762c99pLABtn7/Ur0ExEsQJMP7pYjjoTfKubhBqecr5Vo9yHkPBj1eHulQ==", - "dependencies": { - "@nuxt/kit": "^3.15.0", - "@nuxt/schema": "^3.15.0", - "execa": "^7.2.0" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/@nuxt/devtools-ui-kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-ui-kit/-/devtools-ui-kit-1.7.0.tgz", - "integrity": "sha512-pYjwCP3FHz/rrEoJpb8plMinnPHRh+fFc90O+MncMC0aIGydtu4SGwAE3fZsg//JXqkvlY+JyozxqtF9IRA7rA==", - "dependencies": { - "@iconify-json/carbon": "^1.2.5", - "@iconify-json/logos": "^1.2.4", - "@iconify-json/ri": "^1.2.5", - "@iconify-json/tabler": "^1.2.13", - "@nuxt/devtools-kit": "1.7.0", - "@nuxt/kit": "^3.15.0", - "@unocss/core": "^0.65.3", - "@unocss/nuxt": "^0.65.3", - "@unocss/preset-attributify": "^0.65.3", - "@unocss/preset-icons": "^0.65.3", - "@unocss/preset-mini": "^0.65.3", - "@unocss/reset": "^0.65.3", - "@vueuse/core": "^12.2.0", - "@vueuse/integrations": "^12.2.0", - "@vueuse/nuxt": "^12.2.0", - "defu": "^6.1.4", - "focus-trap": "^7.6.2", - "splitpanes": "^3.1.5", - "unocss": "^0.65.3", - "v-lazy-show": "^0.3.0" - }, - "peerDependencies": { - "@nuxt/devtools": "1.7.0" - } - }, - "node_modules/@nuxt/devtools-wizard": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-1.7.0.tgz", - "integrity": "sha512-86Gd92uEw0Dh2ErIYT9TMIrMOISE96fCRN4rxeryTvyiowQOsyrbkCeMNYrEehoRL+lohoyK6iDmFajadPNwWQ==", - "dependencies": { - "consola": "^3.3.1", - "diff": "^7.0.0", - "execa": "^7.2.0", - "global-directory": "^4.0.1", - "magicast": "^0.3.5", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "prompts": "^2.4.2", - "rc9": "^2.1.2", - "semver": "^7.6.3" - }, - "bin": { - "devtools-wizard": "cli.mjs" - } - }, - "node_modules/@nuxt/devtools-wizard/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@nuxt/devtools/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/@nuxt/devtools/node_modules/nypm": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.4.1.tgz", - "integrity": "sha512-1b9mihliBh8UCcKtcGRu//G50iHpjxIQVUqkdhPT/SDVE7KdJKoHXLS0heuYTQCx95dFqiyUbXZB9r8ikn+93g==", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "tinyexec": "^0.3.1", - "ufo": "^1.5.4" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/devtools/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@nuxt/devtools/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/devtools/node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/devtools/node_modules/unimport": { - "version": "3.14.6", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz", - "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", - "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.1", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.1", - "unplugin": "^1.16.1" - } - }, - "node_modules/@nuxt/devtools/node_modules/unimport/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/devtools/node_modules/unimport/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "node_modules/@nuxt/devtools/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nuxt/kit": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.4.tgz", - "integrity": "sha512-dr7I7eZOoRLl4uxdxeL2dQsH0OrbEiVPIyBHnBpA4co24CBnoJoF+JINuP9l3PAM3IhUzc5JIVq3/YY3lEc3Hw==", - "dependencies": { - "c12": "^2.0.1", - "consola": "^3.4.0", - "defu": "^6.1.4", - "destr": "^2.0.3", - "globby": "^14.0.2", - "ignore": "^7.0.3", - "jiti": "^2.4.2", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "mlly": "^1.7.4", - "ohash": "^1.1.4", - "pathe": "^2.0.2", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "semver": "^7.6.3", - "std-env": "^3.8.0", - "ufo": "^1.5.4", - "unctx": "^2.4.1", - "unimport": "^4.0.0", - "untyped": "^1.5.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/schema": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.4.tgz", - "integrity": "sha512-pAYZb/3ocSC/db1EFd5y+otmgHqUkvfxfhd9EknDB5DygnJuOIQNuGJ7LMJM6S2c0DYgBIHOdEelLxKHOjwbgQ==", - "dependencies": { - "consola": "^3.4.0", - "defu": "^6.1.4", - "pathe": "^2.0.2", - "std-env": "^3.8.0" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/telemetry": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.6.5.tgz", - "integrity": "sha512-lwMp9OHML/m0mjh7P5iz9PxINnk5smGkGebh88Wh8PjvnRooY1TBsbyq7mlSrNibpwD1BkwqhV5IAZOXWHLxMQ==", - "dependencies": { - "@nuxt/kit": "^3.15.4", - "citty": "^0.1.6", - "consola": "^3.4.0", - "destr": "^2.0.3", - "dotenv": "^16.4.7", - "git-url-parse": "^16.0.0", - "is-docker": "^3.0.0", - "ofetch": "^1.4.1", - "package-manager-detector": "^0.2.9", - "parse-git-config": "^3.0.0", - "pathe": "^2.0.2", - "rc9": "^2.1.2", - "std-env": "^3.8.0" - }, - "bin": { - "nuxt-telemetry": "bin/nuxt-telemetry.mjs" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/vite-builder": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.15.4.tgz", - "integrity": "sha512-yBK6tWT973+ExKC3ciTWymZpjJ+enToOtYz574kXCyGO0PbSnuXdoJKTvrwXw1lK97PajCKxExlmwI/3oLOmMQ==", - "dependencies": { - "@nuxt/kit": "3.15.4", - "@rollup/plugin-replace": "^6.0.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vitejs/plugin-vue-jsx": "^4.1.1", - "autoprefixer": "^10.4.20", - "consola": "^3.4.0", - "cssnano": "^7.0.6", - "defu": "^6.1.4", - "esbuild": "^0.24.2", - "escape-string-regexp": "^5.0.0", - "externality": "^1.0.2", - "get-port-please": "^3.1.2", - "h3": "^1.14.0", - "jiti": "^2.4.2", - "knitwork": "^1.2.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "ohash": "^1.1.4", - "pathe": "^2.0.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "postcss": "^8.5.1", - "rollup-plugin-visualizer": "^5.13.1", - "std-env": "^3.8.0", - "ufo": "^1.5.4", - "unenv": "^1.10.0", - "unplugin": "^2.1.2", - "vite": "^6.0.11", - "vite-node": "^3.0.4", - "vite-plugin-checker": "^0.8.0", - "vue-bundle-renderer": "^2.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0.0" - }, - "peerDependencies": { - "vue": "^3.3.4" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxtjs/i18n": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.5.6.tgz", - "integrity": "sha512-L+g+LygKNoaS/AXExk7tzS9wSNn9QdP1T9VdTjjEGYftpeFgv2U8AQsY0dQAhgPIbXXhIAkNYxTk4YcINj9CfA==", - "dev": true, - "dependencies": { - "@intlify/h3": "^0.5.0", - "@intlify/shared": "^9.14.1", - "@intlify/unplugin-vue-i18n": "^3.0.1", - "@intlify/utils": "^0.12.0", - "@miyaneee/rollup-plugin-json5": "^1.2.0", - "@nuxt/kit": "^3.13.1", - "@rollup/plugin-yaml": "^4.1.2", - "@vue/compiler-sfc": "^3.5.4", - "debug": "^4.3.5", - "defu": "^6.1.2", - "estree-walker": "^3.0.3", - "is-https": "^4.0.0", - "knitwork": "^1.1.0", - "magic-string": "^0.30.10", - "mlly": "^1.7.1", - "pathe": "^1.1.1", - "scule": "^1.1.1", - "sucrase": "^3.35.0", - "ufo": "^1.3.1", - "unplugin": "^1.10.1", - "vue-i18n": "^9.14.1", - "vue-router": "^4.4.4" - }, - "engines": { - "node": "^14.16.0 || >=16.11.0" - } - }, - "node_modules/@nuxtjs/i18n/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/@nuxtjs/robots": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/robots/-/robots-3.0.0.tgz", - "integrity": "sha512-qsHGW1KXBvV5Kq7u3huPnFCUTbHS4Fk8Za2mNPgmUXcwLgp3exvhPtdZfIdjrCF/aZk3A8OZONNmGghs6CecBA==", - "dependencies": { - "@nuxt/kit": "^3.0.0", - "h3": "^1.0.1" - } - }, - "node_modules/@nuxtjs/sitemap": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@nuxtjs/sitemap/-/sitemap-5.3.5.tgz", - "integrity": "sha512-TfhEImgVHEZaI/vphZdoCaWM2TRBJqprHZPhIQwWYJz+dpQWkfY6z8UpjhmUh6npvbj5kNY9ncLenkw0cDJp9g==", - "dependencies": { - "@nuxt/devtools-kit": "^1.3.9", - "@nuxt/kit": "^3.12.3", - "chalk": "^5.3.0", - "defu": "^6.1.4", - "h3-compression": "^0.3.2", - "nuxt-site-config": "^2.2.15", - "nuxt-site-config-kit": "^2.2.15", - "ofetch": "^1.3.4", - "pathe": "^1.1.2", - "pkg-types": "^1.1.3", - "radix3": "^1.1.2", - "semver": "^7.6.2", - "sirv": "^2.0.4", - "site-config-stack": "^2.2.15", - "ufo": "^1.5.3" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@nuxtjs/sitemap/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.5.1.tgz", - "integrity": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==", - "bundleDependencies": [ - "napi-wasm" - ], - "dependencies": { - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "napi-wasm": "^1.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@pinia-plugin-persistedstate/nuxt": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@pinia-plugin-persistedstate/nuxt/-/nuxt-1.2.1.tgz", - "integrity": "sha512-q8s+4aQW/AjBMyeqLL48/qzBR5lcgnvvf1525ovNuKf6Wl9CsoLjPKh/5X8vNoKGwSow4gP7lVmdYPQRypgjgg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@nuxt/kit": "^3.12.2", - "defu": "^6.1.4", - "pinia-plugin-persistedstate": ">=3.2.1" - }, - "peerDependencies": { - "@pinia/nuxt": "^0.5.0" - } - }, - "node_modules/@pinia/nuxt": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.5.tgz", - "integrity": "sha512-wjxS7YqIesh4OLK+qE3ZjhdOJ5pYZQ+VlEmZNtTwzQn1Kavei/khovx7mzXVXNA/mvSPXVhb9xBzhyS3XMURtw==", - "dependencies": { - "@nuxt/kit": "^3.9.0", - "pinia": "^2.2.3" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "node_modules/@redocly/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js-replace": "^1.0.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@redocly/config": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.20.3.tgz", - "integrity": "sha512-Nyyv1Bj7GgYwj/l46O0nkH1GTKWbO3Ixe7KFcn021aZipkZd+z8Vlu1BwkhqtVgivcKaClaExtWU/lDHkjBzag==" - }, - "node_modules/@redocly/openapi-core": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.30.0.tgz", - "integrity": "sha512-ZZc+FXKoQXJ9cOR7qRKHxOfKOsGCj2wSodklKdtM2FofzyjzvIwn1rksD5+9iJxvHuORPOPv3ppAHcM+iMr/Ag==", - "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.20.1", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" - } - }, - "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@redocly/openapi-core/node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "node_modules/@redocly/openapi-core/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rollup/plugin-alias": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", - "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", - "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "fdir": "^6.2.0", - "is-reference": "1.2.1", - "magic-string": "^0.30.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", - "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-yaml": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-yaml/-/plugin-yaml-4.1.2.tgz", - "integrity": "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "js-yaml": "^4.1.0", - "tosource": "^2.0.0-alpha.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "peer": true - }, - "node_modules/@types/node": { - "version": "22.13.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", - "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/parse-path": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", - "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==" - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" - }, - "node_modules/@unhead/dom": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.19.tgz", - "integrity": "sha512-udkgITdIblEWH3hsoFQMKW+6QXNO2qFZlZ2FI37bVAplQSnK/PytTPt/5oA1GWkoVwT0DsQNGHbU6kOg/3SlNg==", - "dependencies": { - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/schema": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.19.tgz", - "integrity": "sha512-7VhYHWK7xHgljdv+C01MepCSYZO2v6OhgsfKWPxRQBDDGfUKCUaChox0XMq3tFvXP6u4zSp6yzcDw2yxCfVMwg==", - "dependencies": { - "hookable": "^5.5.3", - "zhead": "^2.2.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/shared": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.19.tgz", - "integrity": "sha512-UYE9EIeQLJOhx8vC71bWGkAGY4Zzq/H8qYlihowUg4NiFOfL+KKMnj96datb74PRxSDvHac9V3OLktNcsX2NuA==", - "dependencies": { - "@unhead/schema": "1.11.19", - "packrup": "^0.1.2" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/ssr": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.11.19.tgz", - "integrity": "sha512-OH+rj6xBTdYyLsSntk4lEQyR+z57aEUZIiR2UpPl1zWGtBZPIr5zs3GY5+EyJ8t8e0zLemPR/Pu7VembTJ8o1w==", - "dependencies": { - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/vue": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.19.tgz", - "integrity": "sha512-/XATTP8wVLs3+2Pkj2crvr/Z55nybVQyOwISh+sAlr/48/9n3jGNiCZHKpHgL4MpOnGT4krwzWzbfhBO/G2BSQ==", - "dependencies": { - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19", - "hookable": "^5.5.3", - "unhead": "1.11.19" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": ">=2.7 || >=3" - } - }, - "node_modules/@unocss/astro": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.65.4.tgz", - "integrity": "sha512-ex1CJOQ6yeftBEPcbA9/W47/YoV+mhQnrAoc8MA1VVrvvFKDitICFU62+nSt3NWRe53XL/fXnQbcbCb8AAgKlA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/reset": "0.65.4", - "@unocss/vite": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/@unocss/cli": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.65.4.tgz", - "integrity": "sha512-D/4hY5Hezh3QETscl4i+ojb+q8YU9Cl9AYJ8v3gsjc/GjTmEuIOD5V4x+/aN25vY5wjqgoApOgaIDGCV3b+2Ig==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@rollup/pluginutils": "^5.1.4", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/preset-uno": "0.65.4", - "cac": "^6.7.14", - "chokidar": "^3.6.0", - "colorette": "^2.0.20", - "consola": "^3.3.1", - "magic-string": "^0.30.17", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "tinyglobby": "^0.2.10" - }, - "bin": { - "unocss": "bin/unocss.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/cli/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/cli/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@unocss/cli/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@unocss/cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/config": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.65.4.tgz", - "integrity": "sha512-/vCt4AXnJ4p4Ow6xqsYwdrelF9533yhZjzkg3SQmL3rKeSkicPayKpeq8nkYECdhDI03VTCVD+6oh5Y/26Hg7A==", - "dependencies": { - "@unocss/core": "0.65.4", - "unconfig": "~0.6.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/core": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.65.4.tgz", - "integrity": "sha512-a2JOoFutrhqd5RgPhIR5FIXrDoHDU3gwCbPrpT6KYTjsqlSc/fv02yZ+JGOZFN3MCFhCmaPTs+idDFtwb3xU8g==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.65.4.tgz", - "integrity": "sha512-GbvTgsDaHplfWfsQtOY8RrvEZvptmvR9k9NwQ5NsZBNIG1JepYVel93CVQvsxT5KioKcoWngXxTYLNOGyxLs0g==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/inspector": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.65.4.tgz", - "integrity": "sha512-byg9x549Ul17U4Ety7ufDwC0UOygypoq4QnLEPzhlZ0KJG1f7WmXKYanOhupeg3h4qCj6Nc/xdZYMGbHl9QRIg==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/rule-utils": "0.65.4", - "colorette": "^2.0.20", - "gzip-size": "^6.0.0", - "sirv": "^3.0.0", - "vue-flow-layout": "^0.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/inspector/node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@unocss/inspector/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@unocss/nuxt": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/nuxt/-/nuxt-0.65.4.tgz", - "integrity": "sha512-dEJdqgvrukgZJk1szxRW6MiIozUZDLeFyyxmnO+iW3loPlji9hu95j2KBVHaQWIzi39XqVSORi4lH5flvAz3Pg==", - "dependencies": { - "@nuxt/kit": "^3.15.0", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/preset-attributify": "0.65.4", - "@unocss/preset-icons": "0.65.4", - "@unocss/preset-tagify": "0.65.4", - "@unocss/preset-typography": "0.65.4", - "@unocss/preset-uno": "0.65.4", - "@unocss/preset-web-fonts": "0.65.4", - "@unocss/preset-wind": "0.65.4", - "@unocss/reset": "0.65.4", - "@unocss/vite": "0.65.4", - "@unocss/webpack": "0.65.4", - "unocss": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/postcss": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.65.4.tgz", - "integrity": "sha512-8peDRo0+rNQsnKh/H2uZEVy67sV2cC16rAeSLpgbVJUMNfZlmF0rC2DNGsOV17uconUXSwz7+mGcHKNiv+8YlQ==", - "dependencies": { - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/rule-utils": "0.65.4", - "css-tree": "^3.1.0", - "postcss": "^8.4.49", - "tinyglobby": "^0.2.10" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/@unocss/postcss/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@unocss/postcss/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" - }, - "node_modules/@unocss/preset-attributify": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.65.4.tgz", - "integrity": "sha512-zxE9hJJ5b37phjdzDdZsxX559ZlmH9rFlY5LVEcQySTnsfY0znviHxPbD2iRpCBCRd+YC5HfFd2jb3XlnTKMJQ==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-icons": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.65.4.tgz", - "integrity": "sha512-5sSzTN72X2Ag3VH48xY1pYudeWnql9jqdMiwgZuLJcmvETBNGelXy2wGxm7tsUUEx/l40Yr04Ck8XRPGT9jLBw==", - "dependencies": { - "@iconify/utils": "^2.2.1", - "@unocss/core": "0.65.4", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.65.4.tgz", - "integrity": "sha512-dcO2PzSl87qN1KdQWcfZDIKEhpdFeImWbYfiXtE7k6pi1393FJkdHEopgI/1ZciIQN1CkTvQJ5c7EpEVWftYRA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/extractor-arbitrary-variants": "0.65.4", - "@unocss/rule-utils": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-tagify": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.65.4.tgz", - "integrity": "sha512-qll6koqdFEkvmz594vKnxj9+3nfM3ugkJxYHrTkqtwx7DAnTgtM8fInFFGZelvjwUzR3o3+Zw6uMhFkLTVTfvg==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.65.4.tgz", - "integrity": "sha512-Dl940ATrviWD9Vh+4fcN0QZXb6wA7al+c7QkdVAzW7I+NtdN2ELvLcN0cY22KnLRpwztzmg52Qp2J/1QnqrLTw==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/preset-mini": "0.65.4" - } - }, - "node_modules/@unocss/preset-uno": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.65.4.tgz", - "integrity": "sha512-56bdBtf476i+soQCQmT36uGzcF2z+7DGCnG1hwWiw6XAbL6gmRMQsubwi1c8z8TcTQNBsOFUnOziFil0gbWufw==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/preset-mini": "0.65.4", - "@unocss/preset-wind": "0.65.4", - "@unocss/rule-utils": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-web-fonts": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.65.4.tgz", - "integrity": "sha512-UB/MvXHUTqMNVH1bbiKZ/ZtZUI5tsYlTYAvBrnXPO1Cztuwr8hJKSi4RCfI9g+YYtKHX4uYuxUbW5bcN85gmBQ==", - "dependencies": { - "@unocss/core": "0.65.4", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.65.4.tgz", - "integrity": "sha512-0rbNbw5E8Lvh2yf4R1Mq+lxI/wL5Tm6+r+crE0uAAhCPe9kxPHW4k+x1cWKDIwq6Vudlm3cNX85N49wN5tYgdA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/preset-mini": "0.65.4", - "@unocss/rule-utils": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/reset": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.65.4.tgz", - "integrity": "sha512-m685H0KFvVMz6R2i5GDIFv4RS9Z7y2G8hJK7xg2OWli+7w8l2ZMihYvXKofPsst4q/ms8EgKXpWc/qqUOTucvA==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/rule-utils": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.65.4.tgz", - "integrity": "sha512-+EzdJEWcqGcO6HwbBTe7vEdBRpuKkBiz4MycQeLD6GEio04T45y6VHHO7/WTqxltbO4YwwW9/s2TKRMxKtoG8g==", - "dependencies": { - "@unocss/core": "^0.65.4", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-attributify-jsx": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.65.4.tgz", - "integrity": "sha512-n438EzWdTKlLCOlAUSpFjmH6FflctqzIReMzMZSJDkmkorymc+C5GpjN3Nty2cKRJXIl6Vwq0oxPuB59RT+FIw==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-compile-class": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.65.4.tgz", - "integrity": "sha512-n1yHDC/iIbcj/9fBUTXkSoASKfLBuRoCN7P1a0ecPc8Gu+uOGfoxafOhrlqC+tpD3hlQGoL+0h74BHSKh+L23Q==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-directives": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.65.4.tgz", - "integrity": "sha512-zkoDEwzPkgXi6ohW7P11gbArwfTRMZ9knYSUYoPEltQz+UZYzeRQ85exiAmdz5MsbCAuhQEr577Kd/CWfhjEuA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/rule-utils": "0.65.4", - "css-tree": "^3.1.0" - } - }, - "node_modules/@unocss/transformer-directives/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@unocss/transformer-directives/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" - }, - "node_modules/@unocss/transformer-variant-group": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.65.4.tgz", - "integrity": "sha512-ggO6xMGeOeoD5GHS2xXBJrYFuzqyiZ25tM0zHAMJn9QU9GIu1NwWvcXluvLCF/MRIygBJGPpAE98aEICI6ifEA==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.65.4.tgz", - "integrity": "sha512-02pRcVLfb5UUxMJwudnjS/0ZQdSlskjuXVHdpZpLBZCA8hhoru2uEOsPbUOBRNNMjDj6ld00pmgk/+im07M35Q==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@rollup/pluginutils": "^5.1.4", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/inspector": "0.65.4", - "chokidar": "^3.6.0", - "magic-string": "^0.30.17", - "tinyglobby": "^0.2.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/@unocss/vite/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/vite/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@unocss/vite/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/webpack": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/webpack/-/webpack-0.65.4.tgz", - "integrity": "sha512-cnd0qnJdSxYlQ+zuF0Qad3xZk2X0/p70XLzlA4TaBZuKa2OPJOyulfJwJSqcrSc4PXYOd9B/B8nXJk8WQ1yBHQ==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@rollup/pluginutils": "^5.1.4", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "chokidar": "^3.6.0", - "magic-string": "^0.30.17", - "tinyglobby": "^0.2.10", - "unplugin": "^2.1.0", - "webpack-sources": "^3.2.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "webpack": "^4 || ^5" - } - }, - "node_modules/@unocss/webpack/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/webpack/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@unocss/webpack/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/webpack/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@vercel/nft": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", - "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0-rc.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@vercel/nft/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitejs/plugin-vue-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.1.tgz", - "integrity": "sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-typescript": "^7.25.9", - "@vue/babel-plugin-jsx": "^1.2.5" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.0.0" - } - }, - "node_modules/@vue-macros/common": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.16.1.tgz", - "integrity": "sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==", - "dependencies": { - "@vue/compiler-sfc": "^3.5.13", - "ast-kit": "^1.4.0", - "local-pkg": "^1.0.0", - "magic-string-ast": "^0.7.0", - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.14.0" - }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, - "node_modules/@vue-macros/common/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", - "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==" - }, - "node_modules/@vue/babel-plugin-jsx": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", - "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.6", - "@babel/types": "^7.25.6", - "@vue/babel-helper-vue-transform-on": "1.2.5", - "@vue/babel-plugin-resolve-type": "1.2.5", - "html-tags": "^3.3.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - } - } - }, - "node_modules/@vue/babel-plugin-resolve-type": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", - "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/parser": "^7.25.6", - "@vue/compiler-sfc": "^3.5.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", - "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" - }, - "node_modules/@vue/devtools-core": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.8.tgz", - "integrity": "sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==", - "dependencies": { - "@vue/devtools-kit": "^7.6.8", - "@vue/devtools-shared": "^7.6.8", - "mitt": "^3.0.1", - "nanoid": "^5.0.9", - "pathe": "^1.1.2", - "vite-hot-client": "^0.2.4" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/@vue/devtools-core/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@vue/devtools-kit": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz", - "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==", - "dependencies": { - "@vue/devtools-shared": "^7.6.8", - "birpc": "^0.2.19", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", - "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", - "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "vue": "3.5.13" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" - }, - "node_modules/@vuetify/loader-shared": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.1.0.tgz", - "integrity": "sha512-dNE6Ceym9ijFsmJKB7YGW0cxs7xbYV8+1LjU6jd4P14xOt/ji4Igtgzt0rJFbxu+ZhAzqz853lhB0z8V9Dy9cQ==", - "devOptional": true, - "dependencies": { - "upath": "^2.0.1" - }, - "peerDependencies": { - "vue": "^3.0.0", - "vuetify": "^3.0.0" - } - }, - "node_modules/@vueuse/core": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.7.0.tgz", - "integrity": "sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA==", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "12.7.0", - "@vueuse/shared": "12.7.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.7.0.tgz", - "integrity": "sha512-IEq7K4bCl7mn3uKJaWtNXnd1CAPaHLUMuyj5K1/k/pVcItt0VONZW8xiGxdIovJcQjkzOHjImhX5t6gija+0/g==", - "dependencies": { - "@vueuse/core": "12.7.0", - "@vueuse/shared": "12.7.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.7.0.tgz", - "integrity": "sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/nuxt": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-12.7.0.tgz", - "integrity": "sha512-JG1yjJifcIZkFr+X1VmfNsdNZyHia/wXcpUHqVI2gwax5+bgmUlybqh9nStNGbX9NLUuPvPNNq043es5DlSJKg==", - "dependencies": { - "@nuxt/kit": "^3.15.4", - "@vueuse/core": "12.7.0", - "@vueuse/metadata": "12.7.0", - "local-pkg": "^1.0.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "nuxt": "^3.0.0" - } - }, - "node_modules/@vueuse/nuxt/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.7.0.tgz", - "integrity": "sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw==", - "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true - }, - "node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/ace-builds": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.39.0.tgz", - "integrity": "sha512-MqoZojv4gpc5QyTMor/dS6kmruDV9db9LVZbCiT4qYz6WsDiv4qyG5f7ZPc+wjUl6oLMqgCAsBjo1whdSVyMlQ==" - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/ast-kit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.4.0.tgz", - "integrity": "sha512-BlGeOw73FDsX7z0eZE/wuuafxYoek2yzNJ6l6A1nsb4+z/p87TOPbHaWuN53kFKNuUXiCQa2M+xLF71IqQmRSw==", - "dependencies": { - "@babel/parser": "^7.26.5", - "pathe": "^2.0.2" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/ast-walker-scope": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.6.2.tgz", - "integrity": "sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==", - "dependencies": { - "@babel/parser": "^7.25.3", - "ast-kit": "^1.0.1" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" - }, - "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, - "node_modules/c12": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.4.tgz", - "integrity": "sha512-3DbbhnFt0fKJHxU4tEUPmD1ahWE4PWPMomqfYsTJdrhpmEnRKJi3qSC4rO5U6E6zN1+pjBY7+z8fUmNRMaVKLw==", - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.1.8", - "defu": "^6.1.4", - "dotenv": "^16.4.7", - "giget": "^1.2.4", - "jiti": "^2.4.2", - "mlly": "^1.7.4", - "ohash": "^2.0.4", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/ohash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.4.tgz", - "integrity": "sha512-ac+SFwzhdHb0hp48/dbR7Jta39qfbuj7t3hApd9uyHS8bisHTfVzSEvjOVgV0L3zG7VR2/7JjkSGimP75D+hOQ==" - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" - }, - "node_modules/chart.js": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", - "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/clipboardy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", - "dependencies": { - "execa": "^8.0.1", - "is-wsl": "^3.1.0", - "is64bit": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/clipboardy/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combine-errors": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz", - "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==", - "dependencies": { - "custom-error-instance": "2.1.1", - "lodash.uniqby": "4.5.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compatx": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz", - "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==" - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - }, - "node_modules/consola": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", - "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/croner": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/croner/-/croner-9.0.0.tgz", - "integrity": "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==", - "engines": { - "node": ">=18.0" - } - }, - "node_modules/cronstrue": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.55.0.tgz", - "integrity": "sha512-ZsBZNtQWb0Rk6CNGJlzpPBYqNE7t93Aez5ZCExLihGwmIpE5qThSTDQzDV8Z1Nw6ksmLkwI98nPKyciZ5sH7dw==", - "bin": { - "cronstrue": "bin/cli.js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crossws": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", - "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", - "dependencies": { - "uncrypto": "^0.1.3" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", - "dependencies": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", - "dependencies": { - "browserslist": "^4.23.3", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/custom-error-instance": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", - "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/db0": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/db0/-/db0-0.2.4.tgz", - "integrity": "sha512-hIzftLH1nMsF95zSLjDLYLbE9huOXnLYUTAQ5yKF5amp0FpeD+B15XJa8BvGYSOeSCH4gl2WahB/y1FcUByQSg==", - "peerDependencies": { - "@electric-sql/pglite": "*", - "@libsql/client": "*", - "better-sqlite3": "*", - "drizzle-orm": "*", - "mysql2": "*", - "sqlite3": "*" - }, - "peerDependenciesMeta": { - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "drizzle-orm": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-pick-omit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz", - "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-prop": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", - "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "dependencies": { - "type-fest": "^4.18.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", - "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-stack-parser-es": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", - "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/errx": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz", - "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/externality": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz", - "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==", - "dependencies": { - "enhanced-resolve": "^5.14.1", - "mlly": "^1.3.0", - "pathe": "^1.1.1", - "ufo": "^1.1.2" - } - }, - "node_modules/externality/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-npm-meta": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-0.2.2.tgz", - "integrity": "sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "peer": true - }, - "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" - }, - "node_modules/focus-trap": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", - "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuse.js": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port-please": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", - "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==" - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/giget": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.5.tgz", - "integrity": "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.5.4", - "pathe": "^2.0.3", - "tar": "^6.2.1" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/git-config-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", - "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/git-up": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.0.1.tgz", - "integrity": "sha512-2XFu1uNZMSjkyetaF+8rqn6P0XqpMq/C+2ycjI6YwrIKcszZ5/WR4UubxjN0lILOKqLkLaHDaCr2B6fP1cke6g==", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^9.2.0" - } - }, - "node_modules/git-url-parse": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.0.1.tgz", - "integrity": "sha512-mcD36GrhAzX5JVOsIO52qNpgRyFzYWRbU1VSRFCvJt1IJvqfvH427wWw/CFqkWvjVPtdG5VTx4MKUeC5GeFPDQ==", - "dependencies": { - "git-up": "^8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gzip-size": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", - "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/h3": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", - "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", - "dependencies": { - "cookie-es": "^1.2.2", - "crossws": "^0.3.3", - "defu": "^6.1.4", - "destr": "^2.0.3", - "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.0", - "radix3": "^1.1.2", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3" - } - }, - "node_modules/h3-compression": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/h3-compression/-/h3-compression-0.3.2.tgz", - "integrity": "sha512-B+yCKyDRnO0BXSfjAP4tCXJgJwmnKp3GyH5Yh66mY9KuOCrrGQSPk/gBFG2TgH7OyB/6mvqNZ1X0XNVuy0qRsw==", - "funding": { - "url": "https://github.com/sponsors/codedredd" - }, - "peerDependencies": { - "h3": "^1.6.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-shutdown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", - "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/httpxy": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz", - "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-meta": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.1.tgz", - "integrity": "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==" - }, - "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "devOptional": true - }, - "node_modules/importx": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/importx/-/importx-0.5.2.tgz", - "integrity": "sha512-YEwlK86Ml5WiTxN/ECUYC5U7jd1CisAVw7ya4i9ZppBoHfFkT2+hChhr3PE2fYxUKLkNyivxEQpa5Ruil1LJBQ==", - "dependencies": { - "bundle-require": "^5.1.0", - "debug": "^4.4.0", - "esbuild": "^0.20.2 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", - "jiti": "^2.4.2", - "pathe": "^2.0.3", - "tsx": "^4.19.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/impound": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/impound/-/impound-0.2.0.tgz", - "integrity": "sha512-gXgeSyp9Hf7qG2/PLKmywHXyQf2xFrw+mJGpoj9DsAB9L7/MIKn+DeEx98UryWXdmbv8wUUPdcQof6qXnZoCGg==", - "dependencies": { - "@rollup/pluginutils": "^5.1.2", - "mlly": "^1.7.2", - "pathe": "^1.1.2", - "unenv": "^1.10.0", - "unplugin": "^1.14.1" - } - }, - "node_modules/impound/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/index-to-position": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", - "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ioredis": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.5.0.tgz", - "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-https": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", - "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", - "dev": true - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is64bit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", - "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", - "dependencies": { - "system-architecture": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-base64": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" - }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-eslint-parser": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", - "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", - "dev": true, - "dependencies": { - "acorn": "^8.5.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/knitwork": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.2.0.tgz", - "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" - }, - "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/listhen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.9.0.tgz", - "integrity": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==", - "dependencies": { - "@parcel/watcher": "^2.4.1", - "@parcel/watcher-wasm": "^2.4.1", - "citty": "^0.1.6", - "clipboardy": "^4.0.0", - "consola": "^3.2.3", - "crossws": ">=0.2.0 <0.4.0", - "defu": "^6.1.4", - "get-port-please": "^3.1.2", - "h3": "^1.12.0", - "http-shutdown": "^1.2.2", - "jiti": "^2.1.2", - "mlly": "^1.7.1", - "node-forge": "^1.3.1", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "ufo": "^1.5.4", - "untun": "^0.1.3", - "uqr": "^0.1.2" - }, - "bin": { - "listen": "bin/listhen.mjs", - "listhen": "bin/listhen.mjs" - } - }, - "node_modules/listhen/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._baseiteratee": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", - "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==", - "dependencies": { - "lodash._stringtopath": "~4.8.0" - } - }, - "node_modules/lodash._basetostring": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", - "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==" - }, - "node_modules/lodash._baseuniq": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", - "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==", - "dependencies": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "node_modules/lodash._createset": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", - "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==" - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==" - }, - "node_modules/lodash._stringtopath": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", - "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==", - "dependencies": { - "lodash._basetostring": "~4.12.0" - } - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/lodash.uniqby": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", - "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==", - "dependencies": { - "lodash._baseiteratee": "~4.7.0", - "lodash._baseuniq": "~4.6.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magic-string-ast": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.7.0.tgz", - "integrity": "sha512-686fgAHaJY7wLTFEq7nnKqeQrhqmXB19d1HnqT35Ci7BN6hbAYLZUezTQ062uUHM7ggZEQlqJ94Ftls+KDXU8Q==", - "dependencies": { - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/merkle-json": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/merkle-json/-/merkle-json-2.7.0.tgz", - "integrity": "sha512-yzOZPrvIydATWQMk0lLxKjudKQV7Deu4hh/EJT7+q6c4aYs7J02WVGG5Mv6B5QbLJGy78h+u2nE5f8eUpDFGEg==", - "dependencies": { - "merkle-json": "^2.1.0" - }, - "engines": { - "node": ">=6.11.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz", - "integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/nanotar": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.2.0.tgz", - "integrity": "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==" - }, - "node_modules/nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dependencies": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "bin": { - "nearley-railroad": "bin/nearley-railroad.js", - "nearley-test": "bin/nearley-test.js", - "nearley-unparse": "bin/nearley-unparse.js", - "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, - "node_modules/nitropack": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.10.4.tgz", - "integrity": "sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g==", - "dependencies": { - "@cloudflare/kv-asset-handler": "^0.3.4", - "@netlify/functions": "^2.8.2", - "@rollup/plugin-alias": "^5.1.1", - "@rollup/plugin-commonjs": "^28.0.1", - "@rollup/plugin-inject": "^5.0.5", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-replace": "^6.0.1", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/pluginutils": "^5.1.3", - "@types/http-proxy": "^1.17.15", - "@vercel/nft": "^0.27.5", - "archiver": "^7.0.1", - "c12": "2.0.1", - "chokidar": "^3.6.0", - "citty": "^0.1.6", - "compatx": "^0.1.8", - "confbox": "^0.1.8", - "consola": "^3.2.3", - "cookie-es": "^1.2.2", - "croner": "^9.0.0", - "crossws": "^0.3.1", - "db0": "^0.2.1", - "defu": "^6.1.4", - "destr": "^2.0.3", - "dot-prop": "^9.0.0", - "esbuild": "^0.24.0", - "escape-string-regexp": "^5.0.0", - "etag": "^1.8.1", - "fs-extra": "^11.2.0", - "globby": "^14.0.2", - "gzip-size": "^7.0.0", - "h3": "^1.13.0", - "hookable": "^5.5.3", - "httpxy": "^0.1.5", - "ioredis": "^5.4.1", - "jiti": "^2.4.0", - "klona": "^2.0.6", - "knitwork": "^1.1.0", - "listhen": "^1.9.0", - "magic-string": "^0.30.12", - "magicast": "^0.3.5", - "mime": "^4.0.4", - "mlly": "^1.7.2", - "node-fetch-native": "^1.6.4", - "ofetch": "^1.4.1", - "ohash": "^1.1.4", - "openapi-typescript": "^7.4.2", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.1", - "pretty-bytes": "^6.1.1", - "radix3": "^1.1.2", - "rollup": "^4.24.3", - "rollup-plugin-visualizer": "^5.12.0", - "scule": "^1.3.0", - "semver": "^7.6.3", - "serve-placeholder": "^2.0.2", - "serve-static": "^1.16.2", - "std-env": "^3.7.0", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3", - "unctx": "^2.3.1", - "unenv": "^1.10.0", - "unimport": "^3.13.1", - "unstorage": "^1.13.1", - "untyped": "^1.5.1", - "unwasm": "^0.3.9" - }, - "bin": { - "nitro": "dist/cli/index.mjs", - "nitropack": "dist/cli/index.mjs" - }, - "engines": { - "node": "^16.11.0 || >=17.0.0" - }, - "peerDependencies": { - "xml2js": "^0.6.2" - }, - "peerDependenciesMeta": { - "xml2js": { - "optional": true - } - } - }, - "node_modules/nitropack/node_modules/c12": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz", - "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==", - "dependencies": { - "chokidar": "^4.0.1", - "confbox": "^0.1.7", - "defu": "^6.1.4", - "dotenv": "^16.4.5", - "giget": "^1.2.3", - "jiti": "^2.3.0", - "mlly": "^1.7.1", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/nitropack/node_modules/c12/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/nitropack/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/nitropack/node_modules/chokidar/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/nitropack/node_modules/chokidar/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/nitropack/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/nitropack/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/nitropack/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/nitropack/node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/nitropack/node_modules/unimport": { - "version": "3.14.6", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz", - "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", - "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.1", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.1", - "unplugin": "^1.16.1" - } - }, - "node_modules/nitropack/node_modules/unimport/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-mock-http": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", - "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nuxt": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.15.4.tgz", - "integrity": "sha512-hSbZO4mR0uAMJtZPNTnCfiAtgleoOu28gvJcBNU7KQHgWnNXPjlWgwMczko2O4Tmnv9zIe/CQged+2HsPwl2ZA==", - "dependencies": { - "@nuxt/cli": "^3.21.1", - "@nuxt/devalue": "^2.0.2", - "@nuxt/devtools": "^1.7.0", - "@nuxt/kit": "3.15.4", - "@nuxt/schema": "3.15.4", - "@nuxt/telemetry": "^2.6.4", - "@nuxt/vite-builder": "3.15.4", - "@unhead/dom": "^1.11.18", - "@unhead/shared": "^1.11.18", - "@unhead/ssr": "^1.11.18", - "@unhead/vue": "^1.11.18", - "@vue/shared": "^3.5.13", - "acorn": "8.14.0", - "c12": "^2.0.1", - "chokidar": "^4.0.3", - "compatx": "^0.1.8", - "consola": "^3.4.0", - "cookie-es": "^1.2.2", - "defu": "^6.1.4", - "destr": "^2.0.3", - "devalue": "^5.1.1", - "errx": "^0.1.0", - "esbuild": "^0.24.2", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "globby": "^14.0.2", - "h3": "^1.14.0", - "hookable": "^5.5.3", - "ignore": "^7.0.3", - "impound": "^0.2.0", - "jiti": "^2.4.2", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "nanotar": "^0.2.0", - "nitropack": "^2.10.4", - "nypm": "^0.5.2", - "ofetch": "^1.4.1", - "ohash": "^1.1.4", - "pathe": "^2.0.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "radix3": "^1.1.2", - "scule": "^1.3.0", - "semver": "^7.6.3", - "std-env": "^3.8.0", - "strip-literal": "^3.0.0", - "tinyglobby": "0.2.10", - "ufo": "^1.5.4", - "ultrahtml": "^1.5.3", - "uncrypto": "^0.1.3", - "unctx": "^2.4.1", - "unenv": "^1.10.0", - "unhead": "^1.11.18", - "unimport": "^4.0.0", - "unplugin": "^2.1.2", - "unplugin-vue-router": "^0.11.2", - "unstorage": "^1.14.4", - "untyped": "^1.5.2", - "vue": "^3.5.13", - "vue-bundle-renderer": "^2.1.1", - "vue-devtools-stub": "^0.1.0", - "vue-router": "^4.5.0" - }, - "bin": { - "nuxi": "bin/nuxt.mjs", - "nuxt": "bin/nuxt.mjs" - }, - "engines": { - "node": "^18.20.5 || ^20.9.0 || >=22.0.0" - }, - "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - }, - "@types/node": { - "optional": true - } - } - }, - "node_modules/nuxt-oidc-auth": { - "version": "1.0.0-beta.5", - "resolved": "https://registry.npmjs.org/nuxt-oidc-auth/-/nuxt-oidc-auth-1.0.0-beta.5.tgz", - "integrity": "sha512-/bZ3yBfKmT40Kk66RZ9757SGMvqcZqLYRX6HK3l2o4N1dPvz1gW50t6cZ6UFJ63G7FWdHUuoRyo2INEpvbXe4g==", - "dependencies": { - "@nuxt/devtools-kit": "^1.7.0", - "@nuxt/devtools-ui-kit": "^1.7.0", - "consola": "^3.4.0", - "defu": "^6.1.4", - "h3": "^1.13.1", - "jose": "^5.9.6", - "ofetch": "^1.4.1", - "scule": "^1.3.0", - "sirv": "^3.0.0", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3", - "undici": "^7.2.3", - "undio": "^0.2.0" - }, - "peerDependencies": { - "undici": "^7.2.1" - }, - "peerDependenciesMeta": { - "undici": { - "optional": true - } - } - }, - "node_modules/nuxt-oidc-auth/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt-site-config": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-2.2.21.tgz", - "integrity": "sha512-VsHpR4socGrlRPjyg2F8JqbirBqH4yCkTQa60fj7saqKMPW1VcRROn21OJzfTHDpjeD+KayRdR3FB0Jxk9WFNA==", - "dependencies": { - "@nuxt/devtools-kit": "^1.6.0", - "@nuxt/kit": "^3.13.2", - "@nuxt/schema": "^3.13.2", - "nuxt-site-config-kit": "2.2.21", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "sirv": "^3.0.0", - "site-config-stack": "2.2.21", - "ufo": "^1.5.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/nuxt-site-config-kit": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-2.2.21.tgz", - "integrity": "sha512-xO41Zf6bXlA9Zvj+fX7ftD+ITee4LfrkzHj85Gt4FpgwonFxzGO5pMBtAqIxXKJwuyT1z2wVAixHI+ov66wV0w==", - "dependencies": { - "@nuxt/kit": "^3.13.2", - "@nuxt/schema": "^3.13.2", - "pkg-types": "^1.2.1", - "site-config-stack": "2.2.21", - "std-env": "^3.7.0", - "ufo": "^1.5.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/nuxt-site-config/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/nuxt-site-config/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/nypm": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.4.tgz", - "integrity": "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "tinyexec": "^0.3.2", - "ufo": "^1.5.4" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ofetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", - "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", - "dependencies": { - "destr": "^2.0.3", - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.4" - } - }, - "node_modules/ohash": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz", - "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/openapi-typescript": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.6.1.tgz", - "integrity": "sha512-F7RXEeo/heF3O9lOXo2bNjCOtfp7u+D6W3a3VNEH2xE6v+fxLtn5nq0uvUcA1F5aT+CMhNeC5Uqtg5tlXFX/ag==", - "dependencies": { - "@redocly/openapi-core": "^1.28.0", - "ansi-colors": "^4.1.3", - "change-case": "^5.4.4", - "parse-json": "^8.1.0", - "supports-color": "^9.4.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "openapi-typescript": "bin/cli.js" - }, - "peerDependencies": { - "typescript": "^5.x" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/package-manager-detector": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.9.tgz", - "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==" - }, - "node_modules/packrup": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/packrup/-/packrup-0.1.2.tgz", - "integrity": "sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==", - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/parse-git-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", - "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==", - "dependencies": { - "git-config-path": "^2.0.0", - "ini": "^1.3.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parse-git-config/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-md": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse-md/-/parse-md-3.0.3.tgz", - "integrity": "sha512-2kpNrrW1GBgli5VT9X9/Y6n4PVsIFVdG49tguq1PHwzsRSK0Cu0yJPTUFOwWouFT85atYNWQ1T/rmqfj7kLd8g==", - "dependencies": { - "js-yaml": "^4.1.0" - } - }, - "node_modules/parse-path": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.1.tgz", - "integrity": "sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==", - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", - "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", - "dependencies": { - "@types/parse-path": "^7.0.0", - "parse-path": "^7.0.0" - }, - "engines": { - "node": ">=14.13.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pinia": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz", - "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", - "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "typescript": ">=4.4.4", - "vue": "^2.7.0 || ^3.5.11" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/pinia-plugin-persistedstate": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz", - "integrity": "sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==", - "dev": true, - "dependencies": { - "@nuxt/kit": "^3.14.1592", - "deep-pick-omit": "^1.2.1", - "defu": "^6.1.4", - "destr": "^2.0.3" - }, - "peerDependencies": { - "@pinia/nuxt": ">=0.9.0", - "pinia": ">=2.3.0" - }, - "peerDependenciesMeta": { - "@pinia/nuxt": { - "optional": true - }, - "pinia": { - "optional": true - } - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", - "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", - "dependencies": { - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" - } - }, - "node_modules/postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", - "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", - "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", - "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", - "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.4" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", - "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", - "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", - "dependencies": { - "browserslist": "^4.23.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", - "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", - "dependencies": { - "cssesc": "^3.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", - "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", - "dependencies": { - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", - "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.3.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", - "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/prom-client": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", - "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", - "dependencies": { - "tdigest": "^0.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" - }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" - }, - "node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz", - "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", - "dependencies": { - "open": "^8.4.0", - "picomatch": "^4.0.2", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "rolldown": "1.x", - "rollup": "2.x || 3.x || 4.x" - }, - "peerDependenciesMeta": { - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", - "devOptional": true, - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-placeholder": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", - "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", - "dependencies": { - "defu": "^6.1.4" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-git": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", - "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/site-config-stack": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-2.2.21.tgz", - "integrity": "sha512-HRIgIgZAEK8XFYYepL/KtygJgmcUPdgxBJl0ueSrA12lNo2tk5aMkSuA2Oz/k6chnTbEwd6ESMYCs6opgYKNHw==", - "dependencies": { - "ufo": "^1.5.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": "^3" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/splitpanes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-3.1.8.tgz", - "integrity": "sha512-iYir0doakV9gYBfCuflGCxCD5Yhh09OGgT+epjfc6LZfTvGDdMXuD0Q4w6jI3hlkdRR1Ta3DlARcV3MOkybymg==", - "funding": { - "url": "https://github.com/sponsors/antoniandre" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/sql-formatter": { - "version": "15.4.11", - "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-15.4.11.tgz", - "integrity": "sha512-AfIjH0mYxv0NVzs4mbcGIAcos2Si20LeF9GMk0VmVA4A3gs1PFIixVu3rtcz34ls7ghPAjrDb+XbRly/aF6HAg==", - "dependencies": { - "argparse": "^2.0.1", - "get-stdin": "=8.0.0", - "nearley": "^2.20.1" - }, - "bin": { - "sql-formatter": "bin/sql-formatter-cli.cjs" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/system-architecture": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", - "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/tdigest": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", - "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", - "dependencies": { - "bintrees": "1.0.2" - } - }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" - }, - "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tosource": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz", - "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tsx": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", - "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" - } - }, - "node_modules/tus-js-client": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.3.1.tgz", - "integrity": "sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==", - "dependencies": { - "buffer-from": "^1.1.2", - "combine-errors": "^3.0.3", - "is-stream": "^2.0.0", - "js-base64": "^3.7.2", - "lodash.throttle": "^4.1.1", - "proper-lockfile": "^4.1.2", - "url-parse": "^1.5.7" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tus-js-client/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-fest": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", - "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" - }, - "node_modules/ultrahtml": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", - "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" - }, - "node_modules/unconfig": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.6.1.tgz", - "integrity": "sha512-cVU+/sPloZqOyJEAfNwnQSFCzFrZm85vcVkryH7lnlB/PiTycUkAjt5Ds79cfIshGOZ+M5v3PBDnKgpmlE5DtA==", - "dependencies": { - "@antfu/utils": "^8.1.0", - "defu": "^6.1.4", - "importx": "^0.5.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unconfig/node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" - }, - "node_modules/unctx": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.4.1.tgz", - "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", - "dependencies": { - "acorn": "^8.14.0", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17", - "unplugin": "^2.1.0" - } - }, - "node_modules/unctx/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/undici": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.3.0.tgz", - "integrity": "sha512-Qy96NND4Dou5jKoSJ2gm8ax8AJM/Ey9o9mz7KN1bb9GP+G0l20Zw8afxTnY2f4b7hmhn/z8aC2kfArVQlAhFBw==", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "node_modules/undio": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/undio/-/undio-0.2.0.tgz", - "integrity": "sha512-1LH824ipsUNqX1qsO6qpcusv0oGPlfFWVykwWq5jJB0Mq6x4kEHO/izSq2KLjGZvOosEd91+HXoxYUSoVI0zPg==" - }, - "node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/unenv/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/unenv/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/unhead": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.19.tgz", - "integrity": "sha512-O5AYb3+xUOzBlwDmPfC/DgGp9rDMoGkB4gFkhoaz8IonQqP8W8qqetxYf5ZyEdntvXnFsMWS8lZF//5176xo6Q==", - "dependencies": { - "@unhead/dom": "1.11.19", - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19", - "hookable": "^5.5.3" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unimport": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.2.tgz", - "integrity": "sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==", - "dependencies": { - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "strip-literal": "^3.0.0", - "tinyglobby": "^0.2.11", - "unplugin": "^2.2.0", - "unplugin-utils": "^0.2.4" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unimport/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unimport/node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", - "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/unimport/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unocss": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.65.4.tgz", - "integrity": "sha512-KUCW5OzI20Ik6j1zXkkrpWhxZ59TwSKl6+DvmYHEzMfaEcrHlBZaFSApAoSt2CYSvo6SluGiKyr+Im1UTkd4KA==", - "dependencies": { - "@unocss/astro": "0.65.4", - "@unocss/cli": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/postcss": "0.65.4", - "@unocss/preset-attributify": "0.65.4", - "@unocss/preset-icons": "0.65.4", - "@unocss/preset-mini": "0.65.4", - "@unocss/preset-tagify": "0.65.4", - "@unocss/preset-typography": "0.65.4", - "@unocss/preset-uno": "0.65.4", - "@unocss/preset-web-fonts": "0.65.4", - "@unocss/preset-wind": "0.65.4", - "@unocss/transformer-attributify-jsx": "0.65.4", - "@unocss/transformer-compile-class": "0.65.4", - "@unocss/transformer-directives": "0.65.4", - "@unocss/transformer-variant-group": "0.65.4", - "@unocss/vite": "0.65.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@unocss/webpack": "0.65.4", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/unplugin": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", - "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/unplugin-utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz", - "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "dependencies": { - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-vue-router": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.11.2.tgz", - "integrity": "sha512-X8BbQ3BNnMqaCYeMj80jtz5jC4AB0jcpdmECIYey9qKm6jy/upaPZ/WzfuT+iTGRiQAY4WemHueXxuzH127oOg==", - "dependencies": { - "@babel/types": "^7.26.5", - "@rollup/pluginutils": "^5.1.4", - "@vue-macros/common": "^1.16.1", - "ast-walker-scope": "^0.6.2", - "chokidar": "^3.6.0", - "fast-glob": "^3.3.3", - "json5": "^2.2.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.2", - "scule": "^1.3.0", - "unplugin": "2.1.2", - "yaml": "^2.7.0" - }, - "peerDependencies": { - "vue-router": "^4.4.0" - }, - "peerDependenciesMeta": { - "vue-router": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-router/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/unplugin-vue-router/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-vue-router/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin-vue-router/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/unplugin-vue-router/node_modules/unplugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.1.2.tgz", - "integrity": "sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unstorage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", - "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^4.0.3", - "destr": "^2.0.3", - "h3": "^1.15.0", - "lru-cache": "^10.4.3", - "node-fetch-native": "^1.6.6", - "ofetch": "^1.4.1", - "ufo": "^1.5.4" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/kv": "^1.0.1", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/unstorage/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/untun": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", - "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", - "dependencies": { - "citty": "^0.1.5", - "consola": "^3.2.3", - "pathe": "^1.1.1" - }, - "bin": { - "untun": "bin/untun.mjs" - } - }, - "node_modules/untun/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/untyped": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.5.2.tgz", - "integrity": "sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/standalone": "^7.26.4", - "@babel/types": "^7.26.3", - "citty": "^0.1.6", - "defu": "^6.1.4", - "jiti": "^2.4.1", - "knitwork": "^1.2.0", - "scule": "^1.3.0" - }, - "bin": { - "untyped": "dist/cli.mjs" - } - }, - "node_modules/unwasm": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.9.tgz", - "integrity": "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==", - "dependencies": { - "knitwork": "^1.0.0", - "magic-string": "^0.30.8", - "mlly": "^1.6.1", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "unplugin": "^1.10.0" - } - }, - "node_modules/unwasm/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "devOptional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uqr": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", - "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" - }, - "node_modules/uri-js-replace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", - "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/v-lazy-show": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/v-lazy-show/-/v-lazy-show-0.3.0.tgz", - "integrity": "sha512-xpVALnvzB+RoDkI/5gqzVC2bL/Mh0Mw5/cPpSWJTTS6K4yDwFE2hZr5OsgFS74c6IHV6/k0jzSkAFXJttnhufg==", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/compiler-core": "^3.5" - } - }, - "node_modules/vite": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-hot-client": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz", - "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite-node": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", - "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-checker": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz", - "integrity": "sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "fs-extra": "^11.1.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" - }, - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "@biomejs/biome": ">=1.7", - "eslint": ">=7", - "meow": "^9.0.0", - "optionator": "^0.9.1", - "stylelint": ">=13", - "typescript": "*", - "vite": ">=2.0.0", - "vls": "*", - "vti": "*", - "vue-tsc": "~2.1.6" - }, - "peerDependenciesMeta": { - "@biomejs/biome": { - "optional": true - }, - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - }, - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/vite-plugin-checker/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/vite-plugin-checker/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-plugin-checker/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/vite-plugin-checker/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-checker/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vite-plugin-checker/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/vite-plugin-checker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-inspect": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", - "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.3", - "debug": "^4.3.7", - "error-stack-parser-es": "^0.1.5", - "fs-extra": "^11.2.0", - "open": "^10.1.0", - "perfect-debounce": "^1.0.0", - "picocolors": "^1.1.1", - "sirv": "^3.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/vite-plugin-inspect/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite-plugin-inspect/node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite-plugin-inspect/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/vite-plugin-vue-inspector": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", - "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/plugin-proposal-decorators": "^7.23.0", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.22.15", - "@vue/babel-plugin-jsx": "^1.1.5", - "@vue/compiler-dom": "^3.3.4", - "kolorist": "^1.8.0", - "magic-string": "^0.30.4" - }, - "peerDependencies": { - "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite-plugin-vuetify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.0.tgz", - "integrity": "sha512-4wEAQtZaigPpwbFcZbrKpYwutOsWwWdeXn22B9XHzDPQNxVsKT+K9lKcXZnI5JESO1Iaql48S9rOk8RZZEt+Mw==", - "devOptional": true, - "dependencies": { - "@vuetify/loader-shared": "^2.1.0", - "debug": "^4.3.3", - "upath": "^2.0.1" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": ">=5", - "vue": "^3.0.0", - "vuetify": "^3.0.0" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - }, - "engines": { - "vscode": "^1.52.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" - }, - "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-axios": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/vue-axios/-/vue-axios-3.5.2.tgz", - "integrity": "sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==", - "peerDependencies": { - "axios": "*", - "vue": "^3.0.0 || ^2.0.0" - } - }, - "node_modules/vue-bundle-renderer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.1.1.tgz", - "integrity": "sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==", - "dependencies": { - "ufo": "^1.5.4" - } - }, - "node_modules/vue-chartjs": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz", - "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==", - "peerDependencies": { - "chart.js": "^4.1.1", - "vue": "^3.0.0-0 || ^2.7.0" - } - }, - "node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vue-devtools-stub": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", - "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==" - }, - "node_modules/vue-flow-layout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.1.1.tgz", - "integrity": "sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==", - "peerDependencies": { - "vue": "^3.4.37" - } - }, - "node_modules/vue-i18n": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.2.tgz", - "integrity": "sha512-JK9Pm80OqssGJU2Y6F7DcM8RFHqVG4WkuCqOZTVsXkEzZME7ABejAUqUdA931zEBedc4thBgSUWxeQh4uocJAQ==", - "dev": true, - "dependencies": { - "@intlify/core-base": "9.14.2", - "@intlify/shared": "9.14.2", - "@vue/devtools-api": "^6.5.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vue-meta": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", - "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==", - "dependencies": { - "deepmerge": "^4.2.2" - } - }, - "node_modules/vue-router": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", - "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-toast-notification": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vue-toast-notification/-/vue-toast-notification-3.1.3.tgz", - "integrity": "sha512-XNyWqwLIGBFfX5G9sK+clq3N3IPlhDjzNdbZaXkEElcotPlWs0wWZailk1vqhdtLYT/93Y4FHAVuzyatLmPZRA==", - "engines": { - "node": ">=12.15.0" - }, - "peerDependencies": { - "vue": "^3.0" - } - }, - "node_modules/vue3-ace-editor": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/vue3-ace-editor/-/vue3-ace-editor-2.2.4.tgz", - "integrity": "sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==", - "dependencies": { - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "ace-builds": "*", - "vue": "^3" - } - }, - "node_modules/vuetify": { - "version": "3.7.13", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.13.tgz", - "integrity": "sha512-4+RuQU+zLtXhlN2eZUpKXums9ftzUzhMeiNEJvvJY4XdOzVwUCth2dTnEZkSF6EKdLHk3WhtRk0cIWXZxpBvcw==", - "engines": { - "node": "^12.20 || >=14.13" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/johnleider" - }, - "peerDependencies": { - "typescript": ">=4.7", - "vite-plugin-vuetify": ">=1.0.0", - "vue": "^3.3.0", - "webpack-plugin-vuetify": ">=2.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vite-plugin-vuetify": { - "optional": true - }, - "webpack-plugin-vuetify": { - "optional": true - } - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" - }, - "node_modules/yaml-eslint-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz", - "integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.0.0", - "lodash": "^4.17.21", - "yaml": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/zhead": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz", - "integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==", - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue index 088190ac5a2fe8a8c9deb5d943c2069b216d2725..54d539ed17154c4235d7db9121463d1aab5ebd5e 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -159,7 +159,7 @@ <TableSchema ref="schema" :back="false" - :disabled="step > 4" + :disabled="step !== 4" :loading="loading" :submit-text="$t('navigation.continue')" :columns="tableCreate.columns" diff --git a/docker-compose.yml b/docker-compose.yml index b7f095ee2b471a2d73e3147baaa4eebc8e9eea1a..524fba056261754b3c7af651c7e85c687e178088 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,57 +1,3 @@ -x-resources-nano: &resources-nano - resources: - reservations: - cpus: '0.1' - memory: 128M - limits: - cpus: '0.15' - memory: 192M - -x-resources-micro: &resources-micro - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 384M - -x-resources-nano-hm: &resources-micro-hm - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 4096M - -x-resources-small: &resources-small - resources: - reservations: - cpus: '0.5' - memory: 512M - limits: - cpus: '0.75' - memory: 768M - -x-resources-medium: &resources-medium - resources: - reservations: - cpus: '0.5' - memory: 1024M - limits: - cpus: '0.75' - memory: 1536M - -x-resources-large: &resources-large - resources: - reservations: - cpus: '1' - memory: 2048M - limits: - cpus: '1.5' - memory: 3072M - x-healthcheck-params: &healthcheck-params interval: 30s timeout: 10s @@ -66,29 +12,49 @@ volumes: identity-service-data: metric-db-data: dashboard-ui-data: + dashboard-db-data: services: dbrepo-metadata-db: restart: "no" container_name: dbrepo-metadata-db hostname: metadata-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - metadata-db-data:/bitnami/mariadb + - metadata-db-data:/var/lib/mysql - ./dbrepo-metadata-db/1_setup-schema.sql:/docker-entrypoint-initdb.d/1_setup-schema.sql - ./dbrepo-metadata-db/2_setup-data.sql:/docker-entrypoint-initdb.d/2_setup-data.sql ports: - "3306:3306" environment: + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${METADATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_DATABASE: "${METADATA_DB:-dbrepo}" - MARIADB_EXTRA_FLAGS: "${METADATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${METADATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" + MARIADB_USER: "${READONLY_USERNAME:-readonly}" + healthcheck: + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized + <<: *healthcheck-params + logging: + driver: json-file + + dbrepo-metadata-db-metrics: + restart: "no" + container_name: dbrepo-metadata-db-metrics + hostname: metadata-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=metadata-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./dbrepo-metadata-db/metrics.cnf:/.my.cnf healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: -h <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + depends_on: + dbrepo-metadata-db: + condition: service_healthy logging: driver: json-file @@ -96,23 +62,40 @@ services: restart: "no" container_name: dbrepo-data-db hostname: data-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - data-db-data:/bitnami/mariadb - - ./dbrepo-data-db/1_grant-user.sql:/docker-entrypoint-startdb.d/1_grant-user.sql + - data-db-data:/var/lib/mysql + - ./dbrepo-data-db/1_grant-user.sql:/docker-entrypoint-initdb.d/1_grant-user.sql ports: - "3307:3306" environment: - MARIADB_EXTRA_FLAGS: "${DATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${DATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${DATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized + <<: *healthcheck-params + logging: + driver: json-file + + dbrepo-data-db-metrics: + restart: "no" + container_name: dbrepo-data-db-metrics + hostname: data-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=data-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./dbrepo-data-db/metrics.cnf:/.my.cnf + healthcheck: + test: -h <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + depends_on: + dbrepo-data-db: + condition: service_healthy logging: driver: json-file @@ -123,8 +106,6 @@ services: image: docker.io/bitnami/postgresql:${POSTGRES_VERSION} volumes: - auth-db-data:/bitnami/postgresql - ports: - - "5432:5432" environment: POSTGRESQL_DATABASE: "${AUTH_DB_NAME:-keycloak}" POSTGRESQL_USERNAME: "${AUTH_DB_USERNAME:-keycloak}" @@ -133,9 +114,23 @@ services: healthcheck: test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'" <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-dashboard-db: + restart: "no" + container_name: dbrepo-dashboard-db + hostname: dashboard-db + image: docker.io/bitnami/postgresql:${POSTGRES_VERSION} + volumes: + - dashboard-db-data:/bitnami/postgresql + environment: + POSTGRESQL_DATABASE: "${DASHBOARD_DB_NAME:-grafana}" + POSTGRESQL_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + POSTGRESQL_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" + healthcheck: + test: "psql -U ${DASHBOARD_DB_USERNAME:-grafana} -h 127.0.0.1 -p 5432 -d ${DASHBOARD_DB_NAME:-grafana} -c 'select version();'" + <<: *healthcheck-params logging: driver: json-file @@ -170,9 +165,6 @@ services: healthcheck: test: curl -fsS localhost:8080/realms/master <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 depends_on: dbrepo-identity-service: condition: service_healthy @@ -197,14 +189,11 @@ services: READONLY_USERNAME: "${READONLY_USERNAME:-readonly}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy dbrepo-gateway-service: - condition: service_healthy + condition: service_started dbrepo-metadata-db: condition: service_healthy logging: @@ -218,8 +207,6 @@ services: build: context: ./dbrepo-metadata-service network: host - ports: - - "9099:8080" environment: ADMIN_EMAIL: "${ADMIN_EMAIL:-noreply@localhost}" ANALYSE_SERVICE_ENDPOINT: "${ANALYSE_SERVICE_ENDPOINT:-http://analyse-service:8080}" @@ -261,9 +248,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-small - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy @@ -288,8 +272,6 @@ services: build: context: ./dbrepo-analyse-service network: host - ports: - - "4050:8080" environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -306,9 +288,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -335,9 +314,6 @@ services: healthcheck: test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running' <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -353,9 +329,6 @@ services: healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 logging: driver: json-file @@ -367,8 +340,6 @@ services: build: context: ./dbrepo-search-service network: host - ports: - - "4060:8080" environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -383,9 +354,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -416,9 +384,6 @@ services: healthcheck: test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-search-service: condition: service_healthy @@ -431,17 +396,11 @@ services: restart: "no" container_name: dbrepo-gateway-service hostname: gateway-service - image: docker.io/nginx:${NGINX_VERSION} + image: docker.io/bitnami/nginx:${NGINX_VERSION} ports: - "80:8080" volumes: - - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf - healthcheck: - test: lsof -i TCP:80 || exit 1 - <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 + - ./dbrepo-gateway-service/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro depends_on: dbrepo-analyse-service: condition: service_healthy @@ -464,7 +423,7 @@ services: restart: "no" container_name: dbrepo-identity-service hostname: identity-service - image: bitnami/openldap:${OPENLDAP_VERSION} + image: docker.io/bitnami/openldap:${OPENLDAP_VERSION} ports: - '1389:1389' - '1636:1636' @@ -481,9 +440,6 @@ services: healthcheck: test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1" <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -504,9 +460,6 @@ services: OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-search-db: condition: service_healthy @@ -531,9 +484,6 @@ services: METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy @@ -556,9 +506,6 @@ services: healthcheck: test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -573,9 +520,6 @@ services: healthcheck: test: promtool check healthy <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -593,9 +537,6 @@ services: S3_BUCKET: "${S3_BUCKET:-dbrepo}" S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-storage-service: condition: service_healthy @@ -610,8 +551,6 @@ services: build: context: ./dbrepo-data-service network: host - ports: - - "9093:8080" environment: AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}" AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" @@ -646,9 +585,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-large - platform: linux/amd64 depends_on: dbrepo-data-db: condition: service_healthy @@ -659,19 +595,25 @@ services: restart: "no" container_name: dbrepo-dashboard-ui hostname: dashboard-ui - image: dbrepo-dashboard-ui:latest - build: - context: ./dbrepo-dashboard-ui - network: host + image: docker.io/bitnami/grafana:${GRAFANA_VERSION} ports: - "3000:3000" volumes: - - dashboard-ui-data:/opt/bitnami/grafana/data + - ./dbrepo-dashboard-ui/dashboards:/app/dashboards + - ./dbrepo-dashboard-ui/grafana.ini:/opt/bitnami/grafana/conf/grafana.ini + - ./dbrepo-dashboard-ui/ldap.toml:/opt/bitnami/grafana/conf/ldap.toml + - ./dbrepo-dashboard-ui/provisioning/dashboards/provider.yaml:/opt/bitnami/grafana/conf/provisioning/dashboards/provider.yaml + - ./dbrepo-dashboard-ui/provisioning/datasources/infinity.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/infinity.yaml + - ./dbrepo-dashboard-ui/provisioning/datasources/prometheus.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/prometheus.yaml + - ./dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/opensearch.yaml environment: BASE_URL: "${BASE_URL:-http://localhost}" # do not attempt to set it in the grafana.ini, hours wasted here: 7 + DASHBOARD_DB_NAME: "${DASHBOARD_DB_NAME:-grafana}" + DASHBOARD_DB_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + DASHBOARD_DB_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" GF_SERVER_ROOT_URL: http://dashboard-ui:3000/dashboard/ - GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource" + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource,grafana-opensearch-datasource" GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" @@ -679,9 +621,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:3000 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 extra_hosts: - "localhost:host-gateway" logging: @@ -695,8 +634,6 @@ services: build: context: ./dbrepo-dashboard-service network: host - ports: - - "4070:8080" environment: AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} BASE_URL: "${BASE_URL:-http://localhost}" @@ -706,9 +643,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:8080/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy diff --git a/grafana/grafana.ini b/grafana/grafana.ini deleted file mode 100644 index df8b9eb1b46e93de904d0c69a448a441f646260f..0000000000000000000000000000000000000000 --- a/grafana/grafana.ini +++ /dev/null @@ -1,5 +0,0 @@ -[server] -domain = grafana -root_url = http://grafana/grafana -serve_from_sub_path = true - diff --git a/helm/dbrepo/Chart.lock b/helm/dbrepo/Chart.lock index e26b869016fcfee00e7f08f1a1f18a306429a6fa..43c2689e41816f86d8fac571c580e9966b900658 100644 --- a/helm/dbrepo/Chart.lock +++ b/helm/dbrepo/Chart.lock @@ -4,7 +4,10 @@ dependencies: version: 1.4.0 - name: keycloak repository: https://charts.bitnami.com/bitnami - version: 24.0.3 + version: 24.6.6 +- name: nginx + repository: https://charts.bitnami.com/bitnami + version: 20.0.2 - name: mariadb-galera repository: https://charts.bitnami.com/bitnami version: 13.2.7 @@ -16,15 +19,15 @@ dependencies: version: 14.0.0 - name: seaweedfs repository: file://../seaweedfs - version: 4.2.1 + version: 4.8.7 - name: grafana repository: https://charts.bitnami.com/bitnami version: 11.4.2 - name: prometheus repository: https://charts.bitnami.com/bitnami version: 1.3.22 -- name: nginx +- name: postgresql repository: https://charts.bitnami.com/bitnami - version: 18.3.1 -digest: sha256:acb36fe9078b39dd50381a03827c318897d401c1946aee453611b3b58c924a54 -generated: "2025-04-01T13:07:24.905667677+02:00" + version: 16.1.0 +digest: sha256:bbe97a5c50a63d3449e457cc6973b7c58e841a82552a8c137d07cd4d6b60fe78 +generated: "2025-05-14T15:39:57.551220972+02:00" diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index 30b33369f27a029f0a11efc8828466e68fb797e0..0814c1a5c763bd44f508079726cb04bab317aa51 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -7,8 +7,8 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.8.1" -appVersion: "1.8.1" +version: "1.8.2" +appVersion: "1.8.2" keywords: - dbrepo maintainers: @@ -24,9 +24,14 @@ dependencies: condition: searchdb.enabled - name: keycloak alias: authservice - version: 24.0.3 # app version: 26.0.4 + version: 24.6.6 repository: https://charts.bitnami.com/bitnami condition: authservice.enabled + - name: nginx + alias: gatewayservice + version: 20.0.2 + repository: https://charts.bitnami.com/bitnami + condition: gatewayservice.enabled - name: mariadb-galera alias: datadb version: 13.2.7 @@ -44,7 +49,7 @@ dependencies: condition: brokerservice.enabled - name: seaweedfs alias: storageservice - version: 4.2.1 + version: 4.8.7 repository: file://../seaweedfs condition: storageservice.enabled - name: grafana @@ -57,8 +62,8 @@ dependencies: version: 1.3.22 repository: https://charts.bitnami.com/bitnami condition: metricdb.enabled - - name: nginx - alias: gatewayservice - version: 18.3.1 + - name: postgresql + alias: dashboarddb + version: 16.1.0 repository: https://charts.bitnami.com/bitnami - condition: gatewayservice.enabled \ No newline at end of file + condition: dashboarddb.enabled \ No newline at end of file diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 6f6d34dec305dcb2b4ed20cda573f2cffe09a7d7..0f60690e238d473d1a20df1d1b3dbe2b3cff9e70 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -11,7 +11,7 @@ sample [ for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.8.1" +helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.8.2" ``` ## Prerequisites @@ -34,7 +34,7 @@ variable when you increase the available Pod memory for performance. To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.8.1" +helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.8.2" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the @@ -54,10 +54,13 @@ The command removes all the Kubernetes components associated with the chart and ### Global parameters -| Name | Description | Value | -| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | -| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | +| Name | Description | Value | +| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | +| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | +| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | +| `global.loggingSidecar.enabled` | Enable the logging sidecars for the analyse-, dashboard-, data-, gateway-, metadata- and search service. | `true` | +| `global.loggingSidecar.image.name` | The logging sidecar image. | `docker.io/bitnami/fluent-bit:4.0.0` | +| `global.loggingSidecar.resourcesPreset` | The resource definitions for the logging sidecar. | `nano` | ### Common parameters @@ -72,7 +75,7 @@ The command removes all the Kubernetes components associated with the chart and | Name | Description | Value | | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -| `metadatadb.enabled` | Enable the Metadata datadb. | `true` | +| `metadatadb.enabled` | Enable the Metadata Database. | `true` | | `metadatadb.host` | The hostname for the microservices. | `metadata-db` | | `metadatadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | | `metadatadb.rootUser.user` | The root username. | `root` | @@ -81,11 +84,20 @@ The command removes all the Kubernetes components associated with the chart and | `metadatadb.galera.mariabackup.user` | The database backup username. | `backup` | | `metadatadb.galera.mariabackup.password` | The database backup user password | `backup` | | `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `metadatadb.configurationConfigMap` | The database configuration files. | `metadata-db-config` | | `metadatadb.extraInitDbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | -| `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | -| `metadatadb.resourcesPreset` | The container resource preset | `nano-hm` | +| `metadatadb.resourcesPreset` | The container resource preset | `xlarge` | | `metadatadb.persistence.enabled` | Enable persistent storage. | `true` | +| `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `1` | + +### Dashboard Database Enable the Dashboard Database. + +| Name | Description | Value | +| --------------------------- | ------------------------------------- | ------------------- | +| `dashboarddb.enabled` | | `true` | +| `dashboarddb.host` | The hostname for the microservices. | `dashboard-db:5432` | +| `dashboarddb.auth.database` | The dashboard database name. | `grafana` | +| `dashboarddb.auth.username` | The dashboard database username. | `grafana` | +| `dashboarddb.auth.password` | The dashboard database user password. | `dbrepo` | ### Auth Service @@ -110,14 +122,16 @@ The command removes all the Kubernetes components associated with the chart and | `datadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | | `datadb.rootUser.user` | The root username. | `root` | | `datadb.rootUser.password` | The root user password. | `dbrepo` | +| `datadb.readonlyUser.user` | The readonly username. | `readonly` | +| `datadb.readonlyUser.password` | The readonly password. | `readonly` | | `datadb.db.name` | The database name. | `dbrepo` | | `datadb.db.user` | The database username for the dashboard service. | `user` | | `datadb.db.password` | The database user password for the dashboard service. | `user` | | `datadb.galera.mariabackup.user` | The database backup username. | `backup` | | `datadb.galera.mariabackup.password` | The database backup user password | `backup` | | `datadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `datadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | -| `datadb.resourcesPreset` | The container resource preset | `nano-hm` | +| `datadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `1` | +| `datadb.resourcesPreset` | The container resource preset | `xlarge` | | `datadb.initdbScriptsConfigMap` | The setup data to load into the database on first start. | `data-db-setup` | | `datadb.persistence.enabled` | Enable persistent storage. | `true` | @@ -140,39 +154,48 @@ The command removes all the Kubernetes components associated with the chart and ### Broker Service -| Name | Description | Value | -| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | -| `brokerservice.enabled` | Enable the Broker Service. | `true` | -| `brokerservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `true` | -| `brokerservice.endpoint` | The management api endpoint for the microservices. | `http://broker-service:15672` | -| `brokerservice.host` | The hostname for the microservices. | `broker-service` | -| `brokerservice.port` | The port for the microservices. | `5672` | -| `brokerservice.virtualHost` | The default virtual host name. | `dbrepo` | -| `brokerservice.queueName` | The default queue name. | `dbrepo` | -| `brokerservice.exchangeName` | The default exchange name. | `dbrepo` | -| `brokerservice.routingKey` | The default routing key binding from the default queue to the default exchange. | `dbrepo.#` | -| `brokerservice.connectionTimeout` | The connection timeout in ms. | `60000` | -| `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | -| `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | -| `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | -| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | -| `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | -| `brokerservice.auth.tls.enabled` | Enable TLS support | `false` | -| `brokerservice.auth.tls.existingSecretFullChain` | If set to `true` the service uses the full chain in the certificate `tls.crt`, otherwise it attempts to read from `ca.crt` | `false` | -| `brokerservice.auth.tls.existingSecret` | Existing secret with certificate content | `ingress-cert` | -| `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt` | -| `brokerservice.persistence.enabled` | If set to true, a PVC will be created. | `false` | -| `brokerservice.extraConfiguration` | The extra configuration for MQTT | `mqtt.vhost = dbrepo +| Name | Description | Value | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `brokerservice.enabled` | Enable the Broker Service. | `true` | +| `brokerservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `true` | +| `brokerservice.endpoint` | The management api endpoint for the microservices. | `http://broker-service:15672` | +| `brokerservice.host` | The hostname for the microservices. | `broker-service` | +| `brokerservice.port` | The port for the microservices. | `5672` | +| `brokerservice.virtualHost` | The default virtual host name. | `dbrepo` | +| `brokerservice.queueName` | The default queue name. | `dbrepo` | +| `brokerservice.exchangeName` | The default exchange name. | `dbrepo` | +| `brokerservice.routingKey` | The default routing key binding from the default queue to the default exchange. | `dbrepo.#` | +| `brokerservice.connectionTimeout` | The connection timeout in ms. | `60000` | +| `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | +| `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | +| `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | +| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | +| `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | +| `brokerservice.auth.tls.enabled` | Enable TLS support | `false` | +| `brokerservice.auth.tls.existingSecretFullChain` | If set to `true` the service uses the full chain in the certificate `tls.crt`, otherwise it attempts to read from `ca.crt` | `false` | +| `brokerservice.auth.tls.existingSecret` | Existing secret with certificate content | `ingress-cert` | +| `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt` | +| `brokerservice.extraConfiguration` | The extra configuration for MQTT | `# https://www.rabbitmq.com/docs/logging#log-message-categories +log.connection.level = warning +log.file = /opt/bitnami/rabbitmq/var/log/rabbitmq/app.log +log.file.formatter = json +log.file.level = info +# rotate when the file reaches 10 MiB +log.file.rotation.size = 10485760 +# keep up to 5 archived log files in addition to the current one +log.file.rotation.count = 5 +mqtt.vhost = dbrepo mqtt.exchange = dbrepo mqtt.prefetch = 10 -` | -| `brokerservice.replicaCount` | The number of replicas. | `1` | +` | +| `brokerservice.replicaCount` | The number of replicas. | `1` | ### Analyse Service | Name | Description | Value | | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- | ------------------------- | | `analyseservice.enabled` | Enable the Broker Service. | `true` | +| `analyseservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `analyseservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `analyseservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `analyseservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -199,6 +222,7 @@ mqtt.prefetch = 10 | Name | Description | Value | | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------- | | `metadataservice.enabled` | Enable the Broker Service. | `true` | +| `metadataservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `metadataservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `metadataservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `metadataservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -239,6 +263,7 @@ mqtt.prefetch = 10 | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | `dataservice.enabled` | Enable the Broker Service. | `true` | | `dataservice.endpoint` | Absolute URL to the data service in the form of http://host:port | `http://data-service` | +| `dataservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `dataservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `dataservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `dataservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -275,6 +300,7 @@ mqtt.prefetch = 10 | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------- | | `searchservice.enabled` | Enable the Broker Service. | `true` | | `searchservice.endpoint` | Absolute URL to the search service in the form of http://host:port | `http://search-service` | +| `searchservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `searchservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `searchservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `searchservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -291,8 +317,9 @@ mqtt.prefetch = 10 | `searchservice.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | | `searchservice.resourcesPreset` | The container resource preset | `micro` | | `searchservice.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | -| `searchservice.init.resourcesPreset` | The container resource preset | `nano` | -| `searchservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `searchservice.setupJob.enabled` | Enable the setup job that syncs missing databases from the Metadata Database into the Search Database. | `true` | +| `searchservice.setupJob.resourcesPreset` | The container resource preset | `nano` | +| `searchservice.setupJob.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | | `searchservice.replicaCount` | The number of replicas. | `2` | ### Storage Service @@ -309,9 +336,10 @@ mqtt.prefetch = 10 | `storageservice.s3.auth.adminSecretAccessKey` | The S3 secret access key for the admin user. In some systems this is named `password`. | `seaweedfsadmin` | | `storageservice.s3.auth.readAccessKeyId` | The S3 access key id for the read only user. | `seaweedfsuser` | | `storageservice.s3.auth.readSecretAccessKey` | The S3 secret access key for the read only user. | `seaweedfsuser` | -| `storageservice.init.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storage-service-s3:8333` | -| `storageservice.init.resourcesPreset` | The container resource preset | `nano` | -| `storageservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `storageservice.setupJob.enabled` | Enable the setup job that creates the bucket in the s3 endpoint. | `true` | +| `storageservice.setupJob.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storage-service-s3:8333` | +| `storageservice.setupJob.resourcesPreset` | The container resource preset | `nano` | +| `storageservice.setupJob.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | ### Identity Service @@ -321,6 +349,7 @@ mqtt.prefetch = 10 | `identityservice.global.ldapDomain` | The LDAP domain name in domain "dbrepo.at" form or explicit in "dc=dbrepo,dc=at" form. | `dc=dbrepo,dc=at` | | `identityservice.global.adminUser` | The admin username that is used to bind. | `admin` | | `identityservice.global.adminPassword` | The admin user password that is used to bind. | `admin` | +| `identityservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `identityservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `identityservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `identityservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -351,6 +380,7 @@ mqtt.prefetch = 10 | `ui.oidc.authSessionSecret` | This should be a at least 48 characters random string. It is used to encrypt the user session. | `qJteD-fvcHNafjwDtJOT3pF7IrN1OEzQRcIyPO0xAT4gzct0` | | `ui.oidc.sessionSecret` | This should be a at least 48 characters random string. It is used to encrypt the user session. | `TjOH1lFnocixYmy5ol2I5cOdsYUdrd5_jZsGxo6aMVPNNDkh` | | `ui.oidc.tokenKey` | This needs to be a random cryptographic AES key in base64. Used to encrypt the server side token store. You can generate a key in JS with await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'])). You just have to encode it to base64 afterwards. | `data:;base64,ntxOAfrF6yw22Ec1AFHK21iFz7L3PZmz9857Uqwyme0=` | +| `ui.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `ui.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `ui.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `ui.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -367,9 +397,10 @@ mqtt.prefetch = 10 | `ui.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | | `ui.resourcesPreset` | The container resource preset | `micro` | | `ui.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | -| `ui.public.api.client` | The endpoint for the client api. Defaults to the value of `gateway`. | `""` | -| `ui.public.api.server` | The endpoint for the server api. Defaults to the value of `gateway`. | `""` | -| `ui.public.upload.client` | The endpoint for the upload client. Defaults to the value of `gateway` and path `/api/upload/files`. | `""` | +| `ui.public.api.client` | The endpoint for the client api. Overrides to the value of `gateway`. | `""` | +| `ui.public.api.server` | The endpoint for the server api. Overrides to the value of `gateway`. | `""` | +| `ui.public.dashboard.url` | The url for the dashboard. Overrides to the value of `gateway` and path `/dashboard`. | `""` | +| `ui.public.upload.client` | The endpoint for the upload client. Overrides to the value of `gateway` and path `/api/upload/files`. | `""` | | `ui.public.title` | The user interface title. | `Database Repository` | | `ui.public.logo` | The user interface logo. | `/logo.svg` | | `ui.public.icon` | The user interface icon. | `/favicon.ico` | @@ -388,6 +419,7 @@ mqtt.prefetch = 10 | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------- | | `dashboardservice.enabled` | Enable the Dashboard Service. | `true` | | `dashboardservice.endpoint` | The endpoint for the microservices. | `http://dashboard-service` | +| `dashboardservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `dashboardservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `dashboardservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `dashboardservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -405,17 +437,19 @@ mqtt.prefetch = 10 | `dashboardservice.resourcesPreset` | The container resource preset | `micro` | | `dashboardservice.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | | `dashboardservice.replicaCount` | The number of replicas. | `2` | -| `dashboardservice.init.resourcesPreset` | The container resource preset | `nano` | -| `dashboardservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `dashboardservice.setupJob.enabled` | Enable the setup job that creates dashboards for existing databases in the Dashboard UI. | `true` | +| `dashboardservice.setupJob.resourcesPreset` | The container resource preset | `nano` | +| `dashboardservice.setupJob.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | | `dashboardservice.replicaCount` | The number of replicas. | `2` | ### Dashboard UI -| Name | Description | Value | -| ----------------------------- | ----------------------------------- | --------------------- | -| `dashboardui.enabled` | Enable the Dashboard UI. | `true` | -| `dashboardui.metrics.enabled` | Enable the metrics sidecar. | `true` | -| `dashboardui.endpoint` | The endpoint for the microservices. | `http://dashboard-ui` | +| Name | Description | Value | +| ---------------------------------- | ----------------------------------- | -------------------------- | +| `dashboardui.enabled` | Enable the Dashboard UI. | `true` | +| `dashboardui.metrics.enabled` | Enable the metrics sidecar. | `true` | +| `dashboardui.endpoint` | The endpoint for the microservices. | `http://dashboard-ui:3000` | +| `dashboardui.grafana.replicaCount` | The number of replicas. | `2` | ### Metric Service diff --git a/helm/dbrepo/charts/keycloak-24.0.3.tgz b/helm/dbrepo/charts/keycloak-24.0.3.tgz deleted file mode 100644 index 29a964b44168bec6c04969e16cf51c94b75952fc..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/keycloak-24.0.3.tgz and /dev/null differ diff --git a/helm/dbrepo/charts/keycloak-24.6.3.tgz b/helm/dbrepo/charts/keycloak-24.6.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2196f1737a0aa9a6e1c4947de17fe842b171b610 Binary files /dev/null and b/helm/dbrepo/charts/keycloak-24.6.3.tgz differ diff --git a/helm/dbrepo/charts/keycloak-24.6.6.tgz b/helm/dbrepo/charts/keycloak-24.6.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9b9fc4efafb111da60cae8ad4197eb2b733dc7fd Binary files /dev/null and b/helm/dbrepo/charts/keycloak-24.6.6.tgz differ diff --git a/helm/dbrepo/charts/nginx-18.3.1.tgz b/helm/dbrepo/charts/nginx-18.3.1.tgz deleted file mode 100644 index 66ed8e26a1578edede247ba67dc160133d3bc93f..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/nginx-18.3.1.tgz and /dev/null differ diff --git a/helm/dbrepo/charts/nginx-20.0.2.tgz b/helm/dbrepo/charts/nginx-20.0.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..91f0c9d5f253e4e2cfc7dfa011954a8e981e6552 Binary files /dev/null and b/helm/dbrepo/charts/nginx-20.0.2.tgz differ diff --git a/helm/dbrepo/charts/postgresql-16.1.0.tgz b/helm/dbrepo/charts/postgresql-16.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4b12fe544d307c4aaa91f3a94ef2711d39b213ff Binary files /dev/null and b/helm/dbrepo/charts/postgresql-16.1.0.tgz differ diff --git a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz deleted file mode 100644 index e91f99bd39e735126710032bce1cab415b4ee4db..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz and /dev/null differ diff --git a/helm/dbrepo/charts/seaweedfs-4.8.7.tgz b/helm/dbrepo/charts/seaweedfs-4.8.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..437a8c385c0d079f33436580068eda55bd9083aa Binary files /dev/null and b/helm/dbrepo/charts/seaweedfs-4.8.7.tgz differ diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index f1c8ff378169a787cc021fa5cb2eafc7795170a0..0508b2fef63a595d592df3f95512cc7cbe77e23d 100644 Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ diff --git a/helm/dbrepo/files/dbrepo.conf b/helm/dbrepo/files/dbrepo.conf new file mode 100644 index 0000000000000000000000000000000000000000..b98aca8b0c890cb5312a99246e912310933dd8a5 --- /dev/null +++ b/helm/dbrepo/files/dbrepo.conf @@ -0,0 +1,187 @@ +# This is required to proxy Grafana Live WebSocket connections. +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +proxy_buffer_size 128k; +proxy_buffers 4 256k; +proxy_busy_buffers_size 256k; + +log_format structured '{"remote_addr": "$remote_addr", "remote_user": "$remote_user", "request": "$request", "status": $status, "body_bytes_sent": $body_bytes_sent, "http_referer": "$http_referer", "http_user_agent": "$http_user_agent"}'; + +server { + gzip on; + access_log /var/log/nginx/access.log structured; + + listen 8080 default_server; + server_name _; + + location /dashboard/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-ui:3000/; + proxy_read_timeout 90; + } + + # Proxy Grafana Live WebSocket connections. + location /dashboard/api/live/ws { + rewrite ^/dashboard/(.*) /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_http_version 1.1; + proxy_pass http://dashboard-ui:3000/; + proxy_read_timeout 90; + } + + # Proxy Keycloak OIDC connections, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations + location /realms { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://auth-service; + proxy_read_timeout 90; + } + + # Proxy Keycloak assets, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations + location /resources { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://auth-service; + proxy_read_timeout 90; + } + + location /api/search { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://search-service; + proxy_read_timeout 90; + } + + location /api/datasource { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-service; + proxy_read_timeout 90; + } + + location /api/dashboard { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-service; + proxy_read_timeout 90; + } + + location /api/upload { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_pass http://data-service; + proxy_read_timeout 90; + # Disable request and response buffering + proxy_request_buffering off; + proxy_buffering off; + proxy_http_version 1.1; + } + + location /api/analyse { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://analyse-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/table/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic|history)" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic)" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 600; + } + + location ~ "/api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user)" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ "/api/identifier/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ "/pid/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { + rewrite /pid/(.*) /api/identifier/$1 break; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://ui:3000; + proxy_read_timeout 90; + } +} diff --git a/helm/dbrepo/files/system.json b/helm/dbrepo/files/dbrepo.json similarity index 73% rename from helm/dbrepo/files/system.json rename to helm/dbrepo/files/dbrepo.json index edee464f623bde864422058dc1edf31d98631162..dc3d570df03df3c485aa9ed64caadaf2b1e75c03 100644 --- a/helm/dbrepo/files/system.json +++ b/helm/dbrepo/files/dbrepo.json @@ -18,6 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, + "id": 4, "links": [ { "asDropdown": false, @@ -29,11 +30,12 @@ "title": "Docs", "tooltip": "", "type": "link", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/" } ], "panels": [ { + "collapsed": false, "gridPos": { "h": 1, "w": 24, @@ -41,6 +43,7 @@ "y": 0 }, "id": 34, + "panels": [], "title": "tl;dr", "type": "row" }, @@ -48,7 +51,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "Quality of Service", "fieldConfig": { @@ -109,12 +112,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -134,7 +137,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -179,12 +182,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -205,7 +208,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -247,12 +250,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -273,7 +276,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -315,12 +318,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -336,7 +339,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -353,7 +356,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -388,7 +391,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -431,12 +434,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -453,13 +456,183 @@ "title": "Data Volume", "type": "stat" }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "description": "Top 10 by number of accesses", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 4 + }, + "id": 38, + "options": { + "displayLabels": [ + "percent" + ], + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "right", + "showLegend": false, + "values": [] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "editorMode": "code", + "expr": "topk(10, dbrepo_datasource_data_get_total)", + "instant": false, + "legendFormat": "{{uri}}", + "range": true, + "refId": "A" + } + ], + "title": "Popular Data Sources", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 4 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "SeaweedFS_s3_request_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{type}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "S3 Requests", + "type": "timeseries" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 4 + "y": 11 }, "id": 22, "panels": [], @@ -469,7 +642,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -506,7 +679,7 @@ "h": 3, "w": 4, "x": 0, - "y": 5 + "y": 12 }, "id": 17, "options": { @@ -526,12 +699,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -551,7 +724,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -588,7 +761,7 @@ "h": 3, "w": 4, "x": 4, - "y": 5 + "y": 12 }, "id": 24, "options": { @@ -608,12 +781,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -633,7 +806,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -645,8 +818,16 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "green", + "value": 2 } ] }, @@ -658,7 +839,7 @@ "h": 3, "w": 4, "x": 8, - "y": 5 + "y": 12 }, "id": 25, "options": { @@ -678,12 +859,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -703,7 +884,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -715,8 +896,12 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -728,7 +913,7 @@ "h": 3, "w": 4, "x": 12, - "y": 5 + "y": 12 }, "id": 26, "options": { @@ -748,12 +933,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -773,7 +958,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -787,7 +972,7 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null } ] @@ -800,7 +985,7 @@ "h": 3, "w": 4, "x": 16, - "y": 5 + "y": 12 }, "id": 27, "options": { @@ -808,6 +993,7 @@ "graphMode": "none", "justifyMode": "auto", "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -819,12 +1005,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -844,7 +1030,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -881,11 +1067,17 @@ "h": 7, "w": 12, "x": 0, - "y": 8 + "y": 15 }, "id": 20, "options": { "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, @@ -902,12 +1094,12 @@ "sizing": "auto", "valueMode": "color" }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -927,7 +1119,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -941,6 +1133,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -988,7 +1181,7 @@ "h": 7, "w": 12, "x": 12, - "y": 8 + "y": 15 }, "id": 21, "options": { @@ -999,15 +1192,17 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -1030,7 +1225,7 @@ "h": 1, "w": 24, "x": 0, - "y": 15 + "y": 22 }, "id": 31, "panels": [], @@ -1040,9 +1235,9 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Quality of Service", + "description": "", "fieldConfig": { "defaults": { "mappings": [], @@ -1051,29 +1246,17 @@ "thresholds": { "mode": "absolute", "steps": [ - { - "color": "purple", - "value": null - }, { "color": "red", - "value": 0 - }, - { - "color": "orange", - "value": 60 - }, - { - "color": "#EAB839", - "value": 80 + "value": null }, { "color": "green", - "value": 100 + "value": 1 } ] }, - "unit": "percent" + "unit": "none" }, "overrides": [] }, @@ -1081,9 +1264,9 @@ "h": 3, "w": 4, "x": 0, - "y": 16 + "y": 23 }, - "id": 32, + "id": 29, "options": { "colorMode": "background", "graphMode": "none", @@ -1101,32 +1284,32 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_channels*100/rabbitmq_channel_consumers", + "expr": "rabbitmq_connection_channels", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "Services Running", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "Broker Service QoS", + "title": "Channels", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -1138,8 +1321,12 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -1151,9 +1338,9 @@ "h": 3, "w": 4, "x": 4, - "y": 16 + "y": 23 }, - "id": 29, + "id": 30, "options": { "colorMode": "background", "graphMode": "none", @@ -1171,16 +1358,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_connection_channels", + "expr": "rabbitmq_channel_consumers", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1190,13 +1377,13 @@ "useBackend": false } ], - "title": "Channels", + "title": "Consumers", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -1208,8 +1395,20 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null + }, + { + "color": "#EAB839", + "value": 10 + }, + { + "color": "orange", + "value": 100 + }, + { + "color": "red", + "value": 1000 } ] }, @@ -1221,9 +1420,9 @@ "h": 3, "w": 4, "x": 8, - "y": 16 + "y": 23 }, - "id": 30, + "id": 35, "options": { "colorMode": "background", "graphMode": "none", @@ -1241,16 +1440,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_channel_consumers", + "expr": "rabbitmq_queue_messages_persistent", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1260,15 +1459,15 @@ "useBackend": false } ], - "title": "Consumers", + "title": "Persistent Messages", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "", + "description": "Ready and unacknowledged messages stored in memory", "fieldConfig": { "defaults": { "mappings": [], @@ -1303,9 +1502,9 @@ "h": 3, "w": 4, "x": 12, - "y": 16 + "y": 23 }, - "id": 35, + "id": 36, "options": { "colorMode": "background", "graphMode": "none", @@ -1323,16 +1522,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_queue_messages_persistent", + "expr": "rabbitmq_queue_messages_ram", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1342,15 +1541,15 @@ "useBackend": false } ], - "title": "Persistent Messages", + "title": "Ready Messages", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Ready and unacknowledged messages stored in memory", + "description": "Messages delivered to consumers but not yet acknowledged", "fieldConfig": { "defaults": { "mappings": [], @@ -1385,9 +1584,9 @@ "h": 3, "w": 4, "x": 16, - "y": 16 + "y": 23 }, - "id": 36, + "id": 37, "options": { "colorMode": "background", "graphMode": "none", @@ -1405,16 +1604,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_queue_messages_ram", + "expr": "rabbitmq_queue_messages_unacked", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1424,97 +1623,15 @@ "useBackend": false } ], - "title": "Ready Messages", + "title": "Unacked Messages", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Messages delivered to consumers but not yet acknowledged", - "fieldConfig": { - "defaults": { - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "#EAB839", - "value": 10 - }, - { - "color": "orange", - "value": 100 - }, - { - "color": "red", - "value": 1000 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 20, - "y": 16 - }, - "id": 37, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.4.3", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_queue_messages_unacked", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Unacked Messages", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "description": "Messages for received protocol messages", + "description": "Messages for received protocol messages", "fieldConfig": { "defaults": { "color": { @@ -1527,6 +1644,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1601,7 +1719,7 @@ "h": 7, "w": 12, "x": 0, - "y": 19 + "y": 26 }, "id": 33, "options": { @@ -1612,16 +1730,17 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -1638,13 +1757,108 @@ "title": "Throughput", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "index": 0, + "text": "DOWN" + }, + "1": { + "index": 1, + "text": "UP" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 26 + }, + "id": 16, + "options": { + "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "up", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Service QoS", + "type": "bargauge" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 26 + "y": 33 }, "id": 2, "panels": [], @@ -1654,7 +1868,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -1669,6 +1883,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1715,7 +1930,7 @@ "h": 7, "w": 12, "x": 0, - "y": 27 + "y": 34 }, "id": 23, "options": { @@ -1726,16 +1941,17 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -1754,101 +1970,11 @@ }, { "datasource": { + "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "fillOpacity": 70, - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "0": { - "index": 0, - "text": "DOWN" - }, - "1": { - "index": 1, - "text": "UP" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 27 - }, - "id": 16, - "options": { - "colWidth": 0.9, - "legend": { - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "rowHeight": 0.9, - "showValue": "auto", - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "up", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{instance}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Service QoS", - "type": "status-history" - }, - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, + "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -1861,6 +1987,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -1896,7 +2023,7 @@ } ] }, - "unit": "none" + "unit": "decbytes" }, "overrides": [ { @@ -1964,10 +2091,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, + "x": 12, "y": 34 }, - "id": 6, + "id": 7, "options": { "legend": { "calcs": [], @@ -1976,40 +2103,39 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "process_cpu_usage", + "expr": "sum by(instance) (jvm_memory_used_bytes)", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": true, + "includeNullMetadata": false, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "process_cpu_usage", + "refId": "A", "useBackend": false } ], - "title": "CPU Usage", + "title": "JVM Memory Usage", "type": "timeseries" }, { "datasource": { - "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -2022,6 +2148,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2057,7 +2184,7 @@ } ] }, - "unit": "decbytes" + "unit": "none" }, "overrides": [ { @@ -2125,10 +2252,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 34 + "x": 0, + "y": 41 }, - "id": 7, + "id": 6, "options": { "legend": { "calcs": [], @@ -2137,37 +2264,38 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "sum by(instance) (jvm_memory_used_bytes)", + "expr": "process_cpu_usage", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "A", + "refId": "process_cpu_usage", "useBackend": false } ], - "title": "JVM Memory Usage", + "title": "CPU Usage", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -2181,6 +2309,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2254,10 +2383,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, + "x": 12, "y": 41 }, - "id": 18, + "id": 19, "options": { "legend": { "calcs": [], @@ -2266,65 +2395,56 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status=~\"200|201|202\",path!=\"/health\"}[$__rate_interval])", + "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", "instant": false, - "legendFormat": "{{method}} {{instance}} {{path}} ({{status}})", + "legendFormat": "{{method}} {{instance}} ({{status}})", "range": true, "refId": "A" } ], - "title": "Successful API Requests", + "title": "Failed API Requests", "type": "timeseries" }, { "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "fixed" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "", + "axisLabel": "Count", "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 25, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, + "lineWidth": 1, "scaleDistribution": { "type": "linear" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, "thresholdsStyle": { "mode": "off" } @@ -2338,14 +2458,51 @@ "value": null } ] - }, - "unit": "reqps" + } }, "overrides": [ { "matcher": { - "id": "byRegexp", - "options": "/.*search-service.*/" + "id": "byFrameRefID", + "options": "200" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "200s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "300s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" }, "properties": [ { @@ -2354,34 +2511,368 @@ "fixedColor": "orange", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "400s" } ] }, { "matcher": { - "id": "byRegexp", - "options": "/.*analyse-service.*/" + "id": "byFrameRefID", + "options": "500" }, "properties": [ { "id": "color", "value": { - "fixedColor": "super-light-orange", + "fixedColor": "red", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "500s" } ] } ] }, "gridPos": { - "h": 7, + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 43, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "normal", + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=200 AND <300)", + "queryType": "lucene", + "refId": "200", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=300 AND <400)", + "queryType": "lucene", + "refId": "300", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=400 AND <500)", + "queryType": "lucene", + "refId": "400", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: >=500", + "queryType": "lucene", + "refId": "500", + "timeField": "@timestamp" + } + ], + "title": "HTTP Status Codes over Time", + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": {}, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "200" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "500" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 8, "w": 12, "x": 12, - "y": 41 + "y": 48 }, - "id": 19, + "id": 44, "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "status: >=400", + "queryType": "lucene", + "refId": "ERROR", + "timeField": "@timestamp" + } + ], + "title": "REST API Errors", + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 39, + "panels": [], + "title": "Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 41, + "options": { + "alertThreshold": true, "legend": { "calcs": [], "displayMode": "list", @@ -2389,44 +2880,175 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", - "instant": false, - "legendFormat": "{{method}} {{instance}} ({{status}})", - "range": true, + "expr": "sum(SeaweedFS_volumeServer_volumes) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_max_volumes)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" } ], - "title": "Failed API Requests", + "title": "Volume Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 42, + "options": { + "alertThreshold": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" + } + ], + "title": "Used Disk Space by Collection and Type", "type": "timeseries" } ], - "refresh": "1m", - "schemaVersion": 39, + "preload": false, + "refresh": "5m", + "schemaVersion": 40, "tags": [ - "provisioned", - "dbrepo" + "ui", + "dashboard", + "metadata", + "data", + "gateway", + "analyse", + "metrics", + "auth" ], "templating": { "list": [] }, "time": { - "from": "now-30m", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "browser", - "title": "DBRepo - Overview", + "title": "DBRepo", "uid": "bdz20owu8zn5se", "version": 1, "weekStart": "" diff --git a/helm/dbrepo/files/keycloak.json b/helm/dbrepo/files/keycloak.json new file mode 100644 index 0000000000000000000000000000000000000000..aa5e2a8c572b6a5273bb9c89c908b3adff857dfa --- /dev/null +++ b/helm/dbrepo/files/keycloak.json @@ -0,0 +1,2393 @@ +{ + "__inputs": [], + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.2.0" + }, + { + "type": "panel", + "id": "grafana-piechart-panel", + "name": "Pie Chart", + "version": "1.6.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + }, + { + "datasource": "-- Grafana --", + "enable": true, + "iconColor": "rgba(0, 211, 255, 1)", + "iconSize": 0, + "lineColor": "", + "name": "Annotations & Alerts", + "query": "", + "showLine": false, + "tags": null, + "tagsField": "", + "textField": "", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 10441, + "graphTooltip": 1, + "id": null, + "iteration": 1624395370240, + "links": [], + "panels": [ + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})\n", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Current Memory HEAP", + "type": "gauge" + }, + "datasource": { + "default": true, + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory HEAP", + "type": "gauge" + }, + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 2, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 12, + "isNew": false, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 70, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_max)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "sum(jvm_memory_bytes_committed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Comitted", + "refId": "C" + }, + { + "expr": "sum(jvm_memory_bytes_used)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Used", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (realm)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per REALM", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "title": "Logins Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 7 + }, + "id": 44, + "interval": null, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "pluginVersion": "7.2.0", + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Registrations Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 12, + "x": 6, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (client_id)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Logins Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Under graph", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_registrations) by (client_id)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "timeFrom": null, + "title": "Registrations Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Registrations Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 6, + "y": 14 + }, + "hiddenSeries": false, + "id": 46, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (code)(increase(keycloak_response_errors_total[30m]))", + "interval": "", + "legendFormat": "{{code}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "4xx and 5xx Responses", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:98", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:99", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 1, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:160", + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "$$hashKey": "object:161", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 7, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{dbrepo }} {{error}}", + "refId": "A" + }, + { + "expr": "sum by (realm) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dialog-test\"} [30m]))", + "interval": "", + "legendFormat": "{{sum by dbrepo}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 18, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per CLIENT on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 21, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Sum by {{realm}}", + "refId": "A" + }, + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "{{error}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 33, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 19, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 22, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + }, + { + "expr": "sum by (realm)(increase(keycloak_registrations{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "Sum by {{realm}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per CLIENT on relm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 34, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 35, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"GET\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"GET\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 54 + }, + "hideTimeOverride": false, + "id": 39, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"GET\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"GET\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"GET\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 62 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 36, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"POST\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"POST\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 62 + }, + "hideTimeOverride": false, + "id": 40, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"POST\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"POST\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"POST\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 70 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 37, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"HEAD\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"HEAD\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 70 + }, + "hideTimeOverride": false, + "id": 41, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"HEAD\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"HEAD\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"HEAD\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 78 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 38, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"PUT\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"PUT\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 78 + }, + "hideTimeOverride": false, + "id": 42, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"PUT\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"PUT\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"PUT\" method was served in 100ms or below", + "type": "gauge" + } + ], + "refresh": "5m", + "schemaVersion": 26, + "style": "dark", + "tags": ["provisioned", "auth"], + "templating": { + "list": [ + { + "datasource": "prometheus", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Keycloak - Overview", + "uid": "keycloak-dashboard", + "version": 6, + "description": "Dashboard of Keycloak metrics exported with Keycloak Metrics SPI\r\n\r\nhttps://github.com/aerogear/keycloak-metrics-spi" +} \ No newline at end of file diff --git a/helm/dbrepo/files/logging.json b/helm/dbrepo/files/logging.json new file mode 100644 index 0000000000000000000000000000000000000000..4bd065db8e64f6da2dcb835f7b6ad13cea013cc9 --- /dev/null +++ b/helm/dbrepo/files/logging.json @@ -0,0 +1,865 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 4, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 6, + "panels": [], + "title": "System", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "orange", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "WARN", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: WARN", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Warnings over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "ERROR", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: ERROR", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Errors over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 5 + }, + "id": 9, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: WARN", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Warnings", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 5 + }, + "id": 19, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: ERROR", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Errors", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "#ffffff", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#ffffff", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "DEBUG", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: DEBUG", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Debugs over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 12, + "y": 15 + }, + "id": 21, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "INFO", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: INFO", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Infos over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 23, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: DEBUG", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Debugs", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 22, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: INFO", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Infos", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 40, + "tags": [ + "ui", + "dashboard", + "metadata", + "data", + "gateway", + "analyse", + "metrics", + "auth", + "search" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Logging - Overview", + "uid": "aejhojr0mrpj4c", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/helm/dbrepo/files/mariadb.json b/helm/dbrepo/files/mariadb.json index f53fe024185f6627f4b7fc592cca8135a9e03cd5..b6297de19c2dcd0c179c49a8c616ab2f230caf6b 100644 --- a/helm/dbrepo/files/mariadb.json +++ b/helm/dbrepo/files/mariadb.json @@ -24,7 +24,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -141,7 +141,7 @@ "type": "table" }, { - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": { @@ -242,7 +242,7 @@ "type": "table" }, { - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {}, @@ -312,7 +312,7 @@ "type": "gauge" }, { - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": { @@ -386,7 +386,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {}, @@ -497,7 +497,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {}, @@ -620,7 +620,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -733,7 +733,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -846,7 +846,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -942,7 +942,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "decimals": 2, "fieldConfig": { "defaults": { @@ -1039,7 +1039,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "decimals": 2, "fieldConfig": { "defaults": { @@ -1148,7 +1148,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "decimals": 1, "fieldConfig": { "defaults": { @@ -1248,7 +1248,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -1348,7 +1348,7 @@ } } ], - "refresh": "1m", + "refresh": "5m", "schemaVersion": 26, "style": "dark", "tags": ["provisioned", "galera", "mariadb"], @@ -1366,12 +1366,12 @@ ] }, "time": { - "from": "now-1h", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "", - "title": "Galera/MariaDB - Overview", + "title": "MariaDB Galera - Overview", "uid": "pXgz0qFGk", "version": 2 } \ No newline at end of file diff --git a/helm/dbrepo/files/my.cnf b/helm/dbrepo/files/my.cnf deleted file mode 100644 index 2798f37644d8b2b2691335277c50e41dcd295def..0000000000000000000000000000000000000000 --- a/helm/dbrepo/files/my.cnf +++ /dev/null @@ -1,125 +0,0 @@ -[client] -port=3306 -socket=/opt/bitnami/mariadb/tmp/mysql.sock -plugin_dir=/opt/bitnami/mariadb/plugin - -[mysqld] -explicit_defaults_for_timestamp -default_storage_engine=InnoDB -basedir=/opt/bitnami/mariadb -datadir=/bitnami/mariadb/data -plugin_dir=/opt/bitnami/mariadb/plugin -tmpdir=/opt/bitnami/mariadb/tmp -socket=/opt/bitnami/mariadb/tmp/mysql.sock -pid_file=/opt/bitnami/mariadb/tmp/mysqld.pid -bind_address=0.0.0.0 - -## Character set -## -collation_server=utf8_unicode_ci -init_connect='SET NAMES utf8' -character_set_server=utf8 - -## MyISAM -## -key_buffer_size=32M -myisam_recover_options=FORCE,BACKUP - -## Safety -## -skip_host_cache -skip_name_resolve -max_allowed_packet=16M -max_connect_errors=1000000 -sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY -sysdate_is_now=1 - -## Binary Logging -## -log_bin=mysql-bin -expire_logs_days=14 -# Disabling for performance per http://severalnines.com/blog/9-tips-going-production-galera-cluster-mysql -sync_binlog=0 -# Required for Galera -binlog_format=row - -## Caches and Limits -## -tmp_table_size=32M -max_heap_table_size=32M -# Re-enabling as now works with Maria 10.1.2 -query_cache_type=1 -query_cache_limit=4M -query_cache_size=256M -max_connections=500 -thread_cache_size=50 -open_files_limit=65535 -table_definition_cache=4096 -table_open_cache=4096 - -## InnoDB -## -innodb=FORCE -innodb_strict_mode=1 -# Mandatory per https://github.com/codership/documentation/issues/25 -innodb_autoinc_lock_mode=2 -# Per https://www.percona.com/blog/2006/08/04/innodb-double-write/ -innodb_doublewrite=1 -innodb_flush_method=O_DIRECT -innodb_log_files_in_group=2 -innodb_log_file_size=128M -innodb_flush_log_at_trx_commit=1 -innodb_file_per_table=1 -# 80% Memory is default reco. -# Need to re-evaluate when DB size grows -innodb_buffer_pool_size=1430M -innodb_file_format=Barracuda - -## Logging -## -log_error=/opt/bitnami/mariadb/logs/mysqld.log -slow_query_log_file=/opt/bitnami/mariadb/logs/mysqld.log -log_queries_not_using_indexes=1 -slow_query_log=1 - -## SSL -## Use extraVolumes and extraVolumeMounts to mount /certs filesystem -# ssl_ca=/certs/ca.pem -# ssl_cert=/certs/server-cert.pem -# ssl_key=/certs/server-key.pem - -[galera] -wsrep_on=ON -wsrep_provider=/opt/bitnami/mariadb/lib/libgalera_smm.so -wsrep_sst_method=mariabackup -wsrep_slave_threads=4 -wsrep_cluster_address=gcomm:// -wsrep_cluster_name=galera -wsrep_sst_auth="root:" -# Enabled for performance per https://mariadb.com/kb/en/innodb-system-variables/#innodb_flush_log_at_trx_commit -innodb_flush_log_at_trx_commit=2 -# MYISAM REPLICATION SUPPORT # -wsrep_mode=REPLICATE_MYISAM - -[mariadb] -plugin_load_add=auth_pam - -## Data-at-Rest Encryption -## Use extraVolumes and extraVolumeMounts to mount /encryption filesystem -# plugin_load_add=file_key_management -# file_key_management_filename=/encryption/keyfile.enc -# file_key_management_filekey=FILE:/encryption/keyfile.key -# file_key_management_encryption_algorithm=AES_CTR -# encrypt_binlog=ON -# encrypt_tmp_files=ON - -## InnoDB/XtraDB Encryption -# innodb_encrypt_tables=ON -# innodb_encrypt_temporary_tables=ON -# innodb_encrypt_log=ON -# innodb_encryption_threads=4 -# innodb_encryption_rotate_key_age=1 - -## Aria Encryption -# aria_encrypt_tables=ON -# encrypt_tmp_disk_tables=ON \ No newline at end of file diff --git a/helm/dbrepo/files/rabbitmq.json b/helm/dbrepo/files/rabbitmq.json index a8db65695f2dfef0484ebd91fcb7401f31f9f70d..fbaaf04ba0f7b32f7da9a10ac3edbafab23f273a 100644 --- a/helm/dbrepo/files/rabbitmq.json +++ b/helm/dbrepo/files/rabbitmq.json @@ -41,7 +41,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -8053,7 +8053,7 @@ "type": "timeseries" } ], - "refresh": "15s", + "refresh": "24h", "schemaVersion": 34, "style": "dark", "tags": ["provisioned", "rabbitmq"], @@ -8133,7 +8133,7 @@ ] }, "time": { - "from": "now-15m", + "from": "now-3h", "to": "now" }, "timepicker": { diff --git a/helm/dbrepo/hack/add-hosts.sh b/helm/dbrepo/hack/add-hosts.sh deleted file mode 100755 index 93d1bbcb52c80ce3d3c173b4d458fd76489fde21..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/add-hosts.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cat /etc/hosts | grep "dbrepo.local" -if [ "$?" -ne 0 ]; then - echo "$(minikube ip) dbrepo.local" | sudo tee -a /etc/hosts -fi \ No newline at end of file diff --git a/helm/dbrepo/hack/generate-rabbitmq-pw.sh b/helm/dbrepo/hack/generate-rabbitmq-pw.sh deleted file mode 100755 index 4bccc93d7b0b9dc8a9e8b4116bcd6826f83f3f71..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/generate-rabbitmq-pw.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# https://stackoverflow.com/a/53175209/2634294 -# THIS SCRIPT REQUIRES xxd TO BE INSTALLED: -# DEBIAN: apt install xxd -# MACOS: brew install coreutils -function encode_password() -{ - SALT=$(od -A n -t x -N 4 /dev/urandom) - PASS=$SALT$(echo -n $1 | xxd -ps | tr -d '\n' | tr -d ' ') - PASS=$(echo -n $PASS | xxd -r -p | sha256sum | head -c 128) - PASS=$(echo -n $SALT$PASS | xxd -r -p | base64 | tr -d '\n') - echo $PASS -} -encode_password $1 \ No newline at end of file diff --git a/helm/dbrepo/hack/generate-tls-cert.sh b/helm/dbrepo/hack/generate-tls-cert.sh deleted file mode 100755 index cfe69dfdb0e59f7c2b0895b63f4bf039e074c9e4..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/generate-tls-cert.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -HOSTNAME="dbrepo.local" - -openssl genrsa -out ./tls/ca.key 2048 -openssl req -new -x509 -days 365 -key ./tls/ca.key -subj "/C=AT/O=Acme, Inc./CN=Acme Root CA" -out ./tls/ca.crt -openssl req -newkey rsa:2048 -nodes -keyout ./tls/tls.key -subj "/C=AT/O=DBRepo/CN=${HOSTNAME}" -out ./tls/tls.csr -openssl x509 -req -extfile <(printf "subjectAltName=DNS:${HOSTNAME},DNS:www.${HOSTNAME}") -days 365 -in ./tls/tls.csr \ - -CA ./tls/ca.crt -CAkey ./tls/ca.key -CAcreateserial -out ./tls/tls.crt \ No newline at end of file diff --git a/helm/dbrepo/hack/install-cert-manager.sh b/helm/dbrepo/hack/install-cert-manager.sh deleted file mode 100755 index 8b0569b733164132d0932e3e645e1fb025a3d84f..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/install-cert-manager.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v${CERT_MANAGER_VERSION}/cert-manager.yaml -if [ $? -ne 0 ]; then - echo "ERROR: Failed to install cert-manager" > /dev/stderr -else - echo "SUCCESS: Installed cert-manager" -fi -cat <<EOF | kubectl apply -f - -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: selfsigned-cluster-issuer -spec: - selfSigned: {} -EOF diff --git a/helm/dbrepo/hack/install-seaweedfs.sh b/helm/dbrepo/hack/install-seaweedfs.sh deleted file mode 100755 index 5842de8eafcb47bb163645b6a51a14e5ab140fd7..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/install-seaweedfs.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -helm upgrade -n seaweedfs seaweedfs https://seaweedfs.github.io/seaweedfs-csi-driver/helm/seaweedfs-csi-driver-0.1.3.tgz \ - --install --create-namespace \ No newline at end of file diff --git a/helm/dbrepo/templates/_helpers.tpl b/helm/dbrepo/templates/_helpers.tpl index b58ad0e517c2d1e9ff34a89e3700c0505eafe3b0..b9b6534de6ebab17707d0f19124698fda0e524fd 100644 --- a/helm/dbrepo/templates/_helpers.tpl +++ b/helm/dbrepo/templates/_helpers.tpl @@ -61,6 +61,57 @@ Create the name of the service account to use {{- end }} {{- end }} +{{/* +Service configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarOpensearchService" -}} +[SERVICE] + Flush 5 + Daemon Off + Log_Level debug + Parsers_File /opt/bitnami/fluent-bit/conf/parsers.conf +{{- end -}} + +{{/* +Input configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarOpensearchInput" -}} +[INPUT] + Name tail + Tag * + Path /var/log/app/service/*/*.log + Parser docker + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k +{{- end -}} + +{{/* +Output configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarOpensearchOutput" -}} +[OUTPUT] + Name opensearch + Match * + Host search-db + Port 9200 + Index logging + Replace_Dots On + Suppress_Type_Name On + Trace_Error On +{{- end -}} + +{{/* +Output configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarMetricsOutput" -}} +[OUTPUT] + name prometheus_exporter + match internal_metrics + host 0.0.0.0 + port 2021 +{{- end -}} + {{/* Broker connections */}} diff --git a/helm/dbrepo/templates/_resources.tpl b/helm/dbrepo/templates/_resources.tpl index be31108c93f7f5bbbcf9d5a9c13313190da554db..d4368b7164e634430db9a322e7a5fc9e095ab736 100644 --- a/helm/dbrepo/templates/_resources.tpl +++ b/helm/dbrepo/templates/_resources.tpl @@ -38,8 +38,8 @@ These presets are for basic testing and not meant to be used in production "limits" (dict "cpu" "1.5" "memory" "3072Mi" "ephemeral-storage" "2Gi") ) "xlarge" (dict - "requests" (dict "cpu" "1.0" "memory" "3072Mi" "ephemeral-storage" "50Mi") - "limits" (dict "cpu" "3.0" "memory" "6144Mi" "ephemeral-storage" "2Gi") + "requests" (dict "cpu" "1.5" "memory" "4096Mi" "ephemeral-storage" "50Mi") + "limits" (dict "cpu" "2.0" "memory" "6144Mi" "ephemeral-storage" "2Gi") ) "2xlarge" (dict "requests" (dict "cpu" "1.0" "memory" "3072Mi" "ephemeral-storage" "50Mi") diff --git a/helm/dbrepo/templates/analyse-configmap.yaml b/helm/dbrepo/templates/analyse-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..45d4cb32219d114b9bec6e50e56a7f165ce93097 --- /dev/null +++ b/helm/dbrepo/templates/analyse-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.analyseservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: analyse-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/analyse-deployment.yaml b/helm/dbrepo/templates/analyse-deployment.yaml index d3e6b699c0b66e1100bdae7aab6a560380a6f19e..07f02ce9192b2ebcbaf1477378ee2435e1630546 100644 --- a/helm/dbrepo/templates/analyse-deployment.yaml +++ b/helm/dbrepo/templates/analyse-deployment.yaml @@ -18,6 +18,10 @@ spec: service: analyse-service template: metadata: + annotations: + {{- if .Values.analyseservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.analyseservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: analyse-service service: analyse-service @@ -35,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/analyse envFrom: - secretRef: name: analyse-service-secret @@ -59,4 +66,37 @@ spec: {{- else if ne .Values.analyseservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.analyseservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.analyseservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.analyseservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.analyseservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/analyse + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: analyse-service-config + {{- end }} + - name: empty-dir + emptyDir: {} {{- end }} diff --git a/helm/dbrepo/templates/auth-configmap.yaml b/helm/dbrepo/templates/auth-configmap.yaml index 8d8340bd9bb3db42e8a1385cdf4a0e631963f525..4e95365743d17062227c2095d745e92b8a04207f 100644 --- a/helm/dbrepo/templates/auth-configmap.yaml +++ b/helm/dbrepo/templates/auth-configmap.yaml @@ -8,19 +8,6 @@ binaryData: create-event-listener.jar: |- {{ .Files.Get "files/create-event-listener.jar" | b64enc }} data: - AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}" - AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}" - AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}" - KEYCLOAK_HOSTNAME: "{{ .Values.gateway }}" - LDAP_ROOT: "{{ .Values.identityservice.global.ldapDomain }}" - LDAP_ADMIN_DN: "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}" - LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}" - METADATA_DB: "{{ .Values.metadatadb.db.name }}" - METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}" - METADATA_SERVICE_ENDPOINT: "{{ .Values.metadataservice.endpoint }}" - METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}" - SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" - SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" {{ (.Files.Glob "files/dbrepo-realm.json").AsConfig | nindent 2 }} {{ (.Files.Glob "files/master-realm.json").AsConfig | nindent 2 }} {{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/auth-secret.yaml b/helm/dbrepo/templates/auth-secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..da47194ddfd93d225242ed84df35802d42501ecf --- /dev/null +++ b/helm/dbrepo/templates/auth-secret.yaml @@ -0,0 +1,26 @@ +{{- if .Values.authservice.enabled }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: auth-service-secret + namespace: {{ include "common.names.namespace" . | quote }} +stringData: + AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}" + AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}" + AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}" + KC_LOG: "console,file" + KC_LOG_FILE_JSON_FORMAT: "ecs" + KC_LOG_FILE_LEVEL: "debug" + KC_LOG_FILE_OUTPUT: "json" + KEYCLOAK_HOSTNAME: "{{ .Values.gateway }}" + LDAP_ROOT: "{{ .Values.identityservice.global.ldapDomain }}" + LDAP_ADMIN_DN: "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}" + LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}" + METADATA_DB: "{{ .Values.metadatadb.db.name }}" + METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}" + METADATA_SERVICE_ENDPOINT: "{{ .Values.metadataservice.endpoint }}" + METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}" + SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" + SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" +{{- end }} diff --git a/helm/dbrepo/templates/auth-job.yaml b/helm/dbrepo/templates/auth-setup-job.yaml similarity index 80% rename from helm/dbrepo/templates/auth-job.yaml rename to helm/dbrepo/templates/auth-setup-job.yaml index ca58e6a287cb97365b62fa4bec597ae8cb0ebab9..9b83684bf501402d5387b295eeab7b83869b2293 100644 --- a/helm/dbrepo/templates/auth-job.yaml +++ b/helm/dbrepo/templates/auth-setup-job.yaml @@ -16,6 +16,9 @@ spec: - name: init image: {{ .Values.authservice.setupJob.image.name }} imagePullPolicy: {{ .Values.authservice.setupJob.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.authservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.authservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} env: - name: POD_IP valueFrom: @@ -30,8 +33,8 @@ spec: fieldRef: fieldPath: metadata.namespace envFrom: - - configMapRef: - name: auth-service-config + - secretRef: + name: auth-service-secret {{- if .Values.authservice.setupJob.resources }} resources: {{- toYaml .Values.authservice.setupJob.resources | nindent 12 }} {{- else if ne .Values.authservice.setupJob.resourcesPreset "none" }} diff --git a/helm/dbrepo/templates/broker-configmap.yaml b/helm/dbrepo/templates/broker-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e39e2cebd1c5fa6b830ed31303774318f343dfb6 --- /dev/null +++ b/helm/dbrepo/templates/broker-configmap.yaml @@ -0,0 +1,41 @@ +{{- if .Values.brokerservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: broker-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + [SERVICE] + Flush 5 + Daemon Off + Log_Level debug + Parsers_File /opt/bitnami/fluent-bit/conf/parsers.conf + [INPUT] + Name tail + Tag * + Path /opt/bitnami/rabbitmq/var/log/rabbitmq/*.log + Parser rabbitmq + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k + [FILTER] + Name modify + Match * + Rename time @timestamp + Rename level log.level + Rename pid process.pid + Rename msg message + Add service.name broker-service + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} + parsers.conf: |- + [PARSER] + Name rabbitmq + Format json + Time_Key time + Time_Format %Y-%m-%d %H:%M:%S.%L + Time_Keep On +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/dashboard-configmap.yaml b/helm/dbrepo/templates/dashboard-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..567878c48e500d7e432963e4cbbd1c3d8a7dfb23 --- /dev/null +++ b/helm/dbrepo/templates/dashboard-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.dashboardservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: dashboard-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/dashboard-deployment.yaml b/helm/dbrepo/templates/dashboard-deployment.yaml index f2c1a6fff16b55ada432db13abca7fb40f5d45e8..9671d4ddd5aaecc54fd867c164802c37c310f998 100644 --- a/helm/dbrepo/templates/dashboard-deployment.yaml +++ b/helm/dbrepo/templates/dashboard-deployment.yaml @@ -18,6 +18,10 @@ spec: service: dashboard-service template: metadata: + annotations: + {{- if .Values.dashboardservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.dashboardservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: dashboard-service service: dashboard-service @@ -25,21 +29,6 @@ spec: {{- if .Values.dashboardservice.podSecurityContext.enabled }} securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.podSecurityContext "context" $) | nindent 8 }} {{- end }} - initContainers: - - name: init - image: {{ .Values.dashboardservice.init.image.name }} - imagePullPolicy: {{ .Values.dashboardservice.init.image.pullPolicy | default "IfNotPresent" }} - {{- if .Values.dashboardservice.containerSecurityContext.enabled }} - securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }} - {{- end }} - envFrom: - - secretRef: - name: dashboard-service-secret - {{- if .Values.dashboardservice.init.resources }} - resources: {{- toYaml .Values.dashboardservice.init.resources | nindent 12 }} - {{- else if ne .Values.dashboardservice.init.resourcesPreset "none" }} - resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.init.resourcesPreset) | nindent 12 }} - {{- end }} containers: - name: dashboard-service image: {{ .Values.dashboardservice.image.name }} @@ -50,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/dashboard envFrom: - secretRef: name: dashboard-service-secret @@ -74,4 +66,37 @@ spec: {{- else if ne .Values.dashboardservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.dashboardservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.dashboardservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/dashboard + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: dashboard-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/dashboard-setup-job.yaml b/helm/dbrepo/templates/dashboard-setup-job.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a12228661b6af4b1d0c3cb8700c017b0e5573399 --- /dev/null +++ b/helm/dbrepo/templates/dashboard-setup-job.yaml @@ -0,0 +1,49 @@ +{{- if .Values.dashboardservice.enabled }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: dashboard-service-setup-job + namespace: {{ include "common.names.namespace" . | quote }} +spec: + backoffLimit: {{ .Values.dashboardservice.setupJob.backoffLimit | default "10" }} + template: + metadata: + name: auth-service-setup-job + spec: + restartPolicy: OnFailure + containers: + - name: init + image: {{ .Values.dashboardservice.setupJob.image.name }} + imagePullPolicy: {{ .Values.dashboardservice.setupJob.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.dashboardservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + envFrom: + - secretRef: + name: dashboard-service-secret + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/dashboard + {{- if .Values.dashboardservice.setupJob.resources }} + resources: {{- toYaml .Values.dashboardservice.setupJob.resources | nindent 12 }} + {{- else if ne .Values.dashboardservice.setupJob.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.setupJob.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + - name: empty-dir + emptyDir: { } +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-ui-configmap.yaml b/helm/dbrepo/templates/dashboard-ui-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9fe92bc9e2aca14e59805388e4a723d85593d5fd --- /dev/null +++ b/helm/dbrepo/templates/dashboard-ui-configmap.yaml @@ -0,0 +1,14 @@ +{{- if .Values.dashboardui.enabled }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: dashboard-ui-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + {{ (.Files.Glob "files/dbrepo.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/keycloak.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/logging.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/mariadb.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/rabbitmq.json").AsConfig | nindent 2 }} +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml b/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8a21a20db8dd41dad8f36174cf23ca5420562a60 --- /dev/null +++ b/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml @@ -0,0 +1,47 @@ +{{- if .Values.dashboardui.enabled }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: dashboard-ui-datasources-secret + namespace: {{ include "common.names.namespace" . | quote }} +stringData: + infinity.yaml: |- + apiVersion: 1 + datasources: + - name: dbrepo-json + uid: dbrepojson0 + type: yesoreyeram-infinity-datasource + basicAuth: true + basicAuthUser: user + url: $BASE_URL + jsonData: + auth_method: 'basicAuth' + httpHeaderName1: Accept + allowedHosts: + - '$BASE_URL' + secureJsonData: + basicAuthPassword: user + httpHeaderValue1: application/json + prometheus.yaml: |- + apiVersion: 1 + datasources: + - name: dbrepo-metrics + type: prometheus + uid: dbrepometrics0 + url: http://metric-db-server + opensearch.yaml: |- + apiVersion: 1 + datasources: + - name: dbrepo-opensearch + uid: dbrepoopensearch0 + type: grafana-opensearch-datasource + basicAuth: false + url: http://search-db:9200 + jsonData: + flavor: "opensearch" + logLevelField: "level" + logMessageField: "message" + timeField: "@timestamp" + version: "2.19.0" +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-ui-secret.yaml b/helm/dbrepo/templates/dashboard-ui-secret.yaml index 0816c696377d28c3c3e9ab1358e5bce69e4e36b2..b8b88a1dc1f721e09ac39f68e104617db51a0eec 100644 --- a/helm/dbrepo/templates/dashboard-ui-secret.yaml +++ b/helm/dbrepo/templates/dashboard-ui-secret.yaml @@ -6,12 +6,16 @@ metadata: name: dashboard-ui-secret namespace: {{ include "common.names.namespace" . | quote }} stringData: - GF_SERVER_PROTOCOL: "http" - GF_SERVER_DOMAIN: "{{ .Values.hostname }}" - GF_SERVER_ROOT_URL: "https://%(domain)s/dashboard/" + BASE_URL: "{{ .Values.gateway }}" GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" - GF_SERVER_SERVE_FROM_SUB_PATH: "true" + GF_DATABASE_TYPE: "postgres" + GF_DATABASE_HOST: "{{ .Values.dashboarddb.host }}" + GF_DATABASE_NAME: "{{ .Values.dashboarddb.auth.database }}" + GF_DATABASE_USER: "{{ .Values.dashboarddb.auth.username }}" + GF_DATABASE_PASSWORD: "{{ .Values.dashboarddb.auth.password }}" + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource,grafana-opensearch-datasource" + GF_SERVER_ROOT_URL: "http://dashboard-ui:3000/dashboard/" GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" LDAP_ADMIN_USERNAME: "{{ .Values.identityservice.global.adminUser }}" LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}" @@ -19,7 +23,7 @@ stringData: ldap.toml: | [[servers]] host = "identity-service" - port = 389 + port = 1389 use_ssl = false # Search user bind dn diff --git a/helm/dbrepo/templates/data-configmap.yaml b/helm/dbrepo/templates/data-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8d9d4b6334a90101e8c348afe6c1c8243697bdcf --- /dev/null +++ b/helm/dbrepo/templates/data-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.dataservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: data-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/data-db-configmap.yaml b/helm/dbrepo/templates/data-db-configmap.yaml index 31fdb84aee6198ca30eeb22edc72909057fcab1b..cf80439a72b46eda575ae8e9626849caa0dbf6ee 100644 --- a/helm/dbrepo/templates/data-db-configmap.yaml +++ b/helm/dbrepo/templates/data-db-configmap.yaml @@ -1,4 +1,5 @@ {{- if .Values.datadb.enabled }} +--- apiVersion: v1 kind: ConfigMap metadata: diff --git a/helm/dbrepo/templates/data-deployment.yaml b/helm/dbrepo/templates/data-deployment.yaml index 7e77d2020e39a877b6d0165452adcf25f2b34eba..6a2a1be15eff868a283fb973856a58cc7f3d3b01 100644 --- a/helm/dbrepo/templates/data-deployment.yaml +++ b/helm/dbrepo/templates/data-deployment.yaml @@ -18,6 +18,10 @@ spec: service: data-service template: metadata: + annotations: + {{- if .Values.dataservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.dataservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: data-service service: data-service @@ -35,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/data envFrom: - secretRef: name: data-service-secret @@ -59,4 +66,37 @@ spec: {{- else if ne .Values.dataservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.dataservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.metadataservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.metadataservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.metadataservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/data + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: data-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/gateway-configmap.yaml b/helm/dbrepo/templates/gateway-configmap.yaml index 37863f85c45ae39134f5293687ca2f1bdb5e8223..e92ccaab9a23b78c21c65a0e63419cb1bf34c281 100644 --- a/helm/dbrepo/templates/gateway-configmap.yaml +++ b/helm/dbrepo/templates/gateway-configmap.yaml @@ -1,201 +1,22 @@ {{- if .Values.gatewayservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} apiVersion: v1 kind: ConfigMap metadata: - name: gateway-service-setup + name: gateway-service-config namespace: {{ include "common.names.namespace" . | quote }} data: - dbrepo.conf: | - # This is required to proxy Grafana Live WebSocket connections. - map $http_upgrade $connection_upgrade { - default upgrade; - '' close; - } - - proxy_buffer_size 128k; - proxy_buffers 4 256k; - proxy_busy_buffers_size 256k; - - server { - listen 8080 default_server; - server_name _; - - location /assets/ { - root /app/assets; - expires max; - access_log off; - autoindex on; - autoindex_exact_size off; - autoindex_format html; - autoindex_localtime on; - } - - location /dashboard/ { - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-ui:3000/; - proxy_read_timeout 90; - } - - # Proxy Grafana Live WebSocket connections. - location /dashboard/api/live/ws { - rewrite ^/dashboard/(.*) /$1 break; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_http_version 1.1; - proxy_pass http://dashboard-ui:3000/; - proxy_read_timeout 90; - } - - # Proxy Keycloak OIDC connections, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations - location /realms { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://auth-service; - proxy_read_timeout 90; - } - - # Proxy Keycloak assets, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations - location /resources { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://auth-service; - proxy_read_timeout 90; - } - - location /api/search { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://search-service; - proxy_read_timeout 90; - } - - location /api/datasource { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - location /api/dashboard { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - location /api/upload { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; - proxy_pass http://data-service; - proxy_read_timeout 90; - # Disable request and response buffering - proxy_request_buffering off; - proxy_buffering off; - proxy_http_version 1.1; - } - - location /api/analyse { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://analyse-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/table/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic|history)" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic)" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data-service; - proxy_read_timeout 600; - } - - location ~ "/api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user)" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location ~ "/api/identifier/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location ~ "/pid/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { - rewrite /pid/(.*) /api/identifier/$1 break; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://ui; - proxy_read_timeout 90; - } - } + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + [INPUT] + Name tail + Tag * + Path /var/log/nginx/*.log + Parser docker + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} {{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/gateway-serverblock-configmap.yaml b/helm/dbrepo/templates/gateway-serverblock-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2a50958d9d7edf6c78322fd0299e41b14df43e53 --- /dev/null +++ b/helm/dbrepo/templates/gateway-serverblock-configmap.yaml @@ -0,0 +1,9 @@ +{{- if .Values.gatewayservice.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: gateway-service-setup + namespace: {{ include "common.names.namespace" . | quote }} +data: + {{ (.Files.Glob "files/dbrepo.conf").AsConfig | nindent 2 }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/identity-statefulset.yaml b/helm/dbrepo/templates/identity-statefulset.yaml index f65a547e669b1346f6bb58a2bdce7745cd5f430f..4c1d9b3f29a66e55af1738fd1050ebf56b3a1510 100644 --- a/helm/dbrepo/templates/identity-statefulset.yaml +++ b/helm/dbrepo/templates/identity-statefulset.yaml @@ -16,6 +16,10 @@ spec: service: identity-service template: metadata: + annotations: + {{- if .Values.identityservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.identityservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: identity-service service: identity-service @@ -40,7 +44,7 @@ spec: name: identity-service-secret {{- if .Values.identityservice.persistence.enabled }} volumeMounts: - - name: openldap-data + - name: data mountPath: /bitnami/openldap {{- end }} livenessProbe: @@ -67,7 +71,7 @@ spec: {{- if .Values.identityservice.persistence.enabled }} volumeClaimTemplates: - metadata: - name: openldap-data + name: data spec: accessModes: [ "ReadWriteOnce" ] {{- if .Values.global.storageClass }} diff --git a/helm/dbrepo/templates/metadata-configmap.yaml b/helm/dbrepo/templates/metadata-configmap.yaml index e837c8072ada18d0bb9a364456834bfaecc3e697..4d4960aa62bad21dcccdbc26039e4b8f6bfa4e5d 100644 --- a/helm/dbrepo/templates/metadata-configmap.yaml +++ b/helm/dbrepo/templates/metadata-configmap.yaml @@ -1,24 +1,15 @@ -{{- if .Values.metadatadb.enabled }} ---- +{{- if .Values.metadataservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} apiVersion: v1 kind: ConfigMap metadata: - name: metadata-db-config + name: metadata-service-config namespace: {{ include "common.names.namespace" . | quote }} data: - {{- with .Values.metadatadb.extraInitDbScripts }} - {{ toYaml . | nindent 2 }} - {{- end }} - {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} - 02-setup-data.sql: |- - BEGIN; - INSERT INTO `mdb_containers` (id, name, internal_name, image_id, host, port, ui_host, ui_port, privileged_username, - privileged_password, readonly_username, readonly_password) - VALUES ('6cfb3b8e-1792-4e46-871a-f3d103527203', 'mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', - 'd79cb089-363c-488b-9717-649e44d8fcc5', 'data-db', {{ .Values.datadb.containerPorts.mysql }}, - '{{ .Values.hostname }}', {{ .Values.datadb.containerPorts.mysql }}, '{{ .Values.datadb.rootUser.user }}', - '{{ .Values.datadb.rootUser.password }}', '{{ .Values.datadb.db.user }}', - '{{ .Values.datadb.db.password }}'); - COMMIT; - {{ (.Files.Glob "files/my.cnf").AsConfig | nindent 2 }} + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/metadata-db-configmap.yaml b/helm/dbrepo/templates/metadata-db-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..09fa8a566157890d788d661228fe45620eb83436 --- /dev/null +++ b/helm/dbrepo/templates/metadata-db-configmap.yaml @@ -0,0 +1,23 @@ +{{- if .Values.metadatadb.enabled }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: metadata-db-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + {{- with .Values.metadatadb.extraInitDbScripts }} + {{ toYaml . | nindent 2 }} + {{- end }} + {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} + 02-setup-data.sql: |- + BEGIN; + INSERT INTO `mdb_containers` (id, name, internal_name, image_id, host, port, ui_host, ui_port, privileged_username, + privileged_password, readonly_username, readonly_password) + VALUES ('6cfb3b8e-1792-4e46-871a-f3d103527203', 'mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', + 'd79cb089-363c-488b-9717-649e44d8fcc5', 'data-db', {{ .Values.datadb.containerPorts.mysql }}, + '{{ .Values.hostname }}', {{ .Values.datadb.containerPorts.mysql }}, '{{ .Values.datadb.rootUser.user }}', + '{{ .Values.datadb.rootUser.password }}', '{{ .Values.datadb.db.user }}', + '{{ .Values.datadb.db.password }}'); + COMMIT; +{{- end }} diff --git a/helm/dbrepo/templates/metadata-deployment.yaml b/helm/dbrepo/templates/metadata-deployment.yaml index f5f27378e1d88c2ee59743a5d2dbbcbe110e0235..c175341703aff14dd07b76b6e9753442d42d2409 100644 --- a/helm/dbrepo/templates/metadata-deployment.yaml +++ b/helm/dbrepo/templates/metadata-deployment.yaml @@ -18,6 +18,10 @@ spec: service: metadata-service template: metadata: + annotations: + {{- if .Values.metadataservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.metadataservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: metadata-service service: metadata-service @@ -35,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/metadata envFrom: - secretRef: name: metadata-service-secret @@ -59,4 +66,37 @@ spec: {{- else if ne .Values.metadataservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.metadataservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.metadataservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.metadataservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.metadataservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/metadata + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: metadata-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/metadata-setup-configmap.yaml b/helm/dbrepo/templates/metadata-setup-configmap.yaml deleted file mode 100644 index 608f1d13e162665464faeaf3eaa789834f6a8429..0000000000000000000000000000000000000000 --- a/helm/dbrepo/templates/metadata-setup-configmap.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.metadatadb.enabled }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: metadata-db-setup - namespace: {{ include "common.names.namespace" . | quote }} -data: - {{- with .Values.metadatadb.extraInitDbScripts }} - {{ toYaml . | nindent 2 }} - {{- end }} - {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} - 02-setup-data.sql: | - BEGIN; - INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, privileged_username, privileged_password) - VALUES ('mariadb-galera:11.3.2-debian-12-r9', 'mariadb-galera:11.3.2-debian-12-r9', 1, 'data-db', 3306, '{{ .Values.datadb.rootUser.user }}', '{{ .Values.datadb.rootUser.password }}'); - COMMIT; - {{ (.Files.Glob "files/my.cnf").AsConfig | nindent 2 }} -{{- end }} diff --git a/helm/dbrepo/templates/search-configmap.yaml b/helm/dbrepo/templates/search-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..407d7ee90ec6a297b0be728eaba6a68ec22b9b1a --- /dev/null +++ b/helm/dbrepo/templates/search-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.searchservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: search-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/search-deployment.yaml b/helm/dbrepo/templates/search-deployment.yaml index 98908f0c4202f31fdbf9e0915a1eeaea866193ad..cdaddbafe0283cdeaf7c12df929c5b9bdf915f81 100644 --- a/helm/dbrepo/templates/search-deployment.yaml +++ b/helm/dbrepo/templates/search-deployment.yaml @@ -18,6 +18,10 @@ spec: service: search-service template: metadata: + annotations: + {{- if .Values.searchservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.searchservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: search-service service: search-service @@ -25,21 +29,6 @@ spec: {{- if .Values.searchservice.podSecurityContext.enabled }} securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.podSecurityContext "context" $) | nindent 8 }} {{- end }} - initContainers: - - name: init - image: {{ .Values.searchservice.init.image.name }} - imagePullPolicy: {{ .Values.searchservice.init.image.pullPolicy | default "IfNotPresent" }} - {{- if .Values.searchservice.containerSecurityContext.enabled }} - securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }} - {{- end }} - envFrom: - - secretRef: - name: search-service-secret - {{- if .Values.searchservice.init.resources }} - resources: {{- toYaml .Values.searchservice.init.resources | nindent 12 }} - {{- else if ne .Values.searchservice.init.resourcesPreset "none" }} - resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.init.resourcesPreset) | nindent 12 }} - {{- end }} containers: - name: search-service image: {{ .Values.searchservice.image.name }} @@ -54,8 +43,10 @@ spec: - secretRef: name: search-service-secret volumeMounts: - - mountPath: /tmp - name: cache + - name: empty-dir + mountPath: /tmp + - name: empty-dir + mountPath: /var/log/app/service/search livenessProbe: exec: command: @@ -77,8 +68,37 @@ spec: {{- else if ne .Values.searchservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.searchservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.searchservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/search + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} volumes: - - name: cache - emptyDir: - sizeLimit: 100Mi + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: search-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/search-setup-job.yaml b/helm/dbrepo/templates/search-setup-job.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4c01e19e0f54378f699be94627d63d96a10fd632 --- /dev/null +++ b/helm/dbrepo/templates/search-setup-job.yaml @@ -0,0 +1,49 @@ +{{- if .Values.searchservice.enabled }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: search-service-setup-job + namespace: {{ include "common.names.namespace" . | quote }} +spec: + backoffLimit: {{ .Values.searchservice.setupJob.backoffLimit | default "10" }} + template: + metadata: + name: search-service-setup-job + spec: + restartPolicy: OnFailure + containers: + - name: init + image: {{ .Values.searchservice.setupJob.image.name }} + imagePullPolicy: {{ .Values.searchservice.setupJob.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.searchservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + envFrom: + - secretRef: + name: search-service-secret + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/search + {{- if .Values.searchservice.setupJob.resources }} + resources: {{- toYaml .Values.searchservice.setupJob.resources | nindent 12 }} + {{- else if ne .Values.searchservice.setupJob.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.setupJob.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + - name: empty-dir + emptyDir: { } +{{- end }} diff --git a/helm/dbrepo/templates/storage-configmap.yaml b/helm/dbrepo/templates/storage-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c3d2469e069e029ec4f1efef8fa3cce190d466c0 --- /dev/null +++ b/helm/dbrepo/templates/storage-configmap.yaml @@ -0,0 +1,26 @@ +{{- if .Values.storageservice.setupJob.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: storage-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + [SERVICE] + Flush 5 + Daemon Off + Log_Level debug + Parsers_File /opt/bitnami/fluent-bit/conf/parsers.conf + [INPUT] + Name tail + Tag * + Path /var/log/app/service/*/*.log + Parser docker + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/storage-secret.yaml b/helm/dbrepo/templates/storage-secret.yaml index 452baecbf9480295e86fcc3975ab62996431f52c..7df792fc4bd371571ec168250f64e5dce749c690 100644 --- a/helm/dbrepo/templates/storage-secret.yaml +++ b/helm/dbrepo/templates/storage-secret.yaml @@ -7,7 +7,7 @@ metadata: namespace: {{ include "common.names.namespace" . | quote }} stringData: S3_BUCKET: "{{ .Values.storageservice.s3.bucket }}" - STORAGE_ENDPOINT: "{{ .Values.storageservice.init.s3.endpoint }}" + STORAGE_ENDPOINT: "{{ .Values.storageservice.setupJob.s3.endpoint }}" admin_access_key_id: "{{ .Values.storageservice.s3.auth.adminAccessKeyId }}" admin_secret_access_key: "{{ .Values.storageservice.s3.auth.adminSecretAccessKey }}" read_access_key_id: "{{ .Values.storageservice.s3.auth.readAccessKeyId }}" diff --git a/helm/dbrepo/templates/storage-job.yaml b/helm/dbrepo/templates/storage-setup-job.yaml similarity index 71% rename from helm/dbrepo/templates/storage-job.yaml rename to helm/dbrepo/templates/storage-setup-job.yaml index ebc26f22125a10e94d910e0b385729b10b0c3c19..69845b1846deed121c66587413d611ba834b6d9d 100644 --- a/helm/dbrepo/templates/storage-job.yaml +++ b/helm/dbrepo/templates/storage-setup-job.yaml @@ -6,7 +6,7 @@ metadata: name: storage-service-setup-job namespace: {{ include "common.names.namespace" . | quote }} spec: - backoffLimit: {{ .Values.storageservice.init.backoffLimit | default "10" }} + backoffLimit: {{ .Values.storageservice.setupJob.backoffLimit | default "10" }} template: metadata: name: storage-service-setup-job @@ -14,8 +14,8 @@ spec: restartPolicy: OnFailure containers: - name: init - image: {{ .Values.storageservice.init.image.name }} - imagePullPolicy: {{ .Values.storageservice.init.image.pullPolicy | default "IfNotPresent" }} + image: {{ .Values.storageservice.setupJob.image.name }} + imagePullPolicy: {{ .Values.storageservice.setupJob.image.pullPolicy | default "IfNotPresent" }} env: - name: POD_IP valueFrom: @@ -50,14 +50,14 @@ spec: name: storage-service-secret key: STORAGE_ENDPOINT volumeMounts: - - name: app-cache + - name: empty-dir mountPath: /app/config - {{- if .Values.storageservice.init.resources }} - resources: {{- toYaml .Values.storageservice.init.resources | nindent 12 }} - {{- else if ne .Values.storageservice.init.resourcesPreset "none" }} - resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.init.resourcesPreset) | nindent 12 }} + {{- if .Values.storageservice.setupJob.resources }} + resources: {{- toYaml .Values.storageservice.setupJob.resources | nindent 12 }} + {{- else if ne .Values.storageservice.setupJob.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.setupJob.resourcesPreset) | nindent 12 }} {{- end }} volumes: - - name: app-cache - emptyDir: {} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/ui-deployment.yaml b/helm/dbrepo/templates/ui-deployment.yaml index 512b3f403f8f18a4949de2c6b8d835f894da46a9..32e2f5905ff9e955a2ca93fafb7824b83b49d969 100644 --- a/helm/dbrepo/templates/ui-deployment.yaml +++ b/helm/dbrepo/templates/ui-deployment.yaml @@ -18,6 +18,10 @@ spec: service: ui template: metadata: + annotations: + {{- if .Values.ui.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.ui.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: ui service: ui diff --git a/helm/dbrepo/templates/ui-secret.yaml b/helm/dbrepo/templates/ui-secret.yaml index 54340220811040bad5eb5a4db79d5eb7d18541e7..bf972bca56ec28b6b29827f133974efe41895e67 100644 --- a/helm/dbrepo/templates/ui-secret.yaml +++ b/helm/dbrepo/templates/ui-secret.yaml @@ -1,5 +1,6 @@ {{- if .Values.ui.enabled }} {{ $uploadEndpoint := printf "%s/api/upload/files" .Values.gateway }} +{{ $dashboardEndpoint := printf "%s/dashboard" .Values.gateway }} --- apiVersion: v1 kind: Secret @@ -16,6 +17,7 @@ stringData: NUXT_PUBLIC_BROKER_HOST: "{{ .Values.ui.public.broker.host }}" NUXT_PUBLIC_BROKER_PORT: {{ .Values.ui.public.broker.port | toJson | quote }} NUXT_PUBLIC_BROKER_EXTRA: "{{ .Values.ui.public.broker.extra }}" + NUXT_PUBLIC_DASHBOARD_URL: "{{ .Values.ui.public.dashboard.url | default $dashboardEndpoint }}" NUXT_PUBLIC_DATABASE_EXTRA: "{{ .Values.ui.public.database.extra }}" NUXT_PUBLIC_DOI_ENABLED: "{{ .Values.ui.public.doi.enabled }}" NUXT_PUBLIC_DOI_ENDPOINT: "{{ .Values.ui.public.doi.endpoint }}" diff --git a/helm/dbrepo/templates/ui-service.yaml b/helm/dbrepo/templates/ui-service.yaml index 1ec140db603c075948b18cf933e2f5f322ac6aae..1f4fc63a133f0b3a2cab0241062e07d558270548 100644 --- a/helm/dbrepo/templates/ui-service.yaml +++ b/helm/dbrepo/templates/ui-service.yaml @@ -11,7 +11,7 @@ spec: type: ClusterIP ports: - name: "" - port: 80 + port: 3000 targetPort: 3000 protocol: TCP selector: diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index 804354f21deb634c5055f9c4cc2a310cef0f5db9..141dd1b385a6c05c1b94006223093b92eb8d15be 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -63,6 +63,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -126,7 +130,7 @@ "endpoint": { "type": "string" }, - "extraEnvVarsCM": { + "extraEnvVarsSecret": { "type": "string" }, "extraVolumeMounts": { @@ -157,14 +161,6 @@ }, "type": "object" }, - "emptyDir": { - "properties": { - "sizeLimit": { - "type": "string" - } - }, - "type": "object" - }, "name": { "type": "string" } @@ -301,6 +297,39 @@ "extraPlugins": { "type": "string" }, + "extraVolumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "extraVolumes": { + "items": { + "properties": { + "configMap": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "fullnameOverride": { "type": "string" }, @@ -361,15 +390,10 @@ }, "type": "object" }, - "metrics": { - "properties": { - "enabled": { - "type": "boolean" - } - }, - "type": "object" + "logs": { + "type": "string" }, - "persistence": { + "metrics": { "properties": { "enabled": { "type": "boolean" @@ -415,16 +439,158 @@ "type": "object" }, "type": "array" - }, - "managerPortEnabled": { - "type": "boolean" - }, - "type": { - "type": "string" } }, "type": "object" }, + "sidecars": { + "items": { + "properties": { + "image": { + "type": "string" + }, + "imagePullPolicy": { + "type": "string" + }, + "livenessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "readinessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "resources": { + "properties": { + "limits": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": {}, + "type": "object" + }, + "seccompProfile": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "volumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subPath": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, "virtualHost": { "type": "string" } @@ -442,6 +608,42 @@ }, "type": "object" }, + "dashboarddb": { + "properties": { + "auth": { + "properties": { + "database": { + "type": "string" + }, + "password": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "fullnameOverride": { + "type": "string" + }, + "host": { + "type": "string" + }, + "metrics": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, "dashboardservice": { "properties": { "containerSecurityContext": { @@ -504,24 +706,8 @@ }, "type": "object" }, - "init": { - "properties": { - "image": { - "properties": { - "name": { - "type": "string" - } - }, - "type": "object" - }, - "resources": { - "properties": {}, - "type": "object" - }, - "resourcesPreset": { - "type": "string" - } - }, + "podAnnotations": { + "properties": {}, "type": "object" }, "podSecurityContext": { @@ -553,12 +739,51 @@ }, "resourcesPreset": { "type": "string" + }, + "setupJob": { + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resources": { + "properties": {}, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" }, "dashboardui": { "properties": { + "dashboardsProvider": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "datasources": { + "properties": { + "secretName": { + "type": "string" + } + }, + "type": "object" + }, "enabled": { "type": "boolean" }, @@ -570,9 +795,26 @@ }, "grafana": { "properties": { + "extraConfigmaps": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "extraEnvVarsSecret": { "type": "string" }, + "replicaCount": { + "type": "integer" + }, "updateStrategy": { "properties": { "type": { @@ -605,6 +847,14 @@ } }, "type": "object" + }, + "persistence": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" } }, "type": "object" @@ -675,6 +925,17 @@ }, "type": "object" }, + "readonlyUser": { + "properties": { + "password": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, "replicaCount": { "type": "integer" }, @@ -768,6 +1029,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -862,6 +1127,39 @@ "existingServerBlockConfigmap": { "type": "string" }, + "extraVolumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "extraVolumes": { + "items": { + "properties": { + "configMap": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "fullnameOverride": { "type": "string" }, @@ -883,6 +1181,154 @@ } }, "type": "object" + }, + "sidecars": { + "items": { + "properties": { + "image": { + "type": "string" + }, + "imagePullPolicy": { + "type": "string" + }, + "livenessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "readinessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "resources": { + "properties": { + "limits": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": {}, + "type": "object" + }, + "seccompProfile": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "volumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subPath": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" } }, "type": "object" @@ -902,6 +1348,25 @@ }, "type": "object" }, + "loggingSidecar": { + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + } + }, + "type": "object" + }, "storageClass": { "type": "string" } @@ -1012,6 +1477,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -1076,9 +1545,6 @@ }, "metadatadb": { "properties": { - "configurationConfigMap": { - "type": "string" - }, "db": { "properties": { "name": { @@ -1265,6 +1731,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -1345,14 +1815,6 @@ "properties": { "enabled": { "type": "boolean" - }, - "service": { - "properties": { - "type": { - "type": "string" - } - }, - "type": "object" } }, "type": "object" @@ -1419,6 +1881,14 @@ } }, "type": "object" + }, + "updateStrategy": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" @@ -1566,24 +2036,8 @@ }, "type": "object" }, - "init": { - "properties": { - "image": { - "properties": { - "name": { - "type": "string" - } - }, - "type": "object" - }, - "resources": { - "properties": {}, - "type": "object" - }, - "resourcesPreset": { - "type": "string" - } - }, + "podAnnotations": { + "properties": {}, "type": "object" }, "podSecurityContext": { @@ -1615,28 +2069,12 @@ }, "resourcesPreset": { "type": "string" - } - }, - "type": "object" - }, - "storageservice": { - "properties": { - "enabled": { - "type": "boolean" }, - "filer": { + "setupJob": { "properties": { "enabled": { "type": "boolean" - } - }, - "type": "object" - }, - "fullnameOverride": { - "type": "string" - }, - "init": { - "properties": { + }, "image": { "properties": { "name": { @@ -1651,17 +2089,28 @@ }, "resourcesPreset": { "type": "string" - }, - "s3": { - "properties": { - "endpoint": { - "type": "string" - } - }, - "type": "object" } }, "type": "object" + } + }, + "type": "object" + }, + "storageservice": { + "properties": { + "enabled": { + "type": "boolean" + }, + "filer": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "fullnameOverride": { + "type": "string" }, "mariadb": { "properties": { @@ -1734,6 +2183,37 @@ }, "type": "object" }, + "setupJob": { + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resources": { + "properties": {}, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + }, + "s3": { + "properties": { + "endpoint": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "volume": { "properties": { "enabled": { @@ -1827,6 +2307,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -1888,6 +2372,14 @@ }, "type": "object" }, + "dashboard": { + "properties": { + "url": { + "type": "string" + } + }, + "type": "object" + }, "database": { "properties": { "extra": { diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 62ce16d3de3933c1be25c7a5602ff55be9c5cbbe..bffbc00c339d56115e82a6bda85e1c1d0e2d99f6 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -12,6 +12,14 @@ global: adaptSecurityContext: auto ## @param global.storageClass Global StorageClass for Persistent Volume(s) storageClass: "" + loggingSidecar: + ## @param global.loggingSidecar.enabled Enable the logging sidecars for the analyse-, dashboard-, data-, gateway-, metadata- and search service. + enabled: true + image: + ## @param global.loggingSidecar.image.name The logging sidecar image. + name: docker.io/bitnami/fluent-bit:4.0.0 + ## @param global.loggingSidecar.resourcesPreset The resource definitions for the logging sidecar. + resourcesPreset: nano ## @section Common parameters @@ -27,7 +35,7 @@ clusterDomain: cluster.local ## @section Metadata Database metadatadb: - ## @param metadatadb.enabled Enable the Metadata datadb. + ## @param metadatadb.enabled Enable the Metadata Database. enabled: true ## @skip metadatadb.fullnameOverride fullnameOverride: metadata-db @@ -56,8 +64,6 @@ metadatadb: enabled: true ## @skip metadatadb.initdbScriptsConfigMap The initial database scripts. initdbScriptsConfigMap: metadata-db-config - ## @param metadatadb.configurationConfigMap The database configuration files. - configurationConfigMap: metadata-db-config ## @param metadatadb.extraInitDbScripts Additional init.db scripts that are executed on the first start. extraInitDbScripts: { } # 03-additional-data.sql: | @@ -65,13 +71,33 @@ metadatadb: # INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password) # VALUES ('MariaDB Galera TEST', 'mariadb_11_1_3', 1, 'data-db', 3306, 'data-db', 80, 'root', 'dbrepo'); # COMMIT; - ## @param metadatadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 - replicaCount: 3 ## @param metadatadb.resourcesPreset The container resource preset - resourcesPreset: "nano-hm" + resourcesPreset: "xlarge" persistence: ## @param metadatadb.persistence.enabled Enable persistent storage. enabled: true + ## @param metadatadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 + replicaCount: 1 + +## @section Dashboard Database Enable the Dashboard Database. + +dashboarddb: + ## @param dashboarddb.enabled + enabled: true + ## @skip dashboarddb.fullnameOverride + fullnameOverride: dashboard-db + ## @param dashboarddb.host The hostname for the microservices. + host: dashboard-db:5432 + metrics: + ## @skip dashboarddb.metrics.enabled + enabled: true + auth: + ## @param dashboarddb.auth.database The dashboard database name. + database: grafana + ## @param dashboarddb.auth.username The dashboard database username. + username: grafana + ## @param dashboarddb.auth.password The dashboard database user password. + password: dbrepo ## @section Auth Service @@ -115,7 +141,7 @@ authservice: setupJob: image: ## @skip authservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.2 ## @param authservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param authservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -126,29 +152,24 @@ authservice: ## limits: ## cpu: 500m ## memory: 1024Mi - ## @skip authservice.extraEnvVarsCM - extraEnvVarsCM: auth-service-config + ## @skip authservice.extraEnvVarsSecret + extraEnvVarsSecret: auth-service-secret ## @skip authservice.extraVolumes extraVolumes: - - name: config-map + - name: config configMap: name: auth-service-config - - name: cache - emptyDir: - sizeLimit: 100Mi ## @skip authservice.extraVolumeMounts extraVolumeMounts: - - name: config-map + - name: config mountPath: /opt/keycloak/data/import/dbrepo-realm.json subPath: dbrepo-realm.json - - name: config-map + - name: config mountPath: /opt/keycloak/data/import/master-realm.json subPath: master-realm.json - - name: config-map + - name: config mountPath: /opt/bitnami/keycloak/providers/create-event-listener.jar subPath: create-event-listener.jar - - name: cache - mountPath: /bitnami/keycloak/ ## @skip authservice.replicaCount The number of replicas. replicaCount: 2 @@ -168,6 +189,11 @@ datadb: user: root ## @param datadb.rootUser.password The root user password. password: dbrepo + readonlyUser: + ## @param datadb.readonlyUser.user The readonly username. + user: readonly + ## @param datadb.readonlyUser.password The readonly password. + password: readonly db: ## @param datadb.db.name The database name. name: dbrepo @@ -187,9 +213,9 @@ datadb: ## @skip datadb.metrics.enabled The Prometheus settings. enabled: true ## @param datadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 - replicaCount: 3 + replicaCount: 1 ## @param datadb.resourcesPreset The container resource preset - resourcesPreset: "nano-hm" + resourcesPreset: "xlarge" ## @param datadb.initdbScriptsConfigMap The setup data to load into the database on first start. initdbScriptsConfigMap: "data-db-setup" persistence: @@ -275,7 +301,7 @@ brokerservice: servers: - identity-service ## @skip brokerservice.ldap.port - port: 389 + port: 1389 ## @param brokerservice.ldap.binddn The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. binddn: cn=admin,dc=dbrepo,dc=at ## @param brokerservice.ldap.bindpw The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. @@ -305,23 +331,84 @@ brokerservice: existingSecret: broker-service-secret ## @param brokerservice.extraPlugins The list of plugins to be activated. extraPlugins: rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt - persistence: - ## @param brokerservice.persistence.enabled If set to true, a PVC will be created. - enabled: false - ## @skip brokerservice.service service: - type: ClusterIP - managerPortEnabled: true + ## @skip brokerservice.service.extraPorts extraPorts: - name: mqtt port: 1883 targetPort: 1883 # loadBalancerIP: + ## @skip brokerservice.logs + logs: "" ## @param brokerservice.extraConfiguration The extra configuration for MQTT extraConfiguration: | + # https://www.rabbitmq.com/docs/logging#log-message-categories + log.connection.level = warning + log.file = /opt/bitnami/rabbitmq/var/log/rabbitmq/app.log + log.file.formatter = json + log.file.level = info + # rotate when the file reaches 10 MiB + log.file.rotation.size = 10485760 + # keep up to 5 archived log files in addition to the current one + log.file.rotation.count = 5 mqtt.vhost = dbrepo mqtt.exchange = dbrepo mqtt.prefetch = 10 + ## @skip brokerservice.sidecars + sidecars: + - name: logging-agent + image: docker.io/bitnami/fluent-bit:4.0.0 + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + runAsGroup: 1001 + runAsNonRoot: true + runAsUser: 1001 + seLinuxOptions: { } + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/parsers.conf + subPath: parsers.conf + - name: empty-dir + mountPath: /opt/bitnami/rabbitmq/var/log/rabbitmq + subPath: app-logs-dir + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 128Mi + ephemeral-storage: 50Mi + limits: + cpu: 150m + memory: 192Mi + ephemeral-storage: 2Gi + ## @skip brokerservice.extraVolumes + extraVolumes: + - name: logging-config + configMap: + name: broker-service-config + ## @skip brokerservice.extraVolumeMounts + extraVolumeMounts: + - name: logging-config + mountPath: /tmp/rabbitmq # irrelevant but needed from bitnami chart ## @param brokerservice.replicaCount The number of replicas. replicaCount: 1 @@ -332,7 +419,10 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.2 + ## @param analyseservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context @@ -393,7 +483,10 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.2 + ## @param metadataservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context @@ -490,7 +583,10 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.2 + ## @param dataservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context @@ -576,7 +672,10 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.2 + ## @param searchservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context @@ -620,13 +719,15 @@ searchservice: ## limits: ## cpu: 500m ## memory: 1024Mi - init: + setupJob: + ## @param searchservice.setupJob.enabled Enable the setup job that syncs missing databases from the Metadata Database into the Search Database. + enabled: true image: - ## @skip searchservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.1 - ## @param searchservice.init.resourcesPreset The container resource preset + ## @skip searchservice.setupJob.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.2 + ## @param searchservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" - ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## @param searchservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: ## cpu: 250m @@ -681,16 +782,18 @@ storageservice: readAccessKeyId: seaweedfsuser ## @param storageservice.s3.auth.readSecretAccessKey The S3 secret access key for the read only user. readSecretAccessKey: seaweedfsuser - init: + setupJob: + ## @param storageservice.setupJob.enabled Enable the setup job that creates the bucket in the s3 endpoint. + enabled: true image: - ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.1 + ## @skip storageservice.setupJob.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.2 s3: - ## @param storageservice.init.s3.endpoint The S3-capable endpoint the microservice connects to. + ## @param storageservice.setupJob.s3.endpoint The S3-capable endpoint the microservice connects to. endpoint: http://storage-service-s3:8333 - ## @param storageservice.init.resourcesPreset The container resource preset + ## @param storageservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" - ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## @param storageservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: ## cpu: 250m @@ -716,6 +819,9 @@ identityservice: adminPassword: admin ## @skip identityservice.global.configUserEnabled configUserEnabled: false + ## @param identityservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param identityservice.podSecurityContext.enabled Enable pods' Security Context @@ -793,7 +899,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.2 ## https://stackblitz.com/edit/nuxt-oidc-auth-keygen?file=index.js oidc: ## @param ui.oidc.authSessionSecret This should be a at least 48 characters random string. It is used to encrypt the user session. @@ -802,6 +908,9 @@ ui: sessionSecret: TjOH1lFnocixYmy5ol2I5cOdsYUdrd5_jZsGxo6aMVPNNDkh ## @param ui.oidc.tokenKey This needs to be a random cryptographic AES key in base64. Used to encrypt the server side token store. You can generate a key in JS with await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'])). You just have to encode it to base64 afterwards. tokenKey: data:;base64,ntxOAfrF6yw22Ec1AFHK21iFz7L3PZmz9857Uqwyme0= + ## @param ui.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param ui.podSecurityContext.enabled Enable pods' Security Context @@ -848,12 +957,15 @@ ui: ## @skip ui.resources public: api: - ## @param ui.public.api.client The endpoint for the client api. Defaults to the value of `gateway`. + ## @param ui.public.api.client The endpoint for the client api. Overrides to the value of `gateway`. client: "" - ## @param ui.public.api.server The endpoint for the server api. Defaults to the value of `gateway`. + ## @param ui.public.api.server The endpoint for the server api. Overrides to the value of `gateway`. server: "" + dashboard: + ## @param ui.public.dashboard.url The url for the dashboard. Overrides to the value of `gateway` and path `/dashboard`. + url: "" upload: - ## @param ui.public.upload.client The endpoint for the upload client. Defaults to the value of `gateway` and path `/api/upload/files`. + ## @param ui.public.upload.client The endpoint for the upload client. Overrides to the value of `gateway` and path `/api/upload/files`. client: "" ## @param ui.public.title The user interface title. title: "Database Repository" @@ -908,9 +1020,12 @@ dashboardservice: enabled: true image: ## @skip dashboardservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.2 ## @param dashboardservice.endpoint The endpoint for the microservices. endpoint: http://dashboard-service + ## @param dashboardservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dashboardservice.podSecurityContext.enabled Enable pods' Security Context @@ -955,13 +1070,15 @@ dashboardservice: ## cpu: 500m ## memory: 1024Mi ## @param dashboardservice.replicaCount The number of replicas. - init: + setupJob: + ## @param dashboardservice.setupJob.enabled Enable the setup job that creates dashboards for existing databases in the Dashboard UI. + enabled: true image: - ## @skip dashboardservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.1 - ## @param dashboardservice.init.resourcesPreset The container resource preset + ## @skip dashboardservice.setupJob.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.2 + ## @param dashboardservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" - ## @param dashboardservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## @param dashboardservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: ## cpu: 250m @@ -983,7 +1100,13 @@ dashboardui: ## @param dashboardui.metrics.enabled Enable the metrics sidecar. enabled: true ## @param dashboardui.endpoint The endpoint for the microservices. - endpoint: http://dashboard-ui + endpoint: http://dashboard-ui:3000 + datasources: + ## @skip dashboardui.datasources.secretName + secretName: dashboard-ui-datasources-secret + dashboardsProvider: + ## @skip dashboardui.dashboardsProvider.enabled + enabled: true ldap: ## @skip dashboardui.ldap.enabled enabled: true @@ -997,6 +1120,15 @@ dashboardui: type: Recreate ## @skip dashboardui.grafana.extraEnvVarsSecret extraEnvVarsSecret: dashboard-ui-secret + ## @skip dashboardui.grafana.extraConfigmaps + extraConfigmaps: + - name: dashboard-ui-config + mountPath: /opt/bitnami/grafana/dashboards + ## @param dashboardui.grafana.replicaCount The number of replicas. + replicaCount: 2 + persistence: + ## @skip dashboardui.persistence.enabled + enabled: false ## @section Metric Service @@ -1010,13 +1142,13 @@ metricdb: alertmanager: ## @skip metricdb.alertmanager.enabled enabled: false - service: - ## @skip metricdb.alertmanager.service.type - type: ClusterIP server: rbac: ## @skip metricdb.server.rbac.create create: false + updateStrategy: + ## @skip metricdb.server.updateStrategy.type + type: Recreate service: ## @skip metricdb.server.service.type type: ClusterIP @@ -1028,15 +1160,28 @@ metricdb: - job_name: 'actuator scrape' metrics_path: '/actuator/prometheus' static_configs: - - targets: [ 'data-service:80', 'metadata-service:80' ] + - targets: + - data-service + - metadata-service - job_name: 'metrics scrape' metrics_path: '/metrics' static_configs: - - targets: [ 'ui:80', 'auth-service-metrics:8080', 'analyse-service:80', 'search-service:80', 'data-db-metrics:9104', 'broker-service:9419', 'metadata-db-metrics:9104', 'storage-service-master-metrics:9327', 'upload-service:80' ] - - job_name: 'dashboard scrape' - metrics_path: '/dashboard/metrics' + - targets: + - analyse-service + - auth-service-metrics:9000 + - broker-service:9419 + - dashboard-db-metrics:9187 + - dashboard-service + - data-db-metrics:9104 + - metadata-db-metrics:9104 + - search-service + - storage-service-master-metrics:9327 + - ui:3000 + - job_name: 'realm scrape' + metrics_path: '/realms/dbrepo/metrics' static_configs: - - targets: [ 'dashboard-service' ] + - targets: + - auth-service-metrics:8080 ## @section Gateway Service @@ -1053,6 +1198,59 @@ gatewayservice: enabled: false ## @param gatewayservice.existingServerBlockConfigmap The extra configuration for the reverse proxy existingServerBlockConfigmap: gateway-service-setup + ## @skip gatewayservice.sidecars + sidecars: + - name: logging-agent + image: docker.io/bitnami/fluent-bit:4.0.0 + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + runAsGroup: 1001 + runAsNonRoot: true + runAsUser: 1001 + seLinuxOptions: { } + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/nginx/ + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 128Mi + ephemeral-storage: 50Mi + limits: + cpu: 150m + memory: 192Mi + ephemeral-storage: 2Gi + ## @skip gatewayservice.extraVolumes + extraVolumes: + - name: logging-config + configMap: + name: gateway-service-config + ## @skip gatewayservice.extraVolumeMounts + extraVolumeMounts: + - name: empty-dir + mountPath: /var/log/nginx + - name: logging-config + mountPath: /app # irrelevant but needed from bitnami chart ## @param gatewayservice.replicaCount The number of replicas. replicaCount: 3 @@ -1062,6 +1260,7 @@ computeservice: ## @param computeservice.endpoint Configure the number of parallel workers with local[n] endpoint: local[2] + ## @section Ingress ingress: diff --git a/helm/seaweedfs/CHANGELOG.md b/helm/seaweedfs/CHANGELOG.md index e880917876b0c345b35c2706b379a006bc41de99..ac474a8e78abe8978ad2659e5267ecdccb43b6bb 100644 --- a/helm/seaweedfs/CHANGELOG.md +++ b/helm/seaweedfs/CHANGELOG.md @@ -1,8 +1,102 @@ # Changelog +## 4.8.7 (2025-05-07) + +* [bitnami/seaweedfs] Release 4.8.7 ([#33539](https://github.com/bitnami/charts/pull/33539)) + +## <small>4.8.6 (2025-05-06)</small> + +* [bitnami/seaweedfs] chore: :recycle: :arrow_up: Update common and remove k8s < 1.23 references (#334 ([3789e42](https://github.com/bitnami/charts/commit/3789e42484b6f398325c81a52f273d9218129b89)), closes [#33434](https://github.com/bitnami/charts/issues/33434) + +## <small>4.8.5 (2025-05-05)</small> + +* [bitnami/seaweedfs] Release 4.8.5 (#33315) ([af40402](https://github.com/bitnami/charts/commit/af40402b56235183cc899c55777c0267e0c50312)), closes [#33315](https://github.com/bitnami/charts/issues/33315) + +## <small>4.8.4 (2025-05-02)</small> + +* [bitnami/seaweedfs] Release 4.8.4 (#33300) ([6078309](https://github.com/bitnami/charts/commit/60783099201f5864d286b6da2f272c5c9bdfa1db)), closes [#33300](https://github.com/bitnami/charts/issues/33300) + +## <small>4.8.3 (2025-04-02)</small> + +* [bitnami/*] Add tanzuCategory annotation (#32409) ([a8fba5c](https://github.com/bitnami/charts/commit/a8fba5cb01f6f4464ca7f69c50b0fbe97d837a95)), closes [#32409](https://github.com/bitnami/charts/issues/32409) +* [bitnami/seaweedfs] Release 4.8.3 (#32763) ([e6f401a](https://github.com/bitnami/charts/commit/e6f401a180a1ba2452c52072192119442b72c8a5)), closes [#32763](https://github.com/bitnami/charts/issues/32763) + +## <small>4.8.2 (2025-03-10)</small> + +* [bitnami/seaweedfs]: fix README for loglevel (#31735) ([b537041](https://github.com/bitnami/charts/commit/b53704137dc1722164ee6cd3c60968bc7154abb3)), closes [#31735](https://github.com/bitnami/charts/issues/31735) + +## <small>4.8.1 (2025-03-05)</small> + +* [bitnami/seaweedfs] Release 4.8.1 (#32317) ([f248247](https://github.com/bitnami/charts/commit/f248247c983ac0c353a3ddc214dba911883b11a2)), closes [#32317](https://github.com/bitnami/charts/issues/32317) + +## 4.8.0 (2025-03-03) + +* [bitnami/seaweedfs] Add support for `s3.allowEmptyFolder` (#32234) ([ce208fa](https://github.com/bitnami/charts/commit/ce208faae53c07ca52f4f239604f37af7ae1786a)), closes [#32234](https://github.com/bitnami/charts/issues/32234) + +## 4.7.0 (2025-02-24) + +* [bitnami/seaweedfs] Set `usePasswordFiles=true` by default (#32119) ([dbc5cb6](https://github.com/bitnami/charts/commit/dbc5cb6ebacef3036f8bbb32ae1d761f171b8bdd)), closes [#32119](https://github.com/bitnami/charts/issues/32119) + +## <small>4.6.2 (2025-02-20)</small> + +* [bitnami/seaweedfs] Release 4.6.2 (#32035) ([efa99db](https://github.com/bitnami/charts/commit/efa99db7094cc5f19ec968634b5a87850c40cb73)), closes [#32035](https://github.com/bitnami/charts/issues/32035) + +## <small>4.6.1 (2025-02-12)</small> + +* [bitnami/*] Use CDN url for the Bitnami Application Icons (#31881) ([d9bb11a](https://github.com/bitnami/charts/commit/d9bb11a9076b9bfdcc70ea022c25ef50e9713657)), closes [#31881](https://github.com/bitnami/charts/issues/31881) +* [bitnami/seaweedfs] Release 4.6.1 (#31902) ([f15c5ed](https://github.com/bitnami/charts/commit/f15c5ed37c1829961a0ba4391809c524237382fb)), closes [#31902](https://github.com/bitnami/charts/issues/31902) +* [bitnami/seaweedfs]: correct typo in README (#31867) ([bb5c61b](https://github.com/bitnami/charts/commit/bb5c61b6fe4c89ac0b115b63ebed43b312f31809)), closes [#31867](https://github.com/bitnami/charts/issues/31867) + +## 4.6.0 (2025-02-05) + +* [bitnami/seaweedfs] Add support for log persistence (#31793) ([2561c2a](https://github.com/bitnami/charts/commit/2561c2aaba3b08507f1c10bdae3b933d74f01427)), closes [#31793](https://github.com/bitnami/charts/issues/31793) + +## <small>4.5.5 (2025-02-05)</small> + +* [bitnami/seaweedfs] Release 4.5.5 (#31779) ([db2813f](https://github.com/bitnami/charts/commit/db2813f08e07f03142c8acd5b587c47bf66a0057)), closes [#31779](https://github.com/bitnami/charts/issues/31779) + +## <small>4.5.4 (2025-02-03)</small> + +* [bitnami/seaweedfs] Release 4.5.4 (#31718) ([b4de2a7](https://github.com/bitnami/charts/commit/b4de2a7edbae2d1bba926a18ffc1415c39a5ca9d)), closes [#31718](https://github.com/bitnami/charts/issues/31718) + +## <small>4.5.3 (2025-02-03)</small> + +* [bitnami/seaweedfs] Release 4.5.3 (#31700) ([6752afa](https://github.com/bitnami/charts/commit/6752afab2f7805c38dfca3ab7e75afffcb0db3e7)), closes [#31700](https://github.com/bitnami/charts/issues/31700) +* Update copyright year (#31682) ([e9f02f5](https://github.com/bitnami/charts/commit/e9f02f5007068751f7eb2270fece811e685c99b6)), closes [#31682](https://github.com/bitnami/charts/issues/31682) + +## <small>4.5.2 (2025-01-24)</small> + +* [bitnami/seaweedfs] Release 4.5.2 (#31583) ([fd84724](https://github.com/bitnami/charts/commit/fd8472445476e56d22e2f54014e90d54fef780db)), closes [#31583](https://github.com/bitnami/charts/issues/31583) + +## <small>4.5.1 (2025-01-21)</small> + +* [bitnami/seaweedfs] Release 4.5.1 (#31490) ([97dae84](https://github.com/bitnami/charts/commit/97dae844ebf47a25522c0b7752595849ca3b711a)), closes [#31490](https://github.com/bitnami/charts/issues/31490) + +## 4.5.0 (2025-01-20) + +* [bitnami/seaweedfs]: add pod for `weed iam` (#31334) ([5f5a702](https://github.com/bitnami/charts/commit/5f5a70213129a814f4a0d4be92409b9fec9686a5)), closes [#31334](https://github.com/bitnami/charts/issues/31334) + +## <small>4.3.2 (2025-01-17)</small> + +* [bitnami/seaweedfs] Release 4.3.2 (#31443) ([942718e](https://github.com/bitnami/charts/commit/942718e8ec1eef14fcd63ebc11e2f2ce7a180c17)), closes [#31443](https://github.com/bitnami/charts/issues/31443) + +## <small>4.3.1 (2025-01-13)</small> + +* [bitnami/seaweedfs]: correct typo in values.yaml regarding s3.auth.existingSecret (#31339) ([31d0532](https://github.com/bitnami/charts/commit/31d0532a517bd0669b445e6974c2c5aace41697d)), closes [#31339](https://github.com/bitnami/charts/issues/31339) + +## 4.3.0 (2025-01-10) + +* [bitnami/seaweedfs] Make database check on start optional (#31277) ([ddb8a97](https://github.com/bitnami/charts/commit/ddb8a97d80c5bc87f2c33be751fbc35797f5f1be)), closes [#31277](https://github.com/bitnami/charts/issues/31277) + +## <small>4.2.1 (2025-01-07)</small> + +* [bitnami/*] Fix typo in README (#31052) ([b41a51d](https://github.com/bitnami/charts/commit/b41a51d1bd04841fc108b78d3b8357a5292771c8)), closes [#31052](https://github.com/bitnami/charts/issues/31052) +* [bitnami/seaweedfs] Release 4.2.1 (#31244) ([75fba5d](https://github.com/bitnami/charts/commit/75fba5d61dbf307dabd130d1ff3f621bb85320cc)), closes [#31244](https://github.com/bitnami/charts/issues/31244) + ## 4.2.0 (2024-12-10) -* [bitnami/seaweedfs] Detect non-standard images ([#30967](https://github.com/bitnami/charts/pull/30967)) +* [bitnami/*] Add Bitnami Premium to NOTES.txt (#30854) ([3dfc003](https://github.com/bitnami/charts/commit/3dfc00376df6631f0ce54b8d440d477f6caa6186)), closes [#30854](https://github.com/bitnami/charts/issues/30854) +* [bitnami/seaweedfs] Detect non-standard images (#30967) ([a4d9265](https://github.com/bitnami/charts/commit/a4d9265e61197d5ed5e6c4a0f85ce7460abd4a66)), closes [#30967](https://github.com/bitnami/charts/issues/30967) ## <small>4.1.2 (2024-12-04)</small> diff --git a/helm/seaweedfs/Chart.lock b/helm/seaweedfs/Chart.lock index dfa3620f167709b52e2c54a4c5b55ef8dc6eb09b..039c66b559f25f3801a766a9bb074a20eb722fda 100644 --- a/helm/seaweedfs/Chart.lock +++ b/helm/seaweedfs/Chart.lock @@ -1,12 +1,12 @@ dependencies: - name: mariadb repository: oci://registry-1.docker.io/bitnamicharts - version: 20.4.2 + version: 20.5.5 - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts - version: 16.6.3 + version: 16.7.2 - name: common repository: oci://registry-1.docker.io/bitnamicharts - version: 2.30.0 -digest: sha256:a1969ecd9ac27255060569f5e0e3f4ad93f999b8968e3f9c5e97d1536996ebd2 -generated: "2025-04-10T10:05:59.79430147+02:00" + version: 2.31.1 +digest: sha256:07ea3df0034b01d47e5e8b3764de78232d8b0e23c3c2fce27a6d4e8bd71837ba +generated: "2025-05-11T13:55:38.808367927+02:00" diff --git a/helm/seaweedfs/Chart.yaml b/helm/seaweedfs/Chart.yaml index 0c7bf3c684c6c3bcee0ebe2d521a9794c4634c59..d3531a424a17629fb197eb52706f9bd12120352c 100644 --- a/helm/seaweedfs/Chart.yaml +++ b/helm/seaweedfs/Chart.yaml @@ -3,18 +3,19 @@ annotations: category: Infrastructure - licenses: Apache-2.0 images: | - name: mariadb - image: docker.io/bitnami/mariadb:11.4.4-debian-12-r1 + image: docker.io/bitnami/mariadb:11.4.5-debian-12-r12 - name: os-shell - image: docker.io/bitnami/os-shell:12-debian-12-r33 + image: docker.io/bitnami/os-shell:12-debian-12-r43 - name: postgresql - image: docker.io/bitnami/postgresql:17.2.0-debian-12-r2 + image: docker.io/bitnami/postgresql:17.4.0-debian-12-r19 - name: seaweedfs - image: docker.io/bitnami/seaweedfs:3.80.0-debian-12-r1 + image: docker.io/bitnami/seaweedfs:3.87.0-debian-12-r1 + licenses: Apache-2.0 + tanzuCategory: clusterUtility apiVersion: v2 -appVersion: 3.80.0 +appVersion: 3.87.0 dependencies: - condition: mariadb.enabled name: mariadb @@ -35,7 +36,7 @@ dependencies: version: 2.x.x description: SeaweedFS is a simple and highly scalable distributed file system. home: https://bitnami.com -icon: https://bitnami.com/assets/stacks/seaweedfs/img/seaweedfs-stack-220x234.png +icon: https://dyltqmyl993wv.cloudfront.net/assets/stacks/seaweedfs/img/seaweedfs-stack-220x234.png keywords: - seaweedfs - storage @@ -50,4 +51,4 @@ name: seaweedfs sources: - https://github.com/bitnami/charts/tree/main/bitnami/seawwedfs - https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs -version: 4.2.1 +version: 4.8.7 diff --git a/helm/seaweedfs/README.md b/helm/seaweedfs/README.md index 7506718dc1087f1ede7d95d9ebb28f40632a0b86..cd0c7e1cc30c7c56e4357523b12b3abbb6bbe8f8 100644 --- a/helm/seaweedfs/README.md +++ b/helm/seaweedfs/README.md @@ -22,8 +22,6 @@ Bitnami charts for Helm are carefully engineered, actively maintained and are th This chart bootstraps a [SeaweedFS](https://github.com/seaweedfs/seaweedfs) deployment in a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - ## Prerequisites - Kubernetes 1.23+ @@ -166,7 +164,7 @@ You can manually create the required TLS certificates for each SeaweedFS compone #### S3 Authentication Authentication can be enabled in the SeaweedFS S3 API by setting the `s3.auth.enabled` parameter to `true`. -You can provide your custom authentication configuration creating a secret with the configuration and setting the `s3.auth.cexistingSecret` parameter with the name of the secret. +You can provide your custom authentication configuration creating a secret with the configuration and setting the `s3.auth.existingSecret` parameter with the name of the secret. Alternatively, you can rely on the chart to create a basic configuration with two main users: `admin` and `read-only`. You can provide the admin user credentials using the `s3.auth.adminAccessKeyId` and `s3.auth.adminSecretAccessKey` parameters, and the read-only user credentials using the `s3.auth.readAccessKeyId` and `s3.auth.readSecretAccessKey` parameters. ### Additional environment variables @@ -349,7 +347,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `master.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Master Server container' Security Context | `false` | | `master.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Master Server container | `["ALL"]` | | `master.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Master Server container | `RuntimeDefault` | -| `master.logLevel` | Master Server log level [0|1|2|3|4] | `1` | +| `master.logLevel` | Master Server log level (0, 1, 2, 3, or 4) | `1` | | `master.bindAddress` | Master Server bind address | `0.0.0.0` | | `master.volumeSizeLimitMB` | Limit (in MB) to stop directing writes to oversized volumes | `1000` | | `master.config` | Master Server configuration | `""` | @@ -436,16 +434,26 @@ If you encounter errors when working with persistent volumes, refer to our [trou | Name | Description | Value | | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | -| `master.persistence.enabled` | Enable persistence on Master Server using Persistent Volume Claims | `true` | +| `master.persistence.enabled` | Enable data persistence on Master Server using Persistent Volume Claims | `true` | | `master.persistence.mountPath` | Path to mount the volume at. | `/data` | | `master.persistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | | `master.persistence.storageClass` | Storage class of backing PVC | `""` | | `master.persistence.annotations` | Persistent Volume Claim annotations | `{}` | | `master.persistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | | `master.persistence.size` | Size of data volume | `8Gi` | -| `master.persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | +| `master.persistence.existingClaim` | The name of an existing PVC to use for data persistence | `""` | | `master.persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | | `master.persistence.dataSource` | Custom PVC data source | `{}` | +| `master.logPersistence.enabled` | Enable logs persistence on Master Server using Persistent Volume Claims | `false` | +| `master.logPersistence.mountPath` | Path to mount the volume at. | `/logs` | +| `master.logPersistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `master.logPersistence.storageClass` | Storage class of backing PVC | `""` | +| `master.logPersistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `master.logPersistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `master.logPersistence.size` | Size of logs volume | `8Gi` | +| `master.logPersistence.existingClaim` | The name of an existing PVC to use for logs persistence | `""` | +| `master.logPersistence.selector` | Selector to match an existing Persistent Volume for logs PVC | `{}` | +| `master.logPersistence.dataSource` | Custom PVC data source | `{}` | | `master.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet | `false` | | `master.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | | `master.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | @@ -516,7 +524,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `volume.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Volume Server container' Security Context | `false` | | `volume.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Volume Server container | `["ALL"]` | | `volume.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Volume Server container | `RuntimeDefault` | -| `volume.logLevel` | Volume Server log level [0|1|2|3|4] | `1` | +| `volume.logLevel` | Volume Server log level (0, 1, 2, 3, or 4) | `1` | | `volume.bindAddress` | Volume Server bind address | `0.0.0.0` | | `volume.publicUrl` | Volume Server public URL | `""` | | `volume.config` | Volume Server configuration | `""` | @@ -615,6 +623,16 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `volume.dataVolumes[0].persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | | `volume.dataVolumes[0].persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | | `volume.dataVolumes[0].persistence.dataSource` | Custom PVC data source | `{}` | +| `volume.logPersistence.enabled` | Enable logs persistence on Volume Server using Persistent Volume Claims | `false` | +| `volume.logPersistence.mountPath` | Path to mount the volume at. | `/logs` | +| `volume.logPersistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `volume.logPersistence.storageClass` | Storage class of backing PVC | `""` | +| `volume.logPersistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `volume.logPersistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `volume.logPersistence.size` | Size of logs volume | `8Gi` | +| `volume.logPersistence.existingClaim` | The name of an existing PVC to use for logs persistence | `""` | +| `volume.logPersistence.selector` | Selector to match an existing Persistent Volume for logs PVC | `{}` | +| `volume.logPersistence.dataSource` | Custom PVC data source | `{}` | | `volume.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet | `false` | | `volume.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | | `volume.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | @@ -686,12 +704,14 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `filer.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Filer Server container' Security Context | `false` | | `filer.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Filer Server container | `["ALL"]` | | `filer.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Filer Server container | `RuntimeDefault` | -| `filer.logLevel` | Filer Server log level [0|1|2|3|4] | `1` | +| `filer.logLevel` | Filer Server log level (0, 1, 2, 3, or 4) | `1` | | `filer.bindAddress` | Filer Server bind address | `0.0.0.0` | | `filer.config` | Filer Server configuration | `[leveldb2] enabled = false ` | | `filer.existingConfigmap` | The name of an existing ConfigMap with your custom configuration for Filer Server | `""` | +| `filer.notificationConfig` | Filer Server notification configuration | `""` | +| `filer.existingNotificationConfigmap` | The name of an existing ConfigMap with your custom notification configuration for Filer Server | `""` | | `filer.command` | Override default Filer Server container command (useful when using custom images) | `[]` | | `filer.args` | Override default Filer Server container args (useful when using custom images) | `[]` | | `filer.automountServiceAccountToken` | Mount Service Account token in Filer Server pods | `false` | @@ -770,6 +790,24 @@ enabled = false | `filer.ingress.secrets` | Custom TLS certificates as secrets | `[]` | | `filer.ingress.extraRules` | Additional rules to be covered with this ingress record | `[]` | +### Filer Server Persistence Parameters + +| Name | Description | Value | +| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | +| `filer.logPersistence.enabled` | Enable logs persistence on Filer Server using Persistent Volume Claims | `false` | +| `filer.logPersistence.mountPath` | Path to mount the volume at. | `/logs` | +| `filer.logPersistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `filer.logPersistence.storageClass` | Storage class of backing PVC | `""` | +| `filer.logPersistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `filer.logPersistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `filer.logPersistence.size` | Size of logs volume | `8Gi` | +| `filer.logPersistence.existingClaim` | The name of an existing PVC to use for logs persistence | `""` | +| `filer.logPersistence.selector` | Selector to match an existing Persistent Volume for logs PVC | `{}` | +| `filer.logPersistence.dataSource` | Custom PVC data source | `{}` | +| `filer.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet | `false` | +| `filer.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `filer.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | + ### Filer Server Metrics Parameters | Name | Description | Value | @@ -837,15 +875,16 @@ enabled = false | `s3.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Amazon S3 API container' Security Context | `false` | | `s3.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Amazon S3 API container | `["ALL"]` | | `s3.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Amazon S3 API container | `RuntimeDefault` | -| `s3.logLevel` | Amazon S3 API log level [0|1|2|3|4] | `1` | +| `s3.logLevel` | Amazon S3 API log level (0, 1, 2, 3, or 4) | `1` | | `s3.bindAddress` | Amazon S3 API bind address | `0.0.0.0` | +| `s3.allowEmptyFolder` | Allow empty folders in Amazon S3 API | `true` | | `s3.auth.enabled` | Enable Amazon S3 API authentication | `false` | | `s3.auth.existingSecret` | Existing secret with Amazon S3 API authentication configuration | `""` | | `s3.auth.existingSecretConfigKey` | Key of the above existing secret with S3 API authentication configuration, defaults to `config.json` | `""` | -| `s3.auth.adminAccessKeyId` | Amazon S3 API access key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | -| `s3.auth.adminSecretAccessKey` | Amazon S3 API secret key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | -| `s3.auth.readAccessKeyId` | Amazon S3 API read access key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | -| `s3.auth.readSecretAccessKey` | Amazon S3 API read secret key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | +| `s3.auth.adminAccessKeyId` | Amazon S3 API access key with admin privileges. Ignored if `s3.auth.existingSecret` is set | `""` | +| `s3.auth.adminSecretAccessKey` | Amazon S3 API secret key with admin privileges. Ignored if `s3.auth.existingSecret` is set | `""` | +| `s3.auth.readAccessKeyId` | Amazon S3 API read access key with read-only privileges. Ignored if `s3.auth.existingSecret` is set | `""` | +| `s3.auth.readSecretAccessKey` | Amazon S3 API read secret key with read-only privileges. Ignored if `s3.auth.existingSecret` is set | `""` | | `s3.command` | Override default Amazon S3 API container command (useful when using custom images) | `[]` | | `s3.args` | Override default Amazon S3 API container args (useful when using custom images) | `[]` | | `s3.automountServiceAccountToken` | Mount Service Account token in Amazon S3 API pods | `false` | @@ -988,7 +1027,7 @@ enabled = false | `webdav.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in WebDAV container' Security Context | `false` | | `webdav.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in WebDAV container | `["ALL"]` | | `webdav.containerSecurityContext.seccompProfile.type` | Set seccomp profile in WebDAV container | `RuntimeDefault` | -| `webdav.logLevel` | WebDAV log level [0|1|2|3|4] | `1` | +| `webdav.logLevel` | WebDAV log level (0, 1, 2, 3, or 4) | `1` | | `webdav.tls.enabled` | Enable TLS transport for WebDAV | `false` | | `webdav.tls.autoGenerated.enabled` | Enable automatic generation of certificates for TLS | `false` | | `webdav.tls.autoGenerated.engine` | Mechanism to generate the certificates (allowed values: helm, cert-manager) | `helm` | @@ -1076,6 +1115,97 @@ enabled = false | `webdav.ingress.secrets` | Custom TLS certificates as secrets | `[]` | | `webdav.ingress.extraRules` | Additional rules to be covered with this ingress record | `[]` | +### IAM Parameters + +| Name | Description | Value | +| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| `iam.enabled` | Enable IAM deployment | `false` | +| `iam.replicaCount` | Number of IAM replicas to deploy | `1` | +| `iam.containerPorts.http` | IAM HTTP container port | `8111` | +| `iam.livenessProbe.enabled` | Enable livenessProbe on IAM containers | `true` | +| `iam.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` | +| `iam.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `iam.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `30` | +| `iam.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | +| `iam.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `iam.readinessProbe.enabled` | Enable readinessProbe on IAM containers | `true` | +| `iam.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `30` | +| `iam.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | +| `iam.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `30` | +| `iam.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | +| `iam.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `iam.startupProbe.enabled` | Enable startupProbe on IAM containers | `false` | +| `iam.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `5` | +| `iam.startupProbe.periodSeconds` | Period seconds for startupProbe | `5` | +| `iam.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | +| `iam.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | +| `iam.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `iam.resourcesPreset` | Set IAM container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if webdav.resources is set (webdav.resources is recommended for production). | `nano` | +| `iam.resources` | Set IAM container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `iam.podSecurityContext.enabled` | Enable IAM pods' Security Context | `true` | +| `iam.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy for IAM pods | `Always` | +| `iam.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface for IAM pods | `[]` | +| `iam.podSecurityContext.supplementalGroups` | Set filesystem extra groups for IAM pods | `[]` | +| `iam.podSecurityContext.fsGroup` | Set fsGroup in IAM pods' Security Context | `1001` | +| `iam.containerSecurityContext.enabled` | Enabled IAM container' Security Context | `true` | +| `iam.containerSecurityContext.seLinuxOptions` | Set SELinux options in IAM container | `{}` | +| `iam.containerSecurityContext.runAsUser` | Set runAsUser in IAM container' Security Context | `1001` | +| `iam.containerSecurityContext.runAsGroup` | Set runAsGroup in IAM container' Security Context | `1001` | +| `iam.containerSecurityContext.runAsNonRoot` | Set runAsNonRoot in IAM container' Security Context | `true` | +| `iam.containerSecurityContext.readOnlyRootFilesystem` | Set readOnlyRootFilesystem in IAM container' Security Context | `true` | +| `iam.containerSecurityContext.privileged` | Set privileged in IAM container' Security Context | `false` | +| `iam.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in IAM container' Security Context | `false` | +| `iam.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in IAM container | `["ALL"]` | +| `iam.containerSecurityContext.seccompProfile.type` | Set seccomp profile in IAM container | `RuntimeDefault` | +| `iam.logLevel` | IAM log level (0, 1, 2, 3, or 4) | `1` | +| `iam.command` | Override default IAM container command (useful when using custom images) | `[]` | +| `iam.args` | Override default IAM container args (useful when using custom images) | `[]` | +| `iam.automountServiceAccountToken` | Mount Service Account token in IAM pods | `false` | +| `iam.hostAliases` | IAM pods host aliases | `[]` | +| `iam.statefulsetAnnotations` | Annotations for IAM statefulset | `{}` | +| `iam.podLabels` | Extra labels for IAM pods | `{}` | +| `iam.podAnnotations` | Annotations for IAM pods | `{}` | +| `iam.podAffinityPreset` | Pod affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `iam.podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` | `soft` | +| `iam.nodeAffinityPreset.type` | Node affinity preset type. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `iam.nodeAffinityPreset.key` | Node label key to match. Ignored if `iam.affinity` is set | `""` | +| `iam.nodeAffinityPreset.values` | Node label values to match. Ignored if `iam.affinity` is set | `[]` | +| `iam.affinity` | Affinity for IAM pods assignment | `{}` | +| `iam.nodeSelector` | Node labels for IAM pods assignment | `{}` | +| `iam.tolerations` | Tolerations for IAM pods assignment | `[]` | +| `iam.updateStrategy.type` | IAM deployment strategy type | `RollingUpdate` | +| `iam.priorityClassName` | IAM pods' priorityClassName | `""` | +| `iam.topologySpreadConstraints` | Topology Spread Constraints for IAM pod assignment spread across your cluster among failure-domains | `[]` | +| `iam.schedulerName` | Name of the k8s scheduler (other than default) for IAM pods | `""` | +| `iam.terminationGracePeriodSeconds` | Seconds IAM pods need to terminate gracefully | `""` | +| `iam.lifecycleHooks` | for IAM containers to automate configuration before or after startup | `{}` | +| `iam.extraEnvVars` | Array with extra environment variables to add to IAM containers | `[]` | +| `iam.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for IAM containers | `""` | +| `iam.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for IAM containers | `""` | +| `iam.extraVolumes` | Optionally specify extra list of additional volumes for the IAM pods | `[]` | +| `iam.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the IAM containers | `[]` | +| `iam.sidecars` | Add additional sidecar containers to the IAM pods | `[]` | +| `iam.initContainers` | Add additional init containers to the IAM pods | `[]` | +| `iam.pdb.create` | Enable/disable a Pod Disruption Budget creation | `true` | +| `iam.pdb.minAvailable` | Minimum number/percentage of pods that should remain scheduled | `""` | +| `iam.pdb.maxUnavailable` | Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `iam.pdb.minAvailable` and `iam.pdb.maxUnavailable` are empty. | `""` | + +### IAM Traffic Exposure Parameters + +| Name | Description | Value | +| -------------------------------------- | ------------------------------------------------------------------------------ | ----------- | +| `iam.service.type` | IAM service type | `ClusterIP` | +| `iam.service.ports.http` | IAM service HTTP port (HTTPS if `iam.tls.enabled` is `true`) | `8111` | +| `iam.service.nodePorts.http` | Node port for HTTP (HTTPS if `iam.tls.enabled` is `true`) | `""` | +| `iam.service.clusterIP` | IAM service Cluster IP | `""` | +| `iam.service.loadBalancerIP` | IAM service Load Balancer IP | `""` | +| `iam.service.loadBalancerSourceRanges` | IAM service Load Balancer sources | `[]` | +| `iam.service.externalTrafficPolicy` | IAM service external traffic policy | `Cluster` | +| `iam.service.annotations` | Additional custom annotations for IAM service | `{}` | +| `iam.service.extraPorts` | Extra ports to expose in IAM service (normally used with the `sidecars` value) | `[]` | +| `iam.service.sessionAffinity` | Control where client requests go, to the same pod or round-robin | `None` | +| `iam.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | + ### Init Container Parameters | Name | Description | Value | @@ -1115,7 +1245,6 @@ enabled = false | `mariadb.auth.database` | MariaDB custom database | `bitnami_seaweedfs` | | `mariadb.auth.username` | MariaDB custom user name | `bn_seaweedfs` | | `mariadb.auth.password` | MariaDB custom user password | `""` | -| `mariadb.auth.usePasswordFiles` | Mount credentials as a file instead of using an environment variable | `false` | | `mariadb.initdbScripts` | Specify dictionary of scripts to be run at first boot | `{}` | | `mariadb.primary.persistence.enabled` | Enable persistence on MariaDB using PVC(s) | `true` | | `mariadb.primary.persistence.storageClass` | Persistent Volume storage class | `""` | @@ -1151,6 +1280,7 @@ enabled = false | `externalDatabase.password` | External Database user password | `""` | | `externalDatabase.database` | External Database database name | `bitnami_seaweedfs` | | `externalDatabase.existingSecret` | The name of an existing secret with database credentials. Evaluated as a template | `""` | +| `externalDatabase.waitForDatabaseEnabled` | Whether to check for external database before starting seaweedfs containers | `true` | | `externalDatabase.initDatabaseJob.enabled` | Enable the init external database job | `false` | | `externalDatabase.initDatabaseJob.labels` | Extra labels for the init external database job | `{}` | | `externalDatabase.initDatabaseJob.annotations` | Extra annotations for the init external database job | `{}` | @@ -1232,7 +1362,7 @@ Find more information about how to deal with common errors related to Bitnami's ## License -Copyright © 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +Copyright © 2025 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/helm/seaweedfs/charts/common-2.30.0.tgz b/helm/seaweedfs/charts/common-2.30.0.tgz deleted file mode 100644 index ef7b68044a9ee31a9ba735054c13e41814b79a16..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/common-2.30.0.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/common-2.30.2.tgz b/helm/seaweedfs/charts/common-2.30.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f35ca37f859944b5081011965987ff76bf3d75fc Binary files /dev/null and b/helm/seaweedfs/charts/common-2.30.2.tgz differ diff --git a/helm/seaweedfs/charts/common-2.31.1.tgz b/helm/seaweedfs/charts/common-2.31.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cf6cff738dbd2e462d1a295a45ebab5d32bd5c7b Binary files /dev/null and b/helm/seaweedfs/charts/common-2.31.1.tgz differ diff --git a/helm/seaweedfs/charts/mariadb-20.4.2.tgz b/helm/seaweedfs/charts/mariadb-20.4.2.tgz deleted file mode 100644 index 5d58a0a1104ab1c9d8312d3117d5d2ece8b1d5a9..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/mariadb-20.4.2.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/mariadb-20.5.3.tgz b/helm/seaweedfs/charts/mariadb-20.5.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..26e91fd8cfba97218673197133afa7dbbb7db995 Binary files /dev/null and b/helm/seaweedfs/charts/mariadb-20.5.3.tgz differ diff --git a/helm/seaweedfs/charts/mariadb-20.5.5.tgz b/helm/seaweedfs/charts/mariadb-20.5.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3e573f1be539f7cde21b4dc6e5e22e93907613d7 Binary files /dev/null and b/helm/seaweedfs/charts/mariadb-20.5.5.tgz differ diff --git a/helm/seaweedfs/charts/postgresql-16.6.3.tgz b/helm/seaweedfs/charts/postgresql-16.6.3.tgz deleted file mode 100644 index 36ca74dcb79a5d83a780bff787c379a488ef1875..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/postgresql-16.6.3.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/postgresql-16.6.6.tgz b/helm/seaweedfs/charts/postgresql-16.6.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..eea64cae7283ea48f6dd6977b6d7ba2af21cd948 Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.6.6.tgz differ diff --git a/helm/seaweedfs/charts/postgresql-16.7.2.tgz b/helm/seaweedfs/charts/postgresql-16.7.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8e301c65cb1ce405a17995e3462a81e4f052f917 Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.7.2.tgz differ diff --git a/helm/seaweedfs/templates/_helpers.tpl b/helm/seaweedfs/templates/_helpers.tpl index 9f76dc6966ce3d40ec3337b4822f67a55702f52e..85cb277cc617c9ae37e51fe4a02c6c44bfb1876b 100644 --- a/helm/seaweedfs/templates/_helpers.tpl +++ b/helm/seaweedfs/templates/_helpers.tpl @@ -24,6 +24,13 @@ Return the proper SeaweedFS Filer Server fullname {{- printf "%s-filer" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" -}} {{- end -}} +{{/* +Return the proper SeaweedFS IAM Server fullname +*/}} +{{- define "seaweedfs.iam.fullname" -}} +{{- printf "%s-iam" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} + {{/* Return the proper SeaweedFS Amazon S3 API fullname */}} @@ -77,6 +84,17 @@ Return the proper init external database job image name {{- end -}} {{- end -}} +{{/* +Returns whether wait for external database is enabled +*/}} +{{- define "seaweedfs.waitForDatabase.enabled" -}} +{{- if or .Values.mariadb.enabled .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.waitForDatabaseEnabled true) ) }} + {{- print "true" -}} + {{- else }} + {{- print "false" -}} +{{- end -}} +{{- end -}} + {{/* Return the proper Docker Image Registry Secret Names */}} @@ -128,6 +146,17 @@ Return the Filer Server configuration configmap. {{- end -}} {{- end -}} +{{/* +Return the Filer Server notification configuration configmap. +*/}} +{{- define "seaweedfs.filer.notificationConfigmapName" -}} +{{- if .Values.filer.existingNotificationConfigmap -}} + {{- print (tpl .Values.filer.existingNotificationConfigmap .) -}} +{{- else -}} + {{- printf "%s-notification" (include "seaweedfs.filer.fullname" .) -}} +{{- end -}} +{{- end -}} + {{/* Return the Master Server peers */}} @@ -339,6 +368,7 @@ Return the database secret key name Returns an init-container that waits for the database to be ready */}} {{- define "seaweedfs.filer.waitForDBInitContainer" -}} +{{ if eq "true" ( include "seaweedfs.waitForDatabase.enabled" . ) }} - name: wait-for-db image: {{ include "seaweedfs.initDatabaseJob.image" . }} {{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }} @@ -415,6 +445,7 @@ Returns an init-container that waits for the database to be ready - name: db-credentials mountPath: /secrets {{- end -}} +{{- end -}} {{/* Returns an init-container that generates auth configuration for the Amazon S3 API @@ -431,7 +462,12 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP args: - -ec - | - #!/bin/bash + {{- if .Values.usePasswordFiles }} + export ADMIN_ACCESS_KEY_ID="$(< $ADMIN_ACCESS_KEY_ID_FILE)" + export ADMIN_SECRET_ACCESS_KEY="$(< $ADMIN_SECRET_ACCESS_KEY_FILE)" + export READ_ACCESS_KEY_ID="$(< $READ_ACCESS_KEY_ID_FILE)" + export READ_SECRET_ACCESS_KEY="$(< $READ_SECRET_ACCESS_KEY_FILE)" + {{- end }} cat > "/auth/config.json" <<EOF { @@ -468,6 +504,16 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP } EOF env: + {{- if .Values.usePasswordFiles }} + - name: ADMIN_ACCESS_KEY_ID_FILE + value: "/opt/bitnami/seaweed/secrets/admin_access_key_id" + - name: ADMIN_SECRET_ACCESS_KEY_FILE + value: "/opt/bitnami/seaweed/secrets/admin_secret_access_key" + - name: READ_ACCESS_KEY_ID_FILE + value: "/opt/bitnami/seaweed/secrets/read_access_key_id" + - name: READ_SECRET_ACCESS_KEY_FILE + value: "/opt/bitnami/seaweed/secrets/read_secret_access_key" + {{- else }} - name: ADMIN_ACCESS_KEY_ID valueFrom: secretKeyRef: @@ -488,6 +534,7 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP secretKeyRef: name: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }} key: read_secret_access_key + {{- end }} {{- if .Values.s3.resources }} resources: {{- toYaml .Values.s3.resources | nindent 12 }} {{- else if ne .Values.s3.resourcesPreset "none" }} @@ -497,6 +544,10 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP - name: empty-dir mountPath: /auth subPath: auth-dir + {{- if .Values.usePasswordFiles }} + - name: seaweed-secrets + mountPath: /opt/bitnami/seaweed/secrets + {{- end}} {{- end -}} {{/* @@ -518,6 +569,7 @@ Compile all warnings into a single message. {{- $messages := list -}} {{- $messages := append $messages (include "seaweedfs.validateValues.security.mTLS" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.master.replicaCount" .) -}} +{{- $messages := append $messages (include "seaweedfs.validateValues.filer.replicaCount" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.volume.replicaCount" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.volume.dataVolumes" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.filer.database" .) -}} @@ -562,12 +614,27 @@ Validate values of SeaweedFS - number of Master server replicas */}} {{- define "seaweedfs.validateValues.master.replicaCount" -}} {{- $masterReplicaCount := int .Values.master.replicaCount }} -{{- if and .Values.master.persistence.enabled .Values.master.persistence.existingClaim (gt $masterReplicaCount 1) -}} +{{- if and (or (and .Values.master.persistence.enabled .Values.master.persistence.existingClaim) (and .Values.master.logPersistence.enabled .Values.master.logPersistence.existingClaim)) (gt $masterReplicaCount 1) -}} master.replicaCount A single existing PVC cannot be shared between multiple Master Server replicas. Please set a valid number of replicas (--set master.replicaCount=1), disable persistence - (--set master.persistence.enabled=false) or rely on dynamic provisioning via Persitent - Volume Claims (--set master.persistence.existingClaim=""). + (--set master.persistence.enabled=false,master.logPersistence.enabled=false) or + rely on dynamic provisioning via Persistent Volume Claims + (--set master.persistence.existingClaim="",master.logPersistence.existingClaim=""). +{{- end -}} +{{- end -}} + +{{/* +Validate values of SeaweedFS - number of Filer server replicas +*/}} +{{- define "seaweedfs.validateValues.filer.replicaCount" -}} +{{- $filerReplicaCount := int .Values.filer.replicaCount }} +{{- if and .Values.filer.enabled .Values.filer.logPersistence.enabled .Values.filer.logPersistence.existingClaim (gt $filerReplicaCount 1) -}} +filer.replicaCount + A single existing PVC cannot be shared between multiple Filer Server replicas. + Please set a valid number of replicas (--set filer.replicaCount=1), disable persistence + (--set filer.logPersistence.enabled=false) or rely on dynamic provisioning via + Persistent Volume Claims (--set filer.logPersistence.existingClaim=""). {{- end -}} {{- end -}} @@ -585,6 +652,13 @@ volume.replicaCount Volume Claims (--set volume.dataVolumes[].persistence.existingClaim=""). {{- end -}} {{- end -}} +{{- if and .Values.volume.logPersistence.enabled .Values.volume.logPersistence.existingClaim (gt $volumeReplicaCount 1) -}} +volume.replicaCount + A single existing PVC cannot be shared between multiple Volume Server replicas. + Please set a valid number of replicas (--set volume.replicaCount=1), disable persistence + (--set volume.logPersistence.enabled=false) or rely on dynamic provisioning via Persistent Volume Claims + (--set volume.logPersistence.existingClaim=""). +{{- end -}} {{- end -}} {{/* diff --git a/helm/seaweedfs/templates/filer/hpa.yaml b/helm/seaweedfs/templates/filer/hpa.yaml index c2c967235f6345af184794f7d689745738348b23..725158c21281674a09c86c8e6849ec44b95f143f 100644 --- a/helm/seaweedfs/templates/filer/hpa.yaml +++ b/helm/seaweedfs/templates/filer/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.filer.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.filer.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.filer.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.filer.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.filer.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/filer/ingress.yaml b/helm/seaweedfs/templates/filer/ingress.yaml index 5ebfed11f95cfdb173470d453d00d229e283caa0..c92a9314563052700129e5a322cd5d213623f7c4 100644 --- a/helm/seaweedfs/templates/filer/ingress.yaml +++ b/helm/seaweedfs/templates/filer/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.filer.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.filer.ingress.ingressClassName }} ingressClassName: {{ .Values.filer.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.filer.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.filer.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.filer.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.filer.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.filer.ingress.hostname )}} host: {{ .Values.filer.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.filer.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.filer.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/filer/notification-configmap.yaml b/helm/seaweedfs/templates/filer/notification-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..367e1bf9452d6a85dec31246a89a077f70ef672e --- /dev/null +++ b/helm/seaweedfs/templates/filer/notification-configmap.yaml @@ -0,0 +1,20 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.filer.notificationConfig (empty .Values.filer.existingNotificationConfigmap) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-notification" (include "seaweedfs.filer.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: filer + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + notification.toml: |- +{{ include "common.tplvalues.render" ( dict "value" .Values.filer.notificationConfig "context" $ ) | indent 4 }} +{{- end }} diff --git a/helm/seaweedfs/templates/filer/statefulset.yaml b/helm/seaweedfs/templates/filer/statefulset.yaml index 8a9c8b442a0dc5b4a2a5f400669d02469d92a7f9..42037cec106d7aefe8f941ae03ca0510915284d7 100644 --- a/helm/seaweedfs/templates/filer/statefulset.yaml +++ b/helm/seaweedfs/templates/filer/statefulset.yaml @@ -34,6 +34,9 @@ spec: {{- if and .Values.filer.config (empty .Values.filer.existingConfigmap) }} checksum/config: {{ include (print $.Template.BasePath "/filer/configmap.yaml") . | sha256sum }} {{- end }} + {{- if and .Values.filer.notificationConfig (empty .Values.filer.existingNotificationConfigmap) }} + checksum/notification-config: {{ include (print $.Template.BasePath "/filer/notification-configmap.yaml") . | sha256sum }} + {{- end }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} {{- if .Values.filer.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.podAnnotations "context" $) | nindent 8 }} @@ -105,7 +108,11 @@ spec: args: {{- include "common.tplvalues.render" (dict "value" .Values.filer.args "context" $) | nindent 12 }} {{- else }} args: + {{- if .Values.filer.logPersistence.enabled }} + - -logdir={{ .Values.filer.logPersistence.mountPath }} + {{- else }} - -logtostderr=true + {{- end }} - -v={{ .Values.filer.logLevel }} - -config_dir=/etc/seaweedfs - filer @@ -235,6 +242,13 @@ spec: lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.filer.lifecycleHooks "context" $) | nindent 12 }} {{- end }} volumeMounts: + {{- if .Values.filer.logPersistence.enabled }} + - name: logs + mountPath: {{ .Values.filer.logPersistence.mountPath }} + {{- if .Values.filer.logPersistence.subPath }} + subPath: {{ .Values.filer.logPersistence.subPath }} + {{- end }} + {{- end }} - name: empty-dir mountPath: /tmp subPath: tmp-dir @@ -244,6 +258,12 @@ spec: subPath: filer.toml readOnly: true {{- end }} + {{- if or .Values.filer.notificationConfig .Values.filer.existingNotificationConfigmap }} + - name: notification-config + mountPath: /etc/seaweedfs/notification.toml + subPath: notification.toml + readOnly: true + {{- end }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -285,6 +305,11 @@ spec: configMap: name: {{ template "seaweedfs.filer.configmapName" . }} {{- end }} + {{- if or .Values.filer.notificationConfig .Values.filer.existingNotificationConfigmap }} + - name: notification-config + configMap: + name: {{ template "seaweedfs.filer.notificationConfigmapName" . }} + {{- end }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -311,4 +336,42 @@ spec: {{- if .Values.filer.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.extraVolumes "context" $) | nindent 8 }} {{- end }} + {{- if and .Values.filer.logPersistence.enabled .Values.filer.logPersistence.existingClaim }} + - name: logs + persistentVolumeClaim: + claimName: {{ tpl .Values.filer.logPersistence.existingClaim . }} + {{- else if .Values.filer.logPersistence.enabled }} + {{- if .Values.filer.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.filer.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.filer.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: logs + {{- if or .Values.filer.logPersistence.annotations .Values.commonAnnotations }} + {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.filer.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }} + {{- end }} + {{- if .Values.commonLabels }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + {{- end }} + spec: + {{- if .Values.filer.logPersistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.filer.logPersistence.dataSource "context" $) | nindent 10 }} + {{- end }} + accessModes: + {{- range .Values.filer.logPersistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.filer.logPersistence.size | quote }} + {{- if .Values.filer.logPersistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.filer.logPersistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.filer.logPersistence "global" .Values.global) | nindent 8 }} + {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/iam/deployment.yaml b/helm/seaweedfs/templates/iam/deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9386f2bd67705ffca6ac9d2c0f3f1b19a362a43b --- /dev/null +++ b/helm/seaweedfs/templates/iam/deployment.yaml @@ -0,0 +1,226 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.iam.enabled }} +apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} +kind: Deployment +metadata: + name: {{ template "seaweedfs.iam.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam + {{- if or .Values.iam.statefulsetAnnotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.iam.statefulsetAnnotations .Values.commonAnnotations) "context" .) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.iam.replicaCount }} + {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: iam + {{- if .Values.iam.updateStrategy }} + strategy: {{- toYaml .Values.iam.updateStrategy | nindent 4 }} + {{- end }} + template: + metadata: + annotations: + checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} + {{- if .Values.iam.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.podAnnotations "context" $) | nindent 8 }} + {{- end }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: iam + spec: + {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }} + serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }} + automountServiceAccountToken: {{ .Values.iam.automountServiceAccountToken }} + {{- if .Values.iam.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.iam.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.iam.affinity }} + affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.iam.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + {{- if not (empty .Values.iam.podAffinityPreset) }} + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.iam.podAffinityPreset "component" "iam" "customLabels" $podLabels "context" $) | nindent 10 }} + {{- end }} + {{- if not (empty .Values.iam.podAntiAffinityPreset) }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.iam.podAntiAffinityPreset "component" "iam" "customLabels" $podLabels "context" $) | nindent 10 }} + {{- end }} + {{- if not (empty .Values.iam.nodeAffinityPreset.type) }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.iam.nodeAffinityPreset.type "key" .Values.iam.nodeAffinityPreset.key "values" .Values.iam.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- end }} + {{- if .Values.iam.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.iam.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.iam.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.iam.tolerations "context" .) | nindent 8 }} + {{- end }} + {{- if .Values.iam.priorityClassName }} + priorityClassName: {{ .Values.iam.priorityClassName | quote }} + {{- end }} + {{- if .Values.iam.schedulerName }} + schedulerName: {{ .Values.iam.schedulerName | quote }} + {{- end }} + {{- if .Values.iam.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.iam.topologySpreadConstraints "context" .) | nindent 8 }} + {{- end }} + {{- if .Values.iam.podSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.iam.podSecurityContext "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.iam.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.iam.terminationGracePeriodSeconds }} + {{- end }} + initContainers: + {{- if .Values.iam.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.initContainers "context" $) | nindent 8 }} + {{- end }} + containers: + - name: seaweedfs + image: {{ template "seaweedfs.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.iam.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.iam.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.iam.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.iam.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.iam.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.iam.args "context" $) | nindent 12 }} + {{- else }} + args: + - -logtostderr=true + - -v={{ .Values.iam.logLevel }} + - iam + - -port={{ .Values.iam.containerPorts.http }} + - -filer={{ printf "%s:%d" (include "seaweedfs.filer.fullname" .) (int .Values.filer.service.ports.http) }} + - -master={{ printf "%s:%d" (include "seaweedfs.master.fullname" .) (int .Values.master.service.ports.http) }} + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: WEED_CLUSTER_DEFAULT + value: {{ .Values.clusterDefault | quote }} + {{- if .Values.iam.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + {{- if or .Values.iam.extraEnvVarsCM .Values.iam.extraEnvVarsSecret }} + envFrom: + {{- if .Values.iam.extraEnvVarsCM }} + - configMapRef: + name: {{ include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVarsCM "context" $) }} + {{- end }} + {{- if .Values.iam.extraEnvVarsSecret }} + - secretRef: + name: {{ include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVarsSecret "context" $) }} + {{- end }} + {{- end }} + {{- if .Values.iam.resources }} + resources: {{- toYaml .Values.iam.resources | nindent 12 }} + {{- else if ne .Values.iam.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.iam.resourcesPreset) | nindent 12 }} + {{- end }} + ports: + - name: "http" + containerPort: {{ .Values.iam.containerPorts.http }} + {{- if .Values.iam.extraContainerPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraContainerPorts "context" $) | nindent 12 }} + {{- end }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.iam.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.iam.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.livenessProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - pgrep + - -f + - iam + {{- end }} + {{- if .Values.iam.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.iam.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.readinessProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: "http" + {{- end }} + {{- if .Values.iam.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.iam.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: "http" + {{- end }} + {{- end }} + {{- if .Values.iam.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.iam.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: empty-dir + mountPath: /tmp + subPath: tmp-dir + - name: security-config + mountPath: /etc/seaweedfs/security.toml + subPath: security.toml + readOnly: true + {{- if .Values.security.mTLS.enabled }} + - name: ca-cert + readOnly: true + mountPath: /certs/ca + - name: master-cert + readOnly: true + mountPath: /certs/master + - name: filer-cert + readOnly: true + mountPath: /certs/filer + - name: volume-cert + readOnly: true + mountPath: /certs/volume + - name: client-cert + readOnly: true + mountPath: /certs/client + {{- end }} + {{- if .Values.iam.extraVolumeMounts }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraVolumeMounts "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.iam.sidecars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.iam.sidecars "context" $) | nindent 8 }} + {{- end }} + volumes: + - name: empty-dir + emptyDir: {} + - name: security-config + configMap: + name: {{ printf "%s-security" (include "common.names.fullname" .) }} + {{- if .Values.security.mTLS.enabled }} + - name: ca-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.caSecretName" . }} + items: + - key: tls.crt + path: tls.crt + - name: master-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.master.secretName" . }} + - name: filer-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.filer.secretName" . }} + - name: volume-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.volume.secretName" . }} + - name: client-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} + {{- end }} + {{- if .Values.iam.extraVolumes }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraVolumes "context" $) | nindent 8 }} + {{- end }} +{{- end }} diff --git a/helm/seaweedfs/templates/iam/pdb.yaml b/helm/seaweedfs/templates/iam/pdb.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6c00475fa5037297f12a3620d660bc25c500bf68 --- /dev/null +++ b/helm/seaweedfs/templates/iam/pdb.yaml @@ -0,0 +1,28 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.iam.enabled .Values.iam.pdb.create }} +apiVersion: {{ include "common.capabilities.policy.apiVersion" . }} +kind: PodDisruptionBudget +metadata: + name: {{ template "seaweedfs.iam.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if .Values.iam.pdb.minAvailable }} + minAvailable: {{ .Values.iam.pdb.minAvailable }} + {{- end }} + {{- if or .Values.iam.pdb.maxUnavailable (not .Values.iam.pdb.minAvailable) }} + maxUnavailable: {{ .Values.iam.pdb.maxUnavailable | default 1 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: iam +{{- end }} diff --git a/helm/seaweedfs/templates/iam/service.yaml b/helm/seaweedfs/templates/iam/service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1589697cea5a2372c1f63d967511bcb049923873 --- /dev/null +++ b/helm/seaweedfs/templates/iam/service.yaml @@ -0,0 +1,54 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.iam.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "seaweedfs.iam.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam + {{- if or .Values.iam.service.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.iam.service.annotations .Values.commonAnnotations) "context" .) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.iam.service.type }} + {{- if and .Values.iam.service.clusterIP (eq .Values.iam.service.type "ClusterIP") }} + clusterIP: {{ .Values.iam.service.clusterIP }} + {{- end }} + {{- if .Values.iam.service.sessionAffinity }} + sessionAffinity: {{ .Values.iam.service.sessionAffinity }} + {{- end }} + {{- if .Values.iam.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.iam.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + {{- if or (eq .Values.iam.service.type "LoadBalancer") (eq .Values.iam.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.iam.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if and (eq .Values.iam.service.type "LoadBalancer") (not (empty .Values.iam.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ .Values.iam.service.loadBalancerSourceRanges }} + {{- end }} + {{- if and (eq .Values.iam.service.type "LoadBalancer") (not (empty .Values.iam.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.iam.service.loadBalancerIP }} + {{- end }} + ports: + - name: "http" + port: {{ .Values.iam.service.ports.http }} + targetPort: "http" + protocol: TCP + {{- if and (or (eq .Values.iam.service.type "NodePort") (eq .Values.iam.service.type "LoadBalancer")) (not (empty .Values.iam.service.nodePorts.http)) }} + nodePort: {{ .Values.iam.service.nodePorts.http }} + {{- else if eq .Values.iam.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.iam.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) | fromYaml }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam +{{- end }} diff --git a/helm/seaweedfs/templates/master/hpa.yaml b/helm/seaweedfs/templates/master/hpa.yaml index b807e0be86a1b85e88f32dad997ae250f34d05b4..bc7441d4be87f66d466824691c567e28069c3a35 100644 --- a/helm/seaweedfs/templates/master/hpa.yaml +++ b/helm/seaweedfs/templates/master/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.master.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.master.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.master.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.master.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.master.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/master/ingress.yaml b/helm/seaweedfs/templates/master/ingress.yaml index c22d1f143bf4de3a4f1136f92f14e2dae38ea478..d76ee7d231d73534b76816088a54f5661ae5d373 100644 --- a/helm/seaweedfs/templates/master/ingress.yaml +++ b/helm/seaweedfs/templates/master/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.master.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.master.ingress.ingressClassName }} ingressClassName: {{ .Values.master.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.master.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.master.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.master.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.master.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.master.ingress.hostname )}} host: {{ .Values.master.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.master.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.master.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/master/statefulset.yaml b/helm/seaweedfs/templates/master/statefulset.yaml index 22aa1180e8a0757bb55c4a63c52dfcb8f00e4284..67e09277dfe60ade5b2ab4bb890583a1de0839ba 100644 --- a/helm/seaweedfs/templates/master/statefulset.yaml +++ b/helm/seaweedfs/templates/master/statefulset.yaml @@ -130,7 +130,11 @@ spec: args: {{- include "common.tplvalues.render" (dict "value" .Values.master.args "context" $) | nindent 12 }} {{- else }} args: + {{- if .Values.master.logPersistence.enabled }} + - -logdir={{ .Values.master.logPersistence.mountPath }} + {{- else }} - -logtostderr=true + {{- end }} - -v={{ .Values.master.logLevel }} - -config_dir=/etc/seaweedfs - master @@ -223,6 +227,13 @@ spec: {{- if .Values.master.persistence.subPath }} subPath: {{ .Values.master.persistence.subPath }} {{- end }} + {{- if .Values.master.logPersistence.enabled }} + - name: logs + mountPath: {{ .Values.master.logPersistence.mountPath }} + {{- if .Values.master.logPersistence.subPath }} + subPath: {{ .Values.master.logPersistence.subPath }} + {{- end }} + {{- end }} - name: empty-dir mountPath: /tmp subPath: tmp-dir @@ -297,20 +308,27 @@ spec: {{- if .Values.master.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.master.extraVolumes "context" $) | nindent 8 }} {{- end }} - {{- if not .Values.master.persistence.enabled }} + {{- if not .Values.master.persistence.enabled }} - name: data emptyDir: {} - {{- else if .Values.master.persistence.existingClaim }} + {{- else if .Values.master.persistence.existingClaim }} - name: data persistentVolumeClaim: - claimName: {{ .Values.master.persistence.existingClaim }} - {{- else }} + claimName: {{ tpl .Values.master.persistence.existingClaim . }} + {{- end }} + {{- if and .Values.master.logPersistence.enabled .Values.master.logPersistence.existingClaim }} + - name: logs + persistentVolumeClaim: + claimName: {{ tpl .Values.master.logPersistence.existingClaim . }} + {{- end }} + {{- if or (and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim)) (and .Values.master.logPersistence.enabled (not .Values.master.logPersistence.existingClaim)) }} {{- if .Values.master.persistentVolumeClaimRetentionPolicy.enabled }} persistentVolumeClaimRetentionPolicy: whenDeleted: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenDeleted }} whenScaled: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenScaled }} {{- end }} volumeClaimTemplates: + {{- if and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim) }} - apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -337,4 +355,33 @@ spec: selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 10 }} {{- end }} {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 8 }} + {{- end }} + {{- if and .Values.master.logPersistence.enabled (not .Values.master.logPersistence.existingClaim) }} + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: logs + {{- if or .Values.master.logPersistence.annotations .Values.commonAnnotations }} + {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.master.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }} + {{- end }} + {{- if .Values.commonLabels }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + {{- end }} + spec: + {{- if .Values.master.logPersistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.logPersistence.dataSource "context" $) | nindent 10 }} + {{- end }} + accessModes: + {{- range .Values.master.logPersistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.master.logPersistence.size | quote }} + {{- if .Values.master.logPersistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.logPersistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.master.logPersistence "global" .Values.global) | nindent 8 }} + {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/s3/deployment.yaml b/helm/seaweedfs/templates/s3/deployment.yaml index 94bdbe54fab4adc521c59352652da45eb1f35e00..2866f56b36afe958cb7768b969e812a3e29cfc69 100644 --- a/helm/seaweedfs/templates/s3/deployment.yaml +++ b/helm/seaweedfs/templates/s3/deployment.yaml @@ -40,7 +40,7 @@ spec: app.kubernetes.io/component: s3 spec: {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }} - serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }} + serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }} automountServiceAccountToken: {{ .Values.s3.automountServiceAccountToken }} {{- if .Values.s3.hostAliases }} hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.s3.hostAliases "context" $) | nindent 8 }} @@ -118,6 +118,7 @@ spec: - -metricsPort={{ .Values.s3.containerPorts.metrics }} {{- end }} - -filer={{ printf "%s:%d" (include "seaweedfs.filer.fullname" .) (int .Values.filer.service.ports.http) }} + - -allowEmptyFolder={{ .Values.s3.allowEmptyFolder }} {{- end }} env: - name: BITNAMI_DEBUG @@ -230,6 +231,11 @@ spec: volumes: - name: empty-dir emptyDir: {} + {{- if .Values.usePasswordFiles }} + - name: seaweed-secrets + secret: + secretName: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }} + {{- end }} {{- if and .Values.s3.auth.enabled .Values.s3.auth.existingSecret }} - name: auth secret: diff --git a/helm/seaweedfs/templates/s3/hpa.yaml b/helm/seaweedfs/templates/s3/hpa.yaml index 26aae790f7799e5593cef4365b7759449100794b..4af087ad1f36a7f95d0b53d6c7948bca2f988273 100644 --- a/helm/seaweedfs/templates/s3/hpa.yaml +++ b/helm/seaweedfs/templates/s3/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.s3.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.s3.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.s3.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.s3.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.s3.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/s3/ingress.yaml b/helm/seaweedfs/templates/s3/ingress.yaml index 9f55b3aae6ee63d91bdf637448fe9963cc84e2dc..51cfa640d848bbc7da25e6944d0033e8701fe3f5 100644 --- a/helm/seaweedfs/templates/s3/ingress.yaml +++ b/helm/seaweedfs/templates/s3/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.s3.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.s3.ingress.ingressClassName }} ingressClassName: {{ .Values.s3.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.s3.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.s3.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.s3.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.s3.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.s3.ingress.hostname )}} host: {{ .Values.s3.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.s3.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.s3.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/volume/hpa.yaml b/helm/seaweedfs/templates/volume/hpa.yaml index 5c458873f6537b80a67795bd83be138aca17be46..5d7992beb1ac7a4baae71f481a1be77180d0a794 100644 --- a/helm/seaweedfs/templates/volume/hpa.yaml +++ b/helm/seaweedfs/templates/volume/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.volume.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.volume.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.volume.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.volume.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.volume.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/volume/ingress.yaml b/helm/seaweedfs/templates/volume/ingress.yaml index 6c3680b94faaf01ec5048705519e8299d3bfdb41..18544f670e071c1eae4ec495327ee4715edd17f8 100644 --- a/helm/seaweedfs/templates/volume/ingress.yaml +++ b/helm/seaweedfs/templates/volume/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.volume.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.volume.ingress.ingressClassName }} ingressClassName: {{ .Values.volume.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.volume.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.volume.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.volume.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.volume.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.volume.ingress.hostname )}} host: {{ .Values.volume.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.volume.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.volume.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/volume/statefulset.yaml b/helm/seaweedfs/templates/volume/statefulset.yaml index 3ba977a7724c8c8c460f7dee623a906b72bf5695..c02cae0d84478ca8403066e1a868b7ac090cc49e 100644 --- a/helm/seaweedfs/templates/volume/statefulset.yaml +++ b/helm/seaweedfs/templates/volume/statefulset.yaml @@ -135,7 +135,11 @@ spec: args: {{- include "common.tplvalues.render" (dict "value" .Values.volume.args "context" $) | nindent 12 }} {{- else }} args: + {{- if .Values.volume.logPersistence.enabled }} + - -logdir={{ .Values.volume.logPersistence.mountPath }} + {{- else }} - -logtostderr=true + {{- end }} - -v={{ .Values.volume.logLevel }} - -config_dir=/etc/seaweedfs - volume @@ -219,7 +223,7 @@ spec: {{- else if .Values.volume.readinessProbe.enabled }} readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.volume.readinessProbe "enabled") "context" $) | nindent 12 }} httpGet: - path: /status + path: /healthz port: http {{- end }} {{- if .Values.volume.customStartupProbe }} @@ -242,6 +246,13 @@ spec: subPath: {{ .subPath }} {{- end }} {{- end }} + {{- if .Values.volume.logPersistence.enabled }} + - name: logs + mountPath: {{ .Values.volume.logPersistence.mountPath }} + {{- if .Values.volume.logPersistence.subPath }} + subPath: {{ .Values.volume.logPersistence.subPath }} + {{- end }} + {{- end }} - name: empty-dir mountPath: /tmp subPath: tmp-dir @@ -326,14 +337,19 @@ spec: claimName: {{ .persistence.existingClaim }} {{- end }} {{- end }} + {{- if and .Values.volume.logPersistence.enabled .Values.volume.logPersistence.existingClaim }} + - name: logs + persistentVolumeClaim: + claimName: {{ tpl .Values.volume.logPersistence.existingClaim . }} + {{- end }} {{- if .Values.volume.persistentVolumeClaimRetentionPolicy.enabled }} persistentVolumeClaimRetentionPolicy: whenDeleted: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenDeleted }} whenScaled: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenScaled }} {{- end }} volumeClaimTemplates: - {{- range .Values.volume.dataVolumes }} - {{- if and .persistence.enabled (not .persistence.existingClaim) }} + {{- range .Values.volume.dataVolumes }} + {{- if and .persistence.enabled (not .persistence.existingClaim) }} - apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -360,5 +376,33 @@ spec: selector: {{- include "common.tplvalues.render" (dict "value" .persistence.selector "context" $) | nindent 10 }} {{- end }} {{- include "common.storage.class" (dict "persistence" .persistence "global" $.Values.global) | nindent 8 }} - {{- end }} - {{- end }} + {{- end }} + {{- end }} + {{- if and .Values.volume.logPersistence.enabled (not .Values.volume.logPersistence.existingClaim) }} + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: logs + {{- if or .Values.volume.logPersistence.annotations .Values.commonAnnotations }} + {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.volume.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }} + {{- end }} + {{- if .Values.commonLabels }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + {{- end }} + spec: + {{- if .Values.volume.logPersistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.volume.logPersistence.dataSource "context" $) | nindent 10 }} + {{- end }} + accessModes: + {{- range .Values.volume.logPersistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.volume.logPersistence.size | quote }} + {{- if .Values.volume.logPersistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.volume.logPersistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.volume.logPersistence "global" .Values.global) | nindent 8 }} + {{- end }} diff --git a/helm/seaweedfs/templates/webadv/hpa.yaml b/helm/seaweedfs/templates/webadv/hpa.yaml index e6434c258b6694736744052686dbda514797bc42..9c2208c369b6e3de2bd84ba1ff86c6d1c78d8324 100644 --- a/helm/seaweedfs/templates/webadv/hpa.yaml +++ b/helm/seaweedfs/templates/webadv/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.webdav.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.webdav.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.webdav.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.webdav.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.webdav.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/webadv/ingress.yaml b/helm/seaweedfs/templates/webadv/ingress.yaml index a42d6e9e3491709a4d69bdafd6eabe8ecbd2609b..821216f34d5011acb6473216253bf61f8aecb533 100644 --- a/helm/seaweedfs/templates/webadv/ingress.yaml +++ b/helm/seaweedfs/templates/webadv/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.webdav.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.webdav.ingress.ingressClassName }} ingressClassName: {{ .Values.webdav.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.webdav.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.webdav.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.webdav.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.webdav.fullname" .) "servicePort" (ternary "https" "http" .Values.webdav.tls.enabled) "context" $) | nindent 14 }} {{- if not (empty .Values.webdav.ingress.hostname )}} host: {{ .Values.webdav.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.webdav.fullname" $) "servicePort" ("https" "http" .Values.webdav.tls.enabled) "context" $) | nindent 14 }} {{- end }} {{- if .Values.webdav.ingress.extraRules }} diff --git a/helm/seaweedfs/values.yaml b/helm/seaweedfs/values.yaml index cbe833459d19a54b31f90cbfe31fc1e7569f695e..40321455a2a7e891b626ddca370a7512afa2de42 100644 --- a/helm/seaweedfs/values.yaml +++ b/helm/seaweedfs/values.yaml @@ -85,7 +85,7 @@ diagnosticMode: image: registry: docker.io repository: bitnami/seaweedfs - tag: 3.80.0-debian-12-r1 + tag: 3.87.0-debian-12-r1 digest: "" ## Specify a imagePullPolicy ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images @@ -314,7 +314,7 @@ master: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param master.logLevel Master Server log level [0|1|2|3|4] + ## @param master.logLevel Master Server log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param master.bindAddress Master Server bind address @@ -324,7 +324,7 @@ master: ## volumeSizeLimitMB: 1000 ## @param master.config Master Server configuration - ## Specify content for master.yml + ## Specify content for master.toml ## config: "" ## @param master.existingConfigmap The name of an existing ConfigMap with your custom configuration for Master Server @@ -716,11 +716,11 @@ master: ## @section Master Server Persistence Parameters ## - ## Enable persistence using Persistent Volume Claims + ## Enable Master data persistence using Persistent Volume Claims ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ ## persistence: - ## @param master.persistence.enabled Enable persistence on Master Server using Persistent Volume Claims + ## @param master.persistence.enabled Enable data persistence on Master Server using Persistent Volume Claims ## enabled: true ## @param master.persistence.mountPath Path to mount the volume at. @@ -747,7 +747,7 @@ master: ## @param master.persistence.size Size of data volume ## size: 8Gi - ## @param master.persistence.existingClaim The name of an existing PVC to use for persistence + ## @param master.persistence.existingClaim The name of an existing PVC to use for data persistence ## existingClaim: "" ## @param master.persistence.selector Selector to match an existing Persistent Volume for data PVC @@ -761,6 +761,51 @@ master: ## @param master.persistence.dataSource Custom PVC data source ## dataSource: {} + ## Enable Master logs persistence using Persistent Volume Claims + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + logPersistence: + ## @param master.logPersistence.enabled Enable logs persistence on Master Server using Persistent Volume Claims + ## + enabled: false + ## @param master.logPersistence.mountPath Path to mount the volume at. + ## + mountPath: /logs + ## @param master.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param master.logPersistence.storageClass Storage class of backing PVC + ## If defined, storageClassName: <storageClass> + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param master.logPersistence.annotations Persistent Volume Claim annotations + ## + annotations: {} + ## @param master.logPersistence.accessModes Persistent Volume Access Modes + ## + accessModes: + - ReadWriteOnce + ## @param master.logPersistence.size Size of logs volume + ## + size: 8Gi + ## @param master.logPersistence.existingClaim The name of an existing PVC to use for logs persistence + ## + existingClaim: "" + ## @param master.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC + ## If set, the PVC can't have a PV dynamically provisioned for it + ## E.g. + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param master.logPersistence.dataSource Custom PVC data source + ## + dataSource: {} ## persistentVolumeClaimRetentionPolicy ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention ## @param master.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet @@ -964,7 +1009,7 @@ volume: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param volume.logLevel Volume Server log level [0|1|2|3|4] + ## @param volume.logLevel Volume Server log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param volume.bindAddress Volume Server bind address @@ -974,7 +1019,7 @@ volume: ## publicUrl: "" ## @param volume.config Volume Server configuration - ## Specify content for volume.yml + ## Specify content for volume.toml ## config: "" ## @param volume.existingConfigmap The name of an existing ConfigMap with your custom configuration for Volume Server @@ -1421,6 +1466,51 @@ volume: ## @param volume.dataVolumes[0].persistence.dataSource Custom PVC data source ## dataSource: {} + ## Enable Volume logs persistence using Persistent Volume Claims + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + logPersistence: + ## @param volume.logPersistence.enabled Enable logs persistence on Volume Server using Persistent Volume Claims + ## + enabled: false + ## @param volume.logPersistence.mountPath Path to mount the volume at. + ## + mountPath: /logs + ## @param volume.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param volume.logPersistence.storageClass Storage class of backing PVC + ## If defined, storageClassName: <storageClass> + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param volume.logPersistence.annotations Persistent Volume Claim annotations + ## + annotations: {} + ## @param volume.logPersistence.accessModes Persistent Volume Access Modes + ## + accessModes: + - ReadWriteOnce + ## @param volume.logPersistence.size Size of logs volume + ## + size: 8Gi + ## @param volume.logPersistence.existingClaim The name of an existing PVC to use for logs persistence + ## + existingClaim: "" + ## @param volume.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC + ## If set, the PVC can't have a PV dynamically provisioned for it + ## E.g. + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param volume.logPersistence.dataSource Custom PVC data source + ## + dataSource: {} ## persistentVolumeClaimRetentionPolicy ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention ## @param volume.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet @@ -1627,14 +1717,14 @@ filer: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param filer.logLevel Filer Server log level [0|1|2|3|4] + ## @param filer.logLevel Filer Server log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param filer.bindAddress Filer Server bind address ## bindAddress: 0.0.0.0 ## @param filer.config Filer Server configuration - ## Specify content for filer.yml + ## Specify content for filer.toml ## config: | [leveldb2] @@ -1642,6 +1732,13 @@ filer: ## @param filer.existingConfigmap The name of an existing ConfigMap with your custom configuration for Filer Server ## existingConfigmap: "" + ## @param filer.notificationConfig Filer Server notification configuration + ## Specify content for custom notification.toml + ## + notificationConfig: "" + ## @param filer.existingNotificationConfigmap The name of an existing ConfigMap with your custom notification configuration for Filer Server + ## + existingNotificationConfigmap: "" ## @param filer.command Override default Filer Server container command (useful when using custom images) ## command: [] @@ -2025,6 +2122,65 @@ filer: ## extraRules: [] + ## @section Filer Server Persistence Parameters + ## + + ## Enable Filer logs persistence using Persistent Volume Claims + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + logPersistence: + ## @param filer.logPersistence.enabled Enable logs persistence on Filer Server using Persistent Volume Claims + ## + enabled: false + ## @param filer.logPersistence.mountPath Path to mount the volume at. + ## + mountPath: /logs + ## @param filer.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param filer.logPersistence.storageClass Storage class of backing PVC + ## If defined, storageClassName: <storageClass> + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param filer.logPersistence.annotations Persistent Volume Claim annotations + ## + annotations: {} + ## @param filer.logPersistence.accessModes Persistent Volume Access Modes + ## + accessModes: + - ReadWriteOnce + ## @param filer.logPersistence.size Size of logs volume + ## + size: 8Gi + ## @param filer.logPersistence.existingClaim The name of an existing PVC to use for logs persistence + ## + existingClaim: "" + ## @param filer.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC + ## If set, the PVC can't have a PV dynamically provisioned for it + ## E.g. + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param filer.logPersistence.dataSource Custom PVC data source + ## + dataSource: {} + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param filer.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet + ## @param filer.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param filer.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain + ## @section Filer Server Metrics Parameters ## metrics: @@ -2220,21 +2376,23 @@ s3: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param s3.logLevel Amazon S3 API log level [0|1|2|3|4] + ## @param s3.logLevel Amazon S3 API log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param s3.bindAddress Amazon S3 API bind address ## bindAddress: 0.0.0.0 + ## @param s3.allowEmptyFolder Allow empty folders in Amazon S3 API + allowEmptyFolder: true ## S3 Authentication ## ref: https://github.com/seaweedfs/seaweedfs/wiki/Amazon-S3-API#s3-authentication ## @param s3.auth.enabled Enable Amazon S3 API authentication ## @param s3.auth.existingSecret Existing secret with Amazon S3 API authentication configuration ## @param s3.auth.existingSecretConfigKey Key of the above existing secret with S3 API authentication configuration, defaults to `config.json` - ## @param s3.auth.adminAccessKeyId Amazon S3 API access key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set - ## @param s3.auth.adminSecretAccessKey Amazon S3 API secret key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set - ## @param s3.auth.readAccessKeyId Amazon S3 API read access key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set - ## @param s3.auth.readSecretAccessKey Amazon S3 API read secret key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set + ## @param s3.auth.adminAccessKeyId Amazon S3 API access key with admin privileges. Ignored if `s3.auth.existingSecret` is set + ## @param s3.auth.adminSecretAccessKey Amazon S3 API secret key with admin privileges. Ignored if `s3.auth.existingSecret` is set + ## @param s3.auth.readAccessKeyId Amazon S3 API read access key with read-only privileges. Ignored if `s3.auth.existingSecret` is set + ## @param s3.auth.readSecretAccessKey Amazon S3 API read secret key with read-only privileges. Ignored if `s3.auth.existingSecret` is set ## auth: enabled: false @@ -2814,7 +2972,7 @@ webdav: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param webdav.logLevel WebDAV log level [0|1|2|3|4] + ## @param webdav.logLevel WebDAV log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## TLS configuration for WebDAV @@ -3223,6 +3381,326 @@ webdav: ## extraRules: [] +## @section IAM Parameters +## +iam: + ## @param iam.enabled Enable IAM deployment + ## + enabled: false + ## @param iam.replicaCount Number of IAM replicas to deploy + ## + replicaCount: 1 + ## @param iam.containerPorts.http IAM HTTP container port + ## + containerPorts: + http: 8111 + ## Configure extra options for IAM containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + ## @param iam.livenessProbe.enabled Enable livenessProbe on IAM containers + ## @param iam.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param iam.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param iam.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param iam.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param iam.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + ## @param iam.readinessProbe.enabled Enable readinessProbe on IAM containers + ## @param iam.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param iam.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param iam.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param iam.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param iam.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + ## @param iam.startupProbe.enabled Enable startupProbe on IAM containers + ## @param iam.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param iam.startupProbe.periodSeconds Period seconds for startupProbe + ## @param iam.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param iam.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param iam.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 1 + failureThreshold: 15 + successThreshold: 1 + + ## IAM resource requests and limits + ## ref: http://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param iam.resourcesPreset Set IAM container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if webdav.resources is set (webdav.resources is recommended for production). + ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15 + ## + resourcesPreset: "nano" + ## @param iam.resources Set IAM container requests and limits for different resources like CPU or memory (essential for production workloads) + ## Example: + ## resources: + ## requests: + ## cpu: 2 + ## memory: 512Mi + ## limits: + ## cpu: 3 + ## memory: 1024Mi + ## + resources: {} + ## Configure Pods Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param iam.podSecurityContext.enabled Enable IAM pods' Security Context + ## @param iam.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy for IAM pods + ## @param iam.podSecurityContext.sysctls Set kernel settings using the sysctl interface for IAM pods + ## @param iam.podSecurityContext.supplementalGroups Set filesystem extra groups for IAM pods + ## @param iam.podSecurityContext.fsGroup Set fsGroup in IAM pods' Security Context + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + ## @param iam.containerSecurityContext.enabled Enabled IAM container' Security Context + ## @param iam.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in IAM container + ## @param iam.containerSecurityContext.runAsUser Set runAsUser in IAM container' Security Context + ## @param iam.containerSecurityContext.runAsGroup Set runAsGroup in IAM container' Security Context + ## @param iam.containerSecurityContext.runAsNonRoot Set runAsNonRoot in IAM container' Security Context + ## @param iam.containerSecurityContext.readOnlyRootFilesystem Set readOnlyRootFilesystem in IAM container' Security Context + ## @param iam.containerSecurityContext.privileged Set privileged in IAM container' Security Context + ## @param iam.containerSecurityContext.allowPrivilegeEscalation Set allowPrivilegeEscalation in IAM container' Security Context + ## @param iam.containerSecurityContext.capabilities.drop List of capabilities to be dropped in IAM container + ## @param iam.containerSecurityContext.seccompProfile.type Set seccomp profile in IAM container + ## + containerSecurityContext: + enabled: true + seLinuxOptions: {} + runAsUser: 1001 + runAsGroup: 1001 + runAsNonRoot: true + readOnlyRootFilesystem: true + privileged: false + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## @param iam.logLevel IAM log level (0, 1, 2, 3, or 4) + ## + logLevel: 1 + ## @param iam.command Override default IAM container command (useful when using custom images) + ## + command: [] + ## @param iam.args Override default IAM container args (useful when using custom images) + ## + args: [] + ## @param iam.automountServiceAccountToken Mount Service Account token in IAM pods + ## + automountServiceAccountToken: false + ## @param iam.hostAliases IAM pods host aliases + ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ + ## + hostAliases: [] + ## @param iam.statefulsetAnnotations Annotations for IAM statefulset + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + statefulsetAnnotations: {} + ## @param iam.podLabels Extra labels for IAM pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + ## + podLabels: {} + ## @param iam.podAnnotations Annotations for IAM pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: {} + ## @param iam.podAffinityPreset Pod affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAffinityPreset: "" + ## @param iam.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAntiAffinityPreset: soft + ## Node iam.affinity preset + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity + ## + nodeAffinityPreset: + ## @param iam.nodeAffinityPreset.type Node affinity preset type. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` + ## + type: "" + ## @param iam.nodeAffinityPreset.key Node label key to match. Ignored if `iam.affinity` is set + ## + key: "" + ## @param iam.nodeAffinityPreset.values Node label values to match. Ignored if `iam.affinity` is set + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] + ## @param iam.affinity Affinity for IAM pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## NOTE: `iam.podAffinityPreset`, `iam.podAntiAffinityPreset`, and `iam.nodeAffinityPreset` will be ignored when it's set + ## + affinity: {} + ## @param iam.nodeSelector Node labels for IAM pods assignment + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: {} + ## @param iam.tolerations Tolerations for IAM pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + ## @param iam.updateStrategy.type IAM deployment strategy type + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + ## + updateStrategy: + ## Can be set to RollingUpdate or Recreate + ## + type: RollingUpdate + ## @param iam.priorityClassName IAM pods' priorityClassName + ## + priorityClassName: "" + ## @param iam.topologySpreadConstraints Topology Spread Constraints for IAM pod assignment spread across your cluster among failure-domains + ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods + ## + topologySpreadConstraints: [] + ## @param iam.schedulerName Name of the k8s scheduler (other than default) for IAM pods + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + schedulerName: "" + ## @param iam.terminationGracePeriodSeconds Seconds IAM pods need to terminate gracefully + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods + ## + terminationGracePeriodSeconds: "" + ## @param iam.lifecycleHooks for IAM containers to automate configuration before or after startup + ## + lifecycleHooks: {} + ## @param iam.extraEnvVars Array with extra environment variables to add to IAM containers + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param iam.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for IAM containers + ## + extraEnvVarsCM: "" + ## @param iam.extraEnvVarsSecret Name of existing Secret containing extra env vars for IAM containers + ## + extraEnvVarsSecret: "" + ## @param iam.extraVolumes Optionally specify extra list of additional volumes for the IAM pods + ## + extraVolumes: [] + ## @param iam.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the IAM containers + ## + extraVolumeMounts: [] + ## @param iam.sidecars Add additional sidecar containers to the IAM pods + ## e.g: + ## sidecars: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## ports: + ## - name: portname + ## containerPort: 1234 + ## + sidecars: [] + ## @param iam.initContainers Add additional init containers to the IAM pods + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ + ## e.g: + ## initContainers: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## command: ['sh', '-c', 'echo "hello world"'] + ## + initContainers: [] + ## Pod Disruption Budget configuration + ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb + ## @param iam.pdb.create Enable/disable a Pod Disruption Budget creation + ## @param iam.pdb.minAvailable Minimum number/percentage of pods that should remain scheduled + ## @param iam.pdb.maxUnavailable Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `iam.pdb.minAvailable` and `iam.pdb.maxUnavailable` are empty. + ## + pdb: + create: true + minAvailable: "" + maxUnavailable: "" + + + ## @section IAM Traffic Exposure Parameters + ## + + ## IAM service parameters + ## + service: + ## @param iam.service.type IAM service type + ## + type: ClusterIP + ## @param iam.service.ports.http IAM service HTTP port (HTTPS if `iam.tls.enabled` is `true`) + ## + ports: + http: 8111 + ## Node ports to expose + ## @param iam.service.nodePorts.http Node port for HTTP (HTTPS if `iam.tls.enabled` is `true`) + ## NOTE: choose port between <30000-32767> + ## + nodePorts: + http: "" + ## @param iam.service.clusterIP IAM service Cluster IP + ## e.g.: + ## clusterIP: None + ## + clusterIP: "" + ## @param iam.service.loadBalancerIP IAM service Load Balancer IP + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer + ## + loadBalancerIP: "" + ## @param iam.service.loadBalancerSourceRanges IAM service Load Balancer sources + ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## e.g: + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param iam.service.externalTrafficPolicy IAM service external traffic policy + ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param iam.service.annotations Additional custom annotations for IAM service + ## + annotations: {} + ## @param iam.service.extraPorts Extra ports to expose in IAM service (normally used with the `sidecars` value) + ## + extraPorts: [] + ## @param iam.service.sessionAffinity Control where client requests go, to the same pod or round-robin + ## Values: ClientIP or None + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/ + ## + sessionAffinity: None + ## @param iam.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## Headless service properties + ## + ## Network Policies for IAM + ## Ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/ + ## + ## @section Init Container Parameters ## @@ -3245,7 +3723,7 @@ volumePermissions: image: registry: docker.io repository: bitnami/os-shell - tag: 12-debian-12-r33 + tag: 12-debian-12-r43 pullPolicy: IfNotPresent ## Optionally specify an array of imagePullSecrets. ## Secrets must be manually created in the namespace. @@ -3329,7 +3807,7 @@ mariadb: image: registry: docker.io repository: bitnami/mariadb - tag: 11.4.4-debian-12-r1 + tag: 11.4.5-debian-12-r12 digest: "" ## Specify a imagePullPolicy ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images @@ -3350,7 +3828,6 @@ mariadb: ## @param mariadb.auth.database MariaDB custom database ## @param mariadb.auth.username MariaDB custom user name ## @param mariadb.auth.password MariaDB custom user password - ## @param mariadb.auth.usePasswordFiles Mount credentials as a file instead of using an environment variable ## ref: https://github.com/bitnami/containers/tree/main/bitnami/mariadb#setting-the-root-password-on-first-run ## https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-on-first-run ## https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-user-on-first-run @@ -3360,7 +3837,6 @@ mariadb: database: bitnami_seaweedfs username: bn_seaweedfs password: "" - usePasswordFiles: false ## @param mariadb.initdbScripts [object] Specify dictionary of scripts to be run at first boot ## initdbScripts: @@ -3430,7 +3906,7 @@ postgresql: image: registry: docker.io repository: bitnami/postgresql - tag: 17.2.0-debian-12-r2 + tag: 17.4.0-debian-12-r19 digest: "" ## Specify a imagePullPolicy ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images @@ -3538,6 +4014,10 @@ externalDatabase: ## NOTE: When it's set, the `externalDatabase.password` parameter is ignored ## existingSecret: "" + ## @param externalDatabase.waitForDatabaseEnabled Whether to check for external database before starting seaweedfs containers + ## + waitForDatabaseEnabled: true + ## ## Init external database job ## initDatabaseJob: diff --git a/install.sh b/install.sh index d200d739da61c8525434ce56bbbea255b98cab3b..2fcfead2867c19c792929623bad52ac863d2252a 100644 --- a/install.sh +++ b/install.sh @@ -1,11 +1,10 @@ #!/bin/bash # preset -APP_VERSION="1.8.1" +APP_VERSION="1.8.2" DOC_VERSION="1.8" MIN_CPU=8 -MIN_RAM=4 -MIN_MAP_COUNT=262144 +MIN_RAM=20 SKIP_CHECKS=${SKIP_CHECKS:-0} DOWNLOAD_ONLY=${DOWNLOAD_ONLY:-0} @@ -42,23 +41,6 @@ if [[ $SKIP_CHECKS -eq 0 ]] && [[ $DOWNLOAD_ONLY -ne 1 ]]; then else echo "RAM ${RAM}GB OK" fi - MAX_MAP_COUNT=$(cat /proc/sys/vm/max_map_count) - if [[ $MAX_MAP_COUNT -lt $MIN_MAP_COUNT ]]; then - echo "You do not have enough max. map counts: found ${MAX_MAP_COUNT} instead of minimum ${MIN_MAP_COUNT}" - if [ $(id -u) -eq 0 ]; then - echo " - attempt to update the /etc/sysctl.conf file and add the line 'vm.max_map_count=${MIN_MAP_COUNT}' at the end" - echo "vm.max_map_count=${MIN_MAP_COUNT}" >> /etc/sysctl.conf - sysctl -p - if [[ $MAX_MAP_COUNT -lt $MIN_MAP_COUNT ]]; then - exit 4 - fi - else - echo " - you need to re-run the install.sh script as root to fix this" - exit 4 - fi - else - echo "MAP COUNT ${MAX_MAP_COUNT} OK" - fi else echo "[✨] Skipping checks ..." fi diff --git a/lib/java/dbrepo-core/.gitignore b/lib/java/dbrepo-core/.gitignore index b425f09ad0e75e91fc43f1aee01bb3a918eec8c0..84f38abb66955bad9e1baa3d4e303cba52a57e66 100644 --- a/lib/java/dbrepo-core/.gitignore +++ b/lib/java/dbrepo-core/.gitignore @@ -9,6 +9,9 @@ target/ *.iml *.ipr +## generated +dependency-reduced-pom.xml + ### Eclipse ### .apt_generated .classpath diff --git a/lib/java/dbrepo-core/Dockerfile b/lib/java/dbrepo-core/Dockerfile deleted file mode 100644 index 8a6348bbcef25836c318e41ae226295f90549a66..0000000000000000000000000000000000000000 --- a/lib/java/dbrepo-core/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -###### FIRST STAGE ###### -FROM maven:3-amazoncorretto-17 AS build -LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" - -COPY ./pom.xml ./ - -RUN mvn dependency:go-offline - -COPY ./src/ ./src/ - -# Make sure it compiles -RUN mvn clean install -DskipTests \ No newline at end of file diff --git a/lib/java/dbrepo-core/pom.xml b/lib/java/dbrepo-core/pom.xml index d86419d19dbb22e8db5ef64f7e8b01d262673bcd..487d9c9215c5a409ffa9c75bae7191e53140ee4c 100644 --- a/lib/java/dbrepo-core/pom.xml +++ b/lib/java/dbrepo-core/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -18,7 +18,7 @@ <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> <name>dbrepo-core</name> - <version>1.8.1</version> + <version>${env.APP_VERSION}</version> <description>Core library for DBRepo</description> @@ -35,18 +35,18 @@ <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <lombok.version>1.18.36</lombok.version> <keycloak.version>26.0.4</keycloak.version> <mapstruct.version>1.6.3</mapstruct.version> - <spring-cloud.version>4.1.4</spring-cloud.version> + <spring-cloud.version>4.2.1</spring-cloud.version> <jackson-datatype.version>2.15.0</jackson-datatype.version> <springdoc-openapi.version>2.8.5</springdoc-openapi.version> </properties> - <dependencies><dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> @@ -104,7 +104,7 @@ <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> - <scope>compile</scope> + <scope>provided</scope> </dependency> <!-- Entities --> <dependency> @@ -153,6 +153,20 @@ </annotationProcessorPaths> </configuration> </plugin> + <!-- build shaded jar --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>3.6.0</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/query/FilterDto.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/query/FilterDto.java index 2e6b1a03d7b5243612123b97e6df104b182f2807..25d0e83f81b013f68ca6f09189f11ca548747329 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/query/FilterDto.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/query/FilterDto.java @@ -32,7 +32,6 @@ public class FilterDto { @Schema(example = "67c5b54d-2eb0-4f42-8dc1-a504562e9f32") private UUID operatorId; - @NotNull @Schema(example = "1") private String value; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java index 04471509c6cd711b745f1a9060227d869f2dcb33..ac0559fa96fea27761b1b95f86db7da77563aef4 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java @@ -33,6 +33,7 @@ import java.util.UUID; @NamedQuery(name = "Identifier.findSubsetIdentifier", query = "select i from Identifier i where i.database.id = ?1 and i.queryId = ?2 and i.type = 'SUBSET' ORDER BY i.id DESC"), @NamedQuery(name = "Identifier.findViewIdentifier", query = "select i from Identifier i where i.database.id = ?1 and i.viewId = ?2 and i.type = 'VIEW' ORDER BY i.id DESC"), @NamedQuery(name = "Identifier.findEarliest", query = "select i from Identifier i ORDER BY i.created ASC limit 1"), + @NamedQuery(name = "Identifier.findAll", query = "select i from Identifier i ORDER BY i.created DESC"), }) public class Identifier implements Serializable { diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py index c88ad653aaeaa511034f476a8bed247136d9bac4..c9bfb58ff39563df45e2b5038d9124a5f27701ed 100644 --- a/lib/python/dbrepo/api/dto.py +++ b/lib/python/dbrepo/api/dto.py @@ -825,14 +825,14 @@ class Filter(BaseModel): type: FilterType column_id: str operator_id: str - value: str + value: Optional[str] = None class FilterDefinition(BaseModel): type: FilterType column: str operator: str - value: str + value: Optional[str] = None class Order(BaseModel): diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index 6775ad3981ea0749688004ae75379fd3402a0aa4..d235ee9ae1976a6ffa426e7dbbf6d19e42064bfa 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.8.1" +version = "1.8.2" description = "DBRepo Python Library" keywords = [ "DBRepo", @@ -23,7 +23,6 @@ dependencies = [ "requests >= 2.31", "pika", "pydantic", - "tuspy", "pandas" ] @@ -35,6 +34,6 @@ build-backend = "setuptools.build_meta" [project.urls] Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/" -Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/python/" +Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/python/" Issues = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues" Source = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/" \ No newline at end of file diff --git a/lib/python/setup.py b/lib/python/setup.py index 20e321aef0883cba8075e8126a979d09ad636a9a..bb75727d7674ce488ed12fdd55dc011c64540d92 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,7 +2,7 @@ from distutils.core import setup setup(name="dbrepo", - version="1.8.1", + version="1.8.2", description="A library for communicating with DBRepo", url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/", author="Martin Weise", diff --git a/make/build.mk b/make/build.mk index 311cdecd97ac8e918d50a5fdfd3b44c9749a28fe..6e2306052ebc7363eb6781d1b09bce53717c244a 100644 --- a/make/build.mk +++ b/make/build.mk @@ -1,46 +1,38 @@ ##@ Build .PHONY: build-images -build-images: ## Build Docker images. - docker build --network=host -t dbrepo-core:build --target build ./lib/java/dbrepo-core - docker build --network=host -t dbrepo-data-service:build --target build dbrepo-data-service - docker build --network=host -t dbrepo-metadata-service:build --target build dbrepo-metadata-service - docker compose build --parallel +build-images: build-java-lib ## Build Docker images. + docker compose build -.PHONY: build-data-service -build-data-service: ## Build the Data Service. - mvn -f ./dbrepo-data-service/pom.xml clean package -DskipTests - -.PHONY: build-metadata-service -build-metadata-service: ## Build the Metadata Service. - mvn -f ./dbrepo-metadata-service/pom.xml clean package -DskipTests +.PHONY: build-java-lib +build-java-lib: ## Build the Java Library. + APP_VERSION=$(APP_VERSION) mvn -f ./lib/java/dbrepo-core/pom.xml -q clean package install -DskipTests + mvn deploy:deploy-file -q -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$(APP_VERSION).jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$(APP_VERSION) -Dpackaging=jar -Durl=file:./dbrepo-data-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true + mvn deploy:deploy-file -q -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$(APP_VERSION).jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$(APP_VERSION) -Dpackaging=jar -Durl=file:./dbrepo-metadata-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true .PHONY: build-auth-event-listener build-auth-event-listener: ## Build the Auth Service Event Listener. - mvn -f ./dbrepo-auth-service/listeners/pom.xml clean package -DskipTests + mvn -f ./dbrepo-auth-service/listeners/pom.xml -q clean package -DskipTests cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./helm/dbrepo/files/create-event-listener.jar .PHONY: build-ui build-ui: ## Build the UI. bun --cwd ./dbrepo-ui build -.PHONY: build-lib -build-lib: ## Build the Python Library. - rm -rf ./dbrepo-analyse-service/venv/ ./dbrepo-analyse-service/Pipfile.lock ./dbrepo-analyse-service/lib/* - rm -rf ./dbrepo-search-service/venv/ ./dbrepo-search-service/Pipfile.lock ./dbrepo-search-service/lib/* - rm -rf ./dbrepo-dashboard-service/venv/ ./dbrepo-dashboard-service/Pipfile.lock ./dbrepo-dashboard-service/lib/* +.PHONY: build-python-lib +build-python-lib: ## Build the Python Library. + rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-search-service/lib/* ./dbrepo-dashboard-service/lib/* python3 -m build --sdist ./lib/python python3 -m build --wheel ./lib/python cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-analyse-service/lib - (cd ./dbrepo-analyse-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev) + PIPENV_PIPFILE=./dbrepo-analyse-service/Pipfile pipenv lock cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-search-service/lib - (cd ./dbrepo-search-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev) + PIPENV_PIPFILE=./dbrepo-search-service/Pipfile pipenv lock cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-dashboard-service/lib - (cd ./dbrepo-dashboard-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev) + PIPENV_PIPFILE=./dbrepo-dashboard-service/Pipfile pipenv lock .PHONY: build-helm build-helm: ## Build the DBRepo and DBRepo MariaDB Galera Helm Charts. - helm dependency update ./helm/seaweedfs helm package ./helm/seaweedfs --destination ./build helm dependency update ./helm/dbrepo helm package ./helm/dbrepo --destination ./build diff --git a/make/dev.mk b/make/dev.mk index d5a8cd513a7760de0fb4d4c5044d36daebf51d53..e580b178b37af91fb32cedf523478c473db4ba62 100644 --- a/make/dev.mk +++ b/make/dev.mk @@ -1,19 +1,18 @@ ##@ Development .PHONY: start-dev -start-dev: build-images build-auth-event-listener ## Start the development deployment. +start-dev: build-java-lib build-auth-event-listener build-images ## Start the development deployment. docker container stop dbrepo-gateway-service || true docker container rm dbrepo-gateway-service || true docker compose up -d - .PHONY: stop-dev stop-dev: ## Stop the development deployment and remove all data. docker compose down .PHONY: package-config package-config: ## Package the config files - mkdir -p ./.docker/config/{dashboards,provisioning} + mkdir -p ./.docker/config cp ./dbrepo-auth-service/dbrepo-realm.json ./.docker/config cp ./dbrepo-auth-service/import-realms.sh ./.docker/config cp ./dbrepo-auth-service/master-realm.json ./.docker/config @@ -25,6 +24,12 @@ package-config: ## Package the config files cp ./dbrepo-broker-service/definitions.json ./.docker/config cp ./dbrepo-broker-service/advanced.config ./.docker/config cp ./dbrepo-gateway-service/dbrepo.conf ./.docker/config + cp -r ./dbrepo-dashboard-ui/dashboards ./.docker/config + cp -r ./dbrepo-dashboard-ui/provisioning ./.docker/config + cp ./dbrepo-dashboard-ui/grafana.ini ./.docker/config/grafana.ini + cp ./dbrepo-dashboard-ui/ldap.toml ./.docker/config/ldap.toml + cp ./dbrepo-logging-service/fluentbit.conf ./.docker/config + cp ./dbrepo-logging-service/fluentbit_parser.conf ./.docker/config cp ./dbrepo-metric-db/prometheus.yml ./.docker/config cp ./dbrepo-storage-service/s3_config.json ./.docker/config cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./.docker/config diff --git a/make/rel.mk b/make/rel.mk index ee9326b7989612dda72d86f3eacb9b68db4f6ae4..dfc114233e486ea85bdd756f9cd45a722fca74e3 100644 --- a/make/rel.mk +++ b/make/rel.mk @@ -6,7 +6,6 @@ tag-images: build-images ## Tag the docker images. docker tag dbrepo-auth-service-init:latest "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-dashboard-service:latest "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-dashboard-service-init:latest "${REPOSITORY_URL}/dashboard-service-init:${APP_VERSION}${BUILD_VERSION}" - docker tag dbrepo-dashboard-ui:latest "${REPOSITORY_URL}/dashboard-ui:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-data-service:latest "${REPOSITORY_URL}/data-service:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-metadata-service:latest "${REPOSITORY_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-search-service:latest "${REPOSITORY_URL}/search-service:${APP_VERSION}${BUILD_VERSION}" @@ -20,7 +19,6 @@ release-images: tag-images ## Release the docker images. docker push "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/dashboard-service-init:${APP_VERSION}${BUILD_VERSION}" - docker push "${REPOSITORY_URL}/dashboard-ui:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/data-service:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}${BUILD_VERSION}" diff --git a/mkdocs.yml b/mkdocs.yml index 7060289640e3f0034d0e20405526d9b512aa26ed..5051d9a3280ca8508dc30a1da884dcbe0cf09be6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -20,6 +20,7 @@ nav: - Data Versioning: concepts/data-versioning.md - Dashboards: concepts/dashboards.md - Data Visibility: concepts/data-visibility.md + - Logging: concepts/logging.md - Messaging: concepts/messaging.md - Monitoring: concepts/monitoring.md - Persistent Identifier: concepts/pid.md diff --git a/sonar-project.properties b/sonar-project.properties index 52013fb417ef062f4d8e32e0bf77766bae2229f0..e8c334eb9b25fc71d79bba5247648a60aa18196b 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77 sonar.host.url=https://s39.datalab.tuwien.ac.at # project -sonar.projectVersion=1.8.1 +sonar.projectVersion=1.8.2 # general sonar.qualitygate.wait=true sonar.projectCreation.mainBranchName=master