From 5c5e55d96983083bb8d7c1812bc2a7122c1f3291 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Thu, 18 Jan 2024 11:09:00 +0100 Subject: [PATCH] Updates the docs --- .docs/.swagger/api-analyse.yaml | 192 +- .docs/.swagger/api-container.yaml | 2410 ----- .docs/.swagger/api-data.yaml | 2 +- .docs/.swagger/api-database.yaml | 1626 ---- .docs/.swagger/api-identifier.yaml | 1333 --- .docs/.swagger/api-metadata.yaml | 4464 ++++----- .docs/.swagger/api-mirror.yaml | 14 - .docs/.swagger/api-query.yaml | 2520 ----- .docs/{ => .swagger}/api-search.yaml | 2 +- .docs/.swagger/api-semantics.yaml | 685 -- .docs/{ => .swagger}/api-sidecar.yaml | 2 +- .docs/.swagger/api-table.yaml | 860 -- .docs/.swagger/api-upload.yaml | 16 +- .docs/.swagger/api-user.yaml | 1521 --- .docs/.swagger/fetch.sh | 24 - .docs/.swagger/generate.sh | 20 - .../swagger-generate.sh} | 13 +- .docs/.swagger/swagger-site.sh | 27 + .docs/.swagger/swagger-version.sh | 17 + .docs/api-analyse.yaml | 105 - .docs/api-data.yaml | 26 - .docs/api-metadata.yaml | 8115 ----------------- .docs/api-upload.yaml | 30 - .docs/docker/release.py | 10 + .docs/docker/setup.py | 2 +- .docs/images/architecture-data-db.svg | 2 +- .docs/images/architecture-ui.png | Bin 34705 -> 0 bytes .docs/images/architecture-ui.svg | 3 + .docs/images/architecture.drawio | 114 +- .docs/images/data-ingest.svg | 2 +- .docs/images/identifier-doi.png | Bin 95778 -> 0 bytes .docs/system-databases-auth.md | 2 +- .docs/system-databases-data.md | 11 +- .docs/system-databases-metadata.md | 2 +- .docs/system-databases-search.md | 4 +- .docs/system-other-search-dashboard.md | 2 +- .docs/system-other-ui.md | 8 +- .docs/system-services-analyse.md | 4 +- .docs/system-services-authentication.md | 4 +- .docs/system-services-broker.md | 2 +- .docs/system-services-data.md | 2 +- .docs/system-services-metadata.md | 14 +- .docs/system-services-search.md | 36 + .docs/system-services-upload.md | 3 +- .docs/usage-identifier.md | 19 - .docs/usage-metadata.md | 7 + .docs/usage-search.md | 7 + .gitlab-ci.yml | 12 +- dbrepo-search-service/Dockerfile | 2 + mkdocs.yml | 10 +- 50 files changed, 2708 insertions(+), 21600 deletions(-) delete mode 100644 .docs/.swagger/api-container.yaml delete mode 100644 .docs/.swagger/api-database.yaml delete mode 100644 .docs/.swagger/api-identifier.yaml delete mode 100644 .docs/.swagger/api-mirror.yaml delete mode 100644 .docs/.swagger/api-query.yaml rename .docs/{ => .swagger}/api-search.yaml (96%) delete mode 100644 .docs/.swagger/api-semantics.yaml rename .docs/{ => .swagger}/api-sidecar.yaml (99%) delete mode 100644 .docs/.swagger/api-table.yaml delete mode 100644 .docs/.swagger/api-user.yaml delete mode 100644 .docs/.swagger/fetch.sh delete mode 100644 .docs/.swagger/generate.sh rename .docs/{generate_swagger.sh => .swagger/swagger-generate.sh} (72%) create mode 100644 .docs/.swagger/swagger-site.sh create mode 100644 .docs/.swagger/swagger-version.sh delete mode 100644 .docs/api-analyse.yaml delete mode 100644 .docs/api-data.yaml delete mode 100644 .docs/api-metadata.yaml delete mode 100644 .docs/api-upload.yaml delete mode 100644 .docs/images/architecture-ui.png create mode 100644 .docs/images/architecture-ui.svg delete mode 100644 .docs/images/identifier-doi.png create mode 100644 .docs/system-services-search.md delete mode 100644 .docs/usage-identifier.md create mode 100644 .docs/usage-metadata.md create mode 100644 .docs/usage-search.md diff --git a/.docs/.swagger/api-analyse.yaml b/.docs/.swagger/api-analyse.yaml index 1aa3c5d60f..5349ba84e1 100644 --- a/.docs/.swagger/api-analyse.yaml +++ b/.docs/.swagger/api-analyse.yaml @@ -1 +1,191 @@ -{"definitions":{},"externalDocs":{"description":"Sourcecode Documentation","url":"https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services"},"info":{"contact":{"email":"andreas.rauber@tuwien.ac.at","name":"Prof. Andreas Rauber"},"description":"Service that analyses data structures","license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"},"title":"Database Repository Analyse Service API","version":"1.3.0"},"openapi":"3.0.0","paths":{"/api/analyse/determinedt":{"post":{"consumes":["application/json"],"description":"This is a simple API which returns the datatypes of a (path) csv file","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"enum":{"example":true,"type":"boolean"},"enum_tol":{"example":0.1},"filepath":{"example":"/data/testdt08.csv","type":"string"},"separator":{"example":",","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"},"405":{"description":"Invalid input"}},"summary":"Determine datatypes"}},"/api/analyse/determinepk":{"post":{"consumes":["application/json"],"description":"This is a simple API which returns the primary keys + ranking of a (path) csv file","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"filepath":{"example":"/data/testdt08.csv","type":"string"},"seperator":{"example":",","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"},"405":{"description":"Invalid input"}},"summary":"Determine primary keys"}},"/health":{"get":{"consumes":["application/json"],"description":"This is a simple API which checks if the application is healthy","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"status":{"example":"UP","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"}},"summary":"Check if application is running"}}},"servers":[{"description":"Generated server url","url":"http://localhost:5000"},{"description":"Sandbox","url":"https://dbrepo2.tuwien.ac.at"}]} +components: + schemas: {} +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +info: + contact: + email: andreas.rauber@tuwien.ac.at + name: Prof. Andreas Rauber + description: Service that analyses data structures + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + title: Database Repository Analyse Service API + version: dbrepo-latest +openapi: 3.0.0 +paths: + /api/analyse/determinedt: + post: + consumes: + - application/json + description: This is a simple API which returns the datatypes of a (path) csv + file + parameters: + - description: to-do description + in: body + name: body + required: true + schema: + properties: + enum: + example: true + type: boolean + enum_tol: + example: 0.1 + filename: + example: sample.csv + type: string + separator: + example: ',' + type: string + type: object + produces: + - application/json + responses: + '200': + description: OK + '405': + description: Invalid input + summary: Determine datatypes + tags: + - analyse-endpoint + /api/analyse/determinepk: + post: + consumes: + - application/json + description: This is a simple API which returns the primary keys + ranking of + a (path) csv file + parameters: + - description: to-do description + in: body + name: body + required: true + schema: + properties: + filepath: + example: /data/testdt08.csv + type: string + seperator: + example: ',' + type: string + type: object + produces: + - application/json + responses: + '200': + description: OK + '405': + description: Invalid input + summary: Determine primary keys + tags: + - analyse-endpoint + /api/analyse/determinestat: + post: + operationId: determinestat + requestBody: + content: + application/json: + schema: + properties: + database_id: + example: 1 + type: integer + table_id: + example: 1 + type: integer + required: + - database_id + - table_id + type: object + responses: + '200': + content: + application/json: + schema: + properties: + message: + example: Analysed statistical properties + type: string + status: + example: '200' + type: integer + required: + - message + - status + type: object + description: Determined statistics + '400': + description: Invalid input + ontent: + application/json: + schema: + properties: + message: + example: Analysed statistical properties + type: string + status: + example: '200' + type: integer + required: + - message + - status + type: object + summary: Determine statistics + tags: + - analyse-endpoint + /api/analyse/determinestats: + post: + operationId: determinestats + requestBody: + content: + application/json: + schema: + properties: + filepath: + example: file.csv + type: string + separator: + example: ',' + type: string + required: + - filepath + - separator + type: object + responses: + '200': + description: Determined statistics + '400': + description: Invalid input + summary: Determine statistics + tags: + - analyse-endpoint + /health: + get: + consumes: + - application/json + description: This is a simple API which checks if the application is healthy + parameters: + - description: to-do description + in: body + name: body + required: true + schema: + properties: + status: + example: UP + type: string + type: object + produces: + - application/json + responses: + '200': + description: OK + summary: Check if application is running + tags: + - health-endpoint +servers: + - description: Generated server url + url: http://localhost:5000 + - description: Sandbox + url: https://test.dbrepo.tuwien.ac.at diff --git a/.docs/.swagger/api-container.yaml b/.docs/.swagger/api-container.yaml deleted file mode 100644 index 2102e2f63c..0000000000 --- a/.docs/.swagger/api-container.yaml +++ /dev/null @@ -1,2410 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository Container Service API - description: Service that manages the containers - 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.2.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9092 - description: Generated server url -- url: https://dbrepo2.tuwien.ac.at - description: Sandbox -paths: - /api/image/{id}: - get: - tags: - - image-endpoint - summary: Find some image - operationId: findById - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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 some image - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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: [] - delete: - tags: - - image-endpoint - summary: Delete some image - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "202": - description: Deleted image successfully - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}: - get: - tags: - - container-endpoint - summary: Find some container - operationId: findById_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "502": - description: Docker client failed to connect - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - put: - tags: - - container-endpoint - summary: Modify some container - operationId: modify - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerChangeDto' - required: true - responses: - "409": - description: Container is already started/stopped - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Container or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Modification of container state is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Modified state of container successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerBriefDto' - security: - - bearerAuth: [] - delete: - tags: - - container-endpoint - summary: Delete some container - operationId: delete_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "410": - description: Container is already removed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Container is still running - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted container successfully - security: - - bearerAuth: [] - /api/image: - get: - tags: - - image-endpoint - summary: Find all images - operationId: findAll - responses: - "200": - description: List images - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ContainerImage' - post: - tags: - - image-endpoint - summary: Create image - operationId: create - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ImageCreateDto' - required: true - responses: - "201": - description: Created image - content: - application/json: - schema: - $ref: '#/components/schemas/ImageDto' - "404": - description: User could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Image specification is invalid - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Docker client failed to connect - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Image already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container: - get: - tags: - - container-endpoint - summary: Find all containers - operationId: findAll_1 - 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 - operationId: create_1 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerCreateRequestDto' - required: true - responses: - "201": - description: Created a new container - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerBriefDto' - "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' - "502": - description: Docker client failed to connect - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] -components: - schemas: - ImageChangeDto: - required: - - dialect - - driver_class - - jdbc_method - - registry - type: object - properties: - registry: - type: string - example: docker.io/library - defaultPort: - maximum: 65535 - minimum: 1024 - type: integer - format: int32 - example: 5432 - environment: - type: array - items: - $ref: '#/components/schemas/ImageEnvItemDto' - dialect: - type: string - example: Postgres - driver_class: - type: string - example: org.postgresql.Driver - jdbc_method: - type: string - example: postgresql - ImageEnvItemDto: - required: - - iid - - key - - type - type: object - properties: - iid: - type: integer - format: int64 - key: - type: string - example: MARIADB_ROOT_PASSWORD - type: - type: string - example: PRIVILEGED_PASSWORD - enum: - - username - - password - - privileged_username - - privileged_password - ImageDateDto: - required: - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - dialect: - type: string - example: org.hibernate.dialect.MariaDBDialect - hash: - type: string - example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e - compiled: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - size: - type: integer - example: 314295447 - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - ContainerChangeDto: - required: - - action - type: object - properties: - action: - type: string - enum: - - start - - stop - ContainerBriefDto: - required: - - creator - - hash - - id - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - creator: - $ref: '#/components/schemas/UserBriefDto' - running: - type: boolean - example: true - database: - $ref: '#/components/schemas/DatabaseBriefDto' - created: - type: string - format: date-time - internal_name: - type: string - example: air-quality - CreatorBriefDto: - required: - - firstname - - lastname - type: object - properties: - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - DatabaseBriefDto: - required: - - id - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - identifier: - $ref: '#/components/schemas/IdentifierBriefDto' - engine: - type: string - example: mariadb:10.5 - owner: - $ref: '#/components/schemas/UserBriefDto' - container: - $ref: '#/components/schemas/ContainerBriefDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - is_public: - type: boolean - example: true - IdentifierBriefDto: - required: - - container id - - creators - - database id - - id - - publication_year - - title - - type - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - type: - type: string - enum: - - database - - subset - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - creators: - type: array - items: - $ref: '#/components/schemas/CreatorBriefDto' - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - UserBriefDto: - required: - - id - - username - 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 - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ImageCreateDto: - required: - - default_port - - dialect - - driver_class - - jdbc_method - - registry - - repository - - tag - type: object - properties: - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - dialect: - type: string - environment: - type: array - items: - $ref: '#/components/schemas/ImageEnvItemDto' - driver_class: - type: string - jdbc_method: - type: string - default_port: - maximum: 65535 - minimum: 1024 - type: integer - format: int32 - ContainerCreateRequestDto: - required: - - name - - repository - - tag - type: object - properties: - name: - type: string - example: Air Quality - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - Constraints: - type: object - properties: - uniques: - type: array - items: - $ref: '#/components/schemas/Unique' - foreignKeys: - type: array - items: - $ref: '#/components/schemas/ForeignKey' - checks: - uniqueItems: true - type: array - items: - type: string - Container: - type: object - properties: - id: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - ownedBy: - type: string - format: uuid - owner: - $ref: '#/components/schemas/User' - name: - type: string - internalName: - type: string - hash: - type: string - imageId: - type: integer - format: int64 - port: - type: integer - format: int32 - database: - $ref: '#/components/schemas/Database' - image: - $ref: '#/components/schemas/ContainerImage' - ipAddress: - type: string - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ContainerImage: - type: object - properties: - id: - type: integer - format: int64 - repository: - type: string - registry: - type: string - tag: - type: string - driverClass: - type: string - dialect: - type: string - jdbcMethod: - type: string - hash: - type: string - compiled: - type: string - format: date-time - size: - type: integer - format: int64 - defaultPort: - type: integer - format: int32 - environment: - type: array - items: - $ref: '#/components/schemas/ContainerImageEnvironmentItem' - dateFormats: - type: array - items: - $ref: '#/components/schemas/ContainerImageDate' - containers: - type: array - items: - $ref: '#/components/schemas/Container' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ContainerImageDate: - type: object - properties: - id: - type: integer - format: int64 - iid: - type: integer - format: int64 - image: - $ref: '#/components/schemas/ContainerImage' - example: - type: string - hasTime: - type: boolean - databaseFormat: - type: string - unixFormat: - type: string - createdAt: - type: string - format: date-time - ContainerImageEnvironmentItem: - type: object - properties: - id: - type: integer - format: int64 - iid: - type: integer - format: int64 - key: - type: string - value: - type: string - type: - type: string - enum: - - USERNAME - - PASSWORD - - PRIVILEGED_USERNAME - - PRIVILEGED_PASSWORD - image: - $ref: '#/components/schemas/ContainerImage' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - Creator: - type: object - properties: - id: - type: integer - format: int64 - pid: - type: integer - format: int64 - firstname: - type: string - lastname: - type: string - affiliation: - type: string - orcid: - type: string - identifier: - $ref: '#/components/schemas/Identifier' - created: - type: string - format: date-time - creator: - $ref: '#/components/schemas/User' - lastModified: - type: string - format: date-time - Credential: - type: object - properties: - id: - type: string - format: uuid - type: - type: string - userId: - type: string - format: uuid - createdDate: - type: integer - format: int64 - secretData: - type: string - credentialData: - type: string - priority: - type: integer - format: int32 - user: - $ref: '#/components/schemas/User' - Database: - type: object - properties: - id: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - ownedBy: - type: string - format: uuid - owner: - $ref: '#/components/schemas/User' - container: - $ref: '#/components/schemas/Container' - name: - type: string - internalName: - type: string - exchangeName: - type: string - description: - type: string - contactPerson: - type: string - format: uuid - contact: - $ref: '#/components/schemas/User' - identifier: - $ref: '#/components/schemas/Identifier' - tables: - type: array - items: - $ref: '#/components/schemas/Table' - views: - type: array - items: - $ref: '#/components/schemas/View' - isPublic: - type: boolean - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ForeignKey: - type: object - properties: - fkid: - type: integer - format: int64 - tid: - type: integer - format: int64 - tdbid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/Table' - rtid: - type: integer - format: int64 - rtdbid: - type: integer - format: int64 - referencedTable: - $ref: '#/components/schemas/Table' - references: - type: array - items: - $ref: '#/components/schemas/ForeignKeyReference' - onUpdate: - type: string - enum: - - ReferenceType.RESTRICT - - ReferenceType.CASCADE - - ReferenceType.SET_NULL - - ReferenceType.NO_ACTION - - ReferenceType.SET_DEFAULT - onDelete: - type: string - enum: - - ReferenceType.RESTRICT - - ReferenceType.CASCADE - - ReferenceType.SET_NULL - - ReferenceType.NO_ACTION - - ReferenceType.SET_DEFAULT - ForeignKeyReference: - type: object - properties: - id: - type: integer - format: int64 - foreignKey: - $ref: '#/components/schemas/ForeignKey' - column: - $ref: '#/components/schemas/TableColumn' - referencedColumn: - $ref: '#/components/schemas/TableColumn' - Identifier: - required: - - publisher - type: object - properties: - id: - type: integer - format: int64 - containerId: - type: integer - format: int64 - databaseId: - type: integer - format: int64 - queryId: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/User' - title: - type: string - description: - type: string - publisher: - type: string - language: - type: string - enum: - - LanguageType.AB - - LanguageType.AA - - LanguageType.AF - - LanguageType.AK - - LanguageType.SQ - - LanguageType.AM - - LanguageType.AR - - LanguageType.AN - - LanguageType.HY - - LanguageType.AS - - LanguageType.AV - - LanguageType.AE - - LanguageType.AY - - LanguageType.AZ - - LanguageType.BM - - LanguageType.BA - - LanguageType.EU - - LanguageType.BE - - LanguageType.BN - - LanguageType.BH - - LanguageType.BI - - LanguageType.BS - - LanguageType.BR - - LanguageType.BG - - LanguageType.MY - - LanguageType.CA - - LanguageType.KM - - LanguageType.CH - - LanguageType.CE - - LanguageType.NY - - LanguageType.ZH - - LanguageType.CU - - LanguageType.CV - - LanguageType.KW - - LanguageType.CO - - LanguageType.CR - - LanguageType.HR - - LanguageType.CS - - LanguageType.DA - - LanguageType.DV - - LanguageType.NL - - LanguageType.DZ - - LanguageType.EN - - LanguageType.EO - - LanguageType.ET - - LanguageType.EE - - LanguageType.FO - - LanguageType.FJ - - LanguageType.FI - - LanguageType.FR - - LanguageType.FF - - LanguageType.GD - - LanguageType.GL - - LanguageType.LG - - LanguageType.KA - - LanguageType.DE - - LanguageType.KI - - LanguageType.EL - - LanguageType.KL - - LanguageType.GN - - LanguageType.GU - - LanguageType.HT - - LanguageType.HA - - LanguageType.HE - - LanguageType.HZ - - LanguageType.HI - - LanguageType.HO - - LanguageType.HU - - LanguageType.IS - - LanguageType.IO - - LanguageType.IG - - LanguageType.ID - - LanguageType.IA - - LanguageType.IE - - LanguageType.IU - - LanguageType.IK - - LanguageType.GA - - LanguageType.IT - - LanguageType.JA - - LanguageType.JV - - LanguageType.KN - - LanguageType.KR - - LanguageType.KS - - LanguageType.KK - - LanguageType.RW - - LanguageType.KV - - LanguageType.KG - - LanguageType.KO - - LanguageType.KJ - - LanguageType.KU - - LanguageType.KY - - LanguageType.LO - - LanguageType.LA - - LanguageType.LV - - LanguageType.LB - - LanguageType.LI - - LanguageType.LN - - LanguageType.LT - - LanguageType.LU - - LanguageType.MK - - LanguageType.MG - - LanguageType.MS - - LanguageType.ML - - LanguageType.MT - - LanguageType.GV - - LanguageType.MI - - LanguageType.MR - - LanguageType.MH - - LanguageType.RO - - LanguageType.MN - - LanguageType.NA - - LanguageType.NV - - LanguageType.ND - - LanguageType.NG - - LanguageType.NE - - LanguageType.SE - - LanguageType.NO - - LanguageType.NB - - LanguageType.NN - - LanguageType.II - - LanguageType.OC - - LanguageType.OJ - - LanguageType.OR - - LanguageType.OM - - LanguageType.OS - - LanguageType.PI - - LanguageType.PA - - LanguageType.PS - - LanguageType.FA - - LanguageType.PL - - LanguageType.PT - - LanguageType.QU - - LanguageType.RM - - LanguageType.RN - - LanguageType.RU - - LanguageType.SM - - LanguageType.SG - - LanguageType.SA - - LanguageType.SC - - LanguageType.SR - - LanguageType.SN - - LanguageType.SD - - LanguageType.SI - - LanguageType.SK - - LanguageType.SL - - LanguageType.SO - - LanguageType.ST - - LanguageType.NR - - LanguageType.ES - - LanguageType.SU - - LanguageType.SW - - LanguageType.SS - - LanguageType.SV - - LanguageType.TL - - LanguageType.TY - - LanguageType.TG - - LanguageType.TA - - LanguageType.TT - - LanguageType.TE - - LanguageType.TH - - LanguageType.BO - - LanguageType.TI - - LanguageType.TO - - LanguageType.TS - - LanguageType.TN - - LanguageType.TR - - LanguageType.TK - - LanguageType.TW - - LanguageType.UG - - LanguageType.UK - - LanguageType.UR - - LanguageType.UZ - - LanguageType.VE - - LanguageType.VI - - LanguageType.VO - - LanguageType.WA - - LanguageType.CY - - LanguageType.FY - - LanguageType.WO - - LanguageType.XH - - LanguageType.YI - - LanguageType.YO - - LanguageType.ZA - - LanguageType.ZU - license: - $ref: '#/components/schemas/License' - type: - type: string - enum: - - DATABASE - - SUBSET - query: - type: string - queryNormalized: - type: string - queryHash: - type: string - resultHash: - type: string - execution: - type: string - format: date-time - resultNumber: - type: integer - format: int64 - publicationYear: - type: integer - format: int32 - publicationMonth: - type: integer - format: int32 - publicationDay: - type: integer - format: int32 - visibility: - type: string - enum: - - VisibilityType.EVERYONE - - VisibilityType.SELF - database: - $ref: '#/components/schemas/Database' - related: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifier' - doi: - type: string - creators: - type: array - items: - $ref: '#/components/schemas/Creator' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - License: - type: object - properties: - identifier: - type: string - uri: - type: string - RelatedIdentifier: - type: object - properties: - id: - type: integer - format: int64 - iid: - type: integer - format: int64 - value: - type: string - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - 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 - creator: - $ref: '#/components/schemas/User' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - Role: - type: object - properties: - id: - type: string - format: uuid - name: - type: string - realmId: - type: string - format: uuid - users: - type: array - items: - $ref: '#/components/schemas/User' - Table: - type: object - properties: - id: - type: integer - format: int64 - tdbid: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/User' - owner: - $ref: '#/components/schemas/User' - name: - type: string - internalName: - type: string - queueName: - type: string - routingKey: - type: string - description: - type: string - database: - $ref: '#/components/schemas/Database' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - constraints: - $ref: '#/components/schemas/Constraints' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - TableColumn: - type: object - properties: - id: - type: integer - format: int64 - tid: - type: integer - format: int64 - cdbid: - type: integer - format: int64 - dfid: - type: integer - format: int64 - dateFormat: - $ref: '#/components/schemas/ContainerImageDate' - table: - $ref: '#/components/schemas/Table' - view: - $ref: '#/components/schemas/View' - creator: - $ref: '#/components/schemas/User' - name: - type: string - autoGenerated: - type: boolean - internalName: - type: string - isPrimaryKey: - type: boolean - indexLength: - type: integer - format: int32 - alias: - type: string - columnType: - type: string - enum: - - TableColumnType.ENUM - - TableColumnType.NUMBER - - TableColumnType.DECIMAL - - TableColumnType.STRING - - TableColumnType.TEXT - - TableColumnType.BOOLEAN - - TableColumnType.DATE - - TableColumnType.TIMESTAMP - - TableColumnType.BLOB - length: - type: integer - format: int32 - isNullAllowed: - type: boolean - enumValues: - type: array - items: - type: string - ordinalPosition: - type: integer - format: int32 - created: - type: string - format: date-time - concept: - $ref: '#/components/schemas/TableColumnConcept' - unit: - $ref: '#/components/schemas/TableColumnUnit' - lastModified: - type: string - format: date-time - TableColumnConcept: - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - TableColumnUnit: - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - Unique: - type: object - properties: - uid: - type: integer - format: int64 - tid: - type: integer - format: int64 - tdbid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/Table' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - User: - type: object - properties: - id: - type: string - format: uuid - username: - type: string - firstname: - type: string - lastname: - type: string - realmId: - type: string - format: uuid - email: - type: string - emailVerified: - type: boolean - enabled: - type: boolean - createdTimestamp: - type: integer - format: int64 - databasePassword: - type: string - attributes: - type: array - items: - $ref: '#/components/schemas/UserAttribute' - credentials: - type: array - items: - $ref: '#/components/schemas/Credential' - containers: - type: array - items: - $ref: '#/components/schemas/Container' - databases: - type: array - items: - $ref: '#/components/schemas/Database' - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - roles: - type: array - items: - $ref: '#/components/schemas/Role' - tables: - type: array - items: - $ref: '#/components/schemas/Table' - UserAttribute: - type: object - properties: - id: - type: string - format: uuid - userId: - type: string - format: uuid - name: - type: string - value: - type: string - user: - $ref: '#/components/schemas/User' - View: - type: object - properties: - id: - type: integer - format: int64 - vcid: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - database: - $ref: '#/components/schemas/Database' - name: - type: string - internalName: - type: string - isPublic: - type: boolean - isInitialView: - type: boolean - query: - type: string - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - ContainerDto: - required: - - created - - hash - - id - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - state: - type: string - example: running - enum: - - created - - restarting - - running - - paused - - exited - - dead - database: - $ref: '#/components/schemas/DatabaseDto' - running: - type: boolean - example: true - image: - $ref: '#/components/schemas/ImageBriefDto' - port: - type: integer - format: int32 - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - internal_name: - type: string - example: air-quality - ip_address: - type: string - CreatorDto: - required: - - firstname - - id - - lastname - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - orcid: - type: string - example: 0000-0002-1825-0097 - DatabaseAccessDto: - required: - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - DatabaseDto: - required: - - creator - - exchange_name - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - description: - type: string - example: Weather Australia 2009-2021 - tables: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - image: - $ref: '#/components/schemas/ImageDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - exchange_name: - type: string - example: dbrepo/air_quality - internal_name: - type: string - example: weather_australia - is_public: - type: boolean - example: true - IdentifierDto: - required: - - container id - - creators - - database id - - execution - - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - - title - - type - - visibility - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - visibility: - type: string - example: everyone - enum: - - everyone - - self - doi: - type: string - example: 10.1038/nphys1170 - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorDto' - created: - type: string - format: date-time - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifierDto' - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - 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 - last_modified: - type: string - format: date-time - ImageBriefDto: - required: - - id - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - LicenseDto: - required: - - identifier - - uri - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - last_modified: - type: string - format: date-time - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - UserAttributeDto: - type: object - properties: - name: - type: string - example: theme_dark - value: - type: string - example: "true" - UserDto: - required: - - email - - email_verified - - id - - username - 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 - attributes: - type: array - items: - $ref: '#/components/schemas/UserAttributeDto' - containers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - databases: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - email: - type: string - example: jcarberry@brown.edu - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ViewBriefDto: - required: - - created - - creator - - id - - internal_name - - name - - query - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - creator: - $ref: '#/components/schemas/UserDto' - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - last_modified: - type: string - format: date-time - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/api-data.yaml b/.docs/.swagger/api-data.yaml index 4d40f4a702..4b5a54fbbf 100644 --- a/.docs/.swagger/api-data.yaml +++ b/.docs/.swagger/api-data.yaml @@ -8,7 +8,7 @@ info: license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.3.0 + version: dbrepo-latest externalDocs: description: Sourcecode Documentation url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services diff --git a/.docs/.swagger/api-database.yaml b/.docs/.swagger/api-database.yaml deleted file mode 100644 index 40b76995cc..0000000000 --- a/.docs/.swagger/api-database.yaml +++ /dev/null @@ -1,1626 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository Database Service API - description: Service that manages the databases - 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.2.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9092 - description: Generated server url -- url: https://dbrepo2.tuwien.ac.at - description: Sandbox -paths: - /api/container/{id}/database/{databaseId}/visibility: - put: - tags: - - database-endpoint - summary: Update database - operationId: visibility - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseModifyVisibilityDto' - required: true - responses: - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Visibility modified successfully - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "405": - description: Visibility modification is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/transfer: - put: - tags: - - database-endpoint - summary: Transfer database - operationId: transfer - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - 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/DatabaseDto' - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Transfer of ownership is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/access/{username}: - put: - tags: - - access-endpoint - summary: Modify access to some database - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: username - in: path - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseModifyAccessDto' - required: true - responses: - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modify access succeeded - "403": - description: Modify access not permitted when no access is granted in the - first place - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - delete: - tags: - - access-endpoint - summary: Revoke access to some database - operationId: revoke - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: username - in: path - required: true - schema: - type: string - responses: - "404": - description: User with access was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Revoke of access not permitted - 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' - "202": - description: Revoked access successfully - security: - - bearerAuth: [] - /api/container/{id}/database: - get: - tags: - - database-endpoint - summary: List databases - operationId: list - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: List of databases - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/DatabaseBriefDto' - post: - tags: - - database-endpoint - summary: Create database - operationId: create - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseCreateDto' - required: true - responses: - "201": - description: Created a new database - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseBriefDto' - "404": - description: "Container, user or database could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "406": - description: Failed to create user at broker service or virtual host could - not be reached at broker service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Database create permission is missing or grant permissions - at broker service failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Container image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Connection to the container failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Database create query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Database name already exist or query store could not be created - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/access: - get: - tags: - - access-endpoint - summary: Check access to some database - operationId: find - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "403": - description: No access to this database - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found database access - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseAccessDto' - "405": - description: Check access is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - post: - tags: - - access-endpoint - summary: Give access to some database - operationId: create_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseGiveAccessDto' - required: true - responses: - "202": - description: Granting access succeeded - "405": - description: Granting access not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Granting access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}: - get: - tags: - - database-endpoint - summary: Find some database - operationId: findById - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Database information is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Database or container could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Database found successfully - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - bearerAuth: [] - delete: - tags: - - database-endpoint - summary: Delete some database - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "400": - description: Database delete query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Container or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Database delete permission is missing or revoke permissions - at broker service failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Container image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "406": - description: Failed to delete user at broker service or virtual host could - not be reached at broker service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Connection to the container failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Deleted a database - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseBriefDto' - security: - - bearerAuth: [] - /api/container/{id}/database/license: - get: - tags: - - license-endpoint - summary: Get all licenses - operationId: list_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: List of licenses - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/LicenseDto' -components: - schemas: - DatabaseModifyVisibilityDto: - required: - - is_public - type: object - properties: - is_public: - type: boolean - example: true - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - ContainerDto: - required: - - created - - hash - - id - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - state: - type: string - example: running - enum: - - created - - restarting - - running - - paused - - exited - - dead - database: - $ref: '#/components/schemas/DatabaseDto' - running: - type: boolean - example: true - image: - $ref: '#/components/schemas/ImageBriefDto' - port: - type: integer - format: int32 - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - internal_name: - type: string - example: air-quality - ip_address: - type: string - CreatorDto: - required: - - firstname - - id - - lastname - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - orcid: - type: string - example: 0000-0002-1825-0097 - DatabaseAccessDto: - required: - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - DatabaseDto: - required: - - creator - - exchange_name - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - description: - type: string - example: Weather Australia 2009-2021 - tables: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - image: - $ref: '#/components/schemas/ImageDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - exchange_name: - type: string - example: dbrepo/air_quality - internal_name: - type: string - example: weather_australia - is_public: - type: boolean - example: true - IdentifierDto: - required: - - container id - - creators - - database id - - execution - - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - - title - - type - - visibility - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - visibility: - type: string - example: everyone - enum: - - everyone - - self - doi: - type: string - example: 10.1038/nphys1170 - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorDto' - created: - type: string - format: date-time - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifierDto' - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - 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 - last_modified: - type: string - format: date-time - ImageBriefDto: - required: - - id - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - ImageDateDto: - required: - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - dialect: - type: string - example: org.hibernate.dialect.MariaDBDialect - hash: - type: string - example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e - compiled: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - size: - type: integer - example: 314295447 - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - LicenseDto: - required: - - identifier - - uri - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - last_modified: - type: string - format: date-time - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - UserAttributeDto: - type: object - properties: - name: - type: string - example: theme_dark - value: - type: string - example: "true" - UserBriefDto: - required: - - id - - username - 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 - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - UserDto: - required: - - email - - email_verified - - id - - username - 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 - attributes: - type: array - items: - $ref: '#/components/schemas/UserAttributeDto' - containers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - databases: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - email: - type: string - example: jcarberry@brown.edu - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ViewBriefDto: - required: - - created - - creator - - id - - internal_name - - name - - query - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - creator: - $ref: '#/components/schemas/UserDto' - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - last_modified: - type: string - format: date-time - DatabaseTransferDto: - required: - - username - type: object - properties: - username: - type: string - DatabaseModifyAccessDto: - required: - - type - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - DatabaseCreateDto: - required: - - is_public - - name - type: object - properties: - name: - type: string - example: Air Quality - is_public: - type: boolean - example: true - ContainerBriefDto: - required: - - creator - - hash - - id - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - creator: - $ref: '#/components/schemas/UserBriefDto' - running: - type: boolean - example: true - database: - $ref: '#/components/schemas/DatabaseBriefDto' - created: - type: string - format: date-time - internal_name: - type: string - example: air-quality - CreatorBriefDto: - required: - - firstname - - lastname - type: object - properties: - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - DatabaseBriefDto: - required: - - id - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - identifier: - $ref: '#/components/schemas/IdentifierBriefDto' - engine: - type: string - example: mariadb:10.5 - owner: - $ref: '#/components/schemas/UserBriefDto' - container: - $ref: '#/components/schemas/ContainerBriefDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - is_public: - type: boolean - example: true - IdentifierBriefDto: - required: - - container id - - creators - - database id - - id - - publication_year - - title - - type - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - type: - type: string - enum: - - database - - subset - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - creators: - type: array - items: - $ref: '#/components/schemas/CreatorBriefDto' - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - DatabaseGiveAccessDto: - required: - - type - - username - type: object - properties: - username: - type: string - type: - type: string - enum: - - read - - write_own - - write_all - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/api-identifier.yaml b/.docs/.swagger/api-identifier.yaml deleted file mode 100644 index 002b392bb6..0000000000 --- a/.docs/.swagger/api-identifier.yaml +++ /dev/null @@ -1,1333 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository Identifier Service API - description: Service that manages the identifiers - 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.2.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9096 - description: Generated server url -- url: https://dbrepo2.tuwien.ac.at - description: Sandbox -paths: - /api/pid/{id}: - put: - tags: - - persistence-endpoint - summary: Update some identifier - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierUpdateDto' - required: true - responses: - "405": - description: Updating identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Updated identifier - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - "404": - description: Identifier or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Identifier data is not valid to the form - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "406": - description: Updating identifier not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - delete: - tags: - - persistence-endpoint - summary: Delete some identifier - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Identifier could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Deleting identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted identifier - security: - - bearerAuth: [] - /api/identifier: - get: - tags: - - identifier-endpoint - summary: Find identifiers - operationId: list - parameters: - - name: dbid - in: query - required: false - schema: - type: integer - format: int64 - - name: qid - in: query - required: false - schema: - type: integer - format: int64 - - name: type - in: query - required: false - schema: - type: string - enum: - - database - - subset - responses: - "200": - description: List identifiers - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - post: - tags: - - identifier-endpoint - summary: Create identifier - operationId: create - parameters: - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierCreateDto' - required: true - responses: - "406": - description: Creating identifier not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Query information could not be retrieved - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created identifier - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Creating identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Identifier for this resource already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/pid/{pid}: - get: - tags: - - persistence-endpoint - summary: Find some identifier - operationId: find - parameters: - - name: pid - in: path - required: true - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Found identifier successfully - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - text/csv: {} - text/xml: {} - text/bibliography: {} - text/bibliography; style=apa: {} - text/bibliography; style=ieee: {} - text/bibliography; style=bibtex: {} - "404": - description: Identifier could not be exported from database as the resource - was not found - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - text/bibliography: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Identifier could not exported from database as it is not reachable - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' -components: - schemas: - CreatorDto: - required: - - firstname - - id - - lastname - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - orcid: - type: string - example: 0000-0002-1825-0097 - IdentifierUpdateDto: - required: - - cid - - creators - - dbid - - publication_year - - title - - type - - visibility - type: object - properties: - cid: - type: integer - format: int64 - dbid: - type: integer - format: int64 - qid: - type: integer - format: int64 - doi: - type: string - example: 10.1038/nphys1170 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - visibility: - type: string - example: everyone - enum: - - everyone - - self - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorDto' - 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/RelatedIdentifierCreateDto' - LicenseDto: - required: - - identifier - - uri - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - RelatedIdentifierCreateDto: - required: - - value - type: object - properties: - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - IdentifierDto: - required: - - container id - - creators - - database id - - execution - - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - - title - - type - - visibility - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - visibility: - type: string - example: everyone - enum: - - everyone - - self - doi: - type: string - example: 10.1038/nphys1170 - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorDto' - created: - type: string - format: date-time - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifierDto' - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - 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 - last_modified: - type: string - format: date-time - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - last_modified: - type: string - format: date-time - CreatorCreateDto: - required: - - firstname - - lastname - type: object - properties: - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - orcid: - type: string - example: 0000-0002-1825-0097 - IdentifierCreateDto: - required: - - cid - - creators - - dbid - - publication_year - - title - - type - - visibility - type: object - properties: - cid: - type: integer - format: int64 - dbid: - type: integer - format: int64 - qid: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - visibility: - type: string - example: everyone - enum: - - everyone - - self - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorCreateDto' - 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/RelatedIdentifierCreateDto' - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/api-metadata.yaml b/.docs/.swagger/api-metadata.yaml index b92b07c670..c609f5390d 100644 --- a/.docs/.swagger/api-metadata.yaml +++ b/.docs/.swagger/api-metadata.yaml @@ -8,14 +8,14 @@ info: license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.3.0 + version: dbrepo-latest externalDocs: description: Sourcecode Documentation url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services servers: - url: http://localhost:9099 description: Generated server url -- url: https://dbrepo2.tuwien.ac.at +- url: https://test.dbrepo.tuwien.ac.at description: Sandbox paths: /api/database/{databaseId}/table/{tableId}/history: @@ -38,40 +38,34 @@ paths: type: integer format: int64 responses: - "404": - description: "Table, database or user could not be found" + "200": + description: Find table history successfully content: application/json: schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed + type: array + items: + $ref: '#/components/schemas/TableHistoryDto' + "400": + description: Table history query is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": + "403": description: Find table history is not permitted content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table history query is malformed + "409": + description: Query store failed to query table history content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find table history successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableHistoryDto' - "504": - description: Query store failed to query table history + "404": + description: "Table, database or user could not be found" content: application/json: schema: @@ -97,40 +91,34 @@ paths: type: integer format: int64 responses: - "404": - description: "Table, database or user could not be found" + "200": + description: Find table history successfully content: application/json: schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed + type: array + items: + $ref: '#/components/schemas/TableHistoryDto' + "400": + description: Table history query is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": + "403": description: Find table history is not permitted content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table history query is malformed + "409": + description: Query store failed to query table history content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find table history successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableHistoryDto' - "504": - description: Query store failed to query table history + "404": + description: "Table, database or user could not be found" content: application/json: schema: @@ -188,44 +176,38 @@ paths: schema: type: string responses: - "200": - description: OK + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table data is malformed or image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "422": + description: Could not import csv via sidecar + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Get table data successfully content: '*/*': schema: $ref: '#/components/schemas/QueryResultDto' security: - bearerAuth: [] - put: - tags: - - table-data-endpoint - summary: Update data - operationId: update_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCsvUpdateDto' - required: true - responses: - "200": - description: OK - deprecated: true - security: - - bearerAuth: [] post: tags: - table-data-endpoint @@ -251,15 +233,37 @@ paths: $ref: '#/components/schemas/TableCsvDto' required: true responses: - "200": - description: OK + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Inserted data successfully + content: + '*/*': + schema: + type: object + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Insert table data is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] delete: tags: - table-data-endpoint summary: Delete data - operationId: delete_7 + operationId: delete_6 parameters: - name: databaseId in: path @@ -280,8 +284,26 @@ paths: $ref: '#/components/schemas/TableCsvDeleteDto' required: true responses: - "200": - description: OK + "202": + description: Deleted table data successfully + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table data or query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] head: @@ -334,8 +356,32 @@ paths: schema: type: string responses: - "200": - description: OK + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table data is malformed or image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "422": + description: Could not import csv via sidecar + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Get table data successfully content: '*/*': schema: @@ -356,19 +402,19 @@ paths: type: string format: uuid responses: - "200": - description: Found user - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' "404": description: User was not found content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": + "200": + description: Found user + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + "403": description: Find user is not permitted content: application/json: @@ -395,14 +441,14 @@ paths: $ref: '#/components/schemas/UserUpdateDto' required: true responses: - "405": - description: Modify user is not permitted + "400": + description: Modify user query is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: User attribute was not found + "403": + description: Modify user is not permitted content: application/json: schema: @@ -413,6 +459,18 @@ paths: application/json: schema: $ref: '#/components/schemas/UserDto' + "404": + description: User attribute was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Foreign user modification + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/user/{id}/theme: @@ -435,12 +493,6 @@ paths: $ref: '#/components/schemas/UserThemeSetDto' required: true responses: - "405": - description: Modify user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "404": description: User or user attribute was not found content: @@ -453,6 +505,18 @@ paths: application/json: schema: $ref: '#/components/schemas/UserDto' + "403": + description: Modify user is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Foreign user modification + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/user/{id}/password: @@ -475,24 +539,36 @@ paths: $ref: '#/components/schemas/UserPasswordDto' required: true responses: - "202": - description: Modified user password + "403": + description: Modify is not allowed content: application/json: schema: - $ref: '#/components/schemas/UserDto' + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: User was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' "405": - description: Modify user is not permitted + description: Foreign user modification content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: User was not found + "503": + description: Authentication service does not respond content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modified user password + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' security: - bearerAuth: [] /api/semantic/ontology/{id}: @@ -509,18 +585,18 @@ paths: type: integer format: int64 responses: - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "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 @@ -540,18 +616,18 @@ paths: $ref: '#/components/schemas/OntologyModifyDto' required: true responses: - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "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: [] delete: @@ -579,87 +655,6 @@ paths: $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] - /api/pid/{id}: - put: - tags: - - persistence-endpoint - summary: Update some identifier - operationId: update_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierSaveDto' - required: true - responses: - "406": - description: Updating identifier not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Updating identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Updated identifier - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - "404": - description: Identifier or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Identifier data is not valid to the form - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - delete: - tags: - - persistence-endpoint - summary: Delete some identifier - operationId: delete_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Deleting identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted identifier - "404": - description: Identifier could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] /api/maintenance/message/{id}: get: tags: @@ -674,6 +669,12 @@ paths: type: integer format: int64 responses: + "404": + description: Could not find message + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' "200": description: Get messages content: @@ -684,7 +685,7 @@ paths: tags: - maintenance-endpoint summary: Update maintenance message - operationId: update_2 + operationId: update_1 parameters: - name: id in: path @@ -704,7 +705,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/BannerMessageNotFoundException' + $ref: '#/components/schemas/ApiErrorDto' "202": description: Updated message content: @@ -724,16 +725,16 @@ paths: type: integer format: int64 responses: - "202": - description: Deleted message - content: - application/json: {} "404": description: Could not find message content: application/json: schema: - $ref: '#/components/schemas/BannerMessageNotFoundException' + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Deleted message + content: + application/json: {} /api/image/{id}: get: tags: @@ -748,23 +749,23 @@ paths: type: integer format: int64 responses: - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "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 some image - operationId: update_3 + operationId: update_2 parameters: - name: id in: path @@ -779,18 +780,18 @@ paths: $ref: '#/components/schemas/ImageChangeDto' required: true responses: - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "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: [] delete: @@ -836,7 +837,13 @@ paths: $ref: '#/components/schemas/DatabaseModifyVisibilityDto' required: true responses: - "405": + "404": + description: Database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": description: Visibility modification is not permitted content: application/json: @@ -848,12 +855,6 @@ paths: application/json: schema: $ref: '#/components/schemas/DatabaseDto' - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database/{id}/transfer: @@ -876,8 +877,8 @@ paths: $ref: '#/components/schemas/DatabaseTransferDto' required: true responses: - "405": - description: Transfer of ownership is not permitted + "404": + description: Database or user could not be found content: application/json: schema: @@ -888,8 +889,8 @@ paths: application/json: schema: $ref: '#/components/schemas/DatabaseDto' - "404": - description: Database or user could not be found + "403": + description: Transfer of ownership is not permitted content: application/json: schema: @@ -901,7 +902,7 @@ paths: tags: - table-column-endpoint summary: Update a table column semantic mapping - operationId: update_4 + operationId: update_3 parameters: - name: id in: path @@ -933,19 +934,6 @@ paths: $ref: '#/components/schemas/ColumnSemanticsUpdateDto' required: true responses: - "405": - description: Update column semantics not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ColumnDto' - "404": - description: "Table, database, semantic concept, unit of measurement or\ - \ container could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "403": description: Access to the database is forbidden content: @@ -958,6 +946,12 @@ paths: application/json: schema: $ref: '#/components/schemas/ColumnDto' + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' "400": description: Update semantic concept query is malformed or update unit of measurement query is malformed @@ -972,7 +966,7 @@ paths: tags: - access-endpoint summary: Modify access to some database - operationId: update_5 + operationId: update_4 parameters: - name: id in: path @@ -993,6 +987,12 @@ paths: $ref: '#/components/schemas/DatabaseModifyAccessDto' required: true responses: + "404": + description: Database or user not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' "403": description: Modify access not permitted when no access is granted in the first place @@ -1000,20 +1000,14 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modify access succeeded "400": description: Modify access query or database connection is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modify access succeeded security: - bearerAuth: [] post: @@ -1041,14 +1035,6 @@ paths: $ref: '#/components/schemas/DatabaseGiveAccessDto' required: true responses: - "202": - description: Granting access succeeded - "400": - description: Granting access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "405": description: Granting access not permitted content: @@ -1061,6 +1047,20 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Failed giving access + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Granting access succeeded + "400": + description: Granting access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] delete: @@ -1082,28 +1082,22 @@ paths: type: string format: uuid responses: - "403": - description: Revoke of access not permitted as no access was found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Revoke of access not permitted + "202": + description: Revoked access successfully + "400": + description: Modify access query or database connection is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' "404": - description: User with access was not found + description: "User, database with access was not found" content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Revoked access successfully - "400": - description: Modify access query or database connection is malformed + "403": + description: Revoke of access not permitted as no access was found content: application/json: schema: @@ -1130,8 +1124,8 @@ paths: type: integer format: int64 responses: - "503": - description: Connection to the database failed + "501": + description: Image is not supported content: application/json: schema: @@ -1142,8 +1136,8 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, query or user could not be found" + "503": + description: Connection to the database failed content: application/json: schema: @@ -1154,8 +1148,8 @@ paths: application/json: schema: $ref: '#/components/schemas/QueryDto' - "501": - description: Image is not supported + "404": + description: "Database, query or user could not be found" content: application/json: schema: @@ -1193,14 +1187,14 @@ paths: $ref: '#/components/schemas/QueryPersistDto' required: true responses: - "409": - description: Query is already persisted + "405": + description: Persist query is not permitted content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to persist query + "403": + description: Not allowed to persist query content: application/json: schema: @@ -1211,20 +1205,20 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Persist query successful + "400": + description: Image not supported content: application/json: schema: - $ref: '#/components/schemas/QueryDto' - "501": - description: Image is not supported + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Persist query successful content: application/json: schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Persist query is not permitted + $ref: '#/components/schemas/QueryDto' + "412": + description: Query is already persisted content: application/json: schema: @@ -1258,16 +1252,6 @@ paths: $ref: '#/components/schemas/SignupRequestDto' required: true responses: - "201": - description: Created user - content: - application/json: - schema: - $ref: '#/components/schemas/UserBriefDto' - "400": - description: Parameters are not well-formed (likely email) - content: - application/json: {} "409": description: User with username already exists content: @@ -1280,47 +1264,22 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: default role not found + "201": + description: Created user content: application/json: schema: - $ref: '#/components/schemas/ApiErrorDto' - /api/semantic/unit: - get: - tags: - - semantics-endpoint - summary: List semantic units - operationId: findAllUnits - responses: - "200": - description: Find all semantic units + $ref: '#/components/schemas/UserBriefDto' + "404": + description: default role not found content: application/json: schema: - type: array - items: - $ref: '#/components/schemas/UnitDto' - post: - tags: - - semantics-endpoint - summary: Save a semantic unit - operationId: saveUnit - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UnitSaveDto' - required: true - responses: - "202": - description: Saved a semantic unit + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Parameters are not well-formed (likely email) content: - application/json: - schema: - $ref: '#/components/schemas/UnitDto' - security: - - bearerAuth: [] + application/json: {} /api/semantic/ontology: get: tags: @@ -1349,46 +1308,11 @@ paths: required: true responses: "201": - description: Could not find user - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/semantic/concept: - get: - tags: - - semantics-endpoint - summary: List semantic concepts - operationId: findAllConcepts - responses: - "200": - description: Find all semantic concepts - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ConceptDto' - post: - tags: - - semantics-endpoint - summary: Create or update a semantic concept - operationId: saveUnit_1 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ConceptSaveDto' - required: true - responses: - "202": - description: Saved a semantic concept + description: Registered ontology successfully content: application/json: schema: - $ref: '#/components/schemas/ConceptDto' + $ref: '#/components/schemas/OntologyDto' security: - bearerAuth: [] /api/maintenance/message: @@ -1451,14 +1375,14 @@ paths: $ref: '#/components/schemas/ImageCreateDto' required: true responses: - "409": - description: Image already exists + "400": + description: Image specification is invalid content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: User could not be found + "409": + description: Image already exists content: application/json: schema: @@ -1469,18 +1393,6 @@ paths: application/json: schema: $ref: '#/components/schemas/ImageDto' - "502": - description: Failed to connect - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Image specification is invalid - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/identifier: @@ -1508,6 +1420,12 @@ paths: schema: type: integer format: int64 + - name: tid + in: query + required: false + schema: + type: integer + format: int64 - name: type in: query required: false @@ -1516,6 +1434,7 @@ paths: enum: - database - subset + - table - view responses: "200": @@ -1538,32 +1457,26 @@ paths: $ref: '#/components/schemas/IdentifierSaveDto' required: true responses: - "406": - description: Creating identifier not allowed + "409": + description: Identifier for this resource already exists content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created 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 + "503": + description: DataCite system did not respond content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Identifier for this resource already exists + "406": + description: Creating identifier not allowed content: application/json: schema: @@ -1574,12 +1487,36 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' + "201": + description: Created identifier + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierDto' "405": description: Creating identifier not permitted content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' + "204": + description: Identifier could not be created + 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' + "403": + description: Insufficient access rights or authorities + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database: @@ -1603,6 +1540,12 @@ paths: type: array items: $ref: '#/components/schemas/DatabaseBriefDto' + "404": + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' post: tags: - database-endpoint @@ -1615,45 +1558,21 @@ paths: $ref: '#/components/schemas/DatabaseCreateDto' required: true responses: - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Container image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Container, user or database could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": + "403": description: Database create permission is missing or grant permissions at broker service failed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Database name already exist or query store could not be created - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Database create query is malformed + "503": + description: Connection to the database failed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Connection to the container failed + "409": + description: Query store could not be created content: application/json: schema: @@ -1664,9 +1583,14 @@ paths: application/json: schema: $ref: '#/components/schemas/DatabaseBriefDto' - "406": - description: Failed to create user at broker service or virtual host could - not be reached at broker service + "400": + description: Database create query is malformed or image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Container, user or database could not be found" content: application/json: schema: @@ -1685,8 +1609,20 @@ paths: schema: type: string responses: + "404": + description: User not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' "200": description: Count databases + content: + '*/*': + schema: + type: array + items: + $ref: '#/components/schemas/DatabaseDto' /api/database/{databaseId}/view: get: tags: @@ -1709,12 +1645,6 @@ paths: type: array items: $ref: '#/components/schemas/ViewBriefDto' - "405": - description: Find views is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "404": description: Database or user could not be found content: @@ -1742,31 +1672,31 @@ paths: $ref: '#/components/schemas/ViewCreateDto' required: true responses: - "503": - description: Connection to the database failed + "423": + description: Create view resulted in an invalid query statement content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Create view successfully + "400": + description: Create view query is malformed content: application/json: schema: - $ref: '#/components/schemas/ViewBriefDto' - "401": + $ref: '#/components/schemas/ApiErrorDto' + "403": description: Credentials missing content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Create view resulted in an invalid query statement + "503": + description: Connection to the database failed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "403": + "401": description: Credentials missing content: application/json: @@ -1778,18 +1708,18 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Create view query is malformed + "405": + description: Create view is not permitted content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Create view is not permitted + "201": + description: Create view successfully content: application/json: schema: - $ref: '#/components/schemas/ApiErrorDto' + $ref: '#/components/schemas/ViewBriefDto' security: - bearerAuth: [] /api/database/{databaseId}/table: @@ -1820,7 +1750,7 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": + "403": description: List tables not permitted content: application/json: @@ -1847,14 +1777,8 @@ paths: $ref: '#/components/schemas/TableCreateDto' required: true responses: - "409": - description: Create table conflicts with existing table name - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Broker service failed to create queue + "403": + description: Create table not permitted content: application/json: schema: @@ -1871,14 +1795,8 @@ paths: application/json: schema: $ref: '#/components/schemas/TableBriefDto' - "405": - description: Create table not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported + "409": + description: Create table conflicts with existing table name content: application/json: schema: @@ -1917,18 +1835,42 @@ paths: $ref: '#/components/schemas/ImportDto' required: true responses: - "200": - description: OK - security: - - bearerAuth: [] - /api/database/{databaseId}/query: - get: - tags: - - store-endpoint - summary: Find queries - operationId: findAll_4 - parameters: - - name: databaseId + "202": + description: Import table data successfully + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "422": + description: Could not import csv via sidecar + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table data is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/database/{databaseId}/query: + get: + tags: + - store-endpoint + summary: Find queries + operationId: findAll_4 + parameters: + - name: databaseId in: path required: true schema: @@ -1940,8 +1882,8 @@ paths: schema: type: boolean responses: - "503": - description: Connection to the database failed + "501": + description: Image is not supported content: application/json: schema: @@ -1952,21 +1894,21 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Selection of time-versioned query resulted in an invalid query - statement + "404": + description: "Database, container or user could not be found" content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, container or user could not be found" + "423": + description: Selection of time-versioned query resulted in an invalid query + statement content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported + "503": + description: Connection to the database failed content: application/json: schema: @@ -2031,12 +1973,42 @@ paths: $ref: '#/components/schemas/ExecuteStatementDto' required: true responses: - "200": - description: OK + "409": + description: Could not store query in query store content: - '*/*': + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Could not parse columns + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Execute query not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Executed query + content: + application/json: schema: $ref: '#/components/schemas/QueryResultDto' + "404": + description: "Database, query or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/container: @@ -2073,20 +2045,14 @@ paths: $ref: '#/components/schemas/ContainerCreateRequestDto' required: true responses: - "409": - description: Container name already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Failed to connect + "404": + description: Container image or user could not be found content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Container image or user could not be found + "409": + description: Container name already exists content: application/json: schema: @@ -2099,6 +2065,21 @@ paths: $ref: '#/components/schemas/ContainerBriefDto' security: - bearerAuth: [] + /api/semantic/unit: + get: + tags: + - semantics-endpoint + summary: List semantic units + operationId: findAllUnits + responses: + "200": + description: Find all semantic units + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UnitDto' /api/semantic/ontology/{id}/entity: get: tags: @@ -2123,20 +2104,26 @@ paths: schema: type: string responses: - "417": - description: Generated query or uri is malformed + "422": + description: Ontology does not have rdf or sparql endpoint content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Filter params are invalid + "404": + description: Could not find ontology content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Could not find ontology + "417": + description: Generated query or uri is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Filter params are invalid content: application/json: schema: @@ -2177,6 +2164,12 @@ paths: 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' "200": description: Suggested table semantics successfully content: @@ -2219,14 +2212,20 @@ paths: type: integer format: int64 responses: + "417": + description: Generated query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' "404": description: Could not find the table column content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "417": - description: Generated query is malformed + "422": + description: Ontology does not have rdf or sparql endpoint content: application/json: schema: @@ -2241,6 +2240,21 @@ paths: $ref: '#/components/schemas/TableColumnEntityDto' security: - bearerAuth: [] + /api/semantic/concept: + get: + tags: + - semantics-endpoint + summary: List semantic concepts + operationId: findAllConcepts + responses: + "200": + description: Find all semantic concepts + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ConceptDto' /api/pid/{pid}: get: tags: @@ -2260,6 +2274,37 @@ paths: schema: type: string responses: + "400": + description: "Identifier could not be exported, the requested style is not\ + \ known" + content: + text/bibliography: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "422": + description: Failed to retrieve from database sidecar + content: + text/csv: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Identifier could not exported from database as it is not reachable + content: + text/csv: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Exported resource was not found + content: + text/csv: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "410": + description: Failed to retrieve from S3 endpoint + content: + text/csv: + schema: + $ref: '#/components/schemas/ApiErrorDto' "200": description: Found identifier successfully content: @@ -2273,25 +2318,11 @@ paths: text/bibliography; style=ieee: {} text/bibliography; style=bibtex: {} "404": - description: Identifier could not be exported from database as the resource - was not found - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Identifier could not exported from database as it is not reachable + description: Identifier could not be found content: text/csv: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - text/bibliography: - schema: - $ref: '#/components/schemas/ApiErrorDto' /api/oai: get: tags: @@ -2331,7 +2362,7 @@ paths: tags: - identifier-endpoint summary: Retrieve metadata from identifier - operationId: create_10 + operationId: retrieve parameters: - name: url in: query @@ -2359,25 +2390,32 @@ paths: type: integer format: int64 responses: - "404": - description: Database could not be found + "200": + description: Database found successfully + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "503": + description: Connection to the broker service could not be established content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Database found successfully + "404": + description: Database or exchange could not be found content: application/json: schema: - $ref: '#/components/schemas/DatabaseDto' + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] - delete: + /api/database/{id}/table/{tableId}/export: + get: tags: - - database-endpoint - summary: Delete some database - operationId: delete_4 + - export-endpoint + summary: Export table + operationId: export parameters: - name: id in: path @@ -2385,65 +2423,69 @@ paths: schema: type: integer format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: timestamp + in: query + required: false + schema: + type: string + format: date-time responses: - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Container image is not supported + "403": + description: Operation is not allowed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Database delete permission is missing or revoke permissions - at broker service failed + "503": + description: Database connection could not be established content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' "201": - description: Deleted a database + description: Created identifier content: application/json: schema: - $ref: '#/components/schemas/DatabaseBriefDto' - "406": - description: Failed to delete user at broker service or virtual host could - not be reached at broker service + $ref: '#/components/schemas/IdentifierDto' + "422": + description: Sidecar operation could not be completed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Connection to the container failed + "400": + description: Images is not supported or table/query is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Database delete query is malformed + "404": + description: "Table, database or user was not found" content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Container or database could not be found + "410": + description: Blob storage operation could not be completed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] - /api/database/{id}/table/{tableId}/export: + /api/database/{id}/access: get: tags: - - export-endpoint - summary: Export table - operationId: export + - access-endpoint + summary: Check access to some database + operationId: find_5 parameters: - name: id in: path @@ -2451,44 +2493,15 @@ paths: schema: type: integer format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time responses: - "200": - description: OK + "403": + description: No access to this database content: - '*/*': + application/json: schema: - type: string - format: binary - security: - - bearerAuth: [] - /api/database/{id}/access: - get: - tags: - - access-endpoint - summary: Check access to some database - operationId: find_5 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Check access is not permitted + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Database not found content: application/json: schema: @@ -2499,12 +2512,6 @@ paths: application/json: schema: $ref: '#/components/schemas/DatabaseAccessDto' - "403": - description: No access to this database - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database/{databaseId}/view/{viewId}: @@ -2527,8 +2534,8 @@ paths: type: integer format: int64 responses: - "404": - description: "Database, view or user could not be found" + "403": + description: Find view is not permitted content: application/json: schema: @@ -2539,8 +2546,8 @@ paths: application/json: schema: $ref: '#/components/schemas/ViewDto' - "405": - description: Find view is not permitted + "404": + description: "Database, view or user could not be found" content: application/json: schema: @@ -2551,7 +2558,7 @@ paths: tags: - view-endpoint summary: Delete one view - operationId: delete_5 + operationId: delete_4 parameters: - name: databaseId in: path @@ -2566,46 +2573,40 @@ paths: type: integer format: int64 responses: - "200": - description: Delete view successfully - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, view or user could not be found" + "405": + description: Delete view is not permitted content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "401": - description: Credentials missing + "400": + description: Delete view query is malformed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Delete view is not permitted + "423": + description: Delete view resulted in an invalid query statement content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Delete view resulted in an invalid query statement + "200": + description: Delete view successfully + "503": + description: Connection to the database failed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Delete view query is malformed + "403": + description: Deletion not allowed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Credentials missing + "404": + description: "Database, view or user could not be found" content: application/json: schema: @@ -2644,68 +2645,26 @@ paths: type: integer format: int64 responses: - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Pagination not in valid range or find data query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find data is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "401": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "417": - description: Parsing of resulting columns failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, view, container or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "200": description: Find data successfully content: application/json: schema: $ref: '#/components/schemas/QueryResultDto' - "423": - description: Find data resulted in an invalid query statement + "403": + description: View data not allowed content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported + "404": + description: "Database, view, container or user could not be found" content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to query view data + "400": + description: Pagination not in valid range or find data query is malformed content: application/json: schema: @@ -2733,12 +2692,36 @@ paths: format: int64 responses: "200": - description: OK + description: Count data successfully content: - '*/*': + application/json: schema: type: integer format: int64 + "403": + description: Count data not allowed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Database, view, container or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Pagination not in valid range or find data query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Could not count query data + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database/{databaseId}/table/{tableId}: @@ -2767,20 +2750,20 @@ paths: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find table successfully - content: - application/json: - schema: - $ref: '#/components/schemas/TableDto' "404": description: "Table, database or container could not be found" content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find table not permitted + "200": + description: Find table successfully + content: + application/json: + schema: + $ref: '#/components/schemas/TableDto' + "503": + description: Could not communicate with the broker service content: application/json: schema: @@ -2791,7 +2774,7 @@ paths: tags: - table-endpoint summary: Delete a table - operationId: delete_6 + operationId: delete_5 parameters: - name: databaseId in: path @@ -2806,44 +2789,22 @@ paths: type: integer format: int64 responses: - "400": - description: Delete table query resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "202": description: Delete table successfully - content: - application/json: - schema: - $ref: '#/components/schemas/TableDto' - "423": - description: Delete table resulted in an invalid state - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "403": description: Access to the database is forbidden content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Delete table not permitted + "404": + description: "Table, database or container could not be found" content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Table, database or container could not be found" + "400": + description: Delete table query resulted in an invalid query statement content: application/json: schema: @@ -2876,8 +2837,32 @@ paths: type: string format: date-time responses: - "200": - description: OK + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table data is malformed or image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Table or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "422": + description: Could not import csv via sidecar + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Get table data count successfully content: '*/*': schema: @@ -2911,11 +2896,47 @@ paths: type: string responses: "200": - description: OK + description: Executed query content: '*/*': schema: type: object + "422": + description: Sidecar failed to export + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Execute query not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "410": + description: Could not find in S3 storage + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Export of query failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Database or query could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database/{databaseId}/query/{queryId}/data: @@ -2963,12 +2984,42 @@ paths: schema: type: string responses: - "200": - description: OK + "409": + description: Could not store query in query store content: - '*/*': + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Could not parse columns + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Execute query not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Executed query + content: + application/json: schema: $ref: '#/components/schemas/QueryResultDto' + "404": + description: Database or query could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database/{databaseId}/query/{queryId}/data/count: @@ -2991,13 +3042,36 @@ paths: type: integer format: int64 responses: - "200": - description: OK + "417": + description: Could not parse columns content: - '*/*': + application/json: schema: - type: integer - format: int64 + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Execute query not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Executed query + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + "404": + description: Database or query could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' security: - bearerAuth: [] /api/database/license: @@ -3029,12 +3103,6 @@ paths: type: integer format: int64 responses: - "502": - description: Connection to the container failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' "200": description: Found container content: @@ -3051,7 +3119,7 @@ paths: tags: - container-endpoint summary: Delete some container - operationId: delete_8 + operationId: delete_7 parameters: - name: id in: path @@ -3060,16 +3128,48 @@ paths: type: integer format: int64 responses: - "410": - description: Container is already removed + "404": + description: Container not found content: application/json: schema: $ref: '#/components/schemas/ApiErrorDto' "202": description: Deleted container successfully - "409": - description: Container is still running + content: + '*/*': + schema: + type: object + security: + - bearerAuth: [] + /api/pid/{id}: + delete: + tags: + - persistence-endpoint + summary: Delete some identifier + operationId: delete_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "404": + description: Identifier or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Deleted identifier + content: + '*/*': + schema: + type: object + "403": + description: Deleting identifier not permitted content: application/json: schema: @@ -3078,6 +3178,23 @@ paths: - bearerAuth: [] components: schemas: + TableHistoryDto: + required: + - event + - timestamp + - total + type: object + properties: + timestamp: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + event: + type: string + total: + type: integer + format: int64 + example: 1 ApiErrorDto: required: - code @@ -3164,23 +3281,6 @@ components: code: type: string example: error.service.code - TableHistoryDto: - required: - - event - - timestamp - - total - type: object - properties: - timestamp: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - event: - type: string - total: - type: integer - format: int64 - example: 1 QueryResultDto: required: - headers @@ -3235,7 +3335,6 @@ components: UserDto: required: - attributes - - email - id - username type: object @@ -3253,9 +3352,6 @@ components: example: Josiah Carberry attributes: $ref: '#/components/schemas/UserAttributesDto' - email: - type: string - example: jcarberry@brown.edu qualified_name: type: string example: Josiah Carberry — @jcarberry @@ -3295,6 +3391,9 @@ components: sparql_endpoint: type: string example: Ontology SPARQL endpoint + rdf_path: + type: string + example: rdf/om-2.0.rdf OntologyDto: required: - created @@ -3332,6 +3431,9 @@ components: sparql_endpoint: type: string example: https://query.wikidata.org/sparql + rdf_path: + type: string + example: rdf/om-2.0.rdf UserBriefDto: required: - id @@ -3361,106 +3463,619 @@ components: family_name: type: string example: Carberry - CreatorSaveDto: + BannerMessageUpdateDto: required: - - creator_name - - firstname - - lastname - - name_type + - message + - type type: object properties: - id: - type: integer - format: int64 - firstname: + type: type: string - example: Josiah - lastname: + enum: + - error + - warning + - info + message: type: string - example: Carberry - affiliation: + example: Maintenance starts on 8am on Monday + link: type: string - example: Wesleyan University - creator_name: + example: https://example.com + link_text: type: string - example: "Carberry, Josiah" - name_type: + example: More + display_start: type: string - example: Personal - enum: - - Personal - - Organizational - name_identifier: + format: date-time + example: 2021-03-12T15:26:21Z + display_end: type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: + format: date-time + example: 2021-03-12T15:26:21Z + BannerMessageBriefDto: + required: + - message + - type + type: object + properties: + type: type: string - example: ORCID enum: - - ORCID - - ROR - - ISNI - - GRID - affiliation_identifier: + - error + - warning + - info + message: type: string - example: https://ror.org/04d836q62 - affiliation_identifier_scheme: + example: Maintenance starts on 8am on Monday + link: type: string - example: ROR - enum: - - ROR - - GRID - - ISNI - IdentifierFunderSaveDto: + example: https://example.com + link_text: + type: string + example: More + ImageChangeDto: required: - - funder_name + - dialect + - driver_class + - jdbc_method + - registry + type: object + properties: + registry: + type: string + example: docker.io/library + defaultPort: + maximum: 65535 + minimum: 1024 + type: integer + format: int32 + example: 5432 + dialect: + type: string + example: Postgres + driver_class: + type: string + example: org.postgresql.Driver + jdbc_method: + type: string + example: postgresql + ImageDateDto: + required: + - created_at + - database_format + - example + - has_time + - id + - unix_format type: object properties: id: type: integer format: int64 - funder_name: + example: type: string - example: European Commission - funder_identifier: + example: 30.01.2022 + database_format: type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: + example: '%d.%c.%Y' + unix_format: type: string - example: Crossref Funder ID + example: dd.MM.YYYY + has_time: + type: boolean + example: false + created_at: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + ImageDto: + required: + - default_port + - dialect + - driver_class + - id + - jdbc_method + - name + - registry + - version + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + name: + type: string + example: mariadb + version: + type: string + example: "10.5" + dialect: + type: string + example: org.hibernate.dialect.MariaDBDialect + driver_class: + type: string + example: org.mariadb.jdbc.Driver + date_formats: + type: array + items: + $ref: '#/components/schemas/ImageDateDto' + jdbc_method: + type: string + example: mariadb + default_port: + type: integer + format: int32 + example: 3306 + DatabaseModifyVisibilityDto: + required: + - is_public + type: object + properties: + is_public: + type: boolean + example: true + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + alias: + type: string + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - scheme_uri: + - char + - varchar + - binary + - varbinary + - tinyblob + - tinytext + - text + - blob + - mediumtext + - mediumblob + - longtext + - longblob + - enum + - set + - bit + - tinyint + - bool + - smallint + - mediumint + - int + - bigint + - float + - double + - decimal + - date + - datetime + - timestamp + - time + - year + ColumnDto: + required: + - auto_generated + - column_type + - database_id + - id + - internal_name + - is_null_allowed + - is_primary_key + - is_public + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: type: string - example: http://doi.org/ - award_number: + example: Date + alias: type: string - example: "824087" - award_title: + size: + type: integer + format: int64 + example: 255 + d: + type: integer + format: int64 + example: 0 + dataLength: + type: integer + format: int64 + example: 34300 + maxDataLength: + type: integer + format: int64 + example: 34300 + numRows: + type: integer + format: int64 + example: 32 + valMin: + type: number + example: 0 + valMax: + type: number + example: 100 + mean: + type: number + example: 45.4 + median: + type: number + example: 51 + stdDev: + type: number + example: 5.32 + concept: + $ref: '#/components/schemas/ConceptDto' + unit: + $ref: '#/components/schemas/UnitDto' + enums: + type: array + items: + type: string + sets: + type: array + items: + type: string + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: type: string - example: EOSC-Life - IdentifierSaveDescriptionDto: + example: mdb_date + date_format: + $ref: '#/components/schemas/ImageDateDto' + auto_generated: + type: boolean + example: false + is_primary_key: + type: boolean + example: true + index_length: + type: integer + format: int64 + length: + type: integer + format: int64 + column_type: + type: string + example: string + enum: + - char + - varchar + - binary + - varbinary + - tinyblob + - tinytext + - text + - blob + - mediumtext + - mediumblob + - longtext + - longblob + - enum + - set + - bit + - tinyint + - bool + - smallint + - mediumint + - int + - bigint + - float + - double + - decimal + - date + - datetime + - timestamp + - time + - year + is_public: + type: boolean + example: true + is_null_allowed: + type: boolean + example: false + ConceptDto: + required: + - columns + - created + - id + - uri type: object properties: id: type: integer format: int64 + uri: + type: string + name: + type: string description: type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: + created: type: string - example: en - enum: - - ab - - aa - - af - - ak - - sq + format: date-time + example: 2021-03-12T15:26:21Z + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + ConstraintsDto: + type: object + properties: + uniques: + type: array + items: + $ref: '#/components/schemas/UniqueDto' + checks: + type: array + items: + type: string + foreign_keys: + type: array + items: + $ref: '#/components/schemas/ForeignKeyDto' + ContainerDto: + required: + - created + - host + - id + - internal_name + - name + - sidecar_host + - sidecar_port + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + host: + type: string + port: + type: integer + format: int32 + image: + $ref: '#/components/schemas/ImageDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + internal_name: + type: string + example: data-db + sidecar_host: + type: string + sidecar_port: + type: integer + format: int32 + ui_host: + type: string + ui_port: + type: integer + format: int32 + CreatorDto: + required: + - creator_name + - id + type: object + properties: + id: + type: integer + format: int64 + 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 + example: Personal + enum: + - Personal + - Organizational + name_identifier: + type: string + example: 0000-0002-1825-0097 + name_identifier_scheme: + type: string + example: ORCID + enum: + - ORCID + - ROR + - ISNI + - GRID + name_identifier_scheme_uri: + type: string + example: https://orcid.org/ + affiliation_identifier: + type: string + example: https://ror.org/05gq02987 + affiliation_identifier_scheme: + type: string + example: ROR + enum: + - ROR + - GRID + - ISNI + affiliation_identifier_scheme_uri: + type: string + example: https://ror.org/ + DatabaseAccessDto: + required: + - created + - type + - user + type: object + properties: + user: + $ref: '#/components/schemas/UserDto' + type: + type: string + enum: + - read + - write_own + - write_all + created: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + DatabaseDto: + required: + - contact + - created + - creator + - exchange_name + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality + tables: + type: array + items: + $ref: '#/components/schemas/TableDto' + views: + type: array + items: + $ref: '#/components/schemas/ViewDto' + container: + $ref: '#/components/schemas/ContainerDto' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + identifiers: + type: array + items: + $ref: '#/components/schemas/IdentifierDto' + subsets: + type: array + items: + $ref: '#/components/schemas/IdentifierDto' + creator: + $ref: '#/components/schemas/UserDto' + contact: + $ref: '#/components/schemas/UserDto' + owner: + $ref: '#/components/schemas/UserDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + exchange_name: + type: string + example: dbrepo + exchange_type: + type: string + example: topic + internal_name: + type: string + example: air_quality + is_public: + type: boolean + example: true + ForeignKeyDto: + type: object + properties: + columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + referenced_table: + $ref: '#/components/schemas/TableBriefDto' + referenced_columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + on_update: + type: string + enum: + - restrict + - cascade + - set_null + - no_action + - set_default + on_delete: + type: string + enum: + - restrict + - cascade + - set_null + - no_action + - set_default + IdentifierDescriptionDto: + required: + - id + type: object + properties: + id: + type: integer + format: int64 + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + language: + type: string + example: en + enum: + - ab + - aa + - af + - ak + - sq - am - ar - an @@ -3650,44 +4265,55 @@ components: - TableOfContents - TechnicalInfo - Other - IdentifierSaveDto: + IdentifierDto: required: + - created - creators - - database_id + - execution + - id + - last_modified - publication_year + - query + - query_hash + - query_normalized + - result_hash + - result_number - type - - visibility type: object properties: + id: + type: integer + format: int64 type: type: string - example: database enum: - database - subset + - table - view titles: type: array items: - $ref: '#/components/schemas/IdentifierSaveTitleDto' + $ref: '#/components/schemas/IdentifierTitleDto' descriptions: type: array items: - $ref: '#/components/schemas/IdentifierSaveDescriptionDto' + $ref: '#/components/schemas/IdentifierDescriptionDto' funders: type: array items: - $ref: '#/components/schemas/IdentifierFunderSaveDto' - licenses: - type: array - items: - $ref: '#/components/schemas/LicenseDto' - visibility: + $ref: '#/components/schemas/IdentifierFunderDto' + query: type: string - example: everyone - enum: - - everyone - - self + 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 @@ -3878,10 +4504,18 @@ components: - yo - za - zu + licenses: + type: array + items: + $ref: '#/components/schemas/LicenseDto' creators: type: array items: - $ref: '#/components/schemas/CreatorSaveDto' + $ref: '#/components/schemas/CreatorDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21Z database_id: type: integer format: int64 @@ -3889,9 +4523,33 @@ components: query_id: type: integer format: int64 + example: 1 + table_id: + type: integer + format: int64 + example: 1 view_id: type: integer format: int64 + example: 1 + 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 @@ -3904,11 +4562,46 @@ components: type: integer format: int32 example: 2022 - related_identifiers: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifierSaveDto' - IdentifierSaveTitleDto: + last_modified: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + IdentifierFunderDto: + required: + - funder_name + - id + type: object + properties: + id: + type: integer + format: int64 + funder_name: + type: string + example: European Commission + funder_identifier: + type: string + example: http://doi.org/10.13039/501100000780 + funder_identifier_type: + type: string + example: Crossref Funder ID + enum: + - Crossref Funder ID + - ROR + - GND + - ISNI + - Other + scheme_uri: + type: string + example: http://doi.org/ + award_number: + type: string + example: "824087" + award_title: + type: string + example: EOSC-Life + IdentifierTitleDto: + required: + - id type: object properties: id: @@ -4107,7 +4800,6 @@ components: - zu type: type: string - example: Subtitle enum: - AlternativeTitle - Subtitle @@ -4125,11 +4817,16 @@ components: uri: type: string example: https://opensource.org/licenses/MIT - RelatedIdentifierSaveDto: + RelatedIdentifierDto: required: + - created + - id - value type: object properties: + id: + type: integer + format: int64 value: type: string example: 10.70124/dc4zh-9ce78 @@ -4193,14 +4890,23 @@ components: - Requires - IsObsoletedBy - Obsoletes - ColumnBriefDto: + created: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + last_modified: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + TableBriefDto: required: - - column_type - - database_id + - columns + - description - id - internal_name + - is_versioned - name - - table_id + - owner type: object properties: id: @@ -4208,296 +4914,477 @@ components: format: int64 name: type: string - example: date - alias: + example: Air Quality + description: type: string - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 + example: Air Quality in Austria + owner: + $ref: '#/components/schemas/UserBriefDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' internal_name: type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - ContainerDto: + example: air_quality + is_versioned: + type: boolean + example: true + TableDto: required: + - columns - created - - host + - created_by + - creator - id - internal_name + - is_public + - is_versioned - name + - owner + - queue_name + - routing_key + - tdbid type: object properties: id: type: integer format: int64 + tdbid: + type: integer + format: int64 name: type: string example: Air Quality - host: + identifiers: + type: array + items: + $ref: '#/components/schemas/IdentifierDto' + creator: + $ref: '#/components/schemas/UserDto' + owner: + $ref: '#/components/schemas/UserDto' + description: type: string - port: - type: integer - format: int32 - image: - $ref: '#/components/schemas/ImageBriefDto' + example: Air Quality in Austria created: type: string format: date-time example: 2021-03-12T15:26:21Z + columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + constraints: + $ref: '#/components/schemas/ConstraintsDto' internal_name: type: string - example: data-db - CreatorBriefDto: - required: - - creator_name - type: object - properties: - affiliation: + example: air_quality + is_versioned: + type: boolean + example: true + created_by: type: string - example: Wesleyan University - name_identifier: + format: uuid + queue_name: type: string - example: https://orcid.org/0000-0002-1825-0097 - name_type: + example: air_quality + queue_type: type: string - example: Personal - enum: - - Personal - - Organizational - creator_name: + example: quorum + routing_key: type: string - example: "Carberry, Josiah" - CreatorDto: + example: dbrepo.database.air_quality + is_public: + type: boolean + example: true + UniqueDto: required: - - creator_name - - id + - columns + - table + - uid type: object properties: - id: + uid: type: integer format: int64 - 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 - example: Personal - enum: - - Personal - - Organizational - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - example: ORCID - enum: - - ORCID - - ROR - - ISNI - - GRID - name_identifier_scheme_uri: - type: string - example: https://orcid.org/ - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - example: ROR - enum: - - ROR - - GRID - - ISNI - affiliation_identifier_scheme_uri: - type: string - example: https://ror.org/ - DatabaseAccessDto: + table: + $ref: '#/components/schemas/TableDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + UnitDto: required: + - columns - created - - type - - user + - id + - uri type: object properties: - user: - $ref: '#/components/schemas/UserDto' - type: + id: + type: integer + format: int64 + uri: + type: string + name: + type: string + description: type: string - enum: - - read - - write_own - - write_all created: type: string format: date-time example: 2021-03-12T15:26:21Z - DatabaseDto: + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + ViewDto: required: + - columns - created - creator - - exchange_name + - database + - database_id - id - internal_name - name - - owner + - query + - query_hash type: object properties: id: type: integer format: int64 + database: + $ref: '#/components/schemas/DatabaseDto' name: type: string example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - description: - type: string - example: Air Quality - tables: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - image: - $ref: '#/components/schemas/ImageDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: + identifiers: type: array items: - $ref: '#/components/schemas/DatabaseAccessDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' + $ref: '#/components/schemas/IdentifierDto' + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC created: type: string format: date-time example: 2021-03-12T15:26:21Z - exchange_name: - type: string - example: dbrepo - exchange_type: - type: string - example: topic + creator: + $ref: '#/components/schemas/UserDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + database_id: + type: integer + format: int64 internal_name: type: string example: air_quality is_public: type: boolean example: true - IdentifierBriefDto: + initial_view: + type: boolean + description: True if it is the default view for the database + example: true + query_hash: + type: string + example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 + last_modified: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + DatabaseTransferDto: + required: + - username + type: object + properties: + username: + type: string + ColumnSemanticsUpdateDto: + type: object + properties: + concept_uri: + type: string + unit_uri: + type: string + DatabaseModifyAccessDto: required: - - creators - - id - - publication_year - type type: object + properties: + type: + type: string + enum: + - read + - write_own + - write_all + QueryPersistDto: + required: + - persist + type: object + properties: + persist: + type: boolean + example: true + QueryDto: + required: + - created + - creator + - database_id + - execution + - id + - is_persisted + - last_modified + - query + - query_hash + type: object properties: id: type: integer format: int64 + creator: + $ref: '#/components/schemas/UserDto' + execution: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + query: + type: string + example: SELECT `id` FROM `air_quality` type: type: string + example: query enum: - - database - - subset + - query - view - titles: + identifiers: type: array items: - $ref: '#/components/schemas/IdentifierTitleDto' - doi: - type: string - example: 10.1038/nphys1170 - publisher: + $ref: '#/components/schemas/IdentifierDto' + created: type: string - example: TU Wien - creators: - type: array - items: - $ref: '#/components/schemas/CreatorBriefDto' + format: date-time + example: 2021-03-12T15:26:21Z database_id: type: integer format: int64 - example: 1 - query_id: + 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 - publication_year: - type: integer - format: int32 - example: 2022 - IdentifierDescriptionDto: + last_modified: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + SignupRequestDto: required: - - id + - email + - password + - username type: object properties: - id: - type: integer - format: int64 - description: + username: + pattern: "^[a-z0-9]{3,}$" type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: + example: user + email: type: string - example: en - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar + example: user@example.com + password: + type: string + OntologyCreateDto: + required: + - prefix + - uri + type: object + properties: + uri: + type: string + example: Ontology URI + prefix: + type: string + example: Ontology prefix + sparql_endpoint: + type: string + example: Ontology SPARQL endpoint + BannerMessageCreateDto: + required: + - message + - type + 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 + ImageCreateDto: + required: + - default_port + - dialect + - driver_class + - jdbc_method + - name + - registry + - version + type: object + properties: + registry: + type: string + example: docker.io/library + name: + type: string + example: mariadb + version: + type: string + dialect: + type: string + driver_class: + type: string + jdbc_method: + type: string + default_port: + maximum: 65535 + minimum: 1024 + type: integer + format: int32 + CreatorSaveDto: + required: + - creator_name + - firstname + - lastname + - name_type + type: object + properties: + id: + type: integer + format: int64 + 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 + example: Personal + enum: + - Personal + - Organizational + name_identifier: + type: string + example: 0000-0002-1825-0097 + name_identifier_scheme: + type: string + example: ORCID + enum: + - ORCID + - ROR + - ISNI + - GRID + affiliation_identifier: + type: string + example: https://ror.org/04d836q62 + affiliation_identifier_scheme: + type: string + example: ROR + enum: + - ROR + - GRID + - ISNI + IdentifierFunderSaveDto: + required: + - funder_name + type: object + properties: + id: + type: integer + format: int64 + funder_name: + type: string + example: European Commission + funder_identifier: + type: string + example: http://doi.org/10.13039/501100000780 + funder_identifier_type: + type: string + example: Crossref Funder ID + enum: + - Crossref Funder ID + - ROR + - GND + - ISNI + - Other + scheme_uri: + type: string + example: http://doi.org/ + award_number: + type: string + example: "824087" + award_title: + type: string + example: EOSC-Life + IdentifierSaveDescriptionDto: + type: object + properties: + id: + type: integer + format: int64 + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + language: + type: string + example: en + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar - an - hy - as @@ -4685,64 +5572,38 @@ components: - TableOfContents - TechnicalInfo - Other - IdentifierDto: + IdentifierSaveDto: required: - - created - creators - - database - - execution - - id - - last_modified + - database_id - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - type - - visibility type: object properties: - id: - type: integer - format: int64 type: type: string + example: database enum: - database - subset + - table - view titles: type: array items: - $ref: '#/components/schemas/IdentifierTitleDto' + $ref: '#/components/schemas/IdentifierSaveTitleDto' descriptions: type: array items: - $ref: '#/components/schemas/IdentifierDescriptionDto' + $ref: '#/components/schemas/IdentifierSaveDescriptionDto' funders: type: array items: - $ref: '#/components/schemas/IdentifierFunderDto' - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - database: - $ref: '#/components/schemas/DatabaseDto' - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - visibility: - type: string - example: everyone - enum: - - everyone - - self - doi: - type: string - example: 10.1038/nphys1170 + $ref: '#/components/schemas/IdentifierFunderSaveDto' + licenses: + type: array + items: + $ref: '#/components/schemas/LicenseDto' publisher: type: string example: TU Wien @@ -4933,18 +5794,10 @@ components: - yo - za - zu - licenses: - type: array - items: - $ref: '#/components/schemas/LicenseDto' creators: type: array items: - $ref: '#/components/schemas/CreatorDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z + $ref: '#/components/schemas/CreatorSaveDto' database_id: type: integer format: int64 @@ -4952,29 +5805,12 @@ components: query_id: type: integer format: int64 - example: 1 view_id: type: integer format: int64 - example: 1 - 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: + table_id: type: integer format: int64 - example: 1 publication_day: type: integer format: int32 @@ -4987,46 +5823,11 @@ components: type: integer format: int32 example: 2022 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - IdentifierFunderDto: - required: - - funder_name - - id - type: object - properties: - id: - type: integer - format: int64 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - example: Crossref Funder ID - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: "824087" - award_title: - type: string - example: EOSC-Life - IdentifierTitleDto: - required: - - id + related_identifiers: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierSaveDto' + IdentifierSaveTitleDto: type: object properties: id: @@ -5225,841 +6026,80 @@ components: - zu type: type: string + example: Subtitle enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - ImageBriefDto: - required: - - id - - name - - version - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: mariadb - version: - type: string - example: "10.5" - ImageDateDto: - required: - - created_at - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - name - - registry - - version - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - name: - type: string - example: mariadb - version: - type: string - example: "10.5" - dialect: - type: string - example: org.hibernate.dialect.MariaDBDialect - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - is_versioned - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - ViewBriefDto: - required: - - created - - creator - - id - - internal_name - - name - - query - - query_hash - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierBriefDto' - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - BannerMessageUpdateDto: - required: - - message - - type - 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 - BannerMessageNotFoundException: - type: object - properties: - cause: - type: object - properties: - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - suppressed: - type: array - items: - type: object - properties: - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - localizedMessage: - type: string - localizedMessage: - type: string - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - suppressed: - type: array - items: - type: object - properties: - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - localizedMessage: - type: string - localizedMessage: - type: string - BannerMessageBriefDto: - required: - - message - - type - 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 - ImageChangeDto: - required: - - dialect - - driver_class - - jdbc_method - - registry - type: object - properties: - registry: - type: string - example: docker.io/library - defaultPort: - maximum: 65535 - minimum: 1024 - type: integer - format: int32 - example: 5432 - dialect: - type: string - example: Postgres - driver_class: - type: string - example: org.postgresql.Driver - jdbc_method: - type: string - example: postgresql - DatabaseModifyVisibilityDto: - required: - - is_public - type: object - properties: - is_public: - type: boolean - example: true - DatabaseTransferDto: - required: - - username - type: object - properties: - username: - type: string - ColumnSemanticsUpdateDto: - type: object - properties: - concept_uri: - type: string - unit_uri: - type: string - ColumnDto: - required: - - auto_generated - - column_type - - database_id - - id - - internal_name - - is_null_allowed - - is_primary_key - - is_public - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Date - alias: - type: string - size: - type: integer - format: int32 - example: 255 - d: - type: integer - format: int32 - example: 0 - concept: - $ref: '#/components/schemas/ConceptDto' - unit: - $ref: '#/components/schemas/UnitDto' - enums: - type: array - items: - type: string - sets: - type: array - items: - type: string - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - date_format: - $ref: '#/components/schemas/ImageDateDto' - auto_generated: - type: boolean - example: false - is_primary_key: - type: boolean - example: true - index_length: - type: integer - format: int32 - column_type: - type: string - example: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - is_public: - type: boolean - example: true - is_null_allowed: - type: boolean - example: false - ConceptDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - UnitDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - DatabaseModifyAccessDto: - required: - - type - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - TableCsvUpdateDto: - required: - - data - - keys - type: object - properties: - data: - type: object - additionalProperties: - type: object - keys: - type: object - additionalProperties: - type: object - QueryPersistDto: - required: - - persist - type: object - properties: - persist: - type: boolean - example: true - QueryDto: - required: - - cid - - created - - creator - - dbid - - execution - - id - - is_persisted - - last_modified - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - cid: - type: integer - format: int64 - dbid: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/UserDto' - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - example: query - enum: - - query - - view - identifier: - $ref: '#/components/schemas/IdentifierDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - SignupRequestDto: - required: - - email - - password - - username - type: object - properties: - username: - pattern: "^[a-z0-9]{3,}$" - type: string - example: user - email: - type: string - example: user@example.com - password: - type: string - UnitSaveDto: - required: - - description - - name - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - OntologyCreateDto: - required: - - prefix - - uri - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - ConceptSaveDto: - required: - - description - - name - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - BannerMessageCreateDto: - required: - - message - - type - 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 - ImageCreateDto: - required: - - default_port - - dialect - - driver_class - - jdbc_method - - name - - registry - - version + - AlternativeTitle + - Subtitle + - TranslatedTitle + - Other + RelatedIdentifierSaveDto: + required: + - value type: object properties: - registry: - type: string - example: docker.io/library - name: - type: string - example: mariadb - version: - type: string - dialect: + value: type: string - driver_class: + example: 10.70124/dc4zh-9ce78 + type: type: string - jdbc_method: + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: type: string - default_port: - maximum: 65535 - minimum: 1024 - type: integer - format: int32 + example: Cites + 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 DatabaseCreateDto: required: - container_id @@ -6082,6 +6122,7 @@ components: - created - hash - id + - image - internal_name - name - running @@ -6096,6 +6137,8 @@ components: name: type: string example: Air Quality + image: + $ref: '#/components/schemas/ImageBriefDto' running: type: boolean example: true @@ -6106,11 +6149,32 @@ components: internal_name: type: string example: air-quality + CreatorBriefDto: + required: + - creator_name + type: object + properties: + affiliation: + type: string + example: Wesleyan University + name_identifier: + type: string + example: https://orcid.org/0000-0002-1825-0097 + name_type: + type: string + example: Personal + enum: + - Personal + - Organizational + creator_name: + type: string + example: "Carberry, Josiah" DatabaseBriefDto: required: - created + - creator + - exchange_name - id - - image - internal_name - name - owner @@ -6122,32 +6186,160 @@ components: name: type: string example: Air Quality - description: - type: string - example: Air Quality in Austria identifier: - $ref: '#/components/schemas/IdentifierBriefDto' - engine: + $ref: '#/components/schemas/IdentifierDto' + description: type: string - example: mariadb:10.5 - owner: - $ref: '#/components/schemas/UserBriefDto' + example: Air Quality + tables: + type: array + items: + $ref: '#/components/schemas/TableBriefDto' + views: + type: array + items: + $ref: '#/components/schemas/ViewBriefDto' + image: + $ref: '#/components/schemas/ImageDto' container: $ref: '#/components/schemas/ContainerBriefDto' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' creator: $ref: '#/components/schemas/UserBriefDto' + owner: + $ref: '#/components/schemas/UserBriefDto' created: type: string format: date-time example: 2021-03-12T15:26:21Z - image: - $ref: '#/components/schemas/ImageBriefDto' + exchange_name: + type: string + example: dbrepo + exchange_type: + type: string + example: topic + internal_name: + type: string + example: air_quality + is_public: + type: boolean + example: true + IdentifierBriefDto: + required: + - creators + - id + - publication_year + - type + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + - table + - view + titles: + type: array + items: + $ref: '#/components/schemas/IdentifierTitleDto' + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + creators: + type: array + items: + $ref: '#/components/schemas/CreatorBriefDto' + database_id: + type: integer + format: int64 + example: 1 + query_id: + type: integer + format: int64 + example: 1 + publication_year: + type: integer + format: int32 + example: 2022 + ImageBriefDto: + required: + - id + - jdbc_method + - name + - version + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: mariadb + version: + type: string + example: "10.5" + jdbc_method: + type: string + example: mariadb + ViewBriefDto: + required: + - created + - creator + - id + - internal_name + - name + - query + - query_hash + - vdbid + type: object + properties: + id: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + name: + type: string + example: Air Quality + identifier: + $ref: '#/components/schemas/IdentifierBriefDto' + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC + created: + type: string + format: date-time + example: 2021-03-12T15:26:21Z + creator: + $ref: '#/components/schemas/UserDto' internal_name: type: string example: air_quality is_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 + last_modified: + type: string + format: date-time + example: 2021-03-12T15:26:21Z DatabaseGiveAccessDto: required: - type @@ -6221,11 +6413,11 @@ components: - year size: type: integer - format: int32 + format: int64 example: 255 d: type: integer - format: int32 + format: int64 example: 0 dfid: type: integer @@ -6248,7 +6440,7 @@ components: example: false index_length: type: integer - format: int32 + format: int64 null_allowed: type: boolean example: true @@ -6333,7 +6525,7 @@ components: properties: location: type: string - example: /tmp/file.csv + example: file.csv separator: type: string example: "," @@ -6517,14 +6709,23 @@ components: type: string internalName: type: string - imageId: - type: integer - format: int64 host: type: string port: type: integer format: int32 + sidecarHost: + type: string + sidecarPort: + type: integer + format: int32 + uiHost: + type: string + uiPort: + type: integer + format: int32 + uiAdditionalFlags: + type: string databases: type: array items: @@ -6611,8 +6812,8 @@ components: nameType: type: string enum: - - Personal - - Organizational + - PERSONAL + - ORGANIZATIONAL nameIdentifier: type: string nameIdentifierScheme: @@ -6638,12 +6839,12 @@ components: type: string identifier: $ref: '#/components/schemas/Identifier' + ieeeName: + type: string apaName: type: string bibtexName: type: string - ieeeName: - type: string Database: type: object properties: @@ -6678,8 +6879,14 @@ components: format: uuid contact: $ref: '#/components/schemas/User' - identifier: - $ref: '#/components/schemas/Identifier' + identifiers: + type: array + items: + $ref: '#/components/schemas/Identifier' + subsets: + type: array + items: + $ref: '#/components/schemas/Identifier' tables: type: array items: @@ -6688,6 +6895,10 @@ components: type: array items: $ref: '#/components/schemas/View' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccess' isPublic: type: boolean created: @@ -6774,6 +6985,9 @@ components: queryId: type: integer format: int64 + tableId: + type: integer + format: int64 viewId: type: integer format: int64 @@ -6991,6 +7205,7 @@ components: enum: - DATABASE - SUBSET + - TABLE - VIEW query: type: string @@ -7015,11 +7230,6 @@ components: publicationDay: type: integer format: int32 - visibility: - type: string - enum: - - VisibilityType.EVERYONE - - VisibilityType.SELF database: $ref: '#/components/schemas/Database' relatedIdentifiers: @@ -7583,10 +7793,26 @@ components: type: array items: $ref: '#/components/schemas/TableColumn' + identifiers: + type: array + items: + $ref: '#/components/schemas/Identifier' constraints: $ref: '#/components/schemas/Constraints' isVersioned: type: boolean + numRows: + type: integer + format: int64 + dataLength: + type: integer + format: int64 + maxDataLength: + type: integer + format: int64 + avgRowLength: + type: integer + format: int64 created: type: string format: date-time @@ -7617,7 +7843,7 @@ components: type: boolean indexLength: type: integer - format: int32 + format: int64 alias: type: string columnType: @@ -7654,7 +7880,7 @@ components: - TableColumnType.YEAR length: type: integer - format: int32 + format: int64 isNullAllowed: type: boolean ordinalPosition: @@ -7677,10 +7903,20 @@ components: type: string size: type: integer - format: int32 + format: int64 d: type: integer - format: int32 + format: int64 + valMin: + type: number + valMax: + type: number + mean: + type: number + median: + type: number + stdDev: + type: number lastModified: type: string format: date-time @@ -7772,6 +8008,8 @@ components: createdBy: type: string format: uuid + creator: + $ref: '#/components/schemas/User' name: type: string internalName: @@ -7784,10 +8022,12 @@ components: type: string queryHash: type: string + identifiers: + type: array + items: + $ref: '#/components/schemas/Identifier' database: $ref: '#/components/schemas/Database' - identifier: - $ref: '#/components/schemas/Identifier' columns: type: array items: @@ -7798,194 +8038,14 @@ components: lastModified: type: string format: date-time - ViewDto: - required: - - columns - - created - - creator - - database - - database_id - - id - - internal_name - - name - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - database: - $ref: '#/components/schemas/DatabaseDto' - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - ConstraintsDto: - type: object - properties: - uniques: - type: array - items: - $ref: '#/components/schemas/UniqueDto' - checks: - type: array - items: - type: string - foreign_keys: - type: array - items: - $ref: '#/components/schemas/ForeignKeyDto' - ForeignKeyDto: - type: object - properties: - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - referenced_table: - $ref: '#/components/schemas/TableBriefDto' - referenced_columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - TableDto: - required: - - columns - - created - - created_by - - creator - - database - - id - - internal_name - - is_public - - is_versioned - - name - - owner - - queue_name - - routing_key - type: object - properties: - id: - type: integer - format: int64 - database: - $ref: '#/components/schemas/DatabaseDto' - name: - type: string - example: Air Quality - creator: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - description: - type: string - example: Air Quality in Austria - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - constraints: - $ref: '#/components/schemas/ConstraintsDto' - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - created_by: - type: string - format: uuid - queue_name: - type: string - example: air_quality - queue_type: - type: string - example: quorum - routing_key: - type: string - example: dbrepo.database.air_quality - is_public: - type: boolean - example: true - UniqueDto: - required: - - columns - - table - - uid - type: object - properties: - uid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/TableDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' QueryBriefDto: required: - - cid - created - creator - - dbid + - database_id - execution - id + - is_persisted - last_modified - query - query_hash @@ -7994,12 +8054,6 @@ components: id: type: integer format: int64 - cid: - type: integer - format: int64 - dbid: - type: integer - format: int64 creator: $ref: '#/components/schemas/UserDto' execution: @@ -8014,12 +8068,17 @@ components: enum: - query - view - identifier: - $ref: '#/components/schemas/IdentifierBriefDto' + identifiers: + type: array + items: + $ref: '#/components/schemas/IdentifierBriefDto' created: type: string format: date-time example: 2021-03-12T15:26:21Z + database_id: + type: integer + format: int64 query_normalized: type: string example: SELECT `id` FROM `air_quality` @@ -8033,6 +8092,9 @@ components: type: integer format: int64 example: 1 + is_persisted: + type: boolean + example: true last_modified: type: string format: date-time diff --git a/.docs/.swagger/api-mirror.yaml b/.docs/.swagger/api-mirror.yaml deleted file mode 100644 index 2310a7fd8b..0000000000 --- a/.docs/.swagger/api-mirror.yaml +++ /dev/null @@ -1,14 +0,0 @@ -openapi: 3.0.1 -info: - title: OpenAPI definition - version: v0 -servers: -- url: http://localhost:9050 - description: Generated server url -paths: {} -components: - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/api-query.yaml b/.docs/.swagger/api-query.yaml deleted file mode 100644 index 16168d93b0..0000000000 --- a/.docs/.swagger/api-query.yaml +++ /dev/null @@ -1,2520 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository Query Service API - description: Service that manages the queries - 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.2.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9093 - description: Generated server url -- url: https://dbrepo2.tuwien.ac.at - description: Sandbox -paths: - /api/container/{id}/database/{databaseId}/table/{tableId}/history: - get: - tags: - - table-history-endpoint - summary: Find all history - operationId: getAll - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Find table history is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find table history successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableHistoryDto' - "404": - description: "Table, database or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to query table history - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table history query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - head: - tags: - - table-history-endpoint - summary: Find all history - operationId: getAll_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Find table history is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find table history successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableHistoryDto' - "404": - description: "Table, database or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to query table history - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table history query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/table/{tableId}/data: - get: - tags: - - table-data-endpoint - summary: Find data - operationId: getAll_2 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - 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: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - responses: - "200": - description: OK - content: - '*/*': - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - bearerAuth: [] - put: - tags: - - table-data-endpoint - summary: Update data - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCsvUpdateDto' - required: true - responses: - "200": - description: OK - deprecated: true - security: - - bearerAuth: [] - post: - tags: - - table-data-endpoint - summary: Insert data - operationId: insert - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCsvDto' - required: true - responses: - "200": - description: OK - security: - - bearerAuth: [] - delete: - tags: - - table-data-endpoint - summary: Delete data - operationId: delete_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCsvDeleteDto' - required: true - responses: - "200": - description: OK - security: - - bearerAuth: [] - head: - tags: - - table-data-endpoint - summary: Find data - operationId: getAll_3 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - 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: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - responses: - "200": - description: OK - content: - '*/*': - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/query/{queryId}: - get: - tags: - - store-endpoint - summary: Find some query - operationId: find_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: List queries - content: - application/json: - schema: - $ref: '#/components/schemas/QueryDto' - "404": - description: "Database, query or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find query is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to select query - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - put: - tags: - - store-endpoint - summary: Persist some query - operationId: persist - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: "Database, query or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Persist query successful - content: - application/json: - schema: - $ref: '#/components/schemas/QueryDto' - "405": - description: Persist query is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to persist query - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Query is already persisted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/view: - get: - tags: - - view-endpoint - summary: Find all views - operationId: findAll - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find views is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find views successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - security: - - bearerAuth: [] - post: - tags: - - view-endpoint - summary: Create a view - operationId: create - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ViewCreateDto' - required: true - responses: - "401": - description: Credentials missing - 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' - "405": - description: Create view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Create view successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ViewBriefDto' - "423": - description: Create view resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Create view query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/table/{tableId}/data/import: - post: - tags: - - table-data-endpoint - summary: Insert data from csv - operationId: importCsv - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ImportDto' - required: true - responses: - "200": - description: OK - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/query: - get: - tags: - - store-endpoint - summary: Find queries - operationId: findAll_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: persisted - in: query - required: false - schema: - type: boolean - responses: - "405": - description: Find all queries is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to select query - 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' - "423": - description: Selection of time-versioned query resulted in an invalid query - statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: List queries - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/QueryBriefDto' - security: - - bearerAuth: [] - post: - tags: - - query-endpoint - summary: Execute query - operationId: execute - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ExecuteStatementDto' - required: true - responses: - "200": - description: OK - content: - '*/*': - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/view/{viewId}: - get: - tags: - - view-endpoint - summary: Find one view - operationId: find - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Find view successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ViewDto' - "404": - description: "Database, view or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - delete: - tags: - - view-endpoint - summary: Delete one view - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "401": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Credentials missing - 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' - "400": - description: Delete view query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Delete view successfully - "423": - description: Delete view resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Delete view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/view/{viewId}/data: - get: - tags: - - view-endpoint - summary: Find view data - operationId: data - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - - 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: Find data successfully - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - "401": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Find data resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "417": - description: Parsing of resulting columns failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to query view data - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, view, container or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Pagination not in valid range or find data query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find data is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/view/{viewId}/data/count: - get: - tags: - - view-endpoint - summary: Find view data count - operationId: count - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: integer - format: int64 - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/table/{tableId}/export: - get: - tags: - - export-endpoint - summary: Export table - operationId: export - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "200": - description: OK - content: - '*/*': - schema: - type: string - format: binary - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/table/{tableId}/data/count: - get: - tags: - - table-data-endpoint - summary: Find data - operationId: getCount - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "200": - description: OK - content: - '*/*': - schema: - type: integer - format: int64 - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/query/{queryId}/export: - get: - tags: - - query-endpoint - summary: Exports some query - operationId: export_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: OK - content: - '*/*': - schema: - type: object - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/query/{queryId}/data: - get: - tags: - - query-endpoint - summary: Re-execute some query - operationId: reExecute - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - responses: - "200": - description: OK - content: - '*/*': - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/query/{queryId}/data/count: - get: - tags: - - query-endpoint - summary: Re-execute some query - operationId: reExecuteCount - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: OK - content: - '*/*': - schema: - type: integer - format: int64 - security: - - bearerAuth: [] -components: - schemas: - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - TableHistoryDto: - required: - - event - - timestamp - - total - type: object - properties: - timestamp: - type: string - format: date-time - event: - type: string - total: - type: integer - format: int64 - example: 1 - QueryResultDto: - required: - - id - - result - type: object - properties: - result: - type: array - items: - type: object - additionalProperties: - type: object - id: - type: integer - format: int64 - result_number: - type: integer - format: int64 - example: 1 - TableCsvUpdateDto: - required: - - data - - keys - type: object - properties: - data: - type: object - additionalProperties: - type: object - keys: - type: object - additionalProperties: - type: object - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - ContainerDto: - required: - - created - - hash - - id - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - state: - type: string - example: running - enum: - - created - - restarting - - running - - paused - - exited - - dead - database: - $ref: '#/components/schemas/DatabaseDto' - running: - type: boolean - example: true - image: - $ref: '#/components/schemas/ImageBriefDto' - port: - type: integer - format: int32 - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - internal_name: - type: string - example: air-quality - ip_address: - type: string - CreatorDto: - required: - - firstname - - id - - lastname - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - orcid: - type: string - example: 0000-0002-1825-0097 - DatabaseAccessDto: - required: - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - DatabaseDto: - required: - - creator - - exchange_name - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - description: - type: string - example: Weather Australia 2009-2021 - tables: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - image: - $ref: '#/components/schemas/ImageDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - exchange_name: - type: string - example: dbrepo/air_quality - internal_name: - type: string - example: weather_australia - is_public: - type: boolean - example: true - IdentifierDto: - required: - - container id - - creators - - database id - - execution - - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - - title - - type - - visibility - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - visibility: - type: string - example: everyone - enum: - - everyone - - self - doi: - type: string - example: 10.1038/nphys1170 - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorDto' - created: - type: string - format: date-time - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifierDto' - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - 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 - last_modified: - type: string - format: date-time - ImageBriefDto: - required: - - id - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - ImageDateDto: - required: - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - dialect: - type: string - example: org.hibernate.dialect.MariaDBDialect - hash: - type: string - example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e - compiled: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - size: - type: integer - example: 314295447 - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - LicenseDto: - required: - - identifier - - uri - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - QueryDto: - required: - - cid - - created - - creator - - dbid - - id - - is_persisted - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - cid: - type: integer - format: int64 - dbid: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/UserDto' - execution: - type: string - format: date-time - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - example: query - enum: - - query - - view - identifier: - $ref: '#/components/schemas/IdentifierDto' - created: - type: string - format: date-time - 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 - last_modified: - type: string - format: date-time - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - last_modified: - type: string - format: date-time - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - UserAttributeDto: - type: object - properties: - name: - type: string - example: theme_dark - value: - type: string - example: "true" - UserBriefDto: - required: - - id - - username - 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 - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - UserDto: - required: - - email - - email_verified - - id - - username - 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 - attributes: - type: array - items: - $ref: '#/components/schemas/UserAttributeDto' - containers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - databases: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - email: - type: string - example: jcarberry@brown.edu - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ViewBriefDto: - required: - - created - - creator - - id - - internal_name - - name - - query - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - creator: - $ref: '#/components/schemas/UserDto' - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - last_modified: - type: string - format: date-time - ViewCreateDto: - required: - - is_public - - name - - query - type: object - properties: - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` - is_public: - type: boolean - example: true - TableCsvDto: - required: - - data - type: object - properties: - data: - type: object - additionalProperties: - type: object - ImportDto: - required: - - location - - separator - type: object - properties: - location: - type: string - example: /tmp/file.csv - separator: - type: string - example: "," - quote: - type: string - example: '"' - skip_lines: - minimum: 0 - type: integer - format: int64 - false_element: - type: string - true_element: - type: string - null_element: - type: string - example: NA - ExecuteStatementDto: - required: - - statement - type: object - properties: - statement: - type: string - example: SELECT `id` FROM `air_quality` - timestamp: - type: string - description: Execute query for data at this timestamp - format: date-time - ViewDto: - required: - - created - - creator - - database - - id - - internalName - - name - - query - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - database: - $ref: '#/components/schemas/DatabaseDto' - name: - type: string - example: Air Quality - internalName: - type: string - example: air_quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - creator: - $ref: '#/components/schemas/UserDto' - is_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - last_modified: - type: string - format: date-time - CreatorBriefDto: - required: - - firstname - - lastname - type: object - properties: - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - IdentifierBriefDto: - required: - - container id - - creators - - database id - - id - - publication_year - - title - - type - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - type: - type: string - enum: - - database - - subset - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - creators: - type: array - items: - $ref: '#/components/schemas/CreatorBriefDto' - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - QueryBriefDto: - required: - - cid - - created - - creator - - dbid - - id - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - cid: - type: integer - format: int64 - dbid: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/UserDto' - execution: - type: string - format: date-time - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - example: query - enum: - - query - - view - identifier: - $ref: '#/components/schemas/IdentifierBriefDto' - created: - type: string - format: date-time - query_normalized: - type: string - example: SELECT `id` FROM `air_quality` - query_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - result_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - result_number: - type: integer - format: int64 - example: 1 - last_modified: - type: string - format: date-time - TableCsvDeleteDto: - required: - - keys - type: object - properties: - keys: - type: object - additionalProperties: - type: object - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/api-search.yaml b/.docs/.swagger/api-search.yaml similarity index 96% rename from .docs/api-search.yaml rename to .docs/.swagger/api-search.yaml index 78ad885e9b..c600998d58 100644 --- a/.docs/api-search.yaml +++ b/.docs/.swagger/api-search.yaml @@ -12,7 +12,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: Database Repository Search Service API - version: 1.4.0 + version: dbrepo-latest openapi: 3.0.0 paths: {} servers: diff --git a/.docs/.swagger/api-semantics.yaml b/.docs/.swagger/api-semantics.yaml deleted file mode 100644 index c001c6d7bb..0000000000 --- a/.docs/.swagger/api-semantics.yaml +++ /dev/null @@ -1,685 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository Semantic Service API - description: Service that manages the tables - 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.2.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9097 - description: Generated server url -- url: https://dbrepo2.tuwien.ac.at - description: Sandbox -paths: - /api/semantic/ontology/{id}: - get: - tags: - - ontology-endpoint - summary: Find one ontology - operationId: find - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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 an ontology - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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: [] - delete: - tags: - - ontology-endpoint - summary: Delete an ontology - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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: [] - /api/semantic/unit: - get: - tags: - - semantics-endpoint - summary: List semantic units - operationId: findAllUnits - responses: - "200": - description: Find all semantic units - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UnitDto' - post: - tags: - - semantics-endpoint - summary: Save a semantic unit - operationId: saveUnit - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UnitSaveDto' - required: true - responses: - "202": - description: Saved a semantic unit - content: - application/json: - schema: - $ref: '#/components/schemas/UnitDto' - security: - - bearerAuth: [] - /api/semantic/ontology: - get: - tags: - - ontology-endpoint - summary: List all ontologies - operationId: findAll - responses: - "200": - description: List all ontologies - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/OntologyDto' - post: - tags: - - ontology-endpoint - summary: Register a new ontology - operationId: create - 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: [] - /api/semantic/concept: - get: - tags: - - semantics-endpoint - summary: List semantic concepts - operationId: findAllConcepts - responses: - "200": - description: Find all semantic concepts - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ConceptDto' - post: - tags: - - semantics-endpoint - summary: Create or update a semantic concept - operationId: saveUnit_1 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ConceptSaveDto' - required: true - responses: - "202": - description: Saved a semantic concept - content: - application/json: - schema: - $ref: '#/components/schemas/ConceptDto' - security: - - bearerAuth: [] - /api/semantic/ontology/{id}/entity: - get: - tags: - - query-endpoint - summary: Find entities - operationId: find_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - 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' - "417": - description: Generated query or uri is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Filter params are invalid - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/semantic/database/{databaseId}/table/{tableId}: - get: - tags: - - table-endpoint - summary: Suggest table semantics - operationId: analyseTable - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "417": - description: Generated query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Could not find the table - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Suggested table semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableColumnEntityDto' - security: - - bearerAuth: [] - /api/semantic/database/{databaseId}/table/{tableId}/column/{columnId}: - get: - tags: - - table-endpoint - summary: Suggest table column semantics - operationId: analyseTableColumn - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: columnId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "417": - description: Generated query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Suggested table column semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableColumnEntityDto' - "404": - description: Could not find the table column - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] -components: - schemas: - OntologyModifyDto: - required: - - prefix - - uri - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - OntologyDto: - required: - - created - - id - - prefix - - rdf - - sparql - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql: - type: boolean - example: true - rdf: - type: boolean - example: true - creator: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - UserBriefDto: - required: - - id - - username - 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 - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - UnitSaveDto: - required: - - description - - name - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - UnitDto: - required: - - columns - - created - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - OntologyCreateDto: - required: - - prefix - - uri - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - ConceptSaveDto: - required: - - description - - name - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - ConceptDto: - required: - - columns - - created - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - EntityDto: - required: - - label - - uri - 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 - TableColumnEntityDto: - required: - - columnId - - databaseId - - tableId - - uri - type: object - properties: - databaseId: - type: integer - format: int64 - example: 1 - tableId: - type: integer - format: int64 - example: 1 - columnId: - type: integer - format: int64 - example: 1 - 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 - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/api-sidecar.yaml b/.docs/.swagger/api-sidecar.yaml similarity index 99% rename from .docs/api-sidecar.yaml rename to .docs/.swagger/api-sidecar.yaml index c10a7078fc..30546cb579 100644 --- a/.docs/api-sidecar.yaml +++ b/.docs/.swagger/api-sidecar.yaml @@ -21,7 +21,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: Database Repository Data Database sidecar API - version: 1.4.0 + version: dbrepo-latest openapi: 3.0.0 paths: /health: diff --git a/.docs/.swagger/api-table.yaml b/.docs/.swagger/api-table.yaml deleted file mode 100644 index 9639c5fc4e..0000000000 --- a/.docs/.swagger/api-table.yaml +++ /dev/null @@ -1,860 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository Table Service API - description: Service that manages the tables - 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.2.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9094 - description: Generated server url -- url: https://dbrepo2.tuwien.ac.at - description: Sandbox -paths: - /api/container/{id}/database/{databaseId}/table/{tableId}/column/{columnId}: - put: - tags: - - table-column-endpoint - summary: Update a table column semantic mapping - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: columnId - in: path - required: true - schema: - type: integer - format: int64 - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ColumnSemanticsUpdateDto' - required: true - responses: - "404": - description: "Table, database, semantic concept, unit of measurement or\ - \ container could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Updated column semantics successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ColumnDto' - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Update semantic concept query is malformed or update unit of - measurement query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Update column semantics not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ColumnDto' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/table: - get: - tags: - - table-endpoint - summary: List all tables - operationId: list - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: List tables not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: List tables - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - security: - - bearerAuth: [] - post: - tags: - - table-endpoint - summary: Create a table - operationId: create - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCreateDto' - required: true - responses: - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Broker service failed to create queue - 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' - "405": - description: Create table not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - security: - - bearerAuth: [] - /api/container/{id}/database/{databaseId}/table/{tableId}: - get: - tags: - - table-endpoint - summary: Get information about table - operationId: findById - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Find table not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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: [] - delete: - tags: - - table-endpoint - summary: Delete a table - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Delete table successfully - content: - application/json: - schema: - $ref: '#/components/schemas/TableDto' - "405": - description: Delete table not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Delete table resulted in an invalid state - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - security: - - bearerAuth: [] -components: - schemas: - ColumnSemanticsUpdateDto: - type: object - properties: - concept_uri: - type: string - unit_uri: - type: string - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - ColumnDto: - required: - - auto_generated - - column_type - - id - - internal_name - - is_null_allowed - - is_primary_key - - is_public - - name - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Date - length: - type: integer - format: int32 - example: 255 - concept: - $ref: '#/components/schemas/ConceptDto' - unit: - $ref: '#/components/schemas/UnitDto' - internal_name: - type: string - example: mdb_date - date_format: - $ref: '#/components/schemas/ImageDateDto' - auto_generated: - type: boolean - example: false - is_primary_key: - type: boolean - example: true - index_length: - type: integer - format: int32 - column_type: - type: string - example: string - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - is_public: - type: boolean - example: true - is_null_allowed: - type: boolean - example: false - enum_values: - type: array - items: - type: string - ConceptDto: - required: - - columns - - created - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - ImageDateDto: - required: - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - UnitDto: - required: - - columns - - created - - uri - type: object - properties: - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - ColumnCreateDto: - required: - - name - - null_allowed - - primary_key - - type - type: object - properties: - name: - type: string - example: Date - type: - type: string - example: string - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - length: - type: integer - format: int32 - example: 255 - dfid: - type: integer - description: date format id - format: int64 - primary_key: - type: boolean - example: false - index_length: - type: integer - format: int32 - null_allowed: - type: boolean - example: true - enum_values: - type: array - description: "enum values, only considered when type = ENUM" - items: - type: string - description: "enum values, only considered when type = ENUM" - ConstraintsCreateDto: - type: object - properties: - uniques: - type: array - items: - type: array - items: - type: string - checks: - type: array - items: - type: string - foreign_keys: - type: array - items: - $ref: '#/components/schemas/ForeignKeyCreateDto' - ForeignKeyCreateDto: - type: object - properties: - columns: - type: array - items: - type: string - referenced_table: - type: string - referenced_columns: - type: array - items: - type: string - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - TableCreateDto: - required: - - columns - - description - - name - type: object - properties: - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - columns: - type: array - items: - $ref: '#/components/schemas/ColumnCreateDto' - constraints: - $ref: '#/components/schemas/ConstraintsCreateDto' - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - UserBriefDto: - required: - - id - - username - 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 - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ConstraintsDto: - type: object - properties: - uniques: - type: array - items: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - checks: - type: array - items: - type: string - foreign_keys: - type: array - items: - $ref: '#/components/schemas/ForeignKeyDto' - ForeignKeyDto: - type: object - properties: - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - referenced_table: - $ref: '#/components/schemas/TableBriefDto' - referenced_columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - TableDto: - required: - - columns - - creator - - description - - id - - internal_name - - is_public - - name - - owner - - queue_name - - routing_key - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' - description: - type: string - example: Air Quality in Austria - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - constraints: - $ref: '#/components/schemas/ConstraintsDto' - internal_name: - type: string - example: air_quality - queue_name: - type: string - example: dbrepo/air_quality/air_quality - routing_key: - type: string - example: dbrepo/air_quality/air_quality/1 - is_public: - type: boolean - example: true - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/api-upload.yaml b/.docs/.swagger/api-upload.yaml index 6f93138b86..ed8e507073 100644 --- a/.docs/.swagger/api-upload.yaml +++ b/.docs/.swagger/api-upload.yaml @@ -1,4 +1,4 @@ -openapi: 3.0.1 +openapi: 3.0.0 info: title: Database Repository Upload Service API description: Service that manages the uploads @@ -8,23 +8,23 @@ info: license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.3.0 + version: 1.4.9 externalDocs: description: Sourcecode Documentation url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services servers: -- url: http://localhost:1080 - description: Generated server url -- url: https://test.dbrepo.tuwien.ac.at - description: Sandbox + - url: http://localhost:1080 + description: Generated server url + - url: https://test.dbrepo.tuwien.ac.at + description: Sandbox paths: /api/upload/files: post: tags: - - upload-endpoint + - upload-endpoint summary: Uploads a file operationId: upload responses: "201": description: "Successfully uploaded a file" - security: {} \ No newline at end of file + security: { } \ No newline at end of file diff --git a/.docs/.swagger/api-user.yaml b/.docs/.swagger/api-user.yaml deleted file mode 100644 index 56bd25f538..0000000000 --- a/.docs/.swagger/api-user.yaml +++ /dev/null @@ -1,1521 +0,0 @@ -openapi: 3.0.1 -info: - title: Database Repository User Service API - description: Service that manages the users - 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.2.0 -externalDocs: - description: Wiki Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/wikis -servers: -- url: http://localhost:9098 - description: Generated server url -paths: - /api/user/{id}: - get: - tags: - - user-endpoint - summary: Get a user info - operationId: find - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - "404": - description: User was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found user - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - security: - - bearerAuth: [] - put: - tags: - - user-endpoint - summary: Modify user information - operationId: modify - parameters: - - name: id - in: path - required: true - schema: - type: string - 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' - "405": - description: Modify user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: User attribute was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/user/{id}/theme: - put: - tags: - - user-endpoint - summary: Modify user theme - operationId: theme - parameters: - - name: id - in: path - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserThemeSetDto' - required: true - responses: - "405": - description: Modify user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: User or user attribute was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modified user theme - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - security: - - bearerAuth: [] - /api/user/{id}/password: - put: - tags: - - user-endpoint - summary: Modify user password - operationId: password - parameters: - - name: id - in: path - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserPasswordDto' - required: true - responses: - "404": - description: User was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Modify user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modified user password - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - security: - - bearerAuth: [] - /api/maintenance/message/{id}: - get: - tags: - - maintenance-endpoint - summary: Find one maintenance message - operationId: find_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Get messages - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageDto' - put: - tags: - - maintenance-endpoint - summary: Update maintenance message - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageUpdateDto' - required: true - responses: - "404": - description: Could not find message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageNotFoundException' - "202": - description: Updated message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageBriefDto' - delete: - tags: - - maintenance-endpoint - summary: Delete maintenance message - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "202": - description: Deleted message - content: - application/json: {} - "404": - description: Could not find message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageNotFoundException' - /api/user: - get: - tags: - - user-endpoint - summary: Find all users - operationId: findAll - responses: - "200": - description: List users - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UserBriefDto' - post: - tags: - - user-endpoint - summary: Create user - operationId: create - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/SignupRequestDto' - required: true - responses: - "409": - description: User with username already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Realm or default role not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created user - content: - application/json: - schema: - $ref: '#/components/schemas/UserBriefDto' - "417": - description: User with e-mail already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - /api/maintenance/message: - get: - tags: - - maintenance-endpoint - summary: Find maintenance messages - operationId: list - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/BannerMessageDto' - post: - tags: - - maintenance-endpoint - summary: Create maintenance message - operationId: create_1 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageCreateDto' - required: true - responses: - "201": - description: Created message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageBriefDto' - /api/maintenance/message/active: - get: - tags: - - maintenance-endpoint - summary: Find active maintenance messages - operationId: active - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/BannerMessageBriefDto' -components: - schemas: - 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 - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - enum - - number - - decimal - - string - - text - - boolean - - date - - timestamp - - blob - ContainerDto: - required: - - created - - hash - - id - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - state: - type: string - example: running - enum: - - created - - restarting - - running - - paused - - exited - - dead - database: - $ref: '#/components/schemas/DatabaseDto' - running: - type: boolean - example: true - image: - $ref: '#/components/schemas/ImageBriefDto' - port: - type: integer - format: int32 - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - internal_name: - type: string - example: air-quality - ip_address: - type: string - CreatorDto: - required: - - firstname - - id - - lastname - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - orcid: - type: string - example: 0000-0002-1825-0097 - DatabaseAccessDto: - required: - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - DatabaseDto: - required: - - creator - - exchange_name - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - description: - type: string - example: Weather Australia 2009-2021 - tables: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - image: - $ref: '#/components/schemas/ImageDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - exchange_name: - type: string - example: dbrepo/air_quality - internal_name: - type: string - example: weather_australia - is_public: - type: boolean - example: true - IdentifierDto: - required: - - container id - - creators - - database id - - execution - - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - - title - - type - - visibility - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - title: - type: string - example: "Airquality Stephansplatz, Vienna, Austria" - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - visibility: - type: string - example: everyone - enum: - - everyone - - self - doi: - type: string - example: 10.1038/nphys1170 - 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 - license: - $ref: '#/components/schemas/LicenseDto' - creators: - type: array - items: - $ref: '#/components/schemas/CreatorDto' - created: - type: string - format: date-time - container id: - type: integer - format: int64 - example: 1 - database id: - type: integer - format: int64 - example: 1 - query id: - type: integer - format: int64 - example: 1 - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifierDto' - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - 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 - last_modified: - type: string - format: date-time - ImageBriefDto: - required: - - id - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - ImageDateDto: - required: - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - registry - - repository - - tag - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - repository: - type: string - example: mariadb - tag: - type: string - example: "10.5" - dialect: - type: string - example: org.hibernate.dialect.MariaDBDialect - hash: - type: string - example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e - compiled: - type: string - format: date-time - example: 2021-03-12T15:26:21.678396092Z - size: - type: integer - example: 314295447 - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - LicenseDto: - required: - - identifier - - uri - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - last_modified: - type: string - format: date-time - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - UserAttributeDto: - type: object - properties: - name: - type: string - example: theme_dark - value: - type: string - example: "true" - UserBriefDto: - required: - - id - - username - 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 - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - UserDto: - required: - - email - - email_verified - - id - - username - 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 - attributes: - type: array - items: - $ref: '#/components/schemas/UserAttributeDto' - containers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - databases: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/ContainerDto' - email: - type: string - example: jcarberry@brown.edu - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - email_verified: - type: boolean - example: true - ViewBriefDto: - required: - - created - - creator - - id - - internal_name - - name - - query - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - creator: - $ref: '#/components/schemas/UserDto' - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - last_modified: - type: string - format: date-time - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: STATUS - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - UserThemeSetDto: - required: - - theme_dark - type: object - properties: - theme_dark: - type: boolean - example: true - UserPasswordDto: - required: - - password - type: object - properties: - password: - type: string - BannerMessageUpdateDto: - required: - - message - - type - 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 - display_end: - type: string - format: date-time - BannerMessageNotFoundException: - type: object - properties: - cause: - type: object - properties: - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - suppressed: - type: array - items: - type: object - properties: - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - localizedMessage: - type: string - localizedMessage: - type: string - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - suppressed: - type: array - items: - type: object - properties: - stackTrace: - type: array - items: - type: object - properties: - classLoaderName: - type: string - moduleName: - type: string - moduleVersion: - type: string - methodName: - type: string - fileName: - type: string - lineNumber: - type: integer - format: int32 - nativeMethod: - type: boolean - className: - type: string - message: - type: string - localizedMessage: - type: string - localizedMessage: - type: string - BannerMessageBriefDto: - required: - - message - - type - 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 - SignupRequestDto: - required: - - email - - password - - username - type: object - properties: - username: - pattern: "^[a-z0-9]{3,}$" - type: string - example: user - email: - type: string - example: user@example.com - password: - type: string - BannerMessageCreateDto: - required: - - message - - type - 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 - display_end: - type: string - format: date-time - BannerMessageDto: - required: - - id - - message - - type - type: object - properties: - id: - type: integer - format: int64 - 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 - display_end: - type: string - format: date-time - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/fetch.sh b/.docs/.swagger/fetch.sh deleted file mode 100644 index 378878f0ad..0000000000 --- a/.docs/.swagger/fetch.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# This script is executed before pushing to the pipeline for the moment. -# @author: Martin Weise - -declare -A services -services[5000]=analyse -services[9050]=mirror -services[9093]=data -services[9099]=metadata - -function retrieve () { - if [[ "$2" == analyse ]]; then - echo "... retrieve json api from localhost:$1" - wget "http://localhost:$1/api-$2.json" -O "./.docs/.swagger/api-$2.yaml" -q - else - echo "... retrieve yaml api from localhost:$1" - wget "http://localhost:$1/v3/api-docs.yaml" -O "./.docs/.swagger/api-$2.yaml" -q - fi -} - -for key in "${!services[@]}"; do - echo "Generating ${services[$key]} API" - retrieve "$key" "${services[$key]}" -done \ No newline at end of file diff --git a/.docs/.swagger/generate.sh b/.docs/.swagger/generate.sh deleted file mode 100644 index 5752f1578e..0000000000 --- a/.docs/.swagger/generate.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# clean up -echo "clean up ./dist ./site" -rm -rf ./dist ./site - -# ensure target directories are present -echo "ensure target directory ./site are present" -mkdir -p ./site - -# extract static site -echo "extract static site .docs/.swagger/dist.tar.gz" -tar xzf .docs/.swagger/dist.tar.gz -for service in "analyse" "mirror" "data" "metadata" "upload"; do - mkdir -p ./site/$service - echo "extract static site ./dist -> ./site/$service" - cp -r ./dist/* ./site/$service - echo "placing .docs/.swagger/api-$service.yaml -> ./site/$service/api.yaml" - cp ".docs/.swagger/api-$service.yaml" "./site/$service/api.yaml" -done \ No newline at end of file diff --git a/.docs/generate_swagger.sh b/.docs/.swagger/swagger-generate.sh similarity index 72% rename from .docs/generate_swagger.sh rename to .docs/.swagger/swagger-generate.sh index 2c4fa9f572..1469a23bd0 100644 --- a/.docs/generate_swagger.sh +++ b/.docs/.swagger/swagger-generate.sh @@ -9,23 +9,14 @@ services[3305]=sidecar function retrieve () { if [[ "$2" == analyse ]] || [[ "$2" == search ]] || [[ "$2" == sidecar ]]; then echo "... retrieve json api from localhost:$1" - curl -sSL "http://localhost:$1/api-$2.json" | yq -y > "./.docs/api-$2.yaml" + curl -sSL "http://localhost:$1/api-$2.json" | yq -y > "./.docs/.swagger/api-$2.yaml" else echo "... retrieve yaml api from localhost:$1" - curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/api-$2.yaml" + curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/.swagger/api-$2.yaml" fi } -function version () { - echo "... version to ${TAG}" - REGEX="s/dbrepo-latest/${TAG}/g" - sed -i $REGEX ./.docs/api-$1.yaml -} - for key in "${!services[@]}"; do echo "Generating ${services[$key]} API" retrieve "$key" "${services[$key]}" - version "${services[$key]}" done -echo "Generating upload API" -version upload \ No newline at end of file diff --git a/.docs/.swagger/swagger-site.sh b/.docs/.swagger/swagger-site.sh new file mode 100644 index 0000000000..98b8056a77 --- /dev/null +++ b/.docs/.swagger/swagger-site.sh @@ -0,0 +1,27 @@ +#!/bin/bash +declare -A services +services[1080]=upload +services[4000]=search +services[5000]=analyse +services[9093]=data +services[9099]=metadata +services[3305]=sidecar + +# clean up +echo "clean up ./dist ./site" +rm -rf ./dist ./site + +# ensure target directories are present +echo "ensure target directory ./site are present" +mkdir -p ./site + +# extract static site +echo "extract static site .docs/.swagger/dist.tar.gz" +tar xzf .docs/.swagger/dist.tar.gz +for key in "${!services[@]}"; do + mkdir -p ./site/${services[$key]} + echo "extract static site ./dist -> ./site/${services[$key]}" + cp -r ./dist/* ./site/${services[$key]} + echo "placing .docs/.swagger/api-${services[$key]}.yaml -> ./site/${services[$key]}/api.yaml" + cp ".docs/.swagger/api-${services[$key]}.yaml" "./site/${services[$key]}/api.yaml" +done \ No newline at end of file diff --git a/.docs/.swagger/swagger-version.sh b/.docs/.swagger/swagger-version.sh new file mode 100644 index 0000000000..1d400055ba --- /dev/null +++ b/.docs/.swagger/swagger-version.sh @@ -0,0 +1,17 @@ +#!/bin/bash +declare -A services +services[1080]=upload +services[4000]=search +services[5000]=analyse +services[9093]=data +services[9099]=metadata +services[3305]=sidecar + +function version () { + sed -i "s/dbrepo-latest/${TAG}/g" "./.docs/.swagger/api-$1.yaml" +} + +for key in "${!services[@]}"; do + echo "Version ${services[$key]} API" + version "${services[$key]}" +done diff --git a/.docs/api-analyse.yaml b/.docs/api-analyse.yaml deleted file mode 100644 index b05862a7fe..0000000000 --- a/.docs/api-analyse.yaml +++ /dev/null @@ -1,105 +0,0 @@ -components: - schemas: {} -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -info: - contact: - email: andreas.rauber@tuwien.ac.at - name: Prof. Andreas Rauber - description: Service that analyses data structures - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - title: Database Repository Analyse Service API - version: 1.4.0 -openapi: 3.0.0 -paths: - /api/analyse/determinedt: - post: - consumes: - - application/json - description: This is a simple API which returns the datatypes of a (path) csv - file - parameters: - - description: to-do description - in: body - name: body - required: true - schema: - properties: - enum: - example: true - type: boolean - enum_tol: - example: 0.1 - filename: - example: sample.csv - type: string - separator: - example: ',' - type: string - type: object - produces: - - application/json - responses: - '200': - description: OK - '405': - description: Invalid input - summary: Determine datatypes - /api/analyse/determinepk: - post: - consumes: - - application/json - description: This is a simple API which returns the primary keys + ranking of - a (path) csv file - parameters: - - description: to-do description - in: body - name: body - required: true - schema: - properties: - filepath: - example: /data/testdt08.csv - type: string - seperator: - example: ',' - type: string - type: object - produces: - - application/json - responses: - '200': - description: OK - '405': - description: Invalid input - summary: Determine primary keys - /health: - get: - consumes: - - application/json - description: This is a simple API which checks if the application is healthy - parameters: - - description: to-do description - in: body - name: body - required: true - schema: - properties: - status: - example: UP - type: string - type: object - produces: - - application/json - responses: - '200': - description: OK - summary: Check if application is running -servers: - - description: Generated server url - url: http://localhost:5000 - - description: Sandbox - url: https://dbrepo2.tuwien.ac.at diff --git a/.docs/api-data.yaml b/.docs/api-data.yaml deleted file mode 100644 index e50267b7b7..0000000000 --- a/.docs/api-data.yaml +++ /dev/null @@ -1,26 +0,0 @@ -openapi: 3.0.1 -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.4.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9093 - description: Generated server url -- url: https://test.dbrepo.tuwien.ac.at - description: Sandbox -paths: {} -components: - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/api-metadata.yaml b/.docs/api-metadata.yaml deleted file mode 100644 index 547c365fd6..0000000000 --- a/.docs/api-metadata.yaml +++ /dev/null @@ -1,8115 +0,0 @@ -openapi: 3.0.1 -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.4.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: -- url: http://localhost:9099 - description: Generated server url -- url: https://test.dbrepo.tuwien.ac.at - description: Sandbox -paths: - /api/database/{databaseId}/table/{tableId}/history: - get: - tags: - - table-history-endpoint - summary: Find all history - operationId: getAll - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Find table history successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableHistoryDto' - "404": - description: "Table, database or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table history query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Query store failed to query table history - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Find table history is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - head: - tags: - - table-history-endpoint - summary: Find all history - operationId: getAll_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Find table history successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableHistoryDto' - "404": - description: "Table, database or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table history query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Query store failed to query table history - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Find table history is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data: - get: - tags: - - table-data-endpoint - summary: Find data - operationId: getAll_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - 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: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - responses: - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Get table data successfully - content: - '*/*': - schema: - $ref: '#/components/schemas/QueryResultDto' - "422": - description: Could not import csv via sidecar - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table data is malformed or image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - post: - tags: - - table-data-endpoint - summary: Insert data - operationId: insert - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCsvDto' - required: true - responses: - "202": - description: Inserted data successfully - content: - '*/*': - schema: - type: object - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Insert table data 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' - security: - - bearerAuth: [] - delete: - tags: - - table-data-endpoint - summary: Delete data - operationId: delete_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCsvDeleteDto' - required: true - responses: - "202": - description: Deleted table data successfully - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table data or 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' - security: - - bearerAuth: [] - head: - tags: - - table-data-endpoint - summary: Find data - operationId: getAll_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - 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: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - responses: - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Get table data successfully - content: - '*/*': - schema: - $ref: '#/components/schemas/QueryResultDto' - "422": - description: Could not import csv via sidecar - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table data is malformed or image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/user/{id}: - get: - tags: - - user-endpoint - summary: Get a user info - operationId: find - parameters: - - name: id - in: path - required: true - schema: - type: string - format: uuid - responses: - "404": - description: User was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Find user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found user - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - security: - - bearerAuth: [] - put: - tags: - - user-endpoint - summary: Modify user information - operationId: modify - parameters: - - name: id - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserUpdateDto' - required: true - responses: - "400": - description: Modify user query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modified user information - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - "403": - description: Modify user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Foreign user modification - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: User attribute was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/user/{id}/theme: - put: - tags: - - user-endpoint - summary: Modify user theme - operationId: theme - parameters: - - name: id - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserThemeSetDto' - required: true - responses: - "404": - description: User or user attribute was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Modify user is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modified user theme - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - "405": - description: Foreign user modification - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/user/{id}/password: - put: - tags: - - user-endpoint - summary: Modify user password - operationId: password - parameters: - - name: id - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserPasswordDto' - required: true - responses: - "202": - description: Modified user password - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - "404": - description: User was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Modify is not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Foreign user modification - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Authentication service does not respond - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/semantic/ontology/{id}: - get: - tags: - - ontology-endpoint - summary: Find one ontology - operationId: find_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find one ontology - content: - application/json: - schema: - $ref: '#/components/schemas/OntologyDto' - put: - tags: - - ontology-endpoint - summary: Update an ontology - operationId: update - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OntologyModifyDto' - required: true - responses: - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Updated ontology successfully - content: - application/json: - schema: - $ref: '#/components/schemas/OntologyDto' - security: - - bearerAuth: [] - delete: - tags: - - ontology-endpoint - summary: Delete an ontology - operationId: delete - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted ontology successfully - content: - application/json: {} - security: - - bearerAuth: [] - /api/maintenance/message/{id}: - get: - tags: - - maintenance-endpoint - summary: Find one maintenance message - operationId: find_4 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Could not find message - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Get messages - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageDto' - put: - tags: - - maintenance-endpoint - summary: Update maintenance message - operationId: update_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageUpdateDto' - required: true - responses: - "404": - description: Could not find message - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Updated message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageBriefDto' - delete: - tags: - - maintenance-endpoint - summary: Delete maintenance message - operationId: delete_2 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Could not find message - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted message - content: - application/json: {} - /api/image/{id}: - get: - tags: - - image-endpoint - summary: Find some image - operationId: findById - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found image - content: - application/json: - schema: - $ref: '#/components/schemas/ImageDto' - put: - tags: - - image-endpoint - summary: Update some image - operationId: update_2 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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: [] - delete: - tags: - - image-endpoint - summary: Delete some image - operationId: delete_3 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted image successfully - security: - - bearerAuth: [] - /api/database/{id}/visibility: - put: - tags: - - database-endpoint - summary: Update database - operationId: visibility - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseModifyVisibilityDto' - required: true - responses: - "202": - description: Visibility modified successfully - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Visibility modification is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{id}/transfer: - put: - tags: - - database-endpoint - summary: Transfer database - operationId: transfer - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - 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/DatabaseDto' - "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' - security: - - bearerAuth: [] - /api/database/{id}/table/{tableId}/column/{columnId}: - put: - tags: - - table-column-endpoint - summary: Update a table column semantic mapping - operationId: update_3 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: columnId - in: path - required: true - schema: - type: integer - format: int64 - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ColumnSemanticsUpdateDto' - required: true - responses: - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - security: - - bearerAuth: [] - /api/database/{id}/access/{userId}: - put: - tags: - - access-endpoint - summary: Modify access to some database - operationId: update_4 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseModifyAccessDto' - required: true - responses: - "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' - "202": - description: Modify access succeeded - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - post: - tags: - - access-endpoint - summary: Give access to some database - operationId: create_6 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseGiveAccessDto' - required: true - responses: - "405": - description: Granting access not permitted - 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' - "400": - description: Granting access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Granting access succeeded - security: - - bearerAuth: [] - delete: - tags: - - access-endpoint - summary: Revoke access to some database - operationId: revoke - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "403": - description: Revoke of access not permitted as no access was found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Revoked access successfully - "400": - description: Modify access query or database connection is malformed - 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' - security: - - bearerAuth: [] - /api/database/{databaseId}/query/{queryId}: - get: - tags: - - store-endpoint - summary: Find some query - operationId: find_7 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to select query - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: List queries - content: - application/json: - schema: - $ref: '#/components/schemas/QueryDto' - "405": - description: Find query is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, query or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - put: - tags: - - store-endpoint - summary: Persist some query - operationId: persist - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/QueryPersistDto' - required: true - responses: - "405": - description: Persist query is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "412": - description: Query is already persisted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Persist query successful - content: - application/json: - schema: - $ref: '#/components/schemas/QueryDto' - "400": - description: Image not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Not allowed to persist query - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Database, query or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/user: - get: - tags: - - user-endpoint - summary: Find all users - operationId: findAll - responses: - "200": - description: List users - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UserBriefDto' - post: - tags: - - user-endpoint - summary: Create user - operationId: create - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/SignupRequestDto' - required: true - responses: - "404": - description: default role not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Parameters are not well-formed (likely email) - content: - application/json: {} - "201": - description: Created user - content: - application/json: - schema: - $ref: '#/components/schemas/UserBriefDto' - "417": - description: User with e-mail already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: User with username already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - /api/semantic/ontology: - get: - tags: - - ontology-endpoint - summary: List all ontologies - operationId: findAll_1 - responses: - "200": - description: List all ontologies - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/OntologyDto' - post: - tags: - - ontology-endpoint - summary: Register a new ontology - operationId: create_1 - 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: [] - /api/maintenance/message: - get: - tags: - - maintenance-endpoint - summary: Find maintenance messages - operationId: list - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/BannerMessageDto' - post: - tags: - - maintenance-endpoint - summary: Create maintenance message - operationId: create_2 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageCreateDto' - required: true - responses: - "201": - description: Created message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageBriefDto' - /api/image: - get: - tags: - - image-endpoint - summary: Find all images - operationId: findAll_2 - responses: - "200": - description: List images - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ContainerImage' - post: - tags: - - image-endpoint - summary: Create image - operationId: create_3 - 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: [] - /api/identifier: - get: - tags: - - identifier-endpoint - summary: Find identifiers - operationId: list_1 - parameters: - - name: dbid - in: query - required: false - schema: - type: integer - format: int64 - - name: qid - in: query - required: false - schema: - type: integer - format: int64 - - name: vid - in: query - required: false - schema: - type: integer - format: int64 - - name: tid - in: query - required: false - schema: - type: integer - format: int64 - - name: type - in: query - required: false - schema: - type: string - enum: - - database - - subset - - table - - view - responses: - "200": - description: List identifiers - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - post: - tags: - - identifier-endpoint - summary: Create identifier - operationId: create_4 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierSaveDto' - required: true - responses: - "503": - description: DataCite system did not respond - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created 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' - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "204": - description: Identifier could not be created - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Identifier for this resource already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Creating identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "406": - description: Creating identifier not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "502": - description: Query information could not be retrieved - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database: - get: - tags: - - database-endpoint - summary: List databases - operationId: list_2 - parameters: - - name: filter - in: query - required: false - schema: - type: string - responses: - "404": - description: User not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: List of databases - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/DatabaseBriefDto' - post: - tags: - - database-endpoint - summary: Create database - operationId: create_5 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseCreateDto' - required: true - responses: - "409": - description: Query store could not be created - 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: "Container, user or database could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Database create query is malformed or image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created a new database - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseBriefDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - head: - tags: - - database-endpoint - summary: Count databases - operationId: count - parameters: - - name: filter - in: query - required: false - schema: - type: string - responses: - "404": - description: User not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Count databases - content: - '*/*': - schema: - type: array - items: - $ref: '#/components/schemas/DatabaseDto' - /api/database/{databaseId}/view: - get: - tags: - - view-endpoint - summary: Find all views - operationId: findAll_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find views successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - security: - - bearerAuth: [] - post: - tags: - - view-endpoint - summary: Create a view - operationId: create_7 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ViewCreateDto' - required: true - responses: - "423": - description: Create view resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - "401": - description: Credentials missing - 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' - "405": - description: Create view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/table: - get: - tags: - - table-endpoint - summary: List all tables - operationId: list_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: List tables - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: List tables not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - post: - tags: - - table-endpoint - summary: Create a table - operationId: create_8 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCreateDto' - required: true - responses: - "403": - description: Create table not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Create table query is malformed - 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' - "201": - description: Created a new table - content: - application/json: - schema: - $ref: '#/components/schemas/TableBriefDto' - "409": - description: Create table conflicts with existing table name - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data/import: - post: - tags: - - table-data-endpoint - summary: Insert data from csv - operationId: importCsv - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ImportDto' - required: true - responses: - "202": - description: Import table data successfully - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table data is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "422": - description: Could not import csv via sidecar - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/query: - get: - tags: - - store-endpoint - summary: Find queries - operationId: findAll_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: persisted - in: query - required: false - schema: - type: boolean - responses: - "501": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "504": - description: Query store failed to select query - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: List queries - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/QueryBriefDto' - "404": - description: "Database, container or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Find all queries is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Selection of time-versioned query resulted in an invalid query - statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - post: - tags: - - query-endpoint - summary: Execute query - operationId: execute - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ExecuteStatementDto' - required: true - responses: - "403": - description: Execute query not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Could not store query in query store - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Executed query - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - "404": - description: "Database, query or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "417": - description: Could not parse columns - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/container: - get: - tags: - - container-endpoint - summary: Find all containers - operationId: findAll_5 - 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 - operationId: create_9 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerCreateRequestDto' - required: true - responses: - "201": - description: Created a new container - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerBriefDto' - "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: [] - /api/semantic/unit: - get: - tags: - - semantics-endpoint - summary: List semantic units - operationId: findAllUnits - responses: - "200": - description: Find all semantic units - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UnitDto' - /api/semantic/ontology/{id}/entity: - get: - tags: - - ontology-endpoint - summary: Find entities - operationId: find_2 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: label - in: query - required: false - schema: - type: string - - name: uri - in: query - required: false - schema: - type: string - responses: - "417": - description: Generated query or uri is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - "200": - description: Found entities - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/EntityDto' - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/semantic/database/{databaseId}/table/{tableId}: - get: - tags: - - semantics-endpoint - summary: Suggest table semantics - operationId: analyseTable - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "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' - "200": - description: Suggested table semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableColumnEntityDto' - "404": - description: Could not find the table - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/semantic/database/{databaseId}/table/{tableId}/column/{columnId}: - get: - tags: - - semantics-endpoint - summary: Suggest table column semantics - operationId: analyseTableColumn - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: columnId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "417": - description: Generated query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Suggested table column semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableColumnEntityDto' - "404": - description: Could not find the table column - 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: [] - /api/semantic/concept: - get: - tags: - - semantics-endpoint - summary: List semantic concepts - operationId: findAllConcepts - responses: - "200": - description: Find all semantic concepts - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ConceptDto' - /api/pid/{pid}: - get: - tags: - - persistence-endpoint - summary: Find some identifier - operationId: find_3 - parameters: - - name: pid - in: path - required: true - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "409": - description: Exported resource was not found - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "422": - description: Failed to retrieve from database sidecar - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - text/bibliography: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "410": - description: Failed to retrieve from S3 endpoint - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found identifier successfully - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - text/csv: {} - text/xml: {} - text/bibliography: {} - text/bibliography; style=apa: {} - text/bibliography; style=ieee: {} - text/bibliography; style=bibtex: {} - "404": - description: Identifier could not be found - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Identifier could not exported from database as it is not reachable - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - /api/oai: - get: - tags: - - metadata-endpoint - summary: Get the record - operationId: identify_1_1_1_1 - parameters: - - name: verb - in: query - - name: parameters - in: query - required: true - schema: - $ref: '#/components/schemas/OaiListIdentifiersParameters' - responses: - "200": - description: List containers - content: - text/xml: {} - /api/maintenance/message/active: - get: - tags: - - maintenance-endpoint - summary: Find active maintenance messages - operationId: active - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/BannerMessageBriefDto' - /api/identifier/retrieve: - get: - tags: - - identifier-endpoint - summary: Retrieve metadata from identifier - 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' - /api/database/{id}: - get: - tags: - - database-endpoint - summary: Find some database - operationId: findById_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Database or exchange could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the broker service could not be established - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Database found successfully - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - bearerAuth: [] - /api/database/{id}/table/{tableId}/export: - get: - tags: - - export-endpoint - summary: Export table - operationId: export - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "403": - description: Operation is not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created identifier - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - "410": - description: Blob storage operation could not be completed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Images is not supported or table/query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "422": - description: Sidecar operation could not be completed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: "Table, database or user was not found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Database connection could not be established - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{id}/access: - get: - tags: - - access-endpoint - summary: Check access to some database - operationId: find_5 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "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' - "200": - description: Found database access - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseAccessDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/view/{viewId}: - get: - tags: - - view-endpoint - summary: Find one view - operationId: find_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "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' - "200": - description: Find view successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ViewDto' - security: - - bearerAuth: [] - delete: - tags: - - view-endpoint - summary: Delete one view - operationId: delete_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "405": - description: Delete view is not permitted - 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' - "400": - description: Delete view query is malformed - 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' - "403": - description: Deletion not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Delete view successfully - security: - - bearerAuth: [] - /api/database/{databaseId}/view/{viewId}/data: - get: - tags: - - view-endpoint - summary: Find view data - operationId: data - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "404": - description: "Database, view, container or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find data successfully - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - "400": - description: Pagination not in valid range or find data query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: View data not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/view/{viewId}/data/count: - get: - tags: - - view-endpoint - summary: Find view data count - operationId: count_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Count data successfully - content: - application/json: - schema: - type: integer - format: int64 - "404": - description: "Database, view, container or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Pagination not in valid range or find data query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Could not count query data - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Count data not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}: - get: - tags: - - table-endpoint - summary: Get information about table - operationId: findById_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: "Table, database or container could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Could not communicate with the broker service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - security: - - bearerAuth: [] - delete: - tags: - - table-endpoint - summary: Delete a table - operationId: delete_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "202": - description: Delete table successfully - "404": - description: "Table, database or container could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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' - security: - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data/count: - get: - tags: - - table-data-endpoint - summary: Find data - operationId: getCount - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "404": - description: Table or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "422": - description: Could not import csv via sidecar - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Table data is malformed or image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Get table data count successfully - content: - '*/*': - schema: - type: integer - format: int64 - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/query/{queryId}/export: - get: - tags: - - query-endpoint - summary: Exports some query - operationId: export_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "403": - description: Execute query not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Executed query - content: - '*/*': - schema: - type: object - "404": - description: Database or query could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "422": - description: Sidecar failed to export - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Export of query failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "410": - description: Could not find in S3 storage - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/query/{queryId}/data: - get: - tags: - - query-endpoint - summary: Re-execute some query - operationId: reExecute - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: sortDirection - in: query - required: false - schema: - type: string - enum: - - asc - - desc - - name: sortColumn - in: query - required: false - schema: - type: string - responses: - "403": - description: Execute query not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Could not store query in query store - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Executed query - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - "404": - description: Database or query could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "417": - description: Could not parse columns - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/{databaseId}/query/{queryId}/data/count: - get: - tags: - - query-endpoint - summary: Re-execute some query - operationId: reExecuteCount - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: queryId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "403": - description: Execute query not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Executed query - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - "404": - description: Database or query could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "417": - description: Could not parse columns - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - /api/database/license: - get: - tags: - - license-endpoint - summary: Get all licenses - operationId: list_4 - responses: - "200": - description: List of licenses - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/LicenseDto' - /api/container/{id}: - get: - tags: - - container-endpoint - summary: Find some container - operationId: findById_3 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Container image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found container - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerDto' - delete: - tags: - - container-endpoint - summary: Delete some container - operationId: delete_7 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Container not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted container successfully - content: - '*/*': - schema: - type: object - security: - - bearerAuth: [] - /api/pid/{id}: - delete: - tags: - - persistence-endpoint - summary: Delete some identifier - operationId: delete_1 - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: int64 - responses: - "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' - "202": - description: Deleted identifier - content: - '*/*': - schema: - type: object - security: - - bearerAuth: [] -components: - schemas: - TableHistoryDto: - required: - - event - - timestamp - - total - type: object - properties: - timestamp: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - event: - type: string - total: - type: integer - format: int64 - example: 1 - ApiErrorDto: - required: - - code - - message - - status - type: object - properties: - status: - type: string - example: NOT_FOUND - 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 - message: - type: string - example: Error message - code: - type: string - example: error.service.code - QueryResultDto: - required: - - headers - - id - - result - type: object - properties: - result: - type: array - items: - type: object - additionalProperties: - type: object - headers: - type: array - items: - type: object - additionalProperties: - type: integer - format: int32 - id: - type: integer - format: int64 - result_number: - type: integer - format: int64 - example: 1 - 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 - UserAttributesDto: - type: object - properties: - orcid: - type: string - example: https://orcid.org/0000-0002-1825-0097 - affiliation: - type: string - example: Brown University - UserDto: - required: - - attributes - - id - - username - 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 - attributes: - $ref: '#/components/schemas/UserAttributesDto' - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - UserThemeSetDto: - required: - - theme_dark - type: object - properties: - theme_dark: - type: boolean - example: true - UserPasswordDto: - required: - - password - type: object - properties: - password: - type: string - OntologyModifyDto: - required: - - prefix - - uri - 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 - OntologyDto: - required: - - created - - id - - prefix - - rdf - - sparql - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - example: http://www.wikidata.org/ - prefix: - type: string - example: wd - sparql: - type: boolean - example: true - rdf: - type: boolean - example: false - creator: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - UserBriefDto: - required: - - id - - username - 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 - BannerMessageUpdateDto: - required: - - message - - type - 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 - BannerMessageBriefDto: - required: - - message - - type - 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 - ImageChangeDto: - required: - - dialect - - driver_class - - jdbc_method - - registry - type: object - properties: - registry: - type: string - example: docker.io/library - defaultPort: - maximum: 65535 - minimum: 1024 - type: integer - format: int32 - example: 5432 - dialect: - type: string - example: Postgres - driver_class: - type: string - example: org.postgresql.Driver - jdbc_method: - type: string - example: postgresql - ImageDateDto: - required: - - created_at - - database_format - - example - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - example: - type: string - example: 30.01.2022 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - name - - registry - - version - type: object - properties: - id: - type: integer - format: int64 - registry: - type: string - example: docker.io/library - name: - type: string - example: mariadb - version: - type: string - example: "10.5" - dialect: - type: string - example: org.hibernate.dialect.MariaDBDialect - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - DatabaseModifyVisibilityDto: - required: - - is_public - type: object - properties: - is_public: - type: boolean - example: true - ColumnBriefDto: - required: - - column_type - - database_id - - id - - internal_name - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: date - alias: - type: string - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - column_type: - type: string - example: date - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - ColumnDto: - required: - - auto_generated - - column_type - - database_id - - id - - internal_name - - is_null_allowed - - is_primary_key - - is_public - - name - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Date - alias: - type: string - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - dataLength: - type: integer - format: int64 - example: 34300 - maxDataLength: - type: integer - format: int64 - example: 34300 - numRows: - type: integer - format: int64 - example: 32 - valMin: - type: number - example: 0 - valMax: - type: number - example: 100 - mean: - type: number - example: 45.4 - median: - type: number - example: 51 - stdDev: - type: number - example: 5.32 - concept: - $ref: '#/components/schemas/ConceptDto' - unit: - $ref: '#/components/schemas/UnitDto' - enums: - type: array - items: - type: string - sets: - type: array - items: - type: string - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - internal_name: - type: string - example: mdb_date - date_format: - $ref: '#/components/schemas/ImageDateDto' - auto_generated: - type: boolean - example: false - is_primary_key: - type: boolean - example: true - index_length: - type: integer - format: int64 - length: - type: integer - format: int64 - column_type: - type: string - example: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - is_public: - type: boolean - example: true - is_null_allowed: - type: boolean - example: false - ConceptDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - ConstraintsDto: - type: object - properties: - uniques: - type: array - items: - $ref: '#/components/schemas/UniqueDto' - checks: - type: array - items: - type: string - foreign_keys: - type: array - items: - $ref: '#/components/schemas/ForeignKeyDto' - ContainerDto: - required: - - created - - host - - id - - internal_name - - name - - sidecar_host - - sidecar_port - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - host: - type: string - port: - type: integer - format: int32 - image: - $ref: '#/components/schemas/ImageDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - internal_name: - type: string - example: data-db - sidecar_host: - type: string - sidecar_port: - type: integer - format: int32 - ui_host: - type: string - ui_port: - type: integer - format: int32 - CreatorDto: - required: - - creator_name - - id - type: object - properties: - id: - type: integer - format: int64 - 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 - example: Personal - enum: - - Personal - - Organizational - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - example: ORCID - enum: - - ORCID - - ROR - - ISNI - - GRID - name_identifier_scheme_uri: - type: string - example: https://orcid.org/ - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - example: ROR - enum: - - ROR - - GRID - - ISNI - affiliation_identifier_scheme_uri: - type: string - example: https://ror.org/ - DatabaseAccessDto: - required: - - created - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - DatabaseDto: - required: - - contact - - created - - creator - - exchange_name - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality - tables: - type: array - items: - $ref: '#/components/schemas/TableDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - subsets: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - creator: - $ref: '#/components/schemas/UserDto' - contact: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - exchange_name: - type: string - example: dbrepo - exchange_type: - type: string - example: topic - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - ForeignKeyDto: - type: object - properties: - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - referenced_table: - $ref: '#/components/schemas/TableBriefDto' - referenced_columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - IdentifierDescriptionDto: - required: - - id - type: object - properties: - id: - type: integer - format: int64 - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - example: en - 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 - type: - type: string - example: Abstract - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - IdentifierDto: - required: - - created - - creators - - execution - - id - - last_modified - - publication_year - - query - - query_hash - - query_normalized - - result_hash - - result_number - - type - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - - table - - view - 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 - 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' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - database_id: - type: integer - format: int64 - example: 1 - query_id: - type: integer - format: int64 - example: 1 - table_id: - type: integer - format: int64 - example: 1 - view_id: - type: integer - format: int64 - example: 1 - 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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - IdentifierFunderDto: - required: - - funder_name - - id - type: object - properties: - id: - type: integer - format: int64 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - example: Crossref Funder ID - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: "824087" - award_title: - type: string - example: EOSC-Life - IdentifierTitleDto: - required: - - id - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - example: Airquality Demonstrator - language: - type: string - example: en - 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 - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - LicenseDto: - required: - - identifier - - uri - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - RelatedIdentifierDto: - required: - - created - - id - - value - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - is_versioned - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - TableDto: - required: - - columns - - created - - created_by - - creator - - id - - internal_name - - is_public - - is_versioned - - name - - owner - - queue_name - - routing_key - - tdbid - type: object - properties: - id: - type: integer - format: int64 - tdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - creator: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - description: - type: string - example: Air Quality in Austria - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - constraints: - $ref: '#/components/schemas/ConstraintsDto' - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - created_by: - type: string - format: uuid - queue_name: - type: string - example: air_quality - queue_type: - type: string - example: quorum - routing_key: - type: string - example: dbrepo.database.air_quality - is_public: - type: boolean - example: true - UniqueDto: - required: - - columns - - table - - uid - type: object - properties: - uid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/TableDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - UnitDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - ViewDto: - required: - - columns - - created - - creator - - database - - database_id - - id - - internal_name - - name - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - database: - $ref: '#/components/schemas/DatabaseDto' - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - DatabaseTransferDto: - required: - - username - type: object - properties: - username: - type: string - ColumnSemanticsUpdateDto: - type: object - properties: - concept_uri: - type: string - unit_uri: - type: string - DatabaseModifyAccessDto: - required: - - type - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - QueryPersistDto: - required: - - persist - type: object - properties: - persist: - type: boolean - example: true - QueryDto: - required: - - created - - creator - - database_id - - execution - - id - - is_persisted - - last_modified - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/UserDto' - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - example: query - enum: - - query - - view - identifiers: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - database_id: - type: integer - format: int64 - 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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - SignupRequestDto: - required: - - email - - password - - username - type: object - properties: - username: - pattern: "^[a-z0-9]{3,}$" - type: string - example: user - email: - type: string - example: user@example.com - password: - type: string - OntologyCreateDto: - required: - - prefix - - uri - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - BannerMessageCreateDto: - required: - - message - - type - 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 - ImageCreateDto: - required: - - default_port - - dialect - - driver_class - - jdbc_method - - name - - registry - - version - type: object - properties: - registry: - type: string - example: docker.io/library - name: - type: string - example: mariadb - version: - type: string - dialect: - type: string - driver_class: - type: string - jdbc_method: - type: string - default_port: - maximum: 65535 - minimum: 1024 - type: integer - format: int32 - CreatorSaveDto: - required: - - creator_name - - firstname - - lastname - - name_type - type: object - properties: - id: - type: integer - format: int64 - 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 - example: Personal - enum: - - Personal - - Organizational - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - example: ORCID - enum: - - ORCID - - ROR - - ISNI - - GRID - affiliation_identifier: - type: string - example: https://ror.org/04d836q62 - affiliation_identifier_scheme: - type: string - example: ROR - enum: - - ROR - - GRID - - ISNI - IdentifierFunderSaveDto: - required: - - funder_name - type: object - properties: - id: - type: integer - format: int64 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - example: Crossref Funder ID - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: "824087" - award_title: - type: string - example: EOSC-Life - IdentifierSaveDescriptionDto: - type: object - properties: - id: - type: integer - format: int64 - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - example: en - 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 - type: - type: string - example: Abstract - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - IdentifierSaveDto: - required: - - creators - - database_id - - publication_year - - type - type: object - properties: - type: - type: string - example: database - enum: - - database - - subset - - table - - view - titles: - type: array - items: - $ref: '#/components/schemas/IdentifierSaveTitleDto' - descriptions: - type: array - items: - $ref: '#/components/schemas/IdentifierSaveDescriptionDto' - funders: - type: array - items: - $ref: '#/components/schemas/IdentifierFunderSaveDto' - 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/CreatorSaveDto' - database_id: - type: integer - format: int64 - example: 1 - query_id: - type: integer - format: int64 - view_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - 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/RelatedIdentifierSaveDto' - IdentifierSaveTitleDto: - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - example: Airquality Demonstrator - language: - type: string - example: en - 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 - type: - type: string - example: Subtitle - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - RelatedIdentifierSaveDto: - required: - - value - type: object - properties: - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - example: DOI - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - example: Cites - 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 - DatabaseCreateDto: - required: - - container_id - - is_public - - name - type: object - properties: - name: - type: string - example: Air Quality - container_id: - type: integer - format: int64 - example: 1 - is_public: - type: boolean - example: true - ContainerBriefDto: - required: - - created - - hash - - id - - image - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - image: - $ref: '#/components/schemas/ImageBriefDto' - running: - type: boolean - example: true - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - internal_name: - type: string - example: air-quality - CreatorBriefDto: - required: - - creator_name - type: object - properties: - affiliation: - type: string - example: Wesleyan University - name_identifier: - type: string - example: https://orcid.org/0000-0002-1825-0097 - name_type: - type: string - example: Personal - enum: - - Personal - - Organizational - creator_name: - type: string - example: "Carberry, Josiah" - DatabaseBriefDto: - required: - - created - - creator - - exchange_name - - id - - internal_name - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - description: - type: string - example: Air Quality - tables: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - image: - $ref: '#/components/schemas/ImageDto' - container: - $ref: '#/components/schemas/ContainerBriefDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - creator: - $ref: '#/components/schemas/UserBriefDto' - owner: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - exchange_name: - type: string - example: dbrepo - exchange_type: - type: string - example: topic - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - IdentifierBriefDto: - required: - - creators - - id - - publication_year - - type - type: object - properties: - id: - type: integer - format: int64 - type: - type: string - enum: - - database - - subset - - table - - view - titles: - type: array - items: - $ref: '#/components/schemas/IdentifierTitleDto' - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - creators: - type: array - items: - $ref: '#/components/schemas/CreatorBriefDto' - database_id: - type: integer - format: int64 - example: 1 - query_id: - type: integer - format: int64 - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - ImageBriefDto: - required: - - id - - jdbc_method - - name - - version - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: mariadb - version: - type: string - example: "10.5" - jdbc_method: - type: string - example: mariadb - ViewBriefDto: - required: - - created - - creator - - id - - internal_name - - name - - query - - query_hash - - vdbid - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierBriefDto' - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - DatabaseGiveAccessDto: - required: - - type - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - ViewCreateDto: - required: - - is_public - - name - - query - type: object - properties: - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` - is_public: - type: boolean - example: true - ColumnCreateDto: - required: - - name - - null_allowed - - primary_key - - type - type: object - properties: - name: - type: string - example: Date - type: - type: string - example: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - dfid: - type: integer - description: date format id - format: int64 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - type: string - description: "enum values, only considered when type = ENUM" - sets: - type: array - description: "set values, only considered when type = SET" - items: - type: string - description: "set values, only considered when type = SET" - primary_key: - type: boolean - example: false - index_length: - type: integer - format: int64 - null_allowed: - type: boolean - example: true - ConstraintsCreateDto: - type: object - properties: - uniques: - type: array - items: - type: array - items: - type: string - checks: - type: array - items: - type: string - foreign_keys: - type: array - items: - $ref: '#/components/schemas/ForeignKeyCreateDto' - ForeignKeyCreateDto: - type: object - properties: - columns: - type: array - items: - type: string - referenced_table: - type: string - referenced_columns: - type: array - items: - type: string - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - TableCreateDto: - required: - - columns - - name - type: object - properties: - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - columns: - type: array - items: - $ref: '#/components/schemas/ColumnCreateDto' - constraints: - $ref: '#/components/schemas/ConstraintsCreateDto' - TableCsvDto: - required: - - data - type: object - properties: - data: - type: object - additionalProperties: - type: object - ImportDto: - required: - - location - - separator - type: object - properties: - location: - type: string - example: file.csv - separator: - type: string - example: "," - quote: - type: string - example: '"' - skip_lines: - minimum: 0 - type: integer - format: int64 - false_element: - type: string - true_element: - type: string - null_element: - type: string - example: NA - ExecuteStatementDto: - required: - - statement - type: object - properties: - statement: - type: string - example: SELECT `id` FROM `air_quality` - timestamp: - type: string - description: Execute query for data at this timestamp - format: date-time - ContainerCreateRequestDto: - required: - - host - - imageId - - name - - privilegedPassword - - privilegedUsername - type: object - properties: - name: - type: string - example: Air Quality - imageId: - type: integer - description: Image ID - format: int64 - host: - type: string - description: Hostname of container - port: - type: integer - description: Port of container - format: int32 - privilegedUsername: - type: string - description: Username of privileged user - example: root - privilegedPassword: - type: string - description: Password of privileged user - EntityDto: - required: - - label - - uri - 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 - TableColumnEntityDto: - required: - - columnId - - databaseId - - tableId - - uri - type: object - properties: - databaseId: - type: integer - format: int64 - example: 1 - tableId: - type: integer - format: int64 - example: 1 - columnId: - type: integer - format: int64 - example: 1 - 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 - 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: - required: - - id - - message - - type - type: object - properties: - id: - type: integer - format: int64 - 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 - Constraints: - type: object - properties: - uniques: - type: array - items: - $ref: '#/components/schemas/Unique' - foreignKeys: - type: array - items: - $ref: '#/components/schemas/ForeignKey' - checks: - uniqueItems: true - type: array - items: - type: string - Container: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - internalName: - type: string - host: - type: string - port: - type: integer - format: int32 - sidecarHost: - type: string - sidecarPort: - type: integer - format: int32 - uiHost: - type: string - uiPort: - type: integer - format: int32 - uiAdditionalFlags: - type: string - databases: - type: array - items: - $ref: '#/components/schemas/Database' - image: - $ref: '#/components/schemas/ContainerImage' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - privilegedUsername: - type: string - privilegedPassword: - type: string - ContainerImage: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - version: - type: string - driverClass: - type: string - dialect: - type: string - jdbcMethod: - type: string - defaultPort: - type: integer - format: int32 - dateFormats: - type: array - items: - $ref: '#/components/schemas/ContainerImageDate' - containers: - type: array - items: - $ref: '#/components/schemas/Container' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ContainerImageDate: - type: object - properties: - id: - type: integer - format: int64 - iid: - type: integer - format: int64 - image: - $ref: '#/components/schemas/ContainerImage' - example: - type: string - hasTime: - type: boolean - databaseFormat: - type: string - unixFormat: - type: string - createdAt: - type: string - format: date-time - Creator: - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - lastname: - type: string - creatorName: - type: string - nameType: - type: string - enum: - - PERSONAL - - ORGANIZATIONAL - nameIdentifier: - type: string - nameIdentifierScheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - nameIdentifierSchemeUri: - type: string - affiliation: - type: string - affiliationIdentifier: - type: string - affiliationIdentifierScheme: - type: string - enum: - - ROR - - GRID - - ISNI - affiliationIdentifierSchemeUri: - type: string - identifier: - $ref: '#/components/schemas/Identifier' - bibtexName: - type: string - ieeeName: - type: string - apaName: - type: string - Database: - type: object - properties: - id: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - ownedBy: - type: string - format: uuid - owner: - $ref: '#/components/schemas/User' - cid: - type: integer - format: int64 - container: - $ref: '#/components/schemas/Container' - name: - type: string - internalName: - type: string - exchangeName: - type: string - description: - type: string - contactPerson: - type: string - format: uuid - contact: - $ref: '#/components/schemas/User' - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - subsets: - type: array - items: - $ref: '#/components/schemas/Identifier' - tables: - type: array - items: - $ref: '#/components/schemas/Table' - views: - type: array - items: - $ref: '#/components/schemas/View' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccess' - isPublic: - type: boolean - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - DatabaseAccess: - type: object - properties: - huserid: - type: string - format: uuid - user: - $ref: '#/components/schemas/User' - hdbid: - type: integer - format: int64 - database: - $ref: '#/components/schemas/Database' - type: - type: string - enum: - - AccessType.READ - - AccessType.WRITE_OWN - - AccessType.WRITE_ALL - created: - type: string - format: date-time - ForeignKey: - type: object - properties: - fkid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/Table' - referencedTable: - $ref: '#/components/schemas/Table' - references: - type: array - items: - $ref: '#/components/schemas/ForeignKeyReference' - onUpdate: - type: string - enum: - - ReferenceType.RESTRICT - - ReferenceType.CASCADE - - ReferenceType.SET_NULL - - ReferenceType.NO_ACTION - - ReferenceType.SET_DEFAULT - onDelete: - type: string - enum: - - ReferenceType.RESTRICT - - ReferenceType.CASCADE - - ReferenceType.SET_NULL - - ReferenceType.NO_ACTION - - ReferenceType.SET_DEFAULT - ForeignKeyReference: - type: object - properties: - id: - type: integer - format: int64 - foreignKey: - $ref: '#/components/schemas/ForeignKey' - column: - $ref: '#/components/schemas/TableColumn' - referencedColumn: - $ref: '#/components/schemas/TableColumn' - Identifier: - required: - - publisher - type: object - properties: - id: - type: integer - format: int64 - databaseId: - type: integer - format: int64 - queryId: - type: integer - format: int64 - tableId: - type: integer - format: int64 - viewId: - type: integer - format: int64 - creators: - type: array - items: - $ref: '#/components/schemas/Creator' - publisher: - type: string - 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 - titles: - type: array - items: - $ref: '#/components/schemas/IdentifierTitle' - descriptions: - type: array - items: - $ref: '#/components/schemas/IdentifierDescription' - funders: - type: array - items: - $ref: '#/components/schemas/IdentifierFunder' - licenses: - type: array - items: - $ref: '#/components/schemas/License' - type: - type: string - enum: - - DATABASE - - SUBSET - - TABLE - - VIEW - query: - type: string - queryNormalized: - type: string - queryHash: - type: string - resultHash: - type: string - execution: - type: string - format: date-time - resultNumber: - type: integer - format: int64 - publicationYear: - type: integer - format: int32 - publicationMonth: - type: integer - format: int32 - publicationDay: - type: integer - format: int32 - database: - $ref: '#/components/schemas/Database' - relatedIdentifiers: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifier' - doi: - type: string - createdBy: - type: string - format: uuid - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - IdentifierDescription: - type: object - properties: - id: - type: integer - format: int64 - description: - type: string - descriptionType: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - 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 - identifier: - $ref: '#/components/schemas/Identifier' - IdentifierFunder: - type: object - properties: - id: - type: integer - format: int64 - funderName: - type: string - funderIdentifier: - type: string - funderIdentifierType: - type: string - enum: - - CROSSREF_FUNDER_ID - - ROR - - GND - - ISNI - - OTHER - schemeUri: - type: string - awardNumber: - type: string - awardTitle: - type: string - identifier: - $ref: '#/components/schemas/Identifier' - IdentifierTitle: - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - titleType: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - 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 - identifier: - $ref: '#/components/schemas/Identifier' - License: - type: object - properties: - identifier: - type: string - uri: - type: string - RelatedIdentifier: - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - 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 - identifier: - $ref: '#/components/schemas/Identifier' - Table: - type: object - properties: - id: - type: integer - format: int64 - tdbid: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - ownedBy: - type: string - format: uuid - owner: - $ref: '#/components/schemas/User' - name: - type: string - internalName: - type: string - queueName: - type: string - routingKey: - type: string - description: - type: string - database: - $ref: '#/components/schemas/Database' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - constraints: - $ref: '#/components/schemas/Constraints' - isVersioned: - type: boolean - numRows: - type: integer - format: int64 - dataLength: - type: integer - format: int64 - maxDataLength: - type: integer - format: int64 - avgRowLength: - type: integer - format: int64 - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - TableColumn: - type: object - properties: - id: - type: integer - format: int64 - dateFormat: - $ref: '#/components/schemas/ContainerImageDate' - table: - $ref: '#/components/schemas/Table' - views: - type: array - items: - $ref: '#/components/schemas/View' - name: - type: string - autoGenerated: - type: boolean - internalName: - type: string - isPrimaryKey: - type: boolean - indexLength: - type: integer - format: int64 - alias: - type: string - columnType: - type: string - enum: - - TableColumnType.CHAR - - TableColumnType.VARCHAR - - TableColumnType.BINARY - - TableColumnType.VARBINARY - - TableColumnType.TINYBLOB - - TableColumnType.TINYTEXT - - TableColumnType.TEXT - - TableColumnType.BLOB - - TableColumnType.MEDIUMTEXT - - TableColumnType.MEDIUMBLOB - - TableColumnType.LONGTEXT - - TableColumnType.LONGBLOB - - TableColumnType.ENUM - - TableColumnType.SET - - TableColumnType.BIT - - TableColumnType.TINYINT - - TableColumnType.BOOL - - TableColumnType.SMALLINT - - TableColumnType.MEDIUMINT - - TableColumnType.INT - - TableColumnType.BIGINT - - TableColumnType.FLOAT - - TableColumnType.DOUBLE - - TableColumnType.DECIMAL - - TableColumnType.DATE - - TableColumnType.DATETIME - - TableColumnType.TIMESTAMP - - TableColumnType.TIME - - TableColumnType.YEAR - length: - type: integer - format: int64 - isNullAllowed: - type: boolean - ordinalPosition: - type: integer - format: int32 - created: - type: string - format: date-time - concept: - $ref: '#/components/schemas/TableColumnConcept' - unit: - $ref: '#/components/schemas/TableColumnUnit' - enums: - type: array - items: - type: string - sets: - type: array - items: - type: string - size: - type: integer - format: int64 - d: - type: integer - format: int64 - valMin: - type: number - valMax: - type: number - mean: - type: number - median: - type: number - stdDev: - type: number - lastModified: - type: string - format: date-time - TableColumnConcept: - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - TableColumnUnit: - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - Unique: - type: object - properties: - uid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/Table' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - User: - type: object - properties: - id: - type: string - format: uuid - username: - type: string - firstname: - type: string - lastname: - type: string - email: - type: string - orcid: - type: string - affiliation: - type: string - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccess' - themeDark: - type: boolean - mariadbPassword: - type: string - View: - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - name: - type: string - internalName: - type: string - isPublic: - type: boolean - isInitialView: - type: boolean - query: - type: string - queryHash: - type: string - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - database: - $ref: '#/components/schemas/Database' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - QueryBriefDto: - required: - - created - - creator - - database_id - - execution - - id - - is_persisted - - last_modified - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/UserDto' - execution: - type: string - format: date-time - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - example: query - enum: - - query - - view - identifiers: - type: array - items: - $ref: '#/components/schemas/IdentifierBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - database_id: - type: integer - format: int64 - query_normalized: - type: string - example: SELECT `id` FROM `air_quality` - query_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - result_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - result_number: - type: integer - format: int64 - example: 1 - is_persisted: - type: boolean - example: true - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - TableCsvDeleteDto: - required: - - keys - type: object - properties: - keys: - type: object - additionalProperties: - type: object - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/api-upload.yaml b/.docs/api-upload.yaml deleted file mode 100644 index 51cf3ef89d..0000000000 --- a/.docs/api-upload.yaml +++ /dev/null @@ -1,30 +0,0 @@ -openapi: 3.0.0 -info: - title: Database Repository Upload Service API - description: Service that manages the uploads - 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.4.0 -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: - - url: http://localhost:1080 - description: Generated server url - - url: https://test.dbrepo.tuwien.ac.at - description: Sandbox -paths: - /api/upload/files: - post: - tags: - - upload-endpoint - summary: Uploads a file - operationId: upload - responses: - "201": - description: "Successfully uploaded a file" - security: { } \ No newline at end of file diff --git a/.docs/docker/release.py b/.docs/docker/release.py index d29dc4ec27..3c12886af5 100644 --- a/.docs/docker/release.py +++ b/.docs/docker/release.py @@ -41,6 +41,16 @@ components = [ "name": "User Interface", "doc": "system-other-ui", "dir": "ui" + }, + { + "name": "Search Service", + "doc": "system-services-search", + "dir": "search-service" + }, + { + "name": "Data Database Sidecar", + "doc": "system-databases-data", + "dir": "data-db" } ] diff --git a/.docs/docker/setup.py b/.docs/docker/setup.py index 5eda1103d1..e293833201 100644 --- a/.docs/docker/setup.py +++ b/.docs/docker/setup.py @@ -5,6 +5,6 @@ setup(name='dockerhub-client', description='Dockerhub Maintenance Client', author='Martin Weise', author_email='martin.weise@tuwien.ac.at', - url='https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/latest/', + url='https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/', packages=['dockerhub-client'], ) diff --git a/.docs/images/architecture-data-db.svg b/.docs/images/architecture-data-db.svg index 696f4ed091..788750a77e 100644 --- a/.docs/images/architecture-data-db.svg +++ b/.docs/images/architecture-data-db.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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="426px" height="168px" viewBox="-0.5 -0.5 426 168" style="background-color: rgb(255, 255, 255);"><defs/><g><rect x="0" y="37" width="248" height="130" rx="3.9" ry="3.9" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 246px; height: 1px; padding-top: 164px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;">shared filesystem<br />/tmp</div></div></div></foreignObject><text x="124" y="164" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-style="italic">shared filesystem...</text></switch></g><path d="M 47.5 47.63 L 47.49 30.49 L 47.71 7" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 47.5 52.88 L 44 45.88 L 47.5 47.63 L 51 45.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 22px; margin-left: 48px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">jdbc</div></div></div></foreignObject><text x="48" y="25" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">jdbc</text></switch></g><path d="M 22.5 62.6 C 22.5 57.85 33.69 54 47.5 54 C 54.13 54 60.49 54.91 65.18 56.52 C 69.87 58.13 72.5 60.32 72.5 62.6 L 72.5 109.4 C 72.5 114.15 61.31 118 47.5 118 C 33.69 118 22.5 114.15 22.5 109.4 Z" fill="#dae8fc" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 72.5 62.6 C 72.5 67.35 61.31 71.2 47.5 71.2 C 33.69 71.2 22.5 67.35 22.5 62.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="6.5" y="116" width="85" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 126px; margin-left: 5px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db</div></div></div></foreignObject><text x="49" y="130" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">data-db</text></switch></g><path d="M 160 59.63 L 160 36.49 L 160.1 7" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 160 64.88 L 156.5 57.88 L 160 59.63 L 163.5 57.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 23px; margin-left: 160px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">http</div></div></div></foreignObject><text x="160" y="26" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">http</text></switch></g><path d="M 231.37 86 L 288.63 86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 226.12 86 L 233.12 82.5 L 231.37 86 L 233.12 89.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 293.88 86 L 286.88 89.5 L 288.63 86 L 286.88 82.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 86px; margin-left: 260px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><text x="260" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">S3</text></switch></g><rect x="95" y="66" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 86px; margin-left: 96px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data DB Sidecar</div></div></div></foreignObject><text x="160" y="90" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data DB Sidecar</text></switch></g><rect x="295" y="66" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 86px; margin-left: 296px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Storage Service<br />(minIO)</div></div></div></foreignObject><text x="360" y="90" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Storage Service...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="426px" height="214px" viewBox="-0.5 -0.5 426 214"><defs/><g><rect x="0" y="37" width="248" height="130" rx="3.9" ry="3.9" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe center; width: 246px; height: 1px; padding-top: 164px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; overflow-wrap: normal;">shared filesystem<br />/tmp</div></div></div></foreignObject><text x="124" y="164" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle" font-style="italic">shared filesystem...</text></switch></g><path d="M 47.5 47.63 L 47.5 31 L 47.71 7" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 47.5 52.88 L 44 45.88 L 47.5 47.63 L 51 45.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 22px; margin-left: 48px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">jdbc</div></div></div></foreignObject><text x="48" y="25" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">jdbc</text></switch></g><path d="M 22.5 62.6 C 22.5 57.85 33.69 54 47.5 54 C 54.13 54 60.49 54.91 65.18 56.52 C 69.87 58.13 72.5 60.32 72.5 62.6 L 72.5 109.4 C 72.5 114.15 61.31 118 47.5 118 C 33.69 118 22.5 114.15 22.5 109.4 Z" fill="#dae8fc" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 72.5 62.6 C 72.5 67.35 61.31 71.2 47.5 71.2 C 33.69 71.2 22.5 67.35 22.5 62.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="6.5" y="116" width="85" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 126px; margin-left: 5px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db</div></div></div></foreignObject><text x="49" y="130" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">data-db</text></switch></g><path d="M 160 59.63 L 160 37 L 160.1 7" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 160 64.88 L 156.5 57.88 L 160 59.63 L 163.5 57.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 23px; margin-left: 160px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">http</div></div></div></foreignObject><text x="160" y="26" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">http</text></switch></g><path d="M 231.37 86 L 288.63 86" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 226.12 86 L 233.12 82.5 L 231.37 86 L 233.12 89.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 293.88 86 L 286.88 89.5 L 288.63 86 L 286.88 82.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 86px; margin-left: 260px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">S3</div></div></div></foreignObject><text x="260" y="89" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">S3</text></switch></g><rect x="95" y="66" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 86px; margin-left: 96px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data DB Sidecar</div></div></div></foreignObject><text x="160" y="90" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data DB Sidecar</text></switch></g><rect x="295" y="66" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 86px; margin-left: 296px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Storage Service<br style="border-color: var(--border-color);" />(SeaweedFS)</div></div></div></foreignObject><text x="360" y="90" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Storage Service...</text></switch></g><rect x="242.5" y="177" width="30" height="16" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="280" y="177" width="140" height="16" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 138px; height: 1px; padding-top: 185px; margin-left: 282px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">External images</div></div></div></foreignObject><text x="282" y="189" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">External images</text></switch></g><rect x="242.5" y="197" width="30" height="16" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="280" y="197" width="140" height="16" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 138px; height: 1px; padding-top: 205px; margin-left: 282px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Maintained images</div></div></div></foreignObject><text x="282" y="209" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Maintained images</text></switch></g><rect x="257.5" y="177" width="15" height="16" fill="#dae8fc" stroke="#000000" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/.docs/images/architecture-ui.png b/.docs/images/architecture-ui.png deleted file mode 100644 index ec4d56dcfdb5df8f414139df0e360a84fe6f84fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34705 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 diff --git a/.docs/images/architecture-ui.svg b/.docs/images/architecture-ui.svg new file mode 100644 index 0000000000..10f75224a1 --- /dev/null +++ b/.docs/images/architecture-ui.svg @@ -0,0 +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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="551px" height="393px" viewBox="-0.5 -0.5 551 393"><defs/><g><rect x="0" y="212" width="320" height="136" rx="2.72" ry="2.72" fill="#ffffff" stroke="#000000" pointer-events="all"/><rect x="0" y="0" width="320" height="204" rx="4.08" ry="4.08" fill="#ffffff" stroke="#000000" pointer-events="all"/><rect x="170" y="10" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 30px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">UI</div></div></div></foreignObject><text x="235" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">UI</text></switch></g><path d="M 235 73.63 L 235 56.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 235 78.88 L 231.5 71.88 L 235 73.63 L 238.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 51.12 L 238.5 58.12 L 235 56.37 L 231.5 58.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="170" y="80" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 100px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Vue.js</div></div></div></foreignObject><text x="235" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Vue.js</text></switch></g><path d="M 163.63 170 L 146.37 170" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 168.88 170 L 161.88 173.5 L 163.63 170 L 161.88 166.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 141.12 170 L 148.12 166.5 L 146.37 170 L 148.12 173.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 150 L 235 130 L 235 140 L 235 126.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 235 121.12 L 238.5 128.12 L 235 126.37 L 231.5 128.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 143.63 L 235 130 L 235 140 L 235 126.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 235 148.88 L 231.5 141.88 L 235 143.63 L 238.5 141.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 121.12 L 238.5 128.12 L 235 126.37 L 231.5 128.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 196.37 L 235 221.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 235 191.12 L 238.5 198.12 L 235 196.37 L 231.5 198.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 226.88 L 231.5 219.88 L 235 221.63 L 238.5 219.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="170" y="150" width="130" height="40" rx="6" ry="6" fill="#dae8fc" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 170px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Vuex<br />(state)</div></div></div></foreignObject><text x="235" y="174" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Vuex...</text></switch></g><path d="M 75 143.63 L 75 126.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 75 148.88 L 71.5 141.88 L 75 143.63 L 78.5 141.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 75 121.12 L 78.5 128.12 L 75 126.37 L 71.5 128.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="10" y="150" width="130" height="40" rx="6" ry="6" fill="#dae8fc" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 170px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Vuex Persist<br />Plugin</div></div></div></foreignObject><text x="75" y="174" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Vuex Persist...</text></switch></g><path d="M 45 55 C 45 46.72 58.43 40 75 40 C 82.96 40 90.59 41.58 96.21 44.39 C 101.84 47.21 105 51.02 105 55 L 105 105 C 105 113.28 91.57 120 75 120 C 58.43 120 45 113.28 45 105 Z" fill="#dae8fc" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 105 55 C 105 63.28 91.57 70 75 70 C 58.43 70 45 63.28 45 55" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 93px; margin-left: 46px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Local Storage</div></div></div></foreignObject><text x="75" y="96" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Local Stor...</text></switch></g><path d="M 235 274.37 L 235 288 L 235 278 L 235 291.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 235 269.12 L 238.5 276.12 L 235 274.37 L 231.5 276.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 235 296.88 L 231.5 289.88 L 235 291.63 L 238.5 289.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="170" y="228" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 248px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Node.js<br />(api client)</div></div></div></foreignObject><text x="235" y="252" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Node.js...</text></switch></g><path d="M 306.37 318 L 413.63 318" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 301.12 318 L 308.12 314.5 L 306.37 318 L 308.12 321.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 418.88 318 L 411.88 321.5 L 413.63 318 L 411.88 314.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 485 298 L 485 196.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 485 191.12 L 488.5 198.12 L 485 196.37 L 481.5 198.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 249px; margin-left: 486px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">refresh_token</div></div></div></foreignObject><text x="486" y="252" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">refresh_token</text></switch></g><rect x="170" y="298" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 318px; margin-left: 171px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Axios<br />(+request interceptor)</div></div></div></foreignObject><text x="235" y="322" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Axios...</text></switch></g><rect x="420" y="298" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 318px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Storage Service<br style="border-color: var(--border-color);" />(SeaweedFS)</div></div></div></foreignObject><text x="485" y="322" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Storage Service...</text></switch></g><rect x="420" y="150" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 170px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Authentication Service<br style="border-color: var(--border-color);" />(Keycloak)</div></div></div></foreignObject><text x="485" y="174" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Authentication Servic...</text></switch></g><rect x="6" y="7" width="60" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 17px; margin-left: 7px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">client-side</div></div></div></foreignObject><text x="36" y="21" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">client-side</text></switch></g><rect x="7" y="223" width="64" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 62px; height: 1px; padding-top: 233px; margin-left: 8px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">server-side<br />(Nuxt v2)</div></div></div></foreignObject><text x="39" y="237" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">server-sid...</text></switch></g><image x="70.5" y="6.5" width="20" height="20" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Google_Chrome_icon_%28February_2022%29.svg/2048px-Google_Chrome_icon_%28February_2022%29.svg.png" preserveAspectRatio="none"/><image x="95.5" y="6.1" width="20" height="20.8" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Firefox_logo%2C_2019.svg/1200px-Firefox_logo%2C_2019.svg.png" preserveAspectRatio="none"/><image x="74.5" y="222.66" width="28" height="20.84" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Nuxt_logo.svg/2560px-Nuxt_logo.svg.png" preserveAspectRatio="none"/><rect x="371" y="356" width="30" height="16" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="408.5" y="356" width="140" height="16" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 138px; height: 1px; padding-top: 364px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">External images</div></div></div></foreignObject><text x="411" y="368" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">External images</text></switch></g><rect x="371" y="376" width="30" height="16" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="408.5" y="376" width="140" height="16" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 138px; height: 1px; padding-top: 384px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Maintained images</div></div></div></foreignObject><text x="411" y="388" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Maintained images</text></switch></g><rect x="386" y="356" width="15" height="16" fill="#dae8fc" stroke="#000000" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/.docs/images/architecture.drawio b/.docs/images/architecture.drawio index c2332494da..f493f476b2 100644 --- a/.docs/images/architecture.drawio +++ b/.docs/images/architecture.drawio @@ -1,6 +1,6 @@ -<mxfile host="Electron" modified="2024-01-17T12:41:27.263Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.18 Chrome/120.0.6099.199 Electron/28.1.2 Safari/537.36" etag="2tlEwPCE5mA3LfufPqf1" version="22.1.18" type="device" pages="7"> +<mxfile host="Electron" modified="2024-01-18T09:36:17.787Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.18 Chrome/120.0.6099.199 Electron/28.1.2 Safari/537.36" etag="VyIG_SLmjDzwPbzvCqrk" version="22.1.18" type="device" pages="7"> <diagram id="mvBsv1rP8O80Qe3yGnn_" name="docker-compose"> - <mxGraphModel dx="2074" dy="1182" 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="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"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> @@ -218,10 +218,10 @@ <mxCell id="iy0HhJzZLXsiPmpU2ukH-4" value="Data DB Sidecar" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="560" y="563" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-2" value="Researcher" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-2" value="Researcher" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> <mxGeometry x="347" y="553" width="30" height="60" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#000000;startArrow=classic;startFill=1;dashed=1;entryPerimeter=0;" edge="1" parent="1" source="ZFea1dL5_0zV0EoV6Noq-2" target="V1Wl26Vbpgnno5Lb-wtg-34"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#000000;startArrow=classic;startFill=1;dashed=1;entryPerimeter=0;" parent="1" source="ZFea1dL5_0zV0EoV6Noq-2" target="V1Wl26Vbpgnno5Lb-wtg-34" edge="1"> <mxGeometry x="-0.028" relative="1" as="geometry"> <mxPoint x="458" y="240" as="sourcePoint" /> <mxPoint as="offset" /> @@ -237,33 +237,33 @@ <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" vertex="1" parent="1"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="1" vertex="1"> <mxGeometry x="730" y="660" width="30" height="16" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-5" value="External images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-5" value="External images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="767.5" y="660" width="140" height="16" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-6" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-6" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="730" y="680" width="30" height="16" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-7" value="Maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-7" value="Maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="767.5" y="680" width="140" height="16" as="geometry" /> </mxCell> - <mxCell id="ZFea1dL5_0zV0EoV6Noq-8" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#000000;" vertex="1" parent="1"> + <mxCell id="ZFea1dL5_0zV0EoV6Noq-8" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="745" y="660" width="15" height="16" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> - <diagram name="Frontend" id="GYXS_N4ymJ7hX3zLKvDC"> + <diagram name="ui" id="GYXS_N4ymJ7hX3zLKvDC"> <mxGraphModel dx="1434" dy="822" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="583" pageHeight="413" math="0" shadow="0"> <root> <mxCell id="ihsuRJ9dWuDPEHVUeUyY-0" /> <mxCell id="ihsuRJ9dWuDPEHVUeUyY-1" parent="ihsuRJ9dWuDPEHVUeUyY-0" /> - <mxCell id="IRxpwOfG2jHF0YoYJLJK-1" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=2;fillColor=#dae8fc;strokeColor=#000000;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="IRxpwOfG2jHF0YoYJLJK-1" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=2;fillColor=#FFFFFF;strokeColor=#000000;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="17" y="232" width="320" height="136" as="geometry" /> </mxCell> - <mxCell id="IRxpwOfG2jHF0YoYJLJK-0" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=2;fillColor=#d5e8d4;strokeColor=#000000;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="IRxpwOfG2jHF0YoYJLJK-0" value="" style="rounded=1;whiteSpace=wrap;html=1;arcSize=2;fillColor=#FFFFFF;strokeColor=#000000;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="17" y="20" width="320" height="204" as="geometry" /> </mxCell> <mxCell id="kLNLoM7m2o6o68vp3Wb9-0" value="UI" style="rounded=1;whiteSpace=wrap;html=1;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> @@ -287,16 +287,16 @@ <mxCell id="kLNLoM7m2o6o68vp3Wb9-16" 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;startArrow=classic;startFill=1;" parent="ihsuRJ9dWuDPEHVUeUyY-1" source="kLNLoM7m2o6o68vp3Wb9-2" target="kLNLoM7m2o6o68vp3Wb9-10" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="kLNLoM7m2o6o68vp3Wb9-2" value="Vuex<br>(state)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF2CC;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="kLNLoM7m2o6o68vp3Wb9-2" value="Vuex<br>(state)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DAE8FC;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="187" y="170" width="130" height="40" as="geometry" /> </mxCell> <mxCell id="kLNLoM7m2o6o68vp3Wb9-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;" parent="ihsuRJ9dWuDPEHVUeUyY-1" source="kLNLoM7m2o6o68vp3Wb9-3" target="kLNLoM7m2o6o68vp3Wb9-4" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="kLNLoM7m2o6o68vp3Wb9-3" value="Vuex Persist<br>Plugin" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF2CC;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="kLNLoM7m2o6o68vp3Wb9-3" value="Vuex Persist<br>Plugin" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DAE8FC;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="27" y="170" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="kLNLoM7m2o6o68vp3Wb9-4" value="Local Storage" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#FFF2CC;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="kLNLoM7m2o6o68vp3Wb9-4" value="Local Storage" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#DAE8FC;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="62" y="60" width="60" height="80" as="geometry" /> </mxCell> <mxCell id="kLNLoM7m2o6o68vp3Wb9-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" parent="ihsuRJ9dWuDPEHVUeUyY-1" source="kLNLoM7m2o6o68vp3Wb9-10" target="kLNLoM7m2o6o68vp3Wb9-12" edge="1"> @@ -313,22 +313,22 @@ </mxCell> <mxCell id="kLNLoM7m2o6o68vp3Wb9-20" value="refresh_token" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="kLNLoM7m2o6o68vp3Wb9-19" vertex="1" connectable="0"> <mxGeometry x="0.5604" y="1" relative="1" as="geometry"> - <mxPoint x="-21" y="34" as="offset" /> + <mxPoint x="1" y="34" as="offset" /> </mxGeometry> </mxCell> <mxCell id="kLNLoM7m2o6o68vp3Wb9-12" value="Axios<br>(+request interceptor)" style="rounded=1;whiteSpace=wrap;html=1;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="187" y="318" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="kLNLoM7m2o6o68vp3Wb9-13" value="Gateway Service" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#B3B3B3;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="kLNLoM7m2o6o68vp3Wb9-13" value="Storage Service<br style="border-color: var(--border-color);">(SeaweedFS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="437" y="318" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="kLNLoM7m2o6o68vp3Wb9-18" value="Authentication Service" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#B3B3B3;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="kLNLoM7m2o6o68vp3Wb9-18" value="Authentication Service<br style="border-color: var(--border-color);">(Keycloak)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="437" y="170" width="130" height="40" as="geometry" /> </mxCell> <mxCell id="4DtipyiVSSVc0IyAwunU-1" value="client-side" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="23" y="27" width="60" height="20" as="geometry" /> </mxCell> - <mxCell id="4DtipyiVSSVc0IyAwunU-2" value="server-side<br>(nuxt.js)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxCell id="4DtipyiVSSVc0IyAwunU-2" value="server-side<br>(Nuxt v2)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="24" y="243" width="64" height="20" as="geometry" /> </mxCell> <mxCell id="4DtipyiVSSVc0IyAwunU-4" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Google_Chrome_icon_%28February_2022%29.svg/2048px-Google_Chrome_icon_%28February_2022%29.svg.png;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> @@ -340,6 +340,21 @@ <mxCell id="4DtipyiVSSVc0IyAwunU-7" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Nuxt_logo.svg/2560px-Nuxt_logo.svg.png;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> <mxGeometry x="92" y="243.15999999999997" width="28" height="20.84" as="geometry" /> </mxCell> + <mxCell id="GqgzYKxcxpW_CC4_t2HJ-0" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxGeometry x="388" y="376" width="30" height="16" as="geometry" /> + </mxCell> + <mxCell id="GqgzYKxcxpW_CC4_t2HJ-1" value="External images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxGeometry x="425.5" y="376" width="140" height="16" as="geometry" /> + </mxCell> + <mxCell id="GqgzYKxcxpW_CC4_t2HJ-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxGeometry x="388" y="396" width="30" height="16" as="geometry" /> + </mxCell> + <mxCell id="GqgzYKxcxpW_CC4_t2HJ-3" value="Maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxGeometry x="425.5" y="396" width="140" height="16" as="geometry" /> + </mxCell> + <mxCell id="GqgzYKxcxpW_CC4_t2HJ-4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#000000;" parent="ihsuRJ9dWuDPEHVUeUyY-1" vertex="1"> + <mxGeometry x="403" y="376" width="15" height="16" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> @@ -567,7 +582,7 @@ </mxGraphModel> </diagram> <diagram id="e2fuorb2m_XjboQ7R7_y" name="Data Ingest"> - <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="1147" dy="658" 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" /> @@ -585,13 +600,14 @@ <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="0VJCIkSjTVNNat6pGbHc-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=27.5;entryPerimeter=0;" parent="1" source="0VJCIkSjTVNNat6pGbHc-3" target="0VJCIkSjTVNNat6pGbHc-13" edge="1"> + <mxCell id="0VJCIkSjTVNNat6pGbHc-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=27.5;entryPerimeter=0;" parent="1" source="0VJCIkSjTVNNat6pGbHc-3" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="480" y="340" /> <mxPoint x="530" y="340" /> <mxPoint x="530" y="428" /> </Array> + <mxPoint x="575" y="427.5" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="0VJCIkSjTVNNat6pGbHc-36" value="3306/tcp" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="0VJCIkSjTVNNat6pGbHc-35" vertex="1" connectable="0"> @@ -626,7 +642,7 @@ <mxPoint as="offset" /> </mxGeometry> </mxCell> - <mxCell id="0VJCIkSjTVNNat6pGbHc-3" value="Gateway Service" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="0VJCIkSjTVNNat6pGbHc-3" value="Gateway Service<br style="border-color: var(--border-color);">(NGINX)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="1" vertex="1"> <mxGeometry x="382.5" y="278" width="130" height="40" as="geometry" /> </mxCell> <mxCell id="0VJCIkSjTVNNat6pGbHc-7" value="<b>JDBC</b>" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> @@ -652,11 +668,10 @@ </Array> </mxGeometry> </mxCell> - <mxCell id="0VJCIkSjTVNNat6pGbHc-13" value="data-db" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#fff2cc;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="575" y="400" width="60" height="80" as="geometry" /> - </mxCell> - <mxCell id="0VJCIkSjTVNNat6pGbHc-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="0VJCIkSjTVNNat6pGbHc-26" target="0VJCIkSjTVNNat6pGbHc-13" edge="1"> - <mxGeometry relative="1" as="geometry" /> + <mxCell id="0VJCIkSjTVNNat6pGbHc-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="0VJCIkSjTVNNat6pGbHc-26" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="575" y="440" as="targetPoint" /> + </mxGeometry> </mxCell> <mxCell id="0VJCIkSjTVNNat6pGbHc-38" value="3306/tcp" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="0VJCIkSjTVNNat6pGbHc-37" vertex="1" connectable="0"> <mxGeometry x="-0.1716" y="1" relative="1" as="geometry"> @@ -669,15 +684,16 @@ <mxCell id="0VJCIkSjTVNNat6pGbHc-31" 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="0VJCIkSjTVNNat6pGbHc-29" target="0VJCIkSjTVNNat6pGbHc-26" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="0VJCIkSjTVNNat6pGbHc-29" value="Broker Service<br>(RabbitMQ)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="0VJCIkSjTVNNat6pGbHc-29" value="Broker Service<br style="border-color: var(--border-color);">(RabbitMQ)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="1" vertex="1"> <mxGeometry x="399.5" y="360" width="96" height="40" as="geometry" /> </mxCell> - <mxCell id="0VJCIkSjTVNNat6pGbHc-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" parent="1" source="0VJCIkSjTVNNat6pGbHc-33" target="0VJCIkSjTVNNat6pGbHc-13" edge="1"> + <mxCell id="0VJCIkSjTVNNat6pGbHc-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" parent="1" source="0VJCIkSjTVNNat6pGbHc-33" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="530" y="500" /> <mxPoint x="530" y="453" /> </Array> + <mxPoint x="575" y="452.5" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="0VJCIkSjTVNNat6pGbHc-40" value="3306/tcp" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="0VJCIkSjTVNNat6pGbHc-39" vertex="1" connectable="0"> @@ -691,9 +707,30 @@ <mxCell id="SPLHNWc1rHttcZ-O3PPf-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="JkB3rZmVi6YrdEwAjtGV-5" target="0VJCIkSjTVNNat6pGbHc-33" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> - <mxCell id="JkB3rZmVi6YrdEwAjtGV-5" value="Storage Service<br>(minIO)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="JkB3rZmVi6YrdEwAjtGV-5" value="Storage Service<br>(SeaweedFS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="1" vertex="1"> <mxGeometry x="237" y="394" width="96" height="40" as="geometry" /> </mxCell> + <mxCell id="yvNGLmbJRMNvVS071MuP-1" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#dae8fc;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="575" y="408" width="50" height="64" as="geometry" /> + </mxCell> + <mxCell id="yvNGLmbJRMNvVS071MuP-2" value="data-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="559" y="470" width="85" height="20" as="geometry" /> + </mxCell> + <mxCell id="jJosZR_OhRTGx9p3jnjP-1" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" vertex="1" parent="1"> + <mxGeometry x="447.5" y="540" width="30" height="16" as="geometry" /> + </mxCell> + <mxCell id="jJosZR_OhRTGx9p3jnjP-2" value="External images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="485" y="540" width="140" height="16" as="geometry" /> + </mxCell> + <mxCell id="jJosZR_OhRTGx9p3jnjP-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="447.5" y="560" width="30" height="16" as="geometry" /> + </mxCell> + <mxCell id="jJosZR_OhRTGx9p3jnjP-4" value="Maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="485" y="560" width="140" height="16" as="geometry" /> + </mxCell> + <mxCell id="jJosZR_OhRTGx9p3jnjP-5" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="462.5" y="540" width="15" height="16" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> @@ -729,9 +766,24 @@ <mxCell id="S8wz9ZtwZs3Sd4maCRdY-7" value="Data DB Sidecar" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="520" y="869" width="130" height="40" as="geometry" /> </mxCell> - <mxCell id="m0IQrUpga-DAo2afT193-1" value="Storage Service<br>(minIO)" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="m0IQrUpga-DAo2afT193-1" value="Storage Service<br style="border-color: var(--border-color);">(SeaweedFS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" parent="1" vertex="1"> <mxGeometry x="720" y="869" width="130" height="40" as="geometry" /> </mxCell> + <mxCell id="WQwfQuj7Yb_D7RAfNHcl-1" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E6E6E6;" vertex="1" parent="1"> + <mxGeometry x="667.5" y="980" width="30" height="16" as="geometry" /> + </mxCell> + <mxCell id="WQwfQuj7Yb_D7RAfNHcl-2" value="External images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="705" y="980" width="140" height="16" as="geometry" /> + </mxCell> + <mxCell id="WQwfQuj7Yb_D7RAfNHcl-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="667.5" y="1000" width="30" height="16" as="geometry" /> + </mxCell> + <mxCell id="WQwfQuj7Yb_D7RAfNHcl-4" value="Maintained images" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="705" y="1000" width="140" height="16" as="geometry" /> + </mxCell> + <mxCell id="WQwfQuj7Yb_D7RAfNHcl-5" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="682.5" y="980" width="15" height="16" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> diff --git a/.docs/images/data-ingest.svg b/.docs/images/data-ingest.svg index f399f752d9..7d2d1c3830 100644 --- a/.docs/images/data-ingest.svg +++ b/.docs/images/data-ingest.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" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="447px" height="384px" viewBox="-0.5 -0.5 447 384" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 259 83 L 259 112 L 258.61 134.63" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 258.52 139.88 L 255.14 132.82 L 258.61 134.63 L 262.14 132.94 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 111px; margin-left: 259px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">5672/tcp</div></div></div></foreignObject><text x="259" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">5672/tcp</text></switch></g><ellipse cx="258.5" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 258.5 15 L 258.5 40 M 258.5 20 L 243.5 20 M 258.5 20 L 273.5 20 M 258.5 40 L 243.5 60 M 258.5 40 L 273.5 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 259px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>AMQP</b></div></div></div></foreignObject><text x="259" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">AMQP</text></switch></g><path d="M 258.5 181 L 258.5 216.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 258.5 221.88 L 255 214.88 L 258.5 216.63 L 262 214.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 198px; margin-left: 258px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">5672/tcp</div></div></div></foreignObject><text x="258" y="201" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">5672/tcp</text></switch></g><path d="M 291 181 L 291 203 L 341 203 L 341 290.5 L 379.63 290.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 384.88 290.5 L 377.88 294 L 379.63 290.5 L 377.88 287 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 256px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="341" y="259" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><path d="M 226 181 L 226 203 L 175 203 L 175 336.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 175 341.88 L 171.5 334.88 L 175 336.63 L 178.5 334.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 175px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">80/tcp</div></div></div></foreignObject><text x="175" y="254" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">80/tcp</text></switch></g><rect x="193.5" y="141" width="130" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 161px; margin-left: 195px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Gateway Service</div></div></div></foreignObject><text x="259" y="165" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Gateway Service</text></switch></g><ellipse cx="410" cy="40.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 410 48 L 410 73 M 410 53 L 395 53 M 410 53 L 425 53 M 410 73 L 395 93 M 410 73 L 425 93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 100px; margin-left: 410px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>JDBC</b></div></div></div></foreignObject><text x="410" y="112" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">JDBC</text></switch></g><path d="M 330.37 163 L 411 163 L 411 119.37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 325.12 163 L 332.12 159.5 L 330.37 163 L 332.12 166.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 411 114.12 L 414.5 121.12 L 411 119.37 L 407.5 121.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 163px; margin-left: 371px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="371" y="166" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><path d="M 91 63 L 28 63 L 28 277 L 48 277" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 44 281 L 36 273 M 44 273 L 36 281" fill="none" stroke="#b3b3b3" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 149px; margin-left: 28px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font color="#b3b3b3">(not used in<br />the default<br />config)</font></div></div></div></foreignObject><text x="28" y="152" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">(not used in...</text></switch></g><ellipse cx="106" cy="40.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 106 48 L 106 73 M 106 53 L 91 53 M 106 53 L 121 53 M 106 73 L 91 93 M 106 73 L 121 93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 100px; margin-left: 106px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>API</b></div></div></div></foreignObject><text x="106" y="112" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">API</text></switch></g><path d="M 106 119.37 L 106 163 L 187.63 163" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 106 114.12 L 109.5 121.12 L 106 119.37 L 102.5 121.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 192.88 163 L 185.88 166.5 L 187.63 163 L 185.88 159.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 163px; margin-left: 141px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">80/tcp</div></div></div></foreignObject><text x="141" y="166" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">80/tcp</text></switch></g><path d="M 386 278 C 386 269.72 399.43 263 416 263 C 423.96 263 431.59 264.58 437.21 267.39 C 442.84 270.21 446 274.02 446 278 L 446 328 C 446 336.28 432.57 343 416 343 C 399.43 343 386 336.28 386 328 Z" fill="#fff2cc" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 446 278 C 446 286.28 432.57 293 416 293 C 399.43 293 386 286.28 386 278" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 316px; margin-left: 387px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db</div></div></div></foreignObject><text x="416" y="319" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">data-db</text></switch></g><path d="M 306.5 303 L 379.63 303" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 384.88 303 L 377.88 306.5 L 379.63 303 L 377.88 299.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 303px; margin-left: 340px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="340" y="306" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><rect x="210.5" y="283" width="96" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 303px; margin-left: 212px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data Service<br />(Spring AMQP)</div></div></div></foreignObject><text x="259" y="307" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data Service...</text></switch></g><path d="M 258.5 263 L 258.5 276.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 258.5 281.88 L 255 274.88 L 258.5 276.63 L 262 274.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="210.5" y="223" width="96" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 243px; margin-left: 212px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Broker Service<br />(RabbitMQ)</div></div></div></foreignObject><text x="259" y="247" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Broker Service...</text></switch></g><path d="M 223 363 L 341 363 L 341 315.5 L 379.63 315.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 384.88 315.5 L 377.88 319 L 379.63 315.5 L 377.88 312 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 364px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="292" y="367" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><rect x="127" y="343" width="96" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 363px; margin-left: 128px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Metadata Service<br />(Spring AMQP)</div></div></div></foreignObject><text x="175" y="367" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Metadata Service...</text></switch></g><path d="M 96 250.63 L 96 193 L 207.4 193 L 207.41 180.64" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 96 255.88 L 92.5 248.88 L 96 250.63 L 99.5 248.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 216px; margin-left: 99px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">80/tcp</div></div></div></foreignObject><text x="99" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">80/tcp</text></switch></g><path d="M 96 297 L 96 363 L 120.63 363" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 125.88 363 L 118.88 366.5 L 120.63 363 L 118.88 359.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="48" y="257" width="96" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 277px; margin-left: 49px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Upload Service<br />(TUS)</div></div></div></foreignObject><text x="96" y="281" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Upload Service...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="408px" height="440px" viewBox="-0.5 -0.5 408 440"><defs/><g><path d="M 211 83 L 211.52 112.52 L 210.48 112.52 L 210.5 134.63" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 210.5 139.88 L 206.99 132.88 L 210.5 134.63 L 213.99 132.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 112px; margin-left: 212px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">5672/tcp</div></div></div></foreignObject><text x="212" y="115" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">5672/tcp</text></switch></g><ellipse cx="210.5" cy="7.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 210.5 15 L 210.5 40 M 210.5 20 L 195.5 20 M 210.5 20 L 225.5 20 M 210.5 40 L 195.5 60 M 210.5 40 L 225.5 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 211px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>AMQP</b></div></div></div></foreignObject><text x="211" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">AMQP</text></switch></g><path d="M 210.5 181 L 210.5 216.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 210.5 221.88 L 207 214.88 L 210.5 216.63 L 214 214.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 198px; margin-left: 210px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">5672/tcp</div></div></div></foreignObject><text x="210" y="201" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">5672/tcp</text></switch></g><path d="M 243 181 L 243.04 203 L 293.04 203 L 293.04 290.52 L 331.63 290.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 336.88 290.5 L 329.88 294 L 331.63 290.5 L 329.88 287 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 255px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="292" y="259" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><path d="M 178 181 L 178 203 L 127.04 203 L 127 336.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 127 341.88 L 123.5 334.88 L 127 336.63 L 130.5 334.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 250px; margin-left: 126px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">80/tcp</div></div></div></foreignObject><text x="126" y="254" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">80/tcp</text></switch></g><path d="M 178 181 L 178 203 L 48 203 L 48 250.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 48 255.88 L 44.5 248.88 L 48 250.63 L 51.5 248.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 220px; margin-left: 46px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">9000/tcp</div></div></div></foreignObject><text x="46" y="224" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">9000/tcp</text></switch></g><rect x="145.5" y="141" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 161px; margin-left: 147px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Gateway Service<br style="border-color: var(--border-color);" />(NGINX)</div></div></div></foreignObject><text x="211" y="165" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Gateway Service...</text></switch></g><ellipse cx="362" cy="40.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 362 48 L 362 73 M 362 53 L 347 53 M 362 53 L 377 53 M 362 73 L 347 93 M 362 73 L 377 93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 100px; margin-left: 362px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>JDBC</b></div></div></div></foreignObject><text x="362" y="112" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">JDBC</text></switch></g><path d="M 282.37 163.03 L 363.52 163.48 L 363.07 119.37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 277.12 163.01 L 284.14 159.54 L 282.37 163.03 L 284.1 166.54 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 363.01 114.12 L 366.58 121.08 L 363.07 119.37 L 359.58 121.15 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 163px; margin-left: 323px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="323" y="167" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><ellipse cx="58" cy="40.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 58 48 L 58 73 M 58 53 L 43 53 M 58 53 L 73 53 M 58 73 L 43 93 M 58 73 L 73 93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 100px; margin-left: 58px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b>API</b></div></div></div></foreignObject><text x="58" y="112" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">API</text></switch></g><path d="M 58 119.37 L 58 163 L 139.63 163" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 58 114.12 L 61.5 121.12 L 58 119.37 L 54.5 121.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 144.88 163 L 137.88 166.5 L 139.63 163 L 137.88 159.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 163px; margin-left: 93px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">80/tcp</div></div></div></foreignObject><text x="93" y="166" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">80/tcp</text></switch></g><path d="M 258.5 303 L 298.24 303 L 331.63 303" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 336.88 303 L 329.88 306.5 L 331.63 303 L 329.88 299.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 302px; margin-left: 292px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="292" y="306" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><rect x="162.5" y="283" width="96" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 303px; margin-left: 164px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Data Service<br />(Spring AMQP)</div></div></div></foreignObject><text x="211" y="307" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Data Service...</text></switch></g><path d="M 210.5 263 L 210.5 276.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 210.5 281.88 L 207 274.88 L 210.5 276.63 L 214 274.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="162.5" y="223" width="96" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 243px; margin-left: 164px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Broker Service<br style="border-color: var(--border-color);" />(RabbitMQ)</div></div></div></foreignObject><text x="211" y="247" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Broker Service...</text></switch></g><path d="M 175 363 L 293.04 363 L 293.04 315.48 L 331.63 315.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 336.88 315.5 L 329.88 319 L 331.63 315.5 L 329.88 312 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 363px; margin-left: 243px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">3306/tcp</div></div></div></foreignObject><text x="243" y="367" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">3306/tcp</text></switch></g><rect x="79" y="343" width="96" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 363px; margin-left: 80px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Metadata Service<br />(Spring AMQP)</div></div></div></foreignObject><text x="127" y="367" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Metadata Service...</text></switch></g><path d="M 48 297 L 48 363 L 72.63 363" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 77.88 363 L 70.88 366.5 L 72.63 363 L 70.88 359.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="257" width="96" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 94px; height: 1px; padding-top: 277px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Storage Service<br />(SeaweedFS)</div></div></div></foreignObject><text x="48" y="281" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Storage Service...</text></switch></g><path d="M 338 279.6 C 338 274.85 349.19 271 363 271 C 369.63 271 375.99 271.91 380.68 273.52 C 385.37 275.13 388 277.32 388 279.6 L 388 326.4 C 388 331.15 376.81 335 363 335 C 349.19 335 338 331.15 338 326.4 Z" fill="#dae8fc" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 388 279.6 C 388 284.35 376.81 288.2 363 288.2 C 349.19 288.2 338 284.35 338 279.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="322" y="333" width="85" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><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: 343px; margin-left: 320px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data-db</div></div></div></foreignObject><text x="365" y="347" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">data-db</text></switch></g><rect x="210.5" y="403" width="30" height="16" fill="#e6e6e6" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="248" y="403" width="140" height="16" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 138px; height: 1px; padding-top: 411px; margin-left: 250px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">External images</div></div></div></foreignObject><text x="250" y="415" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">External images</text></switch></g><rect x="210.5" y="423" width="30" height="16" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><rect x="248" y="423" width="140" height="16" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 138px; height: 1px; padding-top: 431px; margin-left: 250px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Maintained images</div></div></div></foreignObject><text x="250" y="435" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">Maintained images</text></switch></g><rect x="225.5" y="403" width="15" height="16" fill="#dae8fc" stroke="#000000" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/.docs/images/identifier-doi.png b/.docs/images/identifier-doi.png deleted file mode 100644 index 114f42c224a95651fbd7216b5d8c3d5e0a826898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95778 zcmeAS@N?(olHy`uVBq!ia0y~yU~OVxU`pj+V_;xN?`m7az`(##?Bp53!NI{%!;#X# zz`!6`;u=vBoS#-wo>-L1ke-*Ho2px!T$GxcSDcYw@}7CW9RmY{DoBxYQEFmIW`3SR zNM>#-gKxfqk%@w1L6L%yfswI-p@o%!ft8{0)XV8U3=9eko-U3d6?5L)t*i)sKG*DD z^zW?5IF;yadl=I;-t=MEtY)UldBMcjV`1&>Exwn^E~%;JJ~yA4a_OA(B|qb{KFjBF z`rbNs+rh|pIj@MvZI(^9S(psH&m<-DnBDtcJ2^G`_g}@=5$=<6E4dTioiF{_b?##E zxyo}BPsnfI|IbdS|M+7@K{z-YaVguDQ3(!a#ql(CcECWI1=~RvI53uJPJk<1B-!U^ z05|3$&vAtrFkKxPZOH;YaBU`s4LQ`{`er?pU=fDvJ6nLqx;Zsg{&f!m<jUUOY`@i( z7NMK=rlLT4(`KWI8HWDPQxVQQ(SPLe$BJc-kDPyhuRC`4cP55+w<mSW^5;1(I@+_V zEsY^T0^yu5nlq;<>{z!@((<+(;{)Et`fpbj2iI~kI4nKe=`~wBquy^#R@6H4$bABP zwrym+897t&xQK|@VX6G206(~&g43d+oZr~b(cg3L<AZH4cd#%#csk3@Cis@@r@bL- zW#auWB|YDBf^+`<OV32+<}Z3BHEUz`dAm3EQ`FyVjyiMV+$oXPC;PNsJ)c)45-o`c zkBcHRrz!kMNi<~0zwxr8$F1%)!>8MCDwZB&WAM0oYQn0CkGDmL2ALMU|EAJ(EkG;R z&nEa*uhwkt>P?G|*Zw(oNl!85Ty*lhD}Uxyd}F<0x~+owp6<>S*%@xR$=vg5zOg>Z zt7fVE9mm3ulAih~C2ZM>s2kVQZ<@CuVs6heRSrD~t|sBfz8+UkO<XlqSv{<keNxGZ zeCY$)rnME7FOI8+YP<XOaK-yy@?Ej@@a4}uCprU}LGE<w_+8|CzvaB8D4)zJXU9at zPv7@yY^nCxGGk(f;p3~%%azh^D{E-zxP1#?n6vlw%mu|)__j__KqQThOwOj-HH>e0 zgSHmgESUPZQDyFmM`9nsKJ3dWe)M#f-IA=QH#VD8#XQXQ>xq(>FTC1mRahT8_iaXo z^;f=ho(r`sk-a}B$h7F<Z)@+}1xs=rZqzMZ#{V<7%x1z8;ZU~UT60(D=q=o3S#VDM zeB6=R=pyHDe|)#hNZdN3RY5}FJIA{0jAJJ^i?{w|X!^x|-PDBpeQJ8@rtOGi&N}m& zLd6!ZYjZy<1*R5vu4<|U#X-fk+92Dy;-o)K_y0YN+uz8z#eY>;-yYL@T+a@C|NDGL zaoiGv{eP}8UYrq7+nFsrtC^{=-oE-(V8mlzhCPYz|60#;`xhYH@mv13X3y^W<Cix? zow@Pxf!V_P4}Y!aePcT=wz*(#wfXZ08{4<_|H^^K)r)6JbNeRuiPiktojaxLzSnHw z^;d4VB)(2z)zf<(fA=+adF^lJYNp@sxp^9Ef7jM_I=9|dmR#Fqo`1jlP*Qbx-(Shf z-*HE->F#7`bAA9yij}|PT>kA7FMR(@=FP3W;VT3X*_LUUCdW5T4IQ_;8leZ>k8xCL z=lTVjz7MHLSP@@vPs&)!EGl5*MWrppC-P+->RvNwnMHm0s<O7AC;ttzrxk-hl*5v& zryuUjZRzS2d$LxNuQ*=PUBD)ApTG@q9`&d*JMxS9Hf=WAnEm};=6*YP@o?8-*-}%N zvan?r#1?JasG4##yY96^#MI3zXRVz5h}qLh@yyySmg+INd(^d~EZV;xSLIrxoxAR& zf0@WX+s41DQD-7%PVH=N|GfO`FL>51NuD`Pq2lQ!o;UVW*cleJUa0vL%|4;J=80G0 z{N>Ljk8Mqev2c4OXd}0<iY1==pKVL+u~(jm;=_D?CTG+3ypu=Q+5Qf=eW9nh{d3{{ zXEG{LXA-|(;NAM-R>jlpKfivEU8VJnzp?f@Lqm90&WbIq_nQvcvz+S;eYkC5>q|8u z19^)n?JnJx8and5`Gq^H&7X6u|J!?|7*U4i`CS%bVRlH`!?~6B?26osW7_WLAA0@L zP2Ad4Q8h0yh;c)I{r`s|Yk3;XKYTqIoh&3)X?@AeAWPs)?(YY@)$!|I3OhYupH#BQ zOmJb-gQ<}-Ei6wx%H93#&1XFh^FD<e>ekxDF^ootpq{fVb>j}N*}|9B<Rt#yAAhsm zUgT<zg<Yuj@ynliKHQmW@=)N%)LC|Kblx61cS&!_-s=inb6Z{SwJ{|gh&GJLEKW+# z3_l^pzi)!Xhp=Dobly5GJ*)XDa?br{u`%baYbi~6v&QF&={Anq+P|_EQ`&E}J=<_7 z=D+KAA>FhH-DeZ_Hq5`jSDd}=R*?YQNsN<MaGcARbx7SGykf~(sVD<qj?iRrMO7oI zu61P^yKV^vmI%GgHdhSQc3&0Nb~`ELL}#FXB>#hnt9rkuxN<Limusk%SjR8c#+O(7 zhdDleYrbEP)XFHypshuT3wLa+l8t`syQ93A4^%SV*=_00QOnKMy)pZH+?$Gw-z(P2 z)GT~2e12cUTIb{HQD-W?{+xT_<~I(8eE(-h7A92uUud&u*Xx;q&*2Hn#a#U6xw+Qm zeoqdBtd((V74cS{YM_;3ptX1X`;8d|{jSYRCvv&$W($Zd;$&E`QuFvi{j~@8ub&Gp zUOPj(SLJbYbsyh*A~JP9_w!w{23kuT?eEWCdi-4F#2v>ManAZYapAv%E2Av;nS1xo zi4a}&E7m}3$&Y_Jwmn=g0}^z_&)t7n04g%S%RM%=xc=5*=~>k|&mVL}$Ye@OScR#D zC`v1pY&bUi0b@at#vj|tZ%S2Fzdzh?zWwpQx7{s2ubOUq@Z@IqjgJ?~66aq{YI9ug z>KUne&$^7O^P`%MhrjT-=zxfx>EHKuPEOZnVwm^)VfjtHCU{}wq9WIS+<2~d#iyI% z8}6?UJy`5-+qE{j$Tb;M_x&%hll#o=kiKeH+cVAhGr3mhJmJA+e0&T0L52yt-wIy& z^>xSId~dyXcjqXFY_a?JhP$Hly78J6RYVQJHs4Di=K6&mP+7^<{1;R_uh)enn2RD6 z+V3Soyi|*>uiJAiSW#)w>l4d`Sbp35e8a7wp(Dn6D6AV);QiUM%mHF~iSz5tUmrhs z_<h0E6&p)Wzjb^czgl6(nnhA=9JXgRUY!4`^!V!gdB<-)3c6xya`0h+g46oLZ?2@A znLU?lWk}W9<>s2Uduvy$S$llZ&zIM$w3Ms9pC~lhx~=!ezW?8UZQZ}G^`@q0#6FcD z`X~5hs>D}bbJ2;O)5xtlz3^R<=C=ELIlWq)Bqo0kWV~f%^|5vLI}zF6&#K)8WK)m4 zik`OMdfMUF?e~x05{>lm-p0gmYIRn@qc1lne2(5&qWJ8rA2WlD%^$ftdFFQY&)H5q zExNdax&5AN)F#nLZt<Rq_3Zrn+wG$5864CmJFUK`pm?t5Oy%Z<S2J9a`{&zruMRam zv@J%>xh1as$`Y59Gjn-6U6>dS{rwTFIkltLEa~B&od!o;TKCjF_>nt*xABwB6HcaF z$TacjFi*btr({Kl*Ts#pb7OZDyyS|yb?ae)mEgk5iGEQ=&(3*?K9e|Au}}Qr8EJ-F zR#t`Uc8KV{efy!JAtPDE=u-N@SpxmbrkU;e{qUpUdUl4@({vBc+43at_??U=$^0{| zKy{*sh}hx<8zjE=>PGA|X@08!O<>0suG%Jd@t8+R+4luY*UB!N@mjfJZ^crX&B2q_ zy;ivKvgqO4Km89rR%|HvCzEj{YfE|A!#hX4H}LcHNZq>2am#vlKuFQgU3^XXk#jm3 zk1H@N*nYjO>CoqhEeY#B?49VD`q(brXNw@ig^M?PErNL%4m|$2VCPy{zINfccWn)% zlo%NDwoAv_?)8{I)#zE}^|di#A|-BaE*;x`zh&0Y(mj0X%+JU3%o!qdKSo&8^Ud)S zzh%9<VC5Svt*oq%GfP(s2&anlUd=K&5xbd5j-k1k?~19}!VN1}zBMx5*%UEnz3#~w z?JX6?ck=kFe&_56DHDA!Yuo3$^R=L8rob`PBeORu)J}U55!n&n@nqfEwy32?794K; z)~6S<C#G-Nw6L6?XVy9$h`xTKh2P$e*SSTmTkK40&_ajeY-zvw+HSSM+(lvQB@B7w z-hWS8Q(0b8_HeGUyyC5lBcG1WoZywZB0tORUuW=*4SAwTi+g^Y`4xKT$7gZxi}~^n z-!>gRWOu(jP3>n$bHah!Y)udKp?U2{$kl7gM`tml26L~<l6GQ0s4RZZclN=92mSvq zdK_~7Ld!in>33%$wQaVGWHVj59JC-v>$t_QUr#?)C`|M)C}6H(yBIj}&}+U_aRvpg zOAOsNO&%5>bE{k(W4&uvi^7h*o4JKN1af;^g1uJ@yecjGe&B5xd+VBoGm?`RTwUQV zJ9&yg|0M0F9{%2qeyb%*b2PH13T?c2@8|K^$%fjhocT{>k8Yei|G_)!BG-c}eY9Ms z6#n>mbawK^^w;jCvCaVkYp!RuR+}7kIhbXb{D1cQMSC_$ot~~EaxC-es}1vNLzXyJ zh>30HY~!%)n`6<sY?|4T*~x|$FAjXXoGzGblJt1(>eg4kt}JmmGBc@g%L5+0si7>b z+wC6zjq5ReuRZnZ1h1txcGQWc80B}&nKq}R=S$=v<1hCAiYirQ_?|D>*KXeAZ_Bal z<HyhdV+VC`*|x|o+WwZ6)y7xTR3~_-?kIVhb;5r3bT5?^>#`60>|Xlf<y%l*UE?b0 z(PQ3yEcEKN#XGj}#M;_kSaEg6+(|8GDvMhLmhWCJUSF%u|2j<1IV)&U!JUgu#xLHz zJeqEPuWi;ZHyO)9E{1@JkfuY6gd}(ccf9^K=Vi5k@ROq5j0!8X0@q*e+SV^N$I(69 z{M|m~@Egyo#kQ}FYh2P&!Enz^=Gl#m6`@)&D_1zpUn}1xaNg=p;ei|TJ5N77CLdof zy#4+zwy(Wscf<s?Rs{1@{myyu;uRaio?ZX*85*L)b=`{=rE1CDE%jX);;{bmqP?5F zZ(P4}sclAvvQkNu$<{5LZ)I*-?^c-V<r=zivY@muYxI8ER#(-C?L{}2oL?TMIdN+N zW1rX@$J%6LA>G2oebY}anQ;2px<z3cA{VkuH+;RVZtH&Fb{ZqYuU~t0rL?kN8yFaL zthvhF6t!kagfJ)@dYyLXYg#_*^i#gb+Bfn`?)T)qQ26olZgt^@f`2>uy?e}kD+;aR z=O-VCzWZnMa=Ez|Dh~w)MD+YFx8Y^D!TMn5a=D||bayV6hg2Ib#$lnkwqLAt7b)>h zIGyt2$)BSW-YQDXib{CBJ^5ikcf%y@@WLlYG;7{{lW}=b%FuA>6W1K8=oZV&lM$0F z`RB&kTEqu+eLJUjXIqu)jp9u+k_)fDwXAr2w?@Zfe(RSlQ(kYoo|iO7Qfe!gyWgBc zpH#Ug&dHG6nxAQ*7pHf8&Xts$i0QnXDi-w{O<qK{Tj$x#Kl!rQwZp{a!MWSl99D)L zc>D1|Ql{i7t?Yv9$8Iw)%raaRnLg>p3yqSJGVa^Gx@!%Nx;U@D`ru4!_o07%=kz3$ zl@I;uvx?QTnCq7qtu&Qwt8al-Y{aetyL<M(44<9%6kb)Wu55UZr_-hB*|u+j%?}Pb zvafnA6%cw`VburO&ciQT&R&!M(#^j8xbiM{2FJgB&M#lRWMs&=a_@aaa<TRmt*aet zvnC1Y{CIN6^~;y9icZV9Ez@j{&HBD3MSES?)dzR^{S$spI-~hBCap=@ii1rdsv^&- z|D%1G(eZxwgcG%&-nhbsA<Q?fx>XgSdoSw>$6h`+XO|P-1SU=tyfJ07ABUxGp_+`v z7d@|2>yn;caxJis`SHYw^U|cX5nFRO859id__DTgsr$`$buRY4QLm&s{j{LuLUx7~ zp;{7caq;~jTB>IEcCo4Z%|Cjv$@oI1=?rUa(a&ki9rfhv^P>*@e*ScIUZhe^x_)%i ztv0n7t=(Os-r}vcd3)w}x+opIB^tR%A$nzq6I0Cf`3FlnJB=3YTF0ojT{@_fMR)Dn z6Em!(tJaD!GdI6@^Qz78Qp2}%dPmwWiZL<#`}K`|(c3SPnkUXh>D+o=wlmRi_5^|a zV>3S=-C>-5cgcHKz3I*?Lk{H03%q^*^7UbPzCDZwZu7Bx2)ljGYa`p-!;e4q74EzX z%IG&2c^B-wJ7ca^+@CjDp}iS`Rt!7dZ!ULO9L755Jahl?=0->MsN2>BzhVTHzE~|3 zb>DxNZ*Ja`YZCjmN&fxI94y4rZ~ERMm?tlKuZ%i(_lK~1hDThaHzu6ZxfpMDrzh`+ zLWP=lhk5TVUr0VM=Z}x>SmVmwB5-1sK>zAcQ^&W8SG=ZbD1?Ao5mM`B<YZ+wpMH91 zj!B`0iT2H|CjWDb*Db6(_U%+p&xPdRcUC55+aCqp3>6WZ`XDHh)ojh_c>%i{4x9>_ z>C^RMg~yiPq08Hh^Y+a5^a?t(WcAGT<;nNv-fx(pvAA4u$2&PihTh)3rWm#6u*Gh{ z+0sh9f-hdY;^T65FS`9obkV(wQoULkJ@4;7`gC;WkK4O{u2{3uIV<SV5_{?X<HBDU zwn*`stvSucU?Ia-Qu1}dlOjvL`T~*JMb{h`O7#8go3D4|<K@;v+Z@-szq>Wnk$Zt^ z)T0TO<$W3Ry;gF}I)Cu+d(QQ$LYzU9g(hq*Xbe!)ZA`gx{`7a7Wv{fQ&+S<|twQC< z%)rRtcJEYCi?UC`Q>KL{9KIF0DBV=>x&E|AH7B1=c&{60Al_~K%=guw%c*Xx2ZeLL z7woNiv+ym$o~Z|KM$SBB2B~T9)~w2U&B*Y+wnFK}-hj7?Oqx@<O1^$!VtB)R&&zpj z)Ez4arHKw}gSg(GPx<&P;>hgei}x<J{t;e2q5hA`yPIETYI24@HL}e4yZ5n_`MvWg zUvA{4O*oxeuro&Sez8^TqA&)-z=;z)R9?J!*Le7$!xqD!7jvc4yBxiv*@YgRDX@x7 z)D?MdyS(ts(ML5rf>mecPVG9hNJvFBO6{uL(T4>I1s4Rr#7^*Bx=7)=h%oQ!qdm;+ z_naeBx32jAZc<OBM~C_1wTp$-x%CrnE@JiQ5Z>O(z|iZ(TKwk4|Mv_HcedUPSUn{` zOXNbPspI$MSF<i$xn%X|qit>Ny+SEospzPW|1S2oe*Y4sYqvl1@QmUaC-y82(o9>b zk{ISCq_yhxhmSKiTU35yy0-3w)b+1SKb!6yF!)i$*Vrg2#&Z71(JOM*8P?3uAxo#w zT-!;)x+mtSuWPa{dK7Zvn?Pe#uGxyvdtGi<FVz2jTNWrE-G7|<_kjfl=ft~yt&&S$ z^kRia%9**nm!Eefyx#7-{HlY}!~>7#{jmN1?JMVbgFA%}>(tDJd);(dI{vY-u^GN7 zaCm)vpM%=ugBcwT;o<x_WxF+0db)cZ12ZM9c2~C)UQYBpW)pJd%Az%kxVj8}z3E%B zY#%2>f?U>a1F5xc%v-%$@7c}H*dMpt)n|&JVW8WUE2fXW{7gD>eCDC32)!vQJPxl| zxZ|iy_o-P{Teg+Ayg42ne4WF&Mb2t1o7PmJ`JbbGf|UN2)UBL2ZBEClT~%AQZ1q3+ zlj-n-*S0Kd4X-y>|27S{exYZV=eK{l8ang7SgIA*#5#X&d2S&3-5-*tFCV@xrevxa z$WdNn-}$j{#k$qvz5G0Rx2>!$Uc9NRBO;pK)##(<8o6}G@if;`**kgWLT$%>9y%_! zf5OR!1q=3W_AZ&@qSWZ4)~uZHaoKC%(pYA#>{m_S%D;bc(wfSZ%V3fvnp3uWh1Ax< zmMr)F<GQ!<GG9BSm-}B>6qDS`{oPoy*GaGa^xL-EZ{>>L^nyAr&#sk~eD7GjdVNS3 zBZCg3=sLrTZY3q93%BlNes<%bz}1{C*Zldsy=T{Um`N>LyR<E6<$*`6#epR+y)Kxt z$?}!3{MpU96x@yTHjq*h$nTOZu1PQFf5XhYC|-^wYF~+B&fhYTsWFnj)zma@&SL0| z>J5J0^`N9{^^Vipt1sTVrx>DhI@L%*>C2(>Azyg-LO>?}Uv4AEU-c{J5L0<@V&O5H z_vd*9n3#>%C{^s?lR0&Go$c=?vHH{JP93>+*7C%;Q!a~Azx=;=&D7*^XL`JYW8%h) z|Hb~cQlEZ2FMoe@-Q8+N21wuZ$miYPA3b<jlPGuI_N&IWypu;8ohvII-4t(0{``Hf zM9IFULrF3=bNc_be{%V~R?N7}W=HOoYKsC5es;d+>}P9j;PJSA)i$}Hl_Jx2JlMCl zQ_Of>NJ!@`XOnGP9vzvvc|+8ri}~`PhGoZvmj?M|S_}>=0~E3!GR?6I=b0J8mF;A+ zYgcu_yQG%^@xJd%MYt@J7WHW8u5Jih+ZLkbdU9%!hG^G<4Tfr`I!?{9nvuNdVIzCz z$HL3M1Jo8Q+b1Y`b?b^1>s%M9$`#EN@m>2?WBnSpXL~FUH5Gn*7BMAeXP0pLImM&1 z8lGJ<1Epe{^x9x<JFC!+B`p;<*x3s79z?cV>)kn@VzTk#y=m;}-TI1(=XlnJF(1}o zeE2o*;G9T}^=pppmY;Xv&li)7t5RFGY<=wIDhg_+h$(#T>@|AilWRN2Py9@s=qI+l zd{SGbM6Yi3@aBt)$W`&xT^q1+%A(q+-n1)Sk9KYjD%`n;D_3@IhdDp{&f{F?7VKNe zI@^4W_||1F<Ru)6v#n$F#6kVom1~$9*k6aO<Kdbdo3~v+jo)fc#``yij-Gyc;q{go zvPlOm=AYoOeRkgO@KNojGo~hq>Z)bDe(zozT#%SBM>Fije`&tfn7*yrn?R*9U+o7) zP?sn~>%x^wZC$UTmP80om^V%6+s|W0xAxrC6W7XqRj}`gQQC5qgCfGL({J~lnq^f| z`duOY>?zIJ><`wm><hdz#qop3!?pg7iH2NU-4o|d?R-A3s^o~lmTlm94bGqUgwO9| zSbel7eExk+t9|=6x|+N@nI6x<RhZ3utVhK_gKy4lk79;~-{m&8FMq2;IwAh<p|Q4) zd<+%;-?6!u)8wP(8k)OTfaP~n=j7Js4@-7V5J*4vNp<F;d8<A@KhqSo)am0>qnNep z8l#pv9lLWg!o)td<loiP(;q!HeqQh@Mv$jUcAD-vhxBm%bzz;_;o&;59m31cKRR)I zxxm89ii+oI?&_v(D{~cFGtDAq<qD_7K+ZdP;yhKhVQIR@?nE9|3{9$$5j*Ga9_ecO zN_zIhSyMXBuZiyco4-%E<lK=8W2G-vb9DAFOt=2BnXf!%$NZBXk9;<s@R;BGX_ZvW z$`!|SyT$HYaNH2I^1!k?Uo~{J98W%7U0@+|;q{h?Z5qs<pD$tU?eFYsI{dK3@DfAn zfkTPUZe)a9z1DtLUV_2SDpX=izF(G6*xgMjN0OHWX@Y$6@8je}f7?1Zwv?B#vz{*H z^<9yj(d47m8n)Q6%an2E=VvWBhZA1EKR)|?J;#CD`Vp(Y_QhM&^NDmlV7>Q8_tcE; zu31)dY^oWhudf&TcHMmIf_<76?YDM4{kGw^^6w+FlQ(LX%j(7KYI=0Z$YQRai_41* zNiPp+@-{YZe7?8x@LCPs^$xDSy6eKOJ84Z+P`lM}eoee+*wU{)svqwh=&k#+I-Bvq zsg3sSrFT3OS6ofvi<Et{pW|)@W7dkt?{81)o^Shg#RgfeAG}{)txKOUcdBKU>jw|T zf)$o5a@Ln*oMd0Gj)D#MZ`}T=&v9)~Uu2@hI}4>nFHII}HO-e<XeGuFrg!$hHQk*~ z^0D>%9*A<R6Z`h{j_g{kYu8UPa^#tB{2w3(Dw58uy7hb86D7raEx(RU+aR|0_SW?H z3o<opWw;>Ys~2nE+0W@eE_bVMSKG4%0yqBuWA0xo`%3oADrjZBDB<C>>vwmgR=Ai1 zpIM<$vBoPpK4SOdg>M-eCbu31jZp@En3Z9eeBAkV;D*PUiSdq!hTHlCTHaM;>@JAA zZ<-|??K1V$?r(2|Ls@@wud(2BcTC*4qR6~}?`Gu86ZgLI6m7Rv>bbqOT3=3j*ZYg_ z?5(whuPv7o-MZ&P>j_9r=;Gp1k~}NWvA{w|_nD#d*#lj7Ca3FnHC?-SjOjo!f3CRh zKe1Jz&F71iS&l4T$(>`r(Ng`%4$w4BN}}N!F=L@edwriC-ud69JMxN}(uVbhkoKIQ zpy1tzv=D(k$x|APLlRzR|1S9S#+6|)`?klH`V1<^W*@Vee>G`d!0FZlN1wP^9gk>S zzuwnv#qaqiHbW=McFoK=6>GlqaYx6p%RO98hjZfvZm?HaMYLCaWt#En^^fouQR)IJ z*G)~5ug|MZ-gXJ9O-X6d%tSZVgAb)NS-!1*H#eu^b$p=p#0_Oi*Ez#2zQ<p`aR?Ur zN=l0)A1&i<nty+9xJc8z?W*F|a(Be8#3|O^6+dJZ4{9>pvi50PfB(J9Gl7c#HzQ|O zyj$ts+;{$Kv`!y%z^<bsFULGqK;}l+!*oTlZ0?wzT$8Q6x{ivg)_-4j-lMif{gjjd zOaGGt3vFa9=JZdEoOwd-7bhrbI?0{Rf+hoyo1LrHs(;A*%%36b&Jl9_ve=^s5C1Hv z{muN1HSB|5Si%RH3R{Oe?3LHw?F9`zGcc$h-m(4Vo4JSyoB8`@>v8bCVXk=)FmDCZ zj{^&BYz#$awI%;wXagD=K4b~5u<us8CLfADq8D>Ba^|9ahxaYmzF>nyDeqau_Yd!# zwPa}eEo#5NI{(7o`}-fi)SL?)1``w%jEy#r&F+}$ZM@-sz`PA_xqWIGU%Esofo6KG zmhYDhmSOt6=hq*<JO6L^CGJ~%_F$GFcVfwdzwd8lN7d|xtp(UCzPs%G+$(?K^Wqo3 zzFoGO<K8Y+^AwBd+ZS|N7JSb=$@@ActlM(Mp=<GFVb7+7GyhiM`)V%t_SZhkCvU3* zZ}2_;$E@84pA>&_tjsx_CHk?iFqe*eb%yn(%|@;JcK&1huy=Oxgt=2SUrpX!l-c%U zm-F>A=T03tKd&kz<Fvpln?|8O&t%Ri75)1zena|(_@`g%<SX>Gr>7-kcLZ3^`MtmX z_+=;lrw5=_hLV!fBI$0><omj>D(kj_a`S|*X+@jw+rv`(MIY3K0lQyTA*Q<p@8%G_ z7=X@e4+fQW6;iQ#t3-8mb+1=RAxfvoll`AP*!@4Cvn@`Y!9jDfLY)5bRVupswyAIx zR{iWqR%Q62rFm&_=nwnuo)eyzIUh?^$?W)Dzq%!tlc71Ptu;+_-$os&?nhT9&-}Ff z*yE22cJG$<^z=-WH=g&Lli}@Oy*)8E8kMKkW^A=gymWG-qHq6teN&|%U2d!IUaQ6I zcb&D_DXk1{Ie?SFxg|{r3_DCi+u5hN9enrYLC|Z4e-#Ub^J8BgU2iwLfmLm4Mo!)= zzWaMrrS!}%WEDS3@HCgJU(RU1|8mpqpwdMf@5c%DntEDU+?BghYW?9j_uL=f?!Wr* zX|Jb8f1qF4t;_3n@0QNmD#g{B6mz`wx6SKnnTj9lOC?GwKP+{1i{Rx7Ddl_AFTQI+ z{LSwBb$WtocbC}5!JMZwi&5>al#-Y3;YAjvVJcZ4uBy8IdC2YA5#agp@OSBl-#U&< zg&3Xb4NPqGZ2hWf_2-Wt_o6FCPeQ-2%{5naYGhRt6+60eqoysB{++2DD_MTLUi$8& z-_PKSH*az-zG(68@uAvz_9ye*_Fr!Pe{)s~`{qRjzjJK&ReGDm?YrJ(Hk;et`q(rP zc-%cPeX6=RFiUdZY}w}es_lZuSO4Ci=W6~aVkJw!36%>cj-Oln)l2iySFSBL<{aAR zx10NX{hc=DskH^WY$Il`Ir{juPlr@icfq1#ZSUpR9rykov2pnZ=H;(`DNbjyTv_$! z@U4gp(Zko@ZrJ@{b(5LQ+Bb(APB$Md%(B^Jq_$#}WlU^rtcSn<{0kfZIoY1?>T{g4 z?)`CP?c}B?Hx*Z{4YtNY`t#p9IQI)r>$o7l@$lP&+^o43%lC-KmWe+*w&Fwi>BSqZ zJgr|^A{AGuQDWWElb5uHFwM!{(q41_E#s`Jxj%lo>%Q2syCA<U@l5e8nLLwkRxJ-M zKPz}Fz5e>5B}e<xi_ZS|ZvFV;g~vzu?`QMux+eVI<k9Arf<JCg5B~6&x6mT!X7~L1 zD_T7-B}*PJY~HG|Vr$~@RT6K`m>z!l?ZNE&m9B-wFRCSc<KyL*1ZkQ`o!!yTtNNjG z-m2H^3{RG{@!c#=f62(8{yIl_Uh#Q#*^0kG=5q1U-S_X!?bv$qR^V}j`+KvaW}V0q z4Uz~k+VXX`%kTeHE2ZnT-!>k9+{k{f^+DO1F4robf~#w9Gw-+~XK}|N^tnQu#Z9($ z=^fSc%uW9Nz3EqSBlgC2TUNuUeAa?fZ@p^%^@nQYZBxE%vuDMf&C-uIs@&VXS1+=C zy<YF3e7~)aCr-WCarM+k`*iDo`;U*@dwbHuu&VmkI{%A_zwc%Jc~qetx9hmoy5I9N zqB|zC*qy(&a8-u4%Zq=9KRPE?u8#j&vVhySOs6kc+5D`ul)lM*iS7@u0$1?j58vBa zNsWIS85Puh``f3xA7);#_<rl=-oHQY&Mb?`lRn^YcBJ#zyEEB`&h1f4w6+XtjL+MY zP`0If;f}>uYa?ba5q3&o=(v1ZaQ*bhMYk7daD<&wSyZgwd;P%EZx6DLD<o|#l3Bk^ z@$@1wrv!!x-l{j|$Tj}AyW4lq(frG)58cbHt*s|cnk4k?N5Kz!|CKIAU+!N>uKiv6 z*y*J2<%c_yb$`5^m{yb8DY)|3>v~2zL=K&i$=OuRe)olB!NE1c^Y1N~#O0{Ru*Tzx z!pQ{(?CUSItk*G1s(VwA`eA#xOS11IzN2T$Y|7WL_OI;{{klGP`_6!i7rT?If4N-W zU}^J$V}%Rfl8M#Km(JChGvsU7YFk-wnDU<8zxcjrnShOf0mJgkoOAP@+&l4D^oPw^ ztNb6a_aAdeKDbtD-FB?^&&Ry89WHa?8f{zO-uM?~8Wy$n$MUagDpF42k|>F$>4Eap z+7ApTHuc=iOSl*C<MxHe0;~r)1-Wz#R&F@3#3?RSzOHbO=*=+QE6$4R0+kORvJkD? zU}g4V4%<|njQRHQ0aCUhzByM;T(~8E$L-+u^D89(*8H=wwic9><UFZybqC0Go7YAq z*1x*+K*3`FBK{!G3AwU+-9O$+(Y>aYUAQz?;C$VU9(KNKkM!gH1a%j=!^;@+eVYD% zqH_HH{0fmybJg6a6lneI$K|j0TF<Xp9J1)&;aL$T-z`60Qh$4BpQ&e*h}n&WVIGN{ z0UdQEj8}J`Yp@e#_ujQI+-swSpKZ-LH|wljGKVCl-)=q}UbR8PueYOcTkDKd{|+pi zm%hlc5maKHzsVQ!`>Z6xsaxzHqYB0I=C5^MQ}$#|{Q=8AK9`cGRG3(^%`FpuwafjT zHllH6zRWY6W&8Kt1=}w2?Y`VQX&U37mrm+7au4jykF$T>@K&ziVbN^{8@c@5t&>at zR;*niES>h!Sx@5mWU-}3ri-~f;(u=a@#aoJ4^yp=TbBk_Y~LeZ|9!fZ%@!T5ux2LH zSiU*gn;v(Ts$Jar|K(n{n$(SgoPu0?La#OVXXjQV?e%;i`^NgZa{iTv51(GVpq+Xn z`VOczEqivX*I;#m-*REI*}QDci81Fd#P2x&`Q%qMn?KjBY$`U0-8NF5D6`VR^|->f z*f&kC`p56DH|(wGz2|7YZGTvA@8+*NYPXed+!4-Yop9-tYwaX>vn(TRMu|YpmR0=j ztA8z+;+b&mWFe@c*k|JPV*P9V^^5o`MeohqC)FyVIgzU-J(XwQ4uhgIuWPa^P3~#E zKDu8v`(Ssu>Y)Xb9z9(fwkP63+y7rXMDH@^sYr_4m?g;Bf1LTp*0hR>N|S$Kx0)ZN zSqmwNR9Knwm7nbuxM#j%$&KRmqPy+#j@H-SX>**;&i(kxkNR@;F0r}N-s$P;JZ#KM zE_I4Wwg0v`Yi0TEPWI7xhxlanU1|=SEvz<I=6kBkqsBEW0$0!Y>ZLhvudUpE>&t!b z_eJvaH?*dSmeramW+d9ev-7Txo;Gs*>2DIvmkFDi*_5r2+rMAm^Gbcit|?Qe9?URN zGBewekLVO#+*%a8hU;6V%iX-~(zdp?!MEfQYoRi<?ua;kSbp$j$)T*RPI~i8w)4X6 zS)_SXp`uG;s@Du3W&I0o@Z?{z_RI@8q{XX8y5OA(rA3ncv|hVPi}vHEY+J@%b$jne zHLssr&2H4m;=27Fe{)Rb+T|vi?X$E$7UgnwRozM`woVAj+MuB%wm)tL_tcQGwaej! zf=TYWN`X5@H~Pg_pL;xaT9ygV7sa4;M>csF@0+<rVD;ih>ZN(pk2hbJ(tDhcZ0S{P zec`Q?%NnQVoMfAQQ|ELpWxL#Q{MxPRk6CwB_uP)^t*Vx1yQ`<N;_D7mD?xsBeV0vY zNkPT4^R|AA`?GGB#QW`67aY6Cyf&m!#Fu5;jNp$Arp$sxM`t{@xE06G5FsO2eYpL= z|Mkl_to6k^zFocjd%*;c<FZWt&#Fx$W6v?}2`LuL-x{)T*M8~dJo7bKwq{3E9^TgM z7Fd6&ud?rQtZ&86Z7k|mQWwlJ+5;CJs;L!u*FC@a_oL?yS`&S4|AA$>7q=!<*vOqv z@lPt>{bBmCqCeYqaV)KsWoW3Mw^``EU!=*a!sol9KVIFOzxZq-|2&C?`Z=}Sa^A64 z3oT16**{D@v_0^~U7=64GhLeMXYQ7Y->k<`^?vFtp+DX?J#WOEn{YfUwP?=<1M%`B zYV9@ly6;nYcEu*2`{*Azd!wC|<Cgc~Q=flW|8)6rn=;oFnYj46@DtzvZQmziuVvfV zDEKTPDC@)PR_S9rx6Es57?#$`{)oF3^yl%K=wov(SH!-0d%)ZD=#BdkZH(Kwqh`v4 z7wxlqdi`YyPr^_4dZ+&vo@-9_*l;DG>Gb1+LCu`@bGKW)DfazRz4gI~_ZQ#F@cgz4 z+bYMJy<g*2`M%|%@%F#@X0iWvmP-y<@!_{>c|zn8%O}76`lUfmxqm%Y>f<hNo{bfm zAKfBCc5Qg>1<Oj;_j`u2?7th-djG1(W1sNP9Sa|OM6v(=__g>whvJ5~Wd}BS7_a(W z9dPqLFMq@HQ|A>tWgDv>r}tOq-Pb)Oe#mOCPvcw8mmOg%3im8#JZ>%Z;8Vqi!>83Z z97#AN<h-WfPXGEjNAg$ebKF*2%J$Mq`PJLn6>r|NG2Dppt9gEiy(0Umt;cmq*Xyz+ zyAN?Sx*N^gU@&DbZ}^9blZJ`WObU)`+ntm|pWQdQ(SLpRDR<tc+3Yz^E9$dL9xZwH z<owIR$M5y!j;>s%7V`bO&&^8r&w=iH1(=u*<crs`&Gyw4wz}@JKYa4l*F_Jq)9*W; z4&a!x%J9Lv9VR;%W%Aa!>|Dz|w~w*r@t@y6GR~T1q#pdgMPA>sZ7*+lOKz)6SBfu7 z)tqLh9X0EAi^`Xq_`SF<18auG?pG6Kng25D*vGy$PTAkxT~3NuHm&;l<MgNVig8O@ zZ$CcRuQ&gI_EuGfJqO>Y1#_7wHm#i)^XlyZ_S~%u3|m9m%){>JvTU>WIDN=I-mdYk zsrbWh6(53p4d<QT<7;6Swvx>tX5yc@PmTt7?9G0)_ij*Yd$(P~;kRvf-yZrrHGQMD zv3tqea}5gSVJq8M7XH5yr^y?)`n)~IwG&S+oOaq?&=It%>D$$t)gMD%7A9JsPB>Jb zvgWu=tO&ycuXuGieM`2N0assT*vVvZFPwUEV@(U!<<5din;Z8d%u=6oyZ?2V{~?O$ z!M7VrIOnDp-Pb-lLsuh;{r5xd^Y=vrLf)_4uk@$d^SWeV#nI=j^}--e)TZA%a`T;- z3IDAR)0eIOVb59YdVK%Q7)7qe?a`M$F1FMbH2zY1K6~}i$EwFSnAVv&!%FK#k{Lmc zAAY@XQM^;c{NsGrp$&bn%Pn0OUb+18rc-|KN|&beOW_ZDmvL>ee3K!!<za!h=(axP zIac>CYwd}XP32s5>u+6_SlRU$7KS;WrMVgUm*^Z@aJ!dfE8lJ1my5o?Gg<l|yOSFf zvJ4OYUc0p*yWE<s<+>2V{58LgQXaq9dF!b-i~XEE9R25`#J+9(A6Xc-qGs!=uRoHn zsk!|4`px&c<j3P{d^hZlb=qM&Y4O`qhK8$d+)pN5Jl@ytqjd28@>I^-@}(vV7Hlp& zbxywPwC$b0E?N_Pe$=Ub-fOk%7x&_MzxQ5~s`-1znqkjd$vTttrybYtrFn|~O>)tl z`p{al`@@G;{yo><<q5JLlw+{hwpY%{H(L5YTylF?o$W;F<fGEs@7!V}Y}??)-7({n z3Kotp3SWQOahR{kK4-l!lXr7W=WXVyw^~brYRvR_{~L#h{<&t+obdk|&qAmD5=*7L zR`N9GiO<O^zwrCMzw}Q1kFzwo1z5^0*)P165z$@pEdHYO(tv(#7CxJMCLwDj`|73( z*Jtk1%CVoeD@26pcSg#m4XakyiXMEOEabEglojuq9<A8EmCf|8?Tb=NH=FC{cHaCE zcFBq1-ucJ>KXY%N`!xL!U(^1wcd~o#M;Slcaa3@l#hy=}Z`>|m{a^G{#cJ;1hkH&x zc6{_(pONEkd%4Nvzj3`wj$3x9>s8*a)L3ftN6T1UV@3Iox&DHWZvC^Zjb+T;&ut}L zc=a0V0qGWd({$GpQeO+iX2FIh7D->eGPSDj@XvW>55EdI=bU(TC6#URhg}*Ab`|OD z3*%_mzUk_9>FdkyTvKhSk`%o7*s46mVTY8&m$J^Ln6o?1@iN5Li5`7y`L870_*dJZ zh}Mv<>PP9lzi-)1ud=>ilff*o%f6s4S~t)3W4cXzC7<fvw~N~jTyJ`B{IZB|!P!K9 zE;se8UHiiAb*)>EF~0v?r&G$AmZ{vley#jEyL-0_Sid#cT~Xcp_RwqAs*hXyw_N31 zznMqv3}0a#terFKrdp_=P2kgQeh*70St&i4p>p=aKdEYcw!3;7$6suGwfT@lJ17+I zU*_6<yLD~)y(8zJtv@R3JoWg#Q>mN{?UTj(vfsJxJ*>Dba%H35g7)?GuK7Jdy_fd! z&3T#Sw*E5XX0K+`Ku&{xp%1_0*H6~`Q06VV>R0uGsV5EH(~q1wVd3E%A{qaI`}FhI zi<+L9%I(`GkhU~Tq>jm<w4Q%o;Xhl&jycP_4~Yx!(KY$E{h!gPUwh`SbzFBOT=+RN z!!)-U2BKo_N7{Hw^}lZ8cGP01F}4(L_`Z9paI&j!J^!h8tt3^3yzY%m67Se$*S-7^ z7kXpY$K$_FGweD4d*YO%ipOg;6XnW6=QW>w>f)Jiy{)#0<G)?K?6cR46Uujgc&+uG zsr@3C={EI_=vhDhD?Od2`Q|&kk73@IEyPm(D|D}$W|O!rGsEJViv71AJ8mx)*!XzG zguh=G#oVcVm7h_3<DyBz;pXS}j@HzQOmjc>&>`89;lc0B$Ot(}^L0DlXG_Grcyq3S zbuUBVgz8nRIi>CF6sqF2CO*jftn;VhomS$)brbvQAN<+9Xc|Mq_w(QDZOTRMvi*eL zuHX2bYyIUmExY)9t>f=zb!)uKY!1>oe5gaBMl(@w+p+VKi9fB@FLusV%<JXL<KDRZ z+adv`^OxKnT{v~#*;eF2y=ft%S<N1K({FJl*6bS<%{W*0d|VupS@TcPW&e|9jM7DR z_w>Pq!n_?f554wXCh}+5E2g@jGNFd=KmRAboGU!<a7g|7e}7*|TG-w@|6}45S7kko z^suZC@sisg-gcEg@bu$@$?MW`bSxU~NNC$IX#L);INjsp>Q+lfZk}KD=4qMAiRHUL z+`sDjqxi6B$n9zY)$qhtL%I82r;czv{_)RN09xr??0q<EOWOwCuk36FNmJJwEr@lQ zf8X$-$5n|B*G1<GhaQW2_4dH((&-Eg@jf%8jUr^u{ySzQ!oPLv1O}(0tL^_^<7-sZ zd%(LD6j0mz`4%3Ryc2YA|5le3kEPjje(dI!=LlV5cen51W1b>aP?EEWn$m9^dv?R_ z*cWAdk1E`m<+SaZ^5@k1bI3DW+UCu9k;A}nM@smP*rFZjJ6I1se{`uuK!Rb5k>$1@ ztXEiNFYo4%VX&!tIYVHcw5Zmf*MGKNuG+iuPn;>=jSp_ctPBpSQy+TQaqnr}baYNv z>`co;+t@+1^NH-wdQm^*xvxFmCa~6K*PngTW!r_z=heubpE}=d=UQ&Q?b2tP|5j|? z$@G0*C9{6mT>k8Lu%=W=@=i6!4fUq4Jnlv_e{aufH<%SwtzRZ0?>PT-W5iOc6<(hb zk}d1Zx4ek9c=fjSN8n4&#Om3qvNHt@9UpH~KXWwpnaP=pk{@roN(U6(4iB95*;Ho7 z)6Eet!*e5VU2lwUi->tYUGlZy@=K2#v)TIA?BbuglmF3?S#N(loFlr(^<G^>mCRed z-5YFQNWPQ&9d$T$&()w-i>YGq+w~4GU*idkzp*`f)rZxmE;Qa>c`i+HMZCOdjNlu2 z1#Q)Xiu+FKAK-tJY<=~cS&X2r-1o^lSG(u#HWXd<srqZw-_(UykIr2-WkUDwpTAcu zmOCG#$-tnp@~h+DmGx0&T*s}Yn)*Kf&-=6GjmW8ARud%!o7*RgKkVi#Ze3M#{=#qh z_MH{-&{QON*J7P#Hpl-guie%qOV`^jV2V)Zu3u&PE$&YFGv6yWs}loXewhBWTrp_j zq4}@$A72lBe$gV~@PgZ|%k}Gf>ZS`@2Tkv(+UK~P`@ZHchZQ!xfh#^9w$yg&Gu1Zz z@pch!LAA}I4_3D&`mb*?OHMxMxG?^0Ht+P0=U-~O9{gcjxVdn9<+K+!QhZtDJR^G| zma^IJ_@T&<aNzBs#$!b_#wTy{hbv0*CCKKPgL)hF(Hs0$+$h~~_s8x<-#_|!n=&N$ z=Nj&tzRhHX>ydWnzm3mdFHQ){Y<`!&@?cBT!UZ3iw@F>Jyd%f|>93gD?A69>vi6}; z>^T*`J{>>wO?FvIPVao%g~fk2EfRPqC^n_qK$H0*S3Y<D%71Zh^JVgkHyN5`UfC$W z<?18p=l4Ngj$SPM@zbQ+7tJz`zt8IWcq(9b-!n()clN){;$o}Ruen6FBu}lo&%69~ zul)Jg)_k7Ye1-+7--_;(zFNORHcN5i@@J2xZ2JP6B3zXHepU#}@9)2IrMI-pTz+^x z$x(6QAp^IqOZM;I|3mRro739=CnEY?w#rq_WV-Kj>d3{bw_O?^*2ny15#9Fg;`#6* zk>$H*F;-|#uHR~qex~l|LaiB7gCzG&vhct0u7qbn>IVBY$&3lRRbxXMUq#R0{jkmT zLu8i0!|9USyKb3jED5r)tlqidu2qJ6Y5j-V-(p?S@}hT=7#Q}=oYKj$vz#w|*Q}2j zfpUK3rVm5Xh4;mNVLZpL>ys9iwejd2sZTP&59PhvqMck$g;wO<I}+{mXVW5q{SptC z-+lkva_arnR@Li2a5FMQ<ZkJ)*mm5q<Gt9^<O^?`;+7rg<}O}1>C}V;*B<^~w%+C6 zD}4oLdENuRxtorA_jPJ*|GQuMzE_+ES0m$rC08C;Yj(H1HFmyV3a^?i*Le!qxSQWu zwm{28g0n(=|0mC@QVP>s%&&s1eEv~vs@{t9Rbgt!^^Nn6u2~qy$=5GkFa7GW)Tzy> z%L@uJ1PvH|v~Nk>Vd^4(tzc;e&!V^A1e-ogRLNFq>;Ia~JMmR{+}04WD`pG~Y1zuI zzoVJg-F+(~(sU;}x#_kOgF{nP`+eP88Z~nDnY+5q&#z<tKBtm7-z=Qz16zOfv>chj zhnr9S3jUkA=l-+nLP_^lO}KhGICIth@Z)V_Pnh>`tEsIhRqm_Zy;LgJ@4dd;JCmg> zx*KLJx%PPJQR&w6+cxc&PTw8f^8N4r;$014Vs^!)frnm)xqr}Cht2f9I9BEx<*Z{m zqviVZ-O(4H7qPI0EVr8N)F<zKHsGil!;xMAzEi3}I{hY(Uj?|PtvD6I@FVo8<(>!I zE3Sz@dj6m~)BEr|Z;eLL3m+fz7~KAIDE|NNXfew_J?Fk|NxJZsE2<;^z+0iJOH2)M zdUel^-+KM<Q^kS_9vic!a9!Q=Ey}_+&qXt2#@b$&K!52aLY$MX2;PvG-O@f;T+wZ% z-1XYl)rkxIUrgp^kWQXl82@LE=iJRzhn<uAW}bR4$}mTk>keZ=U)dKiDbsIq54T2& z?h>+%6mDdh>Ng`jw4Q&OdsTIiez(cvyJ7j>6M|!X75l%(A24(htNUsTFRvulc?#@N zJH^x-)0y{N;Z2_Sy^K`{#D$-6z5l*TregP2uN(JLyaZ+6f2#QKdzX;N_btiEIYRHg zRNsGcebd4<>xIpx3*Qp>+xq%V?V;Bv8o0a}Dt3NT`nUDZmW*@u@f+&SRR7Mrsd-1- zp8fOJK*#r$41ach?AnkU_|m0*Tm8c2y!qQh9<pafDr#5R=d5?W+~9lT+y#F9u<d6O z-1c~NA7hmM73;U>UWq8Ezw_At_urHIos?WBSvh^#x8DB4Cy(M2>1+(@R#G2lui|EC zSpICyf$74}T4l^*<-TWgCQi`)nEzS*o=}p_vRBnl>-psWYrWsNu6EyU-6s;ukN2wW zH&b@|`C;q!89^WJTqytP;?BJ4*Y0Mm%l^Mvk8IxZ=sO~jl>0_GpHK~|IlIf@M%}hQ zQ!e;leOdVUq__OS<1ZN)mSiY3iCy~j^Q!-c!<U4A-2WA1Q}WMNCR09cfsU(iqsvyg z2J?V_%f00j54;tU{a=^O+gHx>Kl9%%jY8=b`zuo)xi3|3dHeI1#+$f3f?O|O^uNBk z%e!LZE1PX|esR|YmonNqH>xt2@ZSLSrwT5uzx0!Fe|kc(<wuV|xw^=}4*i->YFvN+ zZMo0<V7+hn$Be*z8_ur?csOrI<e_aLN(Z-3ZvVaK-w!XwuBtZY!_N-Z{kgGzQrTup zQ;icgR#(;~{MA^i?^kNdwch>Jdz;vQ5%rRlxmyo?>wmsZYNJ*8D&M2uPtC8de=u=X zO>LNaWXryb@}*ZEPrWs1f#Lb7^AB$LBzX_E7U02!8WSVSX|A(czdw7?v*Yj-o&&$V zr?_{2a?N$++8zBN$amw0zpV}N3W!#h|D%sTzH&*l8^@kqv_YidLcG|Au-(7HjqK)E zN?$5HT+ej>t;~^QP0fcMMQ5$#IjwYd#jE#%-#i)K#1&b;>+lteecm^D{o)(?PyU2m za(Xjowr<Y;dm(yUzH75=^ZI?=wgmM)TDU6uzVG^ezXS6(nQ<q7H;XxVKmL!vKmOEp z=Qw7%bjdwe$k9``5wPDhIeS0LTA#k$`7%PkPB7hLy|pIGc21so*4w>{7EhD%xlw;Q zy_NND-?r<I|836i7W>&1xI%FCl?B)Cb=ysMzM;?fVYaJu!E{Ss6aMALd)KDl6A}A8 z$$LqJbZVoQ+Tr7}y-upREisMG+IIS1HnZ+o%O6(zMT+4;uV}e)c1xKIyY%UgcON}W zw{}l=+2f`Cg=d<l%7xP+9#^F%2<IO4N}luLhkVQ*f$3G&EpLx8O3z~78+tCNlZE^5 zsyUl`KOTA>mH+;5Thre|`W#DyI5#ODeg5rx)-|<<H~&Fe)Il@iE!HYH%{=q{)co6z z9lh?!?P&k^^6&jGQ!8%hAK`!6=`H{8>Mrj?Wz!C}m^w3l-1x2PqCVfh!fU#Yx<0So z?A`JB$?F#~Q7so0!joc4n0CoDTim?Kas0w}J!2)d`sjZ<Ghe^=fwdK{A8Uzr{-LiU z=5^RXUW%>lzt6q>?3xdF7sW*uS?`PaVK$3Bcf;=3MFOE(6CeCff4}eX>Q(RU`}V){ zE85J?$(g9U$cL42W|wrJ%h5%p@3Xe{{kyX5+ODjttF~sn)`?=Ds@1hyshU$G_-3`L zqV>-2&)$9ht^DMWYBNJ;<BvK!IXk(NJMVwConP#qxB7j}=b!&JzSi98l+e((ku%Wo zLt}lEz1e1NQAT_I{D>BFnWW{{j~<!3I{U1#jcI#$b#Ir|w?EUK%FO6lfB*gYAFqRi zdG=rao+EdEM~iv+I<*uDmO~Fucs>8i>wEUuQDJwtCa)EIeCqQ{^!CRZ>u-wMV)3B& z6(`Tt*|oOUY75p1NUUnUzx~&oqovx*H||)|ut2acN|*Plc4z#%%Bm0!9)smOs$v#h z^?Tp)rRsgDPnx>j?ai(0xmHJ)=afu$-D-K`{^#gv##*-1&8yx<`|dp$8}|OZ?+t@R zai?$OFMY%QQ(9TE;Ovdo)Sp+>Q(79A@f!C(d7f3jlrdg~h0SBjwfjzsjy=B1E^Ktj z=hj}i6>&#**Z<(YI)CQu+uzr0?l1N8vHAb9T<`k28E*5=`?_8@FJ5i_ef33UyQ%eG z^Y;1vgT?2Pr&~PwA4u6g3Z7~ALh0YeT-Eq@H;?7bpRKZb?my4m9Xo6F*;KCYee}8i zF59N#;YYK=OZy+hKfCfSxH@#VT#rxoaqHdJj5b%OTkqA|^H4zYTf{H5WyOJE;pc1@ zeE%@9Xojv$(H(_#r!433e>MlHtF$wJ>S+IRTSS%WvO>?W@N?OhJ8#K0tPVeLPQs+m zpL^SfoAY$n6iy9zvHnn!(M3JAM&rxHKU2?roG8Xx>bcSK$A={sYeIMQmY1zf?Oi>k zYeD~<85QSFWt`{TY5V%lf_2O6KU}!-#_G55^$)Gi6U|spnz5((OkrKzeD<%e{;h-7 zyRR4J?iQA+c+U6EKzyC~&SgJ#S{dB&-y&C2Y_|I3nfPj+$D6ht|5$ggN^IJ*;0NCm zj=3yT?o-svojKv|T)WP%?LYPkU7BJ0BT4OT-1*}_XWw|U^1y)w!7)nWsihB3&5;Y- zKSuys2T#2Actf<a$7?||o~rY;(=RpjtM8gGb#?zwhw$|?j+wjO_S|MUqwJJx%5jUu zapkQ{I-1%Kw#laj%B{(BHZa@Ft^ZZ#=A7-YX0VbHZ^p#4kDk2v)VzAerM-KT+m~P6 zA9%;AT=Tw2F8hNuU%r7dLPdA)<x96N*6%-iDkz6NzZRkUth?g|mtV}!j~%&eXtwcQ zp{aB)<C;}E$K?60TE1&Pl_WOp?d$I~ZdG~0p<1v;q*D80*J_s27Zd$X<}G-5^#FtV zk>wLpN(1D+Y&;fvNV41R(WGs6U%c~CyO*{2K={!&kLK2FO7~V#*|#Ov+-=#`>~Gbu zun?U1Yo+^#^K;B)79D@H{bRfHo;#mQj-`}k75w?KNcPUJ!#;NwIy65{(hbYYz2Cjt zdVa|BV-;{`e7YPcpwq5%|M|nYvDq`@cg^m7SESWk_a=>dr5XEi%V3FVv(DaFqnC0c zIeJ$JH1q`p9UV8oD*6tO)yvO5f+czvmncitgK*Q8*3M~4fa{tV=7+3Ld$~dcT;GzZ z!2&vPeV0yYa)`n8Wj+;Q>4w|4rHHG^6|Qg8I&i>v4Bo(8qZ`}M(IK;M&dYp;35orw zKR29yE%W)?x~+Him)S9#pKCDZWA1L(xY;|3P3t4JZ@6Yzwz<_LnrE-@<(&$fg~hkL z?75lJB~^TR)ytZF>DmnQzsVo=^vs?0Xc{yPERodU5EGmj_2;2LrJZ?YYu>-`9lhU! z%|E2gH!hr^s~bBD96}u(GHjrf$#lR{QdVN-HNJ*R4gFWwCGFF?<E9{!=66yr?#8aB zYU}w|4uy6>bewn?07{b#U%byeI5p?-;yzuSv&nxp>2pf6{lB?44wjZr7<$b<+S%c; zmu>l$rOr7_43&1~`wCXHY70S9@WjIlK?z+d#r*ASZW*&4u{BVayYNj1<&Krt#r#=k z+dO61vhlc3cA&c=R9o`If8B8|E?JtN!Z$9d;qT9n@wvdkY_Kl(y4X6{WF5o=#s{6g z_dgz4_Wo7P+TF&jx2?bY?1bCCY>`5Q%M*z-CY}Qe{@vSqtgg29><qrly6%%lTHd_7 zbNy*bP)^_BH9=5EMa^nT5S*ACvF2!(y2uexo-5YNlwRD=-?Q{y;o{pRk9xkuFv#8B zFym2!c*E;rf0e6Zmt91mnbX7jLRz7c((w&C?ZOQC7A_m_M?aq-8yCLzW9iGe6OR4Z zc30y5HtF(`SKJOK3@UOCKT=x*D*&Pn`R`J)*ig)Ruk`+d`~PeYF7j=;tGc0FSZQL| z`IKXCe2&h#$6Eb+a_7rBwrypvc51mVOLvl*ZTpnrjLyB2s_Z#0#7qvI(YePNvc1y6 z&TeVo=eW6-o3C&Ge}Hd&_sgT!Gvas6R@A)d8@&e-wH<#_>L!UE+{e3FV_t=&>-yfq zrqAVnY}ZqIqZP!VW3TTvW5a5W|JPi1Jp0qU==!lhn~y~`(rH^uQj2(`?=DMz@_M;h z{rPi$!~RPhNS2<qA^ZKt#Fds7y4&2&W*g7mx&8CWiSOlaZrIVNcLZ9d6>Z7>CVKGc z{C|w+%O^7!9A7GM`!|zJY+K^lSB<K6%xAuSUoDaudPvb}om11#><_uKysw_}|BxT+ za`Kw%k+1U|F3mU|wadwptvBy-=ReQfAM0xPckj`2)A`e|aHXY6M6QmueoA&IYrtNq zAB}o{`7_@YM#lbl{%z`-(y5=EQw@VZnHLp?UAH>EZ)-7cylCF)&s+b$E;0(6Y$ezU z36U*J(zu%r-{bO9zuQ#*T8Tl(?XLHq3$sQ3oH{@KW|OKRw|A0Q-(x@Jk8kcjp7mX8 z>gE4k&v$#Wbem1Cxp+BZQgPI-Aj`HH4dQ+>C#P!fOIy5~C*R_Tx$Eu4$8Pwf$-S@B zvK79>mzlTu<dMIzzlzUxWitFpy<9%${xab{tAFKxn*a2EJy-1ieDa1_d@nCS1MSk0 zS-G8Iz8pDcUwHjG8{8>hx7sOT;@_FNNBH+o{W5!b(%BbX^{<sq+5O7(4p%+C;M+#d z8oLKfa&M}*YK4tGwpn%<M!%4led6iOyFYUdu*OWh{CC4MJLA2!%#(~5Z@ex2{OX(h ztW715{3iIba|X}hj8EJ8P2Vc4k&N|}`yQTibMLHQLP~4B625DlT6V{KL&4%(E|Bo* z=<t}F{Ry0elx!O(AGcjB5V1rs=jL7yx$is-^WLjvGFw6o7R(Itm1EicY%f>Hcb09b z-*aBQbdA!DF7p?1yUYFNw+u7}Iyy{R)p(njt-~MO-^EcJ<Ms7efl`sjqxO3(mU^uJ zueq|6t;={>1kI-|OQvRAQn<1EoisyIb^L<fhc0~WH-rBEOuYZx6Q<;ehiRt3oBRK4 z8T#}N&nk+VIDhJ_^ZsYi6v*h@Vrej4?H=r>{b_U1=btNo+Q3~TqnRD-CssC{A))iU z#fuvb|FXR9?VGk?^@@w1XFtB|xwlAZ+ZtiM-EI>X$DVz@{Mly}Xv`@UEtyr~YT#D! zehvG3{x{L)%+a&osq|N~6+5YME`F!>_<H>0qMxg0%w2hecgLKb_<G-4rtgzZzj8bz z`910Mo5uXRJ!-m<uhM_q390*B;ypdEyZmlRjr8*^C6Z^CKl>c~xe{8q3JO{}`R-Es z5g_qUVA+n8q~AS9FXpm{#@jhP-LjlB^vT4ktNT~}`d6#9zpiV;@|Gps|C@Aot1tbT zZE$Fz+u8lke_rmeerfcm{jN~yo|;$8Eqg_m#C*FXcs2gdu?kRR+I&B#JZt$zt$j5j z-?!&8C2X?Vuw<M1w&xOaobwK(l)CitisdaSI=1=8cD-X9>>HndQT?~YdgJqN-94Pu z+8Py$<X49Omv(=ySQ>YE>w~W=zVCi9|GDsq_~7iATVLNN=ilGY`EFC84(H4%zB}7{ z;(0GFYx%T!YsuAD)ASsnu{i6X=iXV%rJcH25B@ejzH~y($KoGmXAe)iD_opowC!U3 zq3wxc-};yhZze_WI-(r*<<?OP|DBU=*d_B<^F{l~2kF<hZn)oEe_JTVc;3<NnR=Pw z`<bV`a+f?2?fdZvr^POwwS2pE%~nmT^*DKibBRv{tNV7r-rW%z9nW`vKe6NK<rRm| zHHJU5`TA=`^0Oai?X~{xAiFmk%idpB*}GqUV%V~s|NLQ&jat4~iGxop?+C}wja%P( z-iUQtQDe^Vti_C_dpkpd@44KQLa!67mR$6``2K3j#-zUU2Y4catrPOEPd`*Yr@i{5 zwFP@Dv%^pI{fFmWo;~HGe$&cbZq@HRB^2dTgXI^TjooY*nZv$!TKQp}H7{cg)Lq*5 zsJSyuds60Jqwi4qn)&j>QuWTam2#ol%Rr3+X#UG=S**mNH@Ad);ip)YdEeD-?(g^C zu%PUB<CBm2X1BNMp0t!;)W7%D*zk{DQq>&aOF#RQHXRM&H{yx;9CvW<i~9n60+%1> z^b{Cm$=yF@x#RiXuKMd-K4t2KfA!Q7uh_O|ec$kW=BsPmslo3S=A5!snOACmPSHGx zWz~u~-$X*S?HRkL&UlwTq2k+n1IszRtM1OaICX|xdf?U~t#gjo1$1t?Bz)HjT3=@^ z#B{wwzRo)IwEdy|m3Do3%KTQ_>pwHSk!3eq)pw$LL#E!;%kxzuHt=~D@ts>}E`0s{ zq!X`~PR=`cZ=t<nxZph1_d@n>!eoy3F8R@W+GBT_(9`*UCq9^08ezO^QqfE9ALV+7 zO+Qy2nirJxyRSRzaN>KDj#H8K_Dc|FrPZzL>r$|I+?THue|&CD<le`t!u)cly{?{C z>u~9X{X~;zhEA#0nsu+eVmANtJ2dk@yTj8p&kObch<hf>9iMiU`Tnn&A!~m~RPWw* zRak;;UaGvn<#e6S=k`t;GK`nLzu%_2+}zOioZ9PyS4C_tPCxQlUUl1b37<4=2{w>7 zWTyMv@(nhad1gxeM-I_=TenNC{wBM=&8lK(V$ELNpZa}`>A6|g1ScQ%RH*k|-1OkU zyQvoK_wKx~`V%b{^ywV0O3$9=8HMK`+}}8*>%4r^g8m(h;V#E^KHKk>Gr#-9pSMZ| z(VSwrM?O@q_;G)}r{sSowf4!6t{)Hna%}05c^0$2MB6LxNVj!eAK&$O$3%-=Jh!Xu z=NkNxb9%aaqe`mzE<b2;5}Y`HF(^URe9Uory4%y{yW^^9erf?5)?J%1#e07Kw%5nM zSajd86K72DJbBdeLsm?2oYKQH{||qtF3_)NZVCJ@a66kPV6V{i-DS7-ar&qQ>D}FK zb#>M~N%!N8Kg{$MmL0!2@$4O+wCpF@phEvs_~gp>+b8m#7dpSIe^I!;(#t0M>roe@ z<u@D4DnDo~=qLzPRqN(0_DPzXtou<?;$D~AS?MCt#6JJ^rFTr<r{3X?>#mWve-rk| z{hs5~p8bNwe<Y9e@6i1u*K(>X(DL>BBXj?BpRkP*GV-)}{V(dXTI>&&X-{MrlB(u- zUhR*cP;pP5al_Wv-KLAR8)LPV9Szis)6%UH!zY5;u8<&^*leNI^x#Qh{ZWoz8<v$F zn08nA@cWgf$7Wp=4Xe5H!qPWQT4G_;abD$?lb1f^MqjoT{x&74LYs414k%DcWUoE2 zY`gD#wX6T*y7`_fQnVMIVv^Zd%D#!=-&}2u@TrskKRJ0(zol8C&RosCrulj|Pq}E) zrsIt_n=JJ>l|>G4gk0TuFmA^xnc$qF#m`J@^v-;{WqM?8P2>`J!v;$|(FTWm{VMbR zI$Vixe|~UB+TXoZSM$6|`_r@2zFVzNza=f=Tq>V5+47g<%w!>sYVF1SmUCKa*SX#8 zht>2a&fg3aWVyYm+I64V@pPAc-}0k<cC6a-YxaWw6P}qIUwUPyWAu&KCex)4d!H*k zTy&G^+1}YRCEfl$-YY7y--<6gtz5|MZmaHQ_NDT7I3M0}{PItSbLN(v)p>`_iv${D zwKt~9@i*wcc47EqJ?-I(nyf235-z44nirIl>z{LFkJ@hG!|&IX-jSKzWV+W|HeKS% zEr<68=1r@wGoDv?Q=XicVxJ0$2SLG!^Ea#cy_z+x`lEG-Uv<~1On*U*I~5+!Zx#K1 zc-ul<tH*TD)F0dH+t<eKXFLBje^$HcT4A+nnQK$NC2V_ef1^oOk077>zHe*i`rQb2 zI`u<*L+ads@@V#M-Bn`IW&Tc2cXK{jYq#Y0t$2lc(|ccyzir*>k=t*(U4EUV{#CAp zv76%$Oq$ZW`0)a_v$<u<1dGH?cZo&c7XFwUDN%Z6f2CqtderAFc?LX(-aR_el>&3L z;L7`fvMkGEew7>5+4lCt`>)=5=xf3p=5-1o6a8Pdmp{D!&vxHgZjG5G+|O=^Bvs9k zG`+UHPA&Abol3+G!S7AxA9Vgt_>s7sDWT|y@b%|PTFdR5%kP@Abejc!{2I^kCQj7y z{u>|FH|39SZ<-MBk}sw>?$Gu;w=1S=GUt9=H`i@NO?m0<4!`D&<uWce>+5^-Ki4>k zvQ}L8JN*0c^RM?N3vvmSi3(}m>`Q-{;&pEypZjsgK<PKCeU&{9_xh*oDHq;%_VdU5 zXs4S~sz0pz*R^D0ePi>Mqbm|m+f7WUdmDH5Yo~lA`#sbDpgsmm_x6CTHC*c|*9+J` z`sPvpV3~-{-M*7KhbP@xck(%W%p)^5YK>{j$((~LwA3TEti1SKBJ^qC-W2I1&y%We zXO*w`@k`U|-afX;H@o(JPMD-$wJPj?O!d2yKep9*AN?<PTx7Dxr5Ej;Z_5jxd_7Vu ze}to5<M)R=A2I85j@KW_6jVMbb-(`5;&;5?%lf+3lVaVUr^E}{KQd$5U4O&;_)Y!* zyRVE~@fMSREHoFk|HK!xzM}V3rhnkKhj%3y^|!4N?vO9@-uqqT#@42$<?M-@Zf#t$ z<#^?(sTS>b1Vp#oGU`|V+s40Q&PScp$?p#sINd1zHKFQk^^IcbIL^KH?#mr3_RZ(H zb8W}R*tSVkKeI#5Rft`GBfe23b#lcy`Ht8ByWQeH2mIKscj(^7DQ@|z)L~7^PsM3Q zJ#4e?%Prc|zN-58w%Q*L9_A_3o2ur=d*8VF;~Vp{A0<KS=S1ACTi7|pZx?HDj?&5G z`B|GRqnVXoB%j~xd~(O%>@$U$y0Lz`AU$^)PIp@VJJZZ>$0mC!9nok`h{|!@p!=G| zsDAf~rF!yfUvBykb~vR}p!`zBo$h-|54YUkQeqj{RDDfY>#pCK!sXjbG+|CuI^ME) zm-~h-I?pG}Hn2(6jdjyKxX4#!PG$V&FLH>;?TyND{cuq!_0VbE*h7J*WoElPdSSn{ zL~`qqIR$y%)8QkFMLrk1s6Tvm?b!^I_Y3vT8m{f=c=P<I>rtP78|PSFFU@-ylyx)Y z(erQT%Re8TDr@+*+$QJ1&iwp`SGjLpRJ?g?tNdFP%VUR%pKtqnGJDPIzu70N`dq)- zK5sj7<ISUok<}HC&gl4^?Ok1d=TnWox!>KB-p|vEz5L!5POjHTcXbr)?>}XA<`rb< zt}bqtDrnSZ@$tS-4DtCzg?~LY1CNWp{}k|svoLRai`xEYZ`S6um6u%OVh<Os@GO|| zazak_r);@wso($F53%Lz>L<Ut#nolwcuOrpvbshn{EKH_Rekvs_8+JBIE6h4pD305 zaMeD|n4+YhD>1#2n-kjG#rNqZRaZ9nX_mdSGo3s6*0F1m(Y5DyDw=h7M$G1%{WIX) zs>io(--)?lYxwE!r9E0{d4-=Z&MK<AXgu>a`!d(w_$`+Yzn%Yno$2{r_2osu|F0;o zf_Uah#04G4g4^xprpLD^*-J-->icHqPVBGO)m<sda{k7fwDQyiGn*2`&G|i6Ki)B0 zQ1<ccKUK#U9ozT+ysl2ty)u6Dul}mm2Tx6k4gK@?wh~ifbN260`(S^CGr9BMDyd&Q z#{E2X^R^SmFMsYXxOH~oPif;c--Z3v`%Wd_;q3gAS0QZ|7kzMU{F`TUyKi5Yym$Tk z9BHF9&6C%!dsE`^T;{}6{>`fnoSvK>ww~=<JI_CZy$gQ5UJ&@)QgojIga7=iVz29Z zH{Mde-M<2oKqn@*hOu;a$Q+j1ylm4QX{#lV-B(=@PKmB;_;+(__{4MfUOifP*=Y9D zUA{+4Qn*8<*KU0O|19&R9i<LZe$}N_H`nLttmfKt=FX!omV@)xtX^<N{Mp>in><P) zUR*bu_BNF<E-pxjvr^hP?a?NosuYVKZzu3D_~i&6=4Xw&7ZrC(-hEr=s?`gh-w~0D zGO(%NJ^S8F!z1r&{ojZQ$N$-+%y9Vs)}7~yPt_{UDKl2Kwww(em7bW~1Rl4VaW^Tc z-}*%GXRgRStGlL1a9^J{<<O1CtN*9``@~<iVc`w-0}bJ3Odl>}=2lcZn|DIS^!W1F zyPX!ZXDY7Ge{}J(ab)C!)L&`hdi68xA`S1@ui<?=c~yApyEPmIe~(*Ru8(Fa=kx1d zmH92qy!qDA#O*HXmC;^*cl=4L+SZx*VV>7s#kiP|Gk4bJ)hIUKn`!vx)fAJe6pKa2 za`nD`{xm6R-~Cuu10HAVBZb!=lw5keX2;*ef4`G0<8#-fxK}ptET39vE3|V}zL#xy zZ=L`2=hc;Yj*7Fr{+4)b`h4I+&x&2niOuHIr+++oi>qsOQ;E;E;?Vgb=U(l~-&(AY z^WoB>q<#0EEV?88Xom^A`B(p?>1jO6{qKl}z5D-9-AX6s^F=<N1G66&88UKyyY+il z8&C6$ztgtr-FUaKzD%c+&-=-Z6?z|QHtd?CyR^<~=?#9XWzL)Cwp!Z+YS)}qv)Ef~ zBmXZVZgm^;{LhDE<?22^&ATUYyRY-KSLCMET&pGB%6gvPQ+#>k=9!6w<uw~;*Y}_9 zty(sJ&DsZVMN{9b<GEma_u!1bx9nsxu7#N^TggQ&h<?aBSuWl3hXc4FFfq)_aYM%m z!!y!6#gDJV#uU^jJumZq@K^p+Wzso0wv^+OCTBdJxp{L%cBSO}HLD-&^)6!c=-+(l z^Ck(oIdKj>SC71R4_W`krzC=-ZT0^(|1RFF2Bpc#db$1+)lbY%d-w31e%a@T`c?^M zj-H_%lU4~tpZc>kYu4tgXDds$SkKsd_Us3~b8O*NVZRQ?e81?&l-L~4@1=Y%FYOcm z(>n&G>g(es9PX?>e52IWE^o%J$$BgK<Rs!^|4+I4^o<7p1iAFoQ?t1C-Fxy#eD9=_ zo*N9)SI-s~6TNJAvhITDLT&CnIU0Horq>2-i1yjDWycKm<>D^yWFM4YE;DAZg{=kP zp0WMx*<SVKmrT!|yOS$dXKy=y(yEfWi`tS6o!;I*D{@)+dvl!IE}z<NZKHGVX=1`| zi+|OTzpL*5&rN0YQR8Um)%m?Ql5N9r(UeoOio%{$FE-n9J521s7Up-W58t~`7adu; z{(f_B=f+td*?LcG{Cj*#m2=3CLn>C^TF;l-KHtFjy>{+-+vUqX9~aDx*n0f5v+=5E zGnpNWD(c^_(|MfF-7Rt1cA_==@{OyNP8?aPTH43k!n^P8!-wmb>lh0SME42g?LTNL z|2Cz1=X{^#Q%_f^y4Phws>VyVKodHaZLEhrT#1Y<@n0VodDHUfxgRHQN6rd&^;^`t zjniyW(wP|zeZRjt^=`ji7~y;5)|tTL*)jD&TKnGw%VsP)7FCfD!FIiN&*YiWF+Hzj z{NJCExVO(@`kW&#E?f}i*lctEbn@a&S!XTNSI>U^%XE*@_xq>4Z^lZdeELyqo7rAk zU{v?1Y+h`@5$WXHj32K5Y+Z6RvNF|&k1xA4qRQ=g?dn4P_fwDPf4}Xsw%$+Y^S0eT ztAd|8Hb011-PtL=wR_E+wOnnLMR|%p*D>7WG~0LgW#X|k@p_4iZQS46I-GA?e`G(r zXUC2ipLeSZ<(qF_b-?@m8417FA+gv0X?IzxUH|*<wyxT}-74anJ68xuB%IkDty#dj zG1}+P&mJAWlbzjr!d~*bM!8>E@pIoH@vJKn)9pn{*SPuqZuN@S5MnX^GUtDdn^^6p zB&GMKr`85nRC;pmw^E(@Wyh`mw;pn~R91Q#rk8d0b9L`tdUNN`$+26H)$d>3bw@=y zcTW4a^#;e&Ep9|TORqVfBJ?KBE<XO`<IUd%I3#1L4zyK5VrXsP+x_OEf)kV5?k07$ z9AMa49bPO}-M8ld`^H?^s<dMXrn4jVZ$Ha&;N#1_s9bKbobMMl_bO*S&G5CI?e%BQ zCB42jog42K#^0W?qW9#QG~wrE-U+FV;?wPWPRGkS&8v@bQem;1a5U!-i%4aY&+R9V zrmCv`aAIR!_rUS}-r7mFt7@I{lD<^$O4!Z5`sR@rj~9g>?z6NLjKA>U_uWv2IoD2} zTr^isZvNi(wWVw3tn>G6s9zv{?)0;tpEp_VuU7i*fBO03t)dgJOJ!xpT>kvyLGmlP zM3>%`VfTyMZrNMcZcgHC<u#jr?XR59-Pl(141;$qFAT25_-}r8v;CqN(}OwdIRCu8 zljC=`cX4<c&v*XQ381{Sch8pz&mjYimSUN%8#+9+lkV>BGD(q1d7x;-$hW%FD1XPn z!p+-uNyNE(n5WO4-S{>syS0T~Yc1DB%dOwIp7!irZSTF>X=~rrr59wMbna|jb7K9Y zD>3To+X^R$Wh)BUeKCJ_;QN*>S}tB|REuna{9{UbANzSI8Q(j0BvrMizTSHImhQ)m ziIQ8x0?osgi&)PMdNXI1w0lv{%;nETjW#Ww{6vDglaG7qz8C4ipKE<r)NU~JG<>!q z`RiHculCP(9eKz5`t+(-|88pD-klkj9QH#hWV=M=zdLW-Vt*&FJvp)|V>x^N1%+kv z;<Y-!V2fCkppKFfd+6PGQ=hDyzq4~$53_NXRY+V^+;=T|^Y&d57dL+U$gFxiN~7p{ z+}7w~9m}%#gqimbyt-HYf4cid^%L&GR-az1@Tt3~z4P2QmUd;!YfhP=9TylE7EN5f zYu=Q<_ZBO@eO&SPP}!bp&+0q>46fH~5%yp3&|t6Ouk_;&`6Y91?mo3GxNGmVRgY)A zw_bij+Endu=Fv>^>y~QD=cF<PFJ35KcY0kH1H;O%Iak6y$8_1U$FJSH>_Yq5oJG-5 zZ{x*e_~I`d$YGlOFV_P+gj&b;Wxkz~(%P6gXMGe>u0-)lryF0F_G0UOu`xI-e7mBB zX?c8hd#S5k%)i>_`e#=!%H7kujq_sTYIT9M%z4unzLn174mAG1sYc)W6!XO7g&Ph| zm)3eYRnocXuFs;whd#dKvx^UJ{NJ$jd?NE7#pbK6cIRyM6ff;k$O-v=BA09VvtxpH zqA&lmiw*C*oAhYOn}`KgDQhn3o;{b#d|Bgj+l|mb*@|o5|2+?7JF)ss`G5I!dh1K) z+ly5-)~?R*&y_!ZY0s(?uc8|A&30zYPwC#mZFxgN*ucWPPjYtb#OsII&fIyF=Fwhz ze%-$3G0GJO&fj#;*6P?k`{i88;O9T|GRxMa3EzKH9=pO?V%@*iLkqXJ7W_P1v(fHX zW$Pg}<83=EHv0OktvdrP1TF^NlsdG%knd@*yu!;v>IEgT_bxr{=#aVWmm}QF_@}s# zv$^>3iJtA3>`or*%uT8&j?|pLcD>5Y#Ai$1-0;}le0{(E!MFUEt&Q8{zg1KgM@pub zbS}Ss&mcdvar$e!dnYe^^P6YAT{ocq{k8n^iWd{#DQGVH)^(v`_srO-j9f8}MvvFV zTs3daoE`J$)#lhcckHKD>~1}2KW*Z3u20J^8!12kn^s`8y>{Ph>1FSpblp1{aaIjf znsG|<<ylxx{pM+A7a8q1U4*@H!@=37y>7<5T7I`KSMt%@w3>qk_U}FxCC%RDd}<fZ zx!z<KcXj_Wx=VIwxm*un|GaJI&yrZy{gQM1n(p?TmQVZh`?lp`Z=3Y8m2sB8uWbr4 zdbDQZzvHEQ|C@Dpa>~Csz*19Os(z|AF)lLbkbAb)j0@T`zgTdu=Gx;E6L#um>|^Cz zwR84*6U)P<6yCr7^Nx|iRMS>FyU6f^i<iH@eP*p;^19d44_%di`{ZP0>zwPljs4d` zHXN6IvdZqa*-z_;{(J2EPCoCtcQQr&#*eII)%)+h6x`p?Q+2y3<w&Gtb&b;hzYAq% z-#pSV$Ksku)z5-b*R>lrZ{PLv?S!7F<K>|&8h36Vw#<<b+0m?X{(F*f`2O?SpZ40= ztZrzvwwZI)bY6gj+W&}S(=IXmx7eR~%LknCJ7nJW?Gin>ueVrZZi(^2t{TupVE*Gd z)AT%Dp3JyrZ#^yko8Pm`rJ{fCU$4};yL;x%mbjBV=XxK%tZe;L>8EI|{cWw&+zZ+> znZhUB_t#H&b&G4=tI1~;FMrRS6r7~H<VeJe9ru^z6~E%-NY7twZ?We`iwf6WN45VE zd=85apE=Tf>!Q8&wCDSEpDmopI>SdTZnuKEkQ4KqIkKm<lZ!gG&;I#&j+5N{&Fw7h zGdJ1_F;?V+h=pzLykE0(wz#-xVdQz0buZ@1l)g3Ib!4(={^OTFUE6<6`!wBn^NwBl zT)|=C`<H8T?XfAUN_!&pvCO#M&ba&R(z?9=HRhnyG$HZBp%-sF6r!&G&NrNyF+XK- z?IhmKH(j#Uw0_q+yVSj{dAgYR=h^z7f0V?khJW>a*suKEwqIg(=XAI9<jpgFd==mQ z^ZY8Kcha*CM#eto&-B@D!hU|<<!MhVL+^Zgsb?ng`^W8_xyq}%7XEu4^Z41nm1pie zdRBh_$>xnW&O0wpEjr04eNgtry5P$*FIdmizZPEfe~ZmE@!vBm0<FKruh_j>$zh?j z%l$RC7XIC>eR@aXE5E!syM*H}JXp;;^^QfUdU^d+_BYuVAAV~8dHD>}KLh3Y2@-K~ zlh2;44ljVr&2K4FJ8Up3$9v(P_FW7YzCHA9FRk<C$YJ^ZRox^~c8O0#q;_-kgonkC zXZ_|EI`<>jdwS8C!n2i~JL;w<`DGM)JePf$?)jwPr!$*#-2Ef@Y|F26`AKiucH(&c z|LMn<hnMtN$#F@~`TBnCpX!+1hwrKQ_Q`#<O$Vj7J0FkcftqQLFU$JYy)6%)wsGH$ z<A;B*<q?Op`j1&>g|S>0Wnz|ayf3(x=icW(nLD2Ci+Nq~^9s90?f-3uXBF2U&F@+M z=(Kx(#k^yyetZi2B=^eco^$Mp`Y$Y8@mB2D-%K}X+834F+$ybE`#)U7=H~oA>c4_M zz0dyeK0?e??af++_Y3uYn4Mq$ebzeG^~o*YzfRHl_59~Vsc-*}@BeH4$9h`ehc60D zm8%&!o~&1UzfiB`RGHkhzh+NAYtJp=PL(&!pYis#&HO#>y9B<4{rB8_^3{T(Yxie= zouzd4VL-iWMEvfC)Sq#;EOfaVqdS|owl+BbziBxoyWghg-vLOu8uWI>3&EIpj+n)2 zJbAp@&E0XkC7x@B3*AnClXyPy^h@VgPuB~4tNxH5-IRT7^AEGLs&8MF9|-#E!Cbjo zbDjmG`}BoNV!jDQ<b>${o-nCX*kk4guD(2Fsq&2h0_V%$Pb@sWJg|K(^ZG-Tuf7Hz zKl3q{WB0cQFKV=&{n&DN-~MYVc?U$_RF+9_rvDKu&N*B!rCX$vJw0QwyIalL$6~^F z%mV&bUx>Q$ea`IJj66Bw#~0jb&bQEjIK9+bt1037p72+^joA{8^6M(s%d|RvSoqdN zu57x@Pf^{lGan^qFlJ}5zj^yB=tuwO0{u$%=L@nKH2yy+zfoK@+326ELFo02^R}GI zPZsCAV&1Yd+f42B!SENA=4TGgy0<hen|ZP_qj%BnsK>e|-+Ju(aZ`EU@#OF?=bKN8 zb?^PWvZDS^(~f__Q7hCYJ~RKdqs6NKd-m#otJiwgp5M81X2WZLFUuDe;G_f^MiyjQ z9{V}($?H=y&p*EP-v8xe_j`_qGRw`Xc|j9QljbxFes~mXFMRmD(z4?>Rp$QJP`iDv zH<O3?`kwFt{a@xS%tyXhNGr?q%sRfkkndgP`bYP-GEKhg8MD9JQ=*iA;VIiUm1!Id z#7y)_eOKRbt!LelFBaXarUn=C?P^Q7sK&HAd}7tt+Y<$Lxc&KXdu7x=!GC8z7nVp@ zUfB6}ws^vOiw%LL4yD>1i|YFpo{io7nx~7=X{oiw|3`^`qQw)-mOZw4$~C8X{rb?? z3p1{KUfulr_Vxn(s>uaU<#KYXCly?)y;1CcD>_5q{H5=O`j!0wAJfisMymAento&6 zV&&)T+~z?aj~@O}u6KOaHO}LO%dhTgTl`p|CR$93V_I_4-K3<GXJeyx@mR9)p6k7Q z9&)tbiNH52UJBNje9-yLP~HA7<(~2Uo@o2^dAm2nYs6Z<u8b-E@A&8@|Aex)Dr;8C za)_<DZQhvpAo3fdVePR=b)Q2f9kXf6{`VR*nm%cU>$T?9hLLYodTS@GVGn;SQzHwW z`BQwOsrYu8=92p#7#E(h4XOEhL-A_f=~s>g=dn-yJ>z{7*SYpBXM2dZ^PzV_UH5kI zRJSv3*_mvmIsG5+`AOebL|K0Acy4#&vvt7JGtXDf`6<J>_?_zCY5p6x+jmYfU#~DB z{_cH?H<|}`*NK6bBYa!m`L>ktsr+5<9YyEwRckJ*c*NpUrvB2r#^I6W{^R>g1J}O3 zvB_U$L-td_`|}|cW=F?~hd}~+=FgBz7rgyk$zbM&B~Kp7RG7|NI+@YnkK7&ZdkPP~ z?CyMP%9iaGKF2w)htJbjElBULb>UyVgR}0<obmYlfs2I-`_6K&ir*IYeo>xL^y>X) z(I4`oeH7|VPd=V^bk;3KZ!f*h^t<j?`RB`C>a$Kuw{knc{ZQcHDlZ=~>1Q*JSRIdg zWNh#)FRjc#F<kK3k1tWjV?W2K{l6$Tv0jQR=KJ%wKW5+N+&jX*SF+eiI>)lMfNx*l zs?hmzf1WgFy!a`5;=|6u^Yv?gReqD{HQj5>nSQT*ZLEFF=6I$9b1t-9(T-DI_FF?o zbEitr9%hFB-`;<_ciK8((}bFrpCgQSC%?Ct@MGfsb){=x-8<>(UQ-V#F_e^)+F!58 z;JrA<2YKG_EoJk5kIkNP?&dPQ`S?K2L7C|-f?NqKs|;>teSgjqJ~g?^H}A@xw)3qw z<94_0n5^IZMVZau_)@d1eFxTw{@AXg^1pN6?^u-{)5XzqAJ2aEb7s<_-%)JcW=Slo z3QFuuU+q|Y`N4`079kV;uU<O&!%Sc0jn)y4c8=ZMtKX-7=f7b+Pl)r!>*OK}L#9vx zzQ&uE9z;M296`Z}&n~=bPAHD?nk&7f^{#3}aFMi)`J3XmbB{1R+uOZdI%28xx3GXe zuPoNgyz41ZD!%QE+?2Y4^iqZ!4Bk#^x$oxP{?IGql5pKCXXbI{gws}n4FCI5w>F)_ zIsbP$@v7A2Vw02Nf42rE&wlgs>hlBpj;I-5{e3yS{o2v|*w*3?TUFx!@Jw5h!!=K? zW8?Sq11Z}~vaW7>_&wyiW*7&2jjisIqfHN1h0YH$dpd8$ge#Umta2>(u4dl6ceVQ3 zmvdMCcvX0Z`~TMWDVtlL6rLBjoqfh}ee&tI?fG}VthhR(ZM)F_Z|^(amO3^+|7Cvm z@T_Z`lWqC3y?(z6<FlTYboRz}$v)JH#BXd}r5kQ6dUtc$-N^wz^O!1E^Y0eVhs+{+ zNd5Krsv2}V`TX1V>~r20R(w5N3Yc?=iPmdQWo=IVeq{5P{a@FGtux)%Iq!bsnwPPL zH<Lc($4Q80{NARs;-4gojrYC77YhYAm;X(>-}#$$|FkWA74?6Vs+Q)<F08*1dgX=a zWq3+GyYOfg3wyWOb*{6kruiS7G{^b2{kp|(56{l{eY`YcQt^r?JJnxL3Re93<5s}8 zqbb1EZmIme*81Pyf0*enNV%jtBRRO^WntQt2+-08-QN=u9=hG(zIR~rALmEycexr) z3i`*)?_M$IAJ4tg`=F&BN3Yi_Zm14@QnT53>W2Hh`KO(nmRc8_t>nDFOEU2KhGnJ4 zc9%&l{B-wfuCf*Hv3rFAssI0)?mPRLGgRb3tTpfZ{`uFd{oOP?ZiITQNU@%`bh2jU zZz~yDcER#bsS^!5ljW2rd{<U|f43$7bIqUI(*n$%%I#UbUn%oV`~!tt(JW9IHe>(0 z2h6V%H{D?5nEIaWK;@~a0(^nL{^hcKx-Ot~yR-V@e$F>{AG~w${rZPt!!6F;-G)td zK78uug4ZuEI<~o@{?D9*i)mW>D`y?}_P$g8oA!cVm2BMR0y=j*79{AV%HMO{v8pCM z_piQsNT9>dbbg^bn;GvPvka;ETCuj8<H_HM=f`T{!EZlx@hVf79jkgCUDsdxx9Mio zU;mVZ4Ht`}f{HwMKa<tkSJyRZ`}%_^+mhbf%y`m0Z`D?%tMjUj_N~1i^l|@j!=oyb zOnxOM{f?EXwEcL8-SCj&DZ4$=laKZlU)XBF9wS$I_hPBVxqs7xf6b3i+;sGj&C}^e z`gimmcqjkuY~eTNDgLz$hs4jR)V(-+q<>HI745jiMYn>d)K-|g9q875&GM-IZqR#M z*0Qw=9=vp%v8GH%^KIe0BGq$><}PdhY)zH(|HUgGVEH)ml-m8q#Fh=uzbJm4^?k$h zZ`ogdKYwAuasK<{#@kZ0=l-q9oV(%qx5YKDm{aZ;$`;qKWt#t)ermnk@*na052SP- zytl7@t(chUtWQ6W&MV+cmA~I!{&o71Z~G>+Tz+>*X0prCEz3E>-yOX6jRm|+=$2Lc z9T$asUf1<89jZHJIhX%$+pxVTK6m9?&!0!VL+bvDgq~iWaQdb5CD!_7KYBj~mj2wX zd+go`(Hrn^KYK7mqBo=HmdDTj?}t8ApZImx%ZD$$Iaxd1u0Q+QeQDGDLodr+=UYFv zd<1Dh$(5~T*P2_xz3hg|q~ms1Q;N5-xm`FuFTH(I;qU7+9tTD3no}ja_WXH{UpGIW zS$XyS{LO`L6?x`&|FQpmFr{Dl_4n0$b@1EcPB@yp>`K^dJa<C9wPLyAwPu!s*S?(l zUBxKx@^p<j-;RLN_Yc&rm&~kKow&)W!#dOEool}9_fxh~vaRRWXT403IX?H=3jqm* zCt6GgWai(CNrkOfJaOJ<GTXsvEj&(3Z*z*}9h!A(<H3y^_Z~CJ+H9U#c}~&%;jE7_ z-qQ<xxI&-E7d6O%Rz9lQEw=Q64Dx~2Pb^g9ZIX>`3(bGAHPOuQuDj{eD`)jEW@>q@ zqUOgRlKd|B$#Ng>=Ehg&C&StV9>E6YPgDBxlo>v(o7*PHW%Bfjl0CPZMnn18>j(BB z)SZ}^bxGmIw9C@f%MZ3_e}6FR_xWXWqMoE5wEaH6CARg3HSe)$mv=8c4X<g!7I`)& zH2iqDo$0}>pEmz;y=PTbO$<A|KbLc=@qG4gwSC~hE)X%xX)^o4zH`n6^NLg%QswXY zu25RPQeW}XtCmxrLF)h*9{KGQa(}L<8#58+>Md%%axBa$egA~}@{~EJzF+p^>&GZb zol6Y=x2cNkH=GynGf(EO+oX~y`Dfts@yF#RCrY>#`^bC?3;1?0_J`RSCWU`ntUKk) zwAH%TTI#76oiTJ`j4A%#nVoOV;l6#MO8h68XETn7t%L7*i<+Ir-IP70{-3%{_kFel zb0#>R`I!Fjg&9+JmAKAF$r&=|p6%IlBJl8sog6#6IK*-fZBI12XBsbDCdzd6t-=<e z2#|L{c$W8O_Ja)j&VDXD`&0d&F8A!;K}yF(s+S);!oNS%wh=N<>*BH`@~?_xLGOWe zQ-7G9Ikr7hPcd9EF<h|i{^#J>xIU?6)ASa&&UmwN#^cKykEB0%VZ`IUUGPRx)%KD| zSkC!m{9!U1(gv4LmyNfVFv4V&lrHTdbFa#|TbEd2v2o)3@!IcquU}H_kl8w~=F`cv z+0l;h4L5&O-tB(BFO7GXOJC{PpOS&u9IzxJNMM6aKYT4gX5sxav1g{}r*F!;Y<5RZ zpYxo>rp-nc*+(4IVk*SaHeWNomVWdV@1278$uY+NYVvkJyHs_2uSKCz{@?G#|Gu7S zJ~QLL?0cV|lYYwY@4K7#n{)NlX`pQepr~+haf!MjJ$c!uPq%|Dc7FeOr|PQe5>@q} zcSXkO4}<=FyQLDg{{ErI-|ybKlq$FN*PIKzemig0*wxByk1H*lyRh<x!H=Y4Ojb|R zF0XbE_d2c3+2$0X!*!!x4-~K`3={kJchwc&XI>DW#5SLI$AVVKMu&;Z1bEsiUhkiO z`TLQ_KaLB3Pd1yWw7%E2nx)_7yVZQZ*{4k(pI;um{Epa~EtRc@6L}6FNZKfK?Wg!0 z+d0qU|MPcG`+MTS<m#(cwI4UhYwGAd{nUMqE#b$4Iv)8e?>n-lC3h>;gSJJSw|qar z_%CnKvi%1q&)&DbJm!SK3+wNDPuy@f)3JM$oxgh3gPCW&E7Lv)c`@Bnp7(xv*_!M6 zpyY8Ws$x&vsy%kQO0(oenXd16{!Dv@-B0<60u{gZsPb66&l1!BZJ2duP3wJk+4wDQ z*xBZko8Dg=b68k^-^rKL@15%C&VP2#ectjzPt(qAKmFtA+WqM#Zb<KVGwuGy2fL?E z+}Zaeroq-#)#lTk*FF1Q>9zIjZQOYM?=+C#=B=vz|JJbnBp1j`@31w`!uMBCQcTW& zuvkCc@WGzdKOby<x%FQA`F%5wH+)`~_VD}aS2gnP{Zd_5vmRc~EPh?{_jCTU#H~>h zwpkhs=lB1U2boh>uV9pxeos!W;*sjPA4hZNR2}>pQ}y}pp1%*pTX>lp>}|gKpWFTE z+=|NZwRev+d|vnL+kJc4*!Np@f;_wJ-HFwk<$k`@<Pa0gR9z;Pv+DcS{L`N_zJ!~; z{5maE<kOpJsW!V)B~||=>wDN<dkr2e%G4ElJoib;)`zbx?|-^`%5-a7`LUyuB;MOR zsmu<$_V4Xh&ytrH`pV;LrtHq!HRtAiy{G*C|0aL8``6X}esAaY`SlX*htK`3uQL?7 zB6o7<!-5&N>;8*;p1$V6FHZ3f*V*5voSErd`Tp_$kJG2$>$;M@Iqd(!e@Fh;c!jx1 z@!zdgUfjm3V5~g#{Ic__OYJW|*HtsM>}>q&x8`$Q@FXD#yAAT2_s4oIy)FE8*6rY< zXIk$Y*Cf~nO%i%#vwy>mDX-tvwS1kut?<3>{wMGI@1Fk9sQ&TMk&}PkZuMlCbLqPa zSNG`~Q{yEp-~XPP?cwK>aP?Mii_^jrAD7y%Q8red+P5=Ty25Mi{nhX5T;d!9*FLUf zb*%~W&$u50$`xCLZm-gc3=52So;_bAC-c+mw;xS&H~a~<h6S9j+@G^wS(qI2_WsxR z`Em7q<+G{fGY$V+YsI`fJnyp0*H@3u$ref2KjXQTw#@k38^I?jTN5vClK=5IKW{<x zbiR^z6Aq_}&+(jk{rE25+kHRo?6Ez%C3o_<So64ZJBt02Kb+jVqwY}a9J?j<_s>N7 zSjez_YdxE&d`ABLuEt_FJ~dU%i5C~QeR{m>Y@l{#>^m(n-M<ry{iLrvSXP;QUb6GP z{Dapw@4Ly)H!C-^n?IlXyj<Y>o%w$Mc(yO^5|{g}`@BcS=l?z1A74u!?|d=m@{B(( z&8JM6YP=!dpJCen9d<?cE`?@W{_k1%gPHMK-W@T^e}7kP<*`~>*4;IKa`^qf9oO&u zoe}-+fBm<2)>fyC-ah_O9#!?e)x<-CQ}v753JrxD8`jjm-Q{{c^t$f)*XvTdSFg+4 zIDKpK!M+7SA`|Xevp6a2{XWm9`acH`52t{FBG>-&mX_+DZOV71J)6U_ZfDWm{@tq0 z-Cn0Ezr?Tq^kRRU_0p3Gs!gsge#~OdxBEYz@4g+*dV3DvKCQE5($_`3qNMw6S8&hF z_^+O%{y5|~xO7l*H>)YA|6Mxc0BkLQUF}=Xx__5XZ;a46^Q(w)|Nq;YeRh5e|MP5P z{p6{W>knlwU;eeUT1HIBBf`VLF!15J?1zeu3|Fq2&--%c#)^V}zo)bBcyMQ9Uh(7P z#T#zrgoIq(6>Fazvg`Ka?sNIscMZNzSoJ`4wOPW}n=|Y({{+r|{UVY1wpN$;j&PCl zu{(M?HV7OmxnTXHAyj(X#qH%xiHeR}wnfFpr}s)V-OWosd~F-o{U0|p%yMtDHr&li z|J>)}wru&NNh0Tuz0JMueM(DHM=$xzhDP_^?<M6Qe+qYW@+{u4<jzzcy9q3D`&FA~ zoG{RvW%F>#(Zz=!xw!Z-D>o}e28JGaGpW{Qj?t~P>#uD(<)pRtY)fT@VA98=a_6st z*ERDppDdlT_Kg1dg*%o`<lxUg$J_lloYT4EW7hBBHOs%}J(yW5efQbiy|09?e}BKs z|LL6zaST(om>6v?5Whe5`NXRc&YKVWHEp+_?ymazbc^GR{s}YYg-<)|y)*h|TzKd5 zi${JY7T%dW<KDv?%vQUvuk45i*Jge383hX4W2-em_$#k(&dr%87m2=}xw}B}wb}cW zXT|jk!%L17u9trC{`t2XDMo@47ye0Y34LC6^v+T3Yo8xZ=RR@j-13DhCFl6%eB1W> z+~IE=x95A<Dd?$9Qe3H7vp0iv|BjblJ#5VP^<tghw?zE<>S^(+*i?!q#->tf{oe1E zH!EFLj=4^b4>`5$?e3j_Z+Tn4IauS6S*f~{^=Qxh!s_<#r?plwNSK=Rmd-9`*r04Y z``I)xHhvF9+qL@A+uuHFJH32kVm6!G;>L;2LH$ziU+P&I^-TZwvHs5={{G#Q4qlv? zxK8DRc)m@o*W*B?2$v@&1||w~N==te*=DwB(W;KkPDwG})246R+B!pS;*mRxw{%2A z#~#X!77HpoaWJ#;?AJYW_fKB$z4>Rxjgp|6=01!61^Q2N9-iF$dZX2y{}U(Q3^*$s z`T9m&_`%c7YFlT2|8ARIY4`krBR6lE_U105$dJM(Tn)l^S6e><7xEJ)KY#xE><+<Z zN%JIw$;bL1%(MSH*?)iB5!>x?cP}rLy?o2p`p4b-^HNi)wEFEn7%LrWGL-Z^^Q%Zv z{%qupyg!X`2itdLd}8_cZT|Jh{i*8AlO{)OO_a9({qpJDTmL6%3RnDX)}OJtK(qXQ zk!Z2F-r)p;f|FA^-RGtoNJy9{%>4as$GXG610ODA=#iUs?0E6MrMtHEeT^=gG)JO+ z{(AG5nYA;2zcrfUr~Z0-+68;dm9dxp_>@!_?bxtnkNczp3tTpIoXA{w^<hGihYt7Y z;-7m|PEY07W+hXzcfanDqk^7ibWXe|sLRZrtj+l*eN#bpj1=>qrki&I&U){R*38a* z)Hv7sXVQ_QF@kf?Y&gL2Z&y06<k#H!9QLLUbQam()@o~KX<-yd`FP}2fxx?mXI%w7 zRet=Kd^_a0HLGNVEZ?&!?~+qP4U?M}#}uB?y!(6_%RURE&VBn1zFD(A#WC`o;Qap| z-&~#h5j-h$;^XNXlh3~Dy}k3<rIQs^6<c=O=LFa<SbLY@!K$oMi@AA^wN~Ga*84JL zz4+P#NoF6<+y9ly*Z03(y8Ce5l*o6>d}PjE*57;j(9&!T-SvmwZ7_bjAxzj^NLKLJ ziZ3SnBKJ(%o%fIP^RzWdDOFk*Cnmbj6_=EAN=`Oz{`KAR)egbtU_+_ioLl>5^F|v> zn60p9c$ukr<(laR^X(11(Z(}u3QL~Pdn5VaLW;o!WzU2FP|DmAked7KQHP4ywC6_K zO=che-FrOAWYdyO4N=kB59RJH`PG_W|3==6{ZIORHLW#gBY52GWXyWMG&KKRH>rkc zNBVD}Ygeai+P!erzI~1=RqP*XzNKBC5!g6UMLtZornDqp#!o%mZTW*#6WN&a))VaC z#&I4nPraGfd1d*xyn@>Q9;Y(ib=cqV&nhi7oW6ek?ZiLFH-|4Oci4UuQidPbFOHWx zzt^yP*|M~{y2qk#-<^-&B-QZb$TqROfB$k_Wu{&=&3hb{d*j;KiDiDZ$-;7Sa(SK) zKAp-E(~D(p_`6}h)tip~?c&dSq|ZGPeSK12EA__%Mwgb>600`v<@3(|xBX`mf9C(Z zJ%@zq?saB8y6DXQ>ERpJH+LqVZFu5x{p-_g^UZmm{od_)XtZaq&BxDQ)z;<<NpE|X z^tsO`EvA5vLD8}C$WfP1Z#QjyB06o($G?sI<qDEDYg%f`gFwM+a^cAaLsJ_@|HYkA z(c0bGpJ&R5ou9t6x^dg7Tho+le&v)~{ml8VSS;+Ee0S0ThUcxvcJ7N04|clmx2@ek zlIM=V?fY+Moqefr)BM6$i`5?=*xxaFwfe^9{q==C)AhF>+4+5v*C);=9)0EO-$4sk zzcW{gk8OJJ+w{--=9@V;wsjXOvk41{IMg}|&n|zHc5+qkm%jd|tGds#E10Ts%IE9f z`(I;MTdn@!>C1!R_jQ-=*s`d7zUS<R&A&Eh{Ir@^TPyawN7~P?PVjxrAJOTt1$_Cn zCewd<hn26|_5IOj^$%wkO<i+y$K3Y!`ycN}vZ#Jz(8ToT=lg7Vfd}tTTRwJ^DL&U5 z?)QB5QSF`I&z~=N&TITaRQBMzy*u}OyC=S6`PWkKoPIC=$CKBKUA%GSP1%CDs;GFo znZIT2?#1!EnqL!RIG?l1h?B>QrMqK}Sd<LkpR;1;_`B2dUfMmImS(JJ(wBewGs6y@ zP5fc$$LCv3-)0t+oXz;)_9vU9{eSNZeqWi9Yxiica%6DqA#v5}$k14qH0Q0+p+#%g zUj6!aq36{^MnUxwf#~$_uU?vhd$dm!_`7GO%k7(P$vyqk)pG3_U!O9q%6j!-Lxjf* z(X(@}pMNmRd-;RMZ&|m5p0@k@Veg;sTlshV+~@xB>$kL9JCk?*Klgga<L&i_)85x` zx4kPk`o&X3WV+$^+o_-yM{TwGhX=OXFIX#1yDGi?^Dp+zA3uIuQeLxu@j7E8+o>x) z1gy$_J;UVRjm|sHk!RAD%{TA+Za4e5>2$w?hl}2bB)CLy<lB5skE?i{99Q#Oc-E|0 zocz2G)y3x?m%V<zK-#+MhQq(_2XllTFXH6nDv0&>e|>s7_cWu#F9B!LE<cR+;133; z$p=exEh{5K<eyD@m+V-nw|Z6gicQ-D-oHJ+;Q+^{S+A|<RNI`4^-q3YKXLk2v%>G+ zj_Rz|VL8CC<Okct2eJp6K5eVp-~R2(Dyt_Gc5(Q>_j_NgRQ>hJEKrY3>5}2*n@4)M z&lPT!w3sH?%>Ln9y?kzY?c4DDo%`hNcI?0Xm^rTQ(f?bq)-`WVo-v*6d#C<+>7DxY z-_F<XS?WCN`(|-~bB2$an!n6juO|8a-|u$3>tNr{_~+NR>>pp>Uf&Vh-QD@*<Nw{S zXJqrs-dKP5hW<>Wk2BgYd7g*Vvqf<k`b=l!LZYL8c&A1GUnx0pZ@-oLjiL|dtIu(F zKmK~~xqRW8mlmr^@^9{G=-ryi@JFXkz}{cNrKR0`=~`c&*k5tGKi*r`ynm8bbhOpp z^PO+524_RgE-1M+ht*qCL+`0Pznrz9_9aPhnsl@2QPb=4c(nIWY|h&3*Zro-uU@F{ zbF2FGAbnFn{`O7FcFhoLmyMsiG`Lze!Fr8RS#j=8?M^G@P5kwKlBH+93hntDdq01r zw*9jolW%hGva17+JWO1-A?t6L(Wat`w}16_eAx5xi~W-aW)mkD{^6Byb$P=6c9XNv z{=a{lUOtzux$-fsc_O#+WQG-+BY%E=7b<h_!-9KxOTTV7{A|&ln%Mj4CLz1-YG>w_ z)XEp1uxL;f{V99Q@PvI2!)A7dYU%7Bt4wac{kPn;+G<X@QnllCXyf^k=)9VbvT^?t z%!1YWp7EF8zjOKFiA)#KgGx%vXBs*Nx>WuOxO3@5>O}YTY<3U!Em>F-JIi<N+Nu0p z<&&=l99|l@m(!?v)8>7XzH^rs`#%zR*CGF6ma&e)9DeR{<_|C4U7fPU<kF*pf<hM| z&wK3r+!fmO>Wpdpi)?FWhR?gKcd)u)`Nbpt$-h6>oD*ZH+gU3Z9=c56^~>XzPBDdr ziI-cvclq|J?*}-`y6if%e7)_>%Zev5y*d*FCtmKknDD@UW%}mzE2nWE61Fl`KX<zS zI@|o?=eO0lPu<$O)l_xOTFpY~&#ouqw!3_odQsD6Z@Kc)wY^ienSH$RZ{88cG;Z_n zUa46XOrK8`Wo(H4>3+@X`ksl66Q^u7n|L?mwqD=wNo|`p?V7=Bx->$TFHP)C(cRbY z#eEjvb;}E$dwY(^{RP6e;Ek`v)sH&WfBb!4fB$k~$Dah-k4J>>ZrdgV3dn_<osulN zXFQ%|Y-iEdx>*1D*FA5~=$}{Jzf*4WL5KSL0(C-j4_!6X%zM1IM-5c(?oU~l=3B~X zw!As+-oGDj-s}H)bfEa>_kF!Jft#j3n&wvZo24i@r#`Ra?fKZ-;^i|uzM9RPX<8z6 z{&~*B&5v}rqF!}=`S7soMany0pXc*ry>F>D`Io?}j=r_l!m&z4DQwFxS5|0yfKwuv zu<U)Y0lFYSP*8B<<vAeNgY&zRlG1WZP{$11uy=8B@hb*p3)raJoM&g2CryrYovEX7 zKD9X4@~AHFjZ(Y0-6s<iPF<d^$e8HE*Zq9eiz)N?;CqE!{EXR_Z~nb$)8;OtpU>~{ zikMt4zb>|XZiK$Q+zVSD&P1?_K*UR<yVE%8GOl~wJ8}P_toMAuyq8l?#sBVo`_cgB z8kZ*~7j$i#rn1;o=0AD=U}3CwwG|IYFBn_$mQ?mXh;*Il#Z*4g{8PDsg@RA6lFO30 zywP8a!yslnDKW_j$lAW<_S3bBZo2;iY#Vn6teGyKeJuX&<wTe_J5KaROyAZvBXr72 zl>%|?jCJW@focBjim)J3vQLVg#Ss@U@AlNwC+n(WA<5Ro#pOv#Nv2Xoac*U}p8D^X zrJ`VGfr5DQ#igAO9!+ao7vuNs@@vEqN9v2cg%5sPXItLKtt@o2_FS(I*W0VAum4(U z&TaafcR1(8pUdA&W@%WwH>;DgU*UahZpXShB<s#3y<6G)c+Z~*(|@n{-k;Sy`|RA> z`<Gr7Tu9h{@m0y3M=v0r29bX9w$nK59_)N`R%f+V$?mXgw^+8wPBJTbS#2vg4dL<3 z#m9vY?v`E^85LRarZM(FrI4=Jl{v7z>n<*JYpQGnYfPTEeS38G%Sxa4->kE<Pk%I- zb))*-*_h2AvoA3p+G$wE&?v?q7ApREwybyT)FTXXZo>QD+V*HKp7hbYdcy*n>3^R6 zDy#0{>U#2RM`I6n-?1c<O)Ho6+)vd}U%v8M?i|J)>V+KUU%gaMJUV#mRgm1BtxbD- zP2FqxnEyKeO#bBI#^M%~zx`9<!@PO7cE{D$Bf@{m%S(qJ`L*0kIC43os5Y|aIN!^q zjgvVxRuta+WqD^yrJXXfa-~7#lG`(;v->^j+tIjZ;{M6=^MCi%_HMm%N&9MU&-RmN zK4(4;x^?S>?d|CW_xs*^e&T$v_2BcZw?8-DJ1p@){E)oSw9g;jU0w34^@HE9DU0Q7 z%rDqa(RYh+nS1t>zxmn66Ys9xp|(uFT%GUblhv@})|HfsK2_~e`Z4ngr_E%mgI_In zublQ#+s^9Moc=E3N|Rz!hM#A@)`ZSF+cH7o`rpk?Ni&4x&Vy|7b7W)SKK*%vrR<+& z-wm$sP}|*GsGXizDr3`g?smqr{h8^L-$);s*OqntYdM!uOf{3pR+A6kCTPY8%sVjW zQmyQ<pAq*BbJnkZk{-Rkbn7&Oga;r0J+4qp@4meco}88LE<G-M(Et721CLHIU4Jar z{&z-k*KFy#^4m=W9zJ|rWuv)8d@Y~#<}RbV$8K7`_>x^}VIaxF!`q=?tI#viaU#Q! zieI}_o4lj$e2<Bl*njt>%31p*hg~-8zuA1zG4PLG^32=ova`B44XOp6KdnErO$cFg z?84*12Q7U|b5>~Dt~8ZtxR_92%eS#2FgN#QNYKx=8~;GQ?wTbX5fyph-QSb({mENa zY_Ohda$_w^^d74{^3N`o{hc_)&}NFws=I#!`1O&>t|wDod~_)&*T~FNxpA0#^1*^D z&NtOsk9~Cc|M5@O?<70jb4&>y4iewhd2OG`{Y&F#IwLnlzR2P3Lapd%h9B4W_0~jg z+J5)%qie^?u7h$A1n+Y0mlwM(yX{(Nf}zAt1)GC!t6JK(-+p}2apIL5Q8Atg4?0Bm zEpyiDV_et$lKnur=ug?c^&7Wt*to5y*tvS*{TTmyiSe)ab>Km;{8VP7;GfV)Gs&-^ zHns^$7w7GJle^~Wq7Ij3t}45FPiL%9y71<tZKrcYSm==(3pDb&y<Zoc-7VbyAlYd1 z#%(<d86V!6Ytf?b{cY#1s4Z4+wphL4;o>-YK4sy(yr=%V!#=(Iz+GuwtCj!s{eo-P zP9^*|IK!r_|1|IIyXlB*&0^uJ-6ZR$ZhzONf9X`#Kl{#e{F_~7CVDOH-K}jWa_>Ap z8o6iA?y1&~*$s_rwf5FB&D`~@IOp8AtGmi`qkVd&%j@&lOn;s9`*YB_uy^<N-6*}! zxo6h)xtR|;d$_uo5|VQzr?2@fwEXhP&6&?X{JX%tL&4_a)pq#Yl*^M41B<!tnTx9D zJlbFVcZF@`(<3u@*oxHe-a;vrL#BtZxL5uvds?(<eq1=LbQQFejGe_HCnRufDz@Ud zD53^yalCp_aL3nAuTQC-uh<w@7b80N5{g|jcCHq$S@7N9-R+OH;ri9bsuq0TFptmC zrLN)G`<2i8?~BP_pR?88``xmPZ|mbP967c~twzT!PeSO*+G^-r>xqvqFLfnktmfLc zG(0O@zuIlr((qNQ8eN~bCp(78u3xwQ$=tJ{wz6H&(pP5LY3(M)f4A~=81kRIf6@2! zJjeDgUZs2cl$6@NdA1cCPWZm+wrFMVo3&Z22|@YxNq=@db^jwc)%=$KOW36dmn!d0 zQ~i;>e<Kec$K(0c<^dOC?#JGqQ<k*%PsM`o2BA#dCj!6neqHiD!hd`A)w8PWTt4*t zW9;euY`N5Ms`)KHWP_sg%0f%H!d;getk#&!`gCW`I^E?vmNM?Xd~@#Ye=BD2ur0Ew zl@t;<_GCkaYJ=;N+goqUsoAr*ZRhUnldCsAdYzb(&?0WWl-*e4((1cEQZ0GU+zC2+ z?vvP>GWEc^v~#|n9`8En*ite3$IUlPW+J9LkA<7vl>GTg?)u}W+rJ+?oMNGR-WQVP zT&&8x{^k8}aEfqosS2xH-1~dKW>R`&_v@(5XU|P~!#3@y*{AEC6X)DNe!lem<F}?Z z8`qr4?Y$$Vou9kv(dD_Od&*P)cpjZRb@K63rL$xDZEbW~SXd{`k?>E7c~iJPJp8^x zS)F3@ulc|3TiWj24vCEu8|U0&o1~<4DOtwv$KyjnWz)7Mm>g)WWtO;ldiJa|c4PDK zz>xgM@4dYx<zD-4nBFNidvbbsID^20%qQyt7asW$eIxSTp)<NyeSAKso;rWVHrZ)q zZehXs@YZ!3>uvQ<ZC!t};!W0r;$yvsE+2ME4mRG&>Z%jHx$)4XpkuufRWau`ZratB zYhC``!)TlOcgVI=K}#`E@pew2``gvsQ5JX1&3dxgWNmWZt*MY-_s3xRE;07|X;+I= zqZEE_4U<~S$FS@>?}JZQ92kxr`B~tawP5vK=ctxyYtGFV3-0{wbZ%n$_%Sb9ePK9H zqT<0d_czU5@xh=<{YYum+-cXYJ-)SF`|Fc?&{FF7BG90n<fGMRtQh{-_Wn`Pz3?_J zr=j(T0(Z4m^v#${XQpO0w)~i3AazTtbN~6g2aERo`@)@Vy+H54<r`}^@_D@U4J*@= zjQkzbnXvlmv2}ZYpE#$xVBJE-e0}|(D)kB1%q1Ika!(Hk4dy<udwvb)fg^^>9sRw_ zw(ObIV_U7Mx%$Av0s$$ZBQFx0KYssO`gW(f^>o?Yn=>*pjvPNe``<~=FK_2|9K0~? z!@4!=5+84yJ0&zE$#C||$pYsmY^jsrX<PhG7vhso&fwuk$)x<$=%ZP&-OYyU(_{-{ zN+-)UB<KrI=jC`ZS=LnKTI9}$lWp2uDhtmpP*79-d9kyPUtQHqYm)5D$Qy6U&Zr5` z{9Sb7r1p~fqWnKKwI}qo(jH%%%ktx=pt$hSn~&W#C102Omh!yt;?H#E2XEiDp3O_Y zIg9tmQ5VC!CjoEDtY2@>dH#Fq>m3FEcTCz;6t?#MnG2509eo_jH?3-GdL%SSSlD1D zPe|BxgZz(0NsE<cnADl{`kq~Ldynkon@1M>({#TR4apf#+MPf>Bx9G*&3l6%>nv-Q zymx=DsNa<RGt13FgKsCL7Z)1O?(Xj7-}2$ck`raQin}KD_nZ4IpFC|^*crQfJRUE7 zv+moi`yD8lC?Ya-(%f)|7$1>3JG+XCiUbCxKY#CBn^kyFrRP|4=oz!!b49bwgQCOz z8}`emP7R%LRxK#_SAv1WExtA0RuuyGcAdS=!O4~IXog_k>vi{bOx?1twr>|KH}N-u zx)|vl4*tTtYx!zydvtbab}E~eTU_8`Jdn{a`*QQnssx4N@~a;YZp$iKwf4!ih@IJa zit@3t{yY53|7sPMNrVR%8!vr2HRSr0r1Be?IayZEyxbNGF2C$qnJOw8YC0t}gz3VC zD=rQD<qana=A1r}^6=7B9;pk{S9~zI9<%zYS7xPZavN`1w6T&7%j&CMwaLPab^9Qh zz2naWO+g){qBakXO#u<<OBY@}xNTBen_G2x)w=CBPfX2hJR>1+;PUCyKP%jMdDrrZ zrClw4`_K8gjv8~=ZsFOBvmdR^&p47`@ZjmqYtwgZTsiZq^!9+TKu@0(mPEya6_r&< z<ucWW&(vDx+}y}5pP#=-=@7@A_^q!uY(LA($(3?zr|^wU#pd^QqkH$S=T~myQL!?b z^K9C-X;QDZ<)r_;Huvqdyv$5SP~Hbc`xACQaHJo(l2RY`%#`WFl}|=-ySIqjO=~Va z$ftf~`z_87COg;F&I>%fM8*F4!-BNMjm48{KyGK?UCTas!$Z3?uGed>Y`dYEy=895 z(hZkis_fs;vSEUP&$4ZMr>}|OKG3uB`NM~aj0;vQ=~*`I+2VDf0Wqgu@kUG77fE=2 z+{h3T61q9{dEWNIM#g_W61H=mO%pTAyL+<ybhz=;H-#*}elr_nIK&H89o-Ur|G4+w z21xt-NxMJH-S%m@tJB;gxo3*5jj`39u6>!Q^Xv8r@!3ybpRuZ9jjE{1GGQn#yZ&*z z>e4+Mb~UYLW1A%P(6zR^`G4+;lC?AIJVHM%@bKq)y@ugWS)8Hxx3A0hTs(H(y{%}^ z^HaH}Pb^utu<=XdU&amAG9e+M#z`j}!i8?UEV-1mb=TR=GtS<S<&)uSU#(t{S;;CV zCl)Rwv0&-d+Ie^16{ybHYhx>ET*Faa{CVYyRf;wyEgL2zaCLiozMfrkWQO%Ew0zfc zGvh(0=EXbzeFbNV>WW;yU6EJXdV9tsHfhn`GN)RfDW*3Jq<BJ1Z&y~vrtbc_?EBYr zmoo=lK74I%j+}6{;qc3p>P+L?-nX?%m#h80Y<=VLijAQmp~3eP7H(WQbIu>9Ph8!e zFXuj3b-+}z_s8#_lcvt~4rs9FYj4io{VgCkx_$oq{_MFMCTuekoxLqxKv=S|zu){| zBjc8BQ8%Ye^bB#4P)!w0d2{pmw*QZ&W*bQMe)0A@boy{}?M_w(m$p_0gCq|r?rCct z?0&lX<#lVp?xRkrrM!IYhf5n`-K$rZZ|DGnKLIo3DxXYrud?D06tt}L-Xwh^_Tshk zWl>%Bg^kn7lK<HB#9T3NNRSuas>?Skmyd_dgXhzOF2=?`fB$$i?Y$l4%+verSyM_q zkHm`Hjh9o3A0?Vy(myl#b{p&G?!b3b_dVQ~_N%pWQh4&xZATlYAN9B&;D7APC&fG4 zAD@?9ot1S`Uq?-S|AaMjY`RXL`naXSpyUF>rC&S4@3*zH1xEzA9h<i|B=q{EYx<J) z_VHP-Uwe9bWmMPgv%8T~wyEgziF4X27tT+=$60tIr>yM#*~IufySTV{J~GC0=FY74 z?CDlLaKHb=hJaJrt8Z+~=HI<()5cplJyKRPPW){@_Oqf|SX$Q8Gm_Q%`<vu^KRL72 zy*qAXgm2ouc&~F)v)?OQXczyb7Tfa6FKxaVz}uvPKQ{&mJHxpo4YEu@I@#CqEU0LL z)Lu$TMYD{*moV7AJo!BS@XL~-?`y9=e*O6J<%i&i0uv?Odj2f-AMdPY=#eyQ*?hdW zXm@yU^l|U}dWHi}Iv-1zS**SMIxO`1hT89PlO9zGO3U6XWt`veW)IV+?k-P%>4y35 zPpVGf-xDYMQ&DY2y~q1zu(2Sb#BX~j%li{&vZiy~+i3l|<+`?pUh2<TycH2Tw(}b9 zY^>&wE`O(HY4~r6@Im$?E^Y}XQg_zP>{+H4xm)}1gnR7pz<4<)&y!`guUgjYS0}Y~ zl=ReYmDZ*|lRKj(Y_|LFj_YgkbKaa1U^I~6v6y@A@x1F7Zd`e~F{bik$ez7>cGcWn z_o&3mP=e>~r^u5R7Qoj6fE)<M9^YS0b15iEVPQS0`sT*mr(P`6Lqh_?0$r10bZ%C% zzI`S#b=t?jr?!fSO;0kL{qnkcXYuj=V@Zae4@tidyncb<z@n$CBe&F;)(Sn|`DxM0 zEnBv1s(W2#WVCt3s&z+?-|l{LuXB!Zo`~4zgUiE1V-J^~4x1Pp(6PLoeQ`VQ!6dWG zmu|fhbB}Wr%r?(g-oHX(_F1=x0)yv$^1d-SCZVQV_k23nzHVdw*<UgZ#mD>8u3R|i zKDT<&z27B#m94HmR@pqtm)RLVyu9-><=yGTQ#T(=T4`MU`lE|``G(5ldPSeO4J3WP zc>6ut!<l?HuD$J;+rId%eYU@gHr`s}($;R6cO+oaqw1Z<WFp=_H;+5K$yEBr)^vT% zTA`Dt^{pQLh98@wWFK?vUBs1l8zzg0dmo#(*FuJG!CI*s2?iIm)mGj8ai>Wst<Grn zohGG8kE#WwWR4umwVq-7-<pAK={Hpq3yy}kixYXIr+CdjQo%57P0Z;_p|1-p=BOMy znzZ%ijSZ>R-eGGB*T&z!aKd{2nKb`0y?b$SEi9~?Ql8!_^L()D7n|LjzoM2uSzTJ% z1muLA0y8Byr`7w$Iy1-3ljD(|($(J1+VJn>UP&{JsV6>MNIqv97<^8$|6)eU&skqh zOw0nq0zIGYlR4zv>?v<?Aoq=W@$=-(HzlkLME(8w&GOGDJp8U5^IckMc18BJ=b$QA zU!Q-G(jiS9z0_-O*5BNh?Z11k{XFCT+MSh4zWAxAYCc?nl*<1UlzO`s6c=+lvoD)8 zb@K6hb803{espuEb@!1S5kAMh?R@^TdwSw_>m8pSale=>z<%I)ynagfHM>*Vt7jNg zv1~2n4G9UIe93xZpfmgKXMOUfQyQ6rIy!q87OYt`>H7WuExOj_h5wEeGOUT&K5^Ny zv`0yccD}llx$c^%{@%Zh(b*jJ_VIN^A6Z@8-5w-ndVj0?_SLB@{cZB|cRFsovS*%b zKE7Gqdiu36?Zxf9YFbKnO#ep|_dnaee(&RNKR&&j?D=voXt|4W8&AsFW4dc1b~irz zd-AnsdhgMMg7=y>RW}6A-Ml}&^2LIXxXS0w+fq}E62EZ#si}?FRwY~dm3N7XYQfDf zCnb2;%F^DYe%q5D`QdNTudkj*YCOIctiF0`?e)0E{_W-$rv0$Hgp!=@PU6^hGv~|O zxhHBi&zw6m^2hI=0kP4?e*_+0xoTypbaZ5_vumiSBjZ1pmbQTK`(d`yvXbZ4t*I56 zIz>=SsOHGtn%bHVUq3F~uw=@gLrGezRxxgf$~7@Fef;?C(R+7l7~J?|TW(${V~B3p zAK(63^-I^%l{;t7y}5JBl&Qh7!ORZ6xpxice?NJ~_RoeL&c9jbn`T*98*jd`#g@6@ z$r2W!$4R%>3d)E)_+_VYVE%*!4qB^LX|7*$==}9|+nYNXdVJ)ccq#FFygd6zboI)$ ztJU|fIFfr;(3x%5B<S`;B_*X#kFV->CM*}WvC&acSKXj)&0cRGe<sbiwpx8t*5S16 z8+(8A$E{ws_HnEE{p{`69=?_43lE7pc89fl<%(5m76uJ3PH^<NDf6{6ufEE4FV4i& zl=;E?*VR2c=ITW4o5dTwJ=s8_v$yL=PF8hi)Y@%%v$@^vb<QOjP8PY}t!rJzXpr?{ zLGrrt1UZM`;@h9?3r@`4KmYe@fd|jMb7O0FJAdHYasYAQz5MpPmx478QTtP(qSvmu zy{C7|k{^7+-F9}lqRZ>{*~L^|yiyil`&)&vAVQplL57cg{+XHXsinN(F&3@X^;M?g z{+8mCPyWsP`STY;F8fm1vu$gwBX(zM?_IQb$M0*eccvXH`K7A9Rl2;wyY2DJY9&zh zIc?(0D!FX4Jlkh7%P+rN<?`)w=IrOY|8KPmD6MsP`|mjWJ9%IC_stz&dMvr885RBV zwfT2vw(Pz7Z(k#O=F|!2pPO}gZK2JtGpj+o&(qhu`ta}UciU4ZUYc(-RbK7={j9dm z!+QBM?=G1_8k8=6;df_o_;tN+?cXk5wtMcCeVVd;oSa-L78(<NwYkagvDXScj*agu z+{p4~ecacNd8?<{ZaM2z>#WS%>-(dkdg7cZ3|qc(Y`ZO+SMB23!nmREwqLmagE@bk zw*Nc8pql!W;mhmEEz8^4`P!Q&ed;PR{QYMAowar<)6Si<737|#bNpdJ!O_;>P9FZ$ z^ZR7VQr~8quiLch*w??ua;-D7@(!N9JbA_n4~Fa6TgonnT`#^rbEa!<tnIvca$mao zY|?aO_wp-UD(-Pp=AORpU{>+})6B~+pKN*`p8RHkes%fLk7pN6eY;LvZ2H8F>dT|Q zow+gj?CbaS7j?72D^of;=H%^KYI=mxZSh3K%)d7`>$l(I+}mf7ck1TjpD#}5|M;?+ zRpm?9!Taa?yH;rx9O?}}%W&)0`*rs=wD#UE3kr^QF9=YWd`_x){(AneyuD}sq?pZ< zlS_Fno^<QJ)T4%t%59sBi}fRK?%ea~oz5OxTTMOf<2go&n{UTHUZi~Z=B{FM@36J1 z>o?4Jbjj$I^$I1wj_#!^w)EtS>8Ac(XS+m2wWR9Z#2TaWy4@{jmwZfKv1Xmx_5~eJ zmar^RI%H9Q$Re%omn!%Ec*mp|oq2L{>po_i<tY}&^To}R6PY@NvEbW|z;#?NH@oqw zYg<o0Q){{B*E^k>+8PZFz07KUwZ3v|jdvbaRr2R%8*ICLKG<bfSd5R#SKi(=G25qh zCb#Wcmw)z#bFH&-tx*4;&D*t?F8`YPv~BH`E7yc23O2C+-lMwO!{0mc@3bDh`<s_- z+jsg}k%i21olHGQGwYJ@uD|trg^%|<xt6`&=2iU$;m1ikA9i`am@MI67-=avGg5-r z&20&PN$5JYqu-Mby%7BI^VfvQ@gAA3s%*`Tr<eJv8QJtax>WQ^diIV_i&m~Xb)DI% zx%tP*qv8URa&ED;wrj(*r~A+M338fqd&ie8j6Cv20*enG*te%<(xd9ax2fV=yUX8v zC<*$lmTVw#LRVwSu5Ifs7xyn&u%cy8lhXF}zuMTubmMyuCV+a|3}3oBlM?=mypooR z+?3Q?9i!YPB=W%DHPuw{V55)y`<zRcf9-zv`&UKr<xpdZIk)<!T?_L%b*i(s@5w6f zWfO1d?+h+1`(oGOaXvFA>(QRgZlAs`63x5*TsQ8h<>R)?H*UNs+q-aMr+NC>hqL1U zO#En^mws&R{-<yI_ZQt=pPiBNs&xOO{Qs4AOV{pO*!g+gKh^X5e_j-P+`+-Crf4>c z)%$L}-r49qU4bt%-yZYd`)*#DuCCqBSJrNR`#X2FHOnu`y*Ke>?*5<J!utCsue^Tu z@MZn;OSbK6eEsg9u>YP9W^2Qwm6zW?a^j`=$G4lduB+spzV6|!-T#mL@XmkSWnFjP zyqiBvd;7L1Nz1=#*YZz3xOqLj@ST6%LHU3GWEi&J`7W{k%%7f0@36wBbL$iS^xWS0 z_22Om+B%Bc7tDya`@tftx4SvJ?xVX|-tDJi^@)X&{`)@giQg}=f1G~jTxq%OkyBsa zt*zl(vp?gf)w<oU70>N@!?$k#Z~vUzQ%jv5gSz7`E-qH5AK2`%Z~F71#;V+I=I^2z zW|>OO!N0$jSSS^Bor&BqB|WaPzuvyget*pe&u9C;>)73kvykCicDF#k->yKN|Nm#v zb#o0{XRputo$zX||Gr1BUA1?<di1%om*@HKtI|IobpN#Zdck&%ah?T3eEs$&_j#4A z=KsGMFb7Sl_;<E{#_zX9c6CqX*L^c+ulh1Gd}V%y($;*T)7SH!ZLPOsaR~FXGynHX zFs|~EW8S{^fpPWE&hxyw&z|AUGT%5);(z(~v+GJhQS$HOo#>kH7rTG_{uOZj!U<LL z|7{<Y*^B=^y{w_R`ayT4_m2PPUK`H#+4J>cOxpSX^S;mfugxHsc<@I>^~aajyDJ|3 z+`jYYs%{DUB7@o6(m!3gJ^#a>`}M~!H2%%V-D*^K?Cp{-eap*hc+BHV4gc-4b7^ZY zI9=O6F*?BK*MWV1UQJuQa_#!(jmQ5r@1L(fPfqOJ-oH^*uI?YE|NqnfW{*<Z{+}k( z{?_{z-d8@KU?MfM?48A*n%aurk9X$W+c*1WzMXSMfkH#}-z)n(?-akjT2WQ?;exP! z(De%^)Ysc~7S=0&JJ%-+>4Lmmlb6e@xO|%M(=V>)OmxGvn}4YbOUayAB>H;ihdm$H z+}*?6%;>gsdD7OXyT{_qleNra?9P_Hc-o=J9I-7;`1Ahww_Ys%vrYPLa_@V-a{9fe zo$T+QHS0h7d|~hQ(itpeM=xeQZ7M$Y>5}#QfRHG^5*LZjV(XI*tthe4QUA7D&3Zei zdRn(Hg^PKTu;hd}CoGfOcfVt2`;lnikQB4!byRY&@&CH7wRwArtoHBt$i)C!s=9wg zi+TFl#1{ve<)_W;ag+P~_WW(t(B#F+6|emFm&MxGAIh+swRwVN{@?Bs9|Rccs*aY_ z{e8at=ImgH{dT$at)HGaf8R0b5QAr-VNA*8TAjF^^R$=w7e)WS-+!<FWD3)RS(3pO zKjyCwhzauZ3Hedj4+|?EQx_4zpN7StK37b^xrk?P^XoS}_-*QAS<U0Nc;nsU&T5l6 zn-4lvrkZl^i$8n%eT|p*>Zy~AzMJXq|NqoCB_-|iY4-UE4qigR=jDpmICS*!BnSLY zd8Qk;)xPhl&uo)-E%uAN{JNC&)F#>6{uBZw@UYcyXB1z{&9m0{JV{gd?z-j6zove_ z7qdNkvU=aU4V%nNEDpS_s>l#vNK|ZWkKtxp@Mwaw6~9X3_ot$te(q7N`Eay`hs}BS zb&$fTcWf_39XIxa<kcm{A%ZnhJN_Kfw3Th@__E>U<YOPd9WP$FW?kyZQ@nq^ujenZ zShr?T*YWwalh0ZkfmYaN{;d+0lDV<2$ih%>){!3)M&F-(+AOX2zC`A-TJPh{>&1=h zjwEEgmX@$j;;1g>_IqJjSzY<*TD{!Et25_+zS8~v!}{?1kEgBHe>Tf|`3|jF{Na&z zr>X4yc)fo|?DpGl-wK_ao4fwP#W=U*+gqLa)$VSoHTU25!R#xqZ;!lbOWoeb8zas{ z^iMosCUwhh@>cmx*G~4p;-&*Ms=B<fCGO%9m17^zPrs+CaiO2_WT$Lj^#lF?tPeI{ zpRaV_ym-S^>Ft4mFXK|J(hmlCd1-@ILSMK4GpYDEZ~1CJ+es&d-9CTuHm*#*CZpyr z(R=gGN14ed8}8P<X<4>^J^%Onm9ph`YgFaW|Lyz#=e=`O)Y^6Pj<<7jePMqvv;DoQ zmd%y7^A6sqtu57FoxSt9|NoR*OA7z|n{K{~&!hI))bG1;{UO<I;^T$a1eBDPcV<pL zwsmW=MR`p7_vp1|WpD1C-s1T<#xtS)vS)1V;@dlRwYmNK{j2>>(b=OmCFj>Zc_ME3 zd2{95F2w`)rxz--?Y`wC<LMEg@Y7Xw-EqI=lfOnA-8p6<!<S=b%`i_+E~fq_E05fS zGktff89#jdb|`Ce@>bb3J7n!D806%{uI1cvEJ>Mh`})JqhwHXjYqu|ZCbn+R2b*xA z9s3rpyuG^I`m&xgB(1Q7fChzc&8Rvju`h1Rr;g49{_dGSW_YBXk9L~>BVvu2bpE+n zhwsf{s&aMTam@DrG53n<>cXo>Cx6^9W9LtG@sF?0oS$KnC~|RP;_;rxn=+qY$l7Y8 zV*0cr*=^Z!qtBP~D@va||Kj=P=p0t>mFw0POMm`$JpSX?MWT1=-Y!)+c67o<_1U?S zk$--D%VzL+eO-F_<&)j{^@naGHh1vwE83ZL#osLw{a^L9_La2MOp7!PzxK&nXO|n~ z1k@knlfN=^`llVL$Bri$&8&EQSbyiYOPV4g(?6a%bKXF5_xsP+{wxXt)n}J3|N3}; z|DR>Izd_^Zax*whbxv5|aPQxFWp~-n*YE#tIzGR;yIQ`ot>uPB-tKQfn?7?zZYpAC zur~hw@uqqAkKgj|4jsPqP5aTZ)q0O+yJ}bb*}2_nYJrS>5yxY9KFe1#qSx<iSv09A zt?nCd-M)Kw3VxcjE&2NNShZYPFQ}r+%*%VY)7*a1mOYa;JW$Bn{Vr(Tt{*iFZai`a zc&Gb6KK;}C=bP6@|NPpvy0gFc(Jb%f0%Af(tmoI9O~0>m>~d1#mko_R_Fk=@PIhte zKYjQ+@A=YlyNBZZc8*n9@$)J^<o)~l>i6Ak%P%GzIDdWi)YscDWNqDfPao>zK8ZPg z&pYK_fLedHD^@I-BmM5D@%_3VPX6tX_Mnn|!7I>-Z=aN}WNrPp{`$S=tGd;{mq1T{ z`J@b*QtCL-f8mV(el;VV7VCBMFJ4{<9*gQY(cci|+|kkThr@EN9}k-|d=ZhoP<oAP zLEzk}pYPu~-kq&oWhEjgIMFW{wqLW)eY(71-N`dKU9WN(DrWGw{G2H%{QPjQb5rLR z>wj;riI@ak%t(*w`p<bZI3)e)S>LN`&g3pwbkeV9f9vUB<{ecD0&dQ?SH8AOW1hFH z+4AEaDecdjU+v6|_`vy=^TLH!4>o--mXLdV_VMJ!G1q1Nc05}gqf~p=raF=5!navd zO>WF6u2p)t@7?;q+SSb~^WQTk{Cry*b6tPt%(E-v>}*QPj&L4_`d>*&DZNe4pM}}S z=gZS)UlL~J`Wc;yuBgv8y`OUJ^PN^h9**xe>$dK@ecK^%?$;KfgVElzc7A{D^vA|0 zW}cYGn*FV|Q*~|jFJsz#@qqs&rp_<M#=n2LY_F7js=H_3!cR+t4(^k4%afNoWIuiS z#?^aT>k@O%SO1%5RkSMl=k3ag?Pm=P^jFW5W@FzO8@pw_+-&AE={0Y+L4v=dqhrpB zJWqYL>X{NEFOQyx$gi_f>6jUQ?BV;&C;j)u9$TF2J7RkFn{d~{i?1FWY(47oJ9<WC zs*L$^cH^D>^7|zuPo2?zv@^%SVfy>Z9jAktJGi%eIP`CuFrWIKUHc|wYW`c&vP=C) zyG!Lq-?Z4>rqAB4RJT2~+WQeCX@ORL83%6<VUgFnar(&J#m+zXvmRY@BKN@>mUsp; zQS;CLu4P>lH%r`V?b-d|$-z#+FI*b}uD?pSBwZbw-BVM^&%mAMbtuW?!^Lk>`)&ri z$MsGvh&P_j&+*{cmuAsD+?!u%uG{|c`{%_UJ{O!XS7(Wgxxf9^+@5;f?)ZMr$8Cy^ zG2aX2W{T?ORsTya5_$ghTk+c8zm91Yt%~maWL$i_LqN~t-Hxc6IVK-gUrhW{RwpRk zHA`dF=D?Wz$F1E?w|iwTpKhOiJ#^FhRa2KF@H1%5ezQh9=TYB7#T@NiyM5xZkYdus z#U*8b@U?=3m^u7z%sF~_-Wg`M=h%G7HB7Wqle0CS<bJMKVg0dF@1Kb?Kgc%xbn)uP zFZ`cXY)^Ifuj_lhc=cn>4<;X9o{M^xezo}Q0)>CJx^0{v_u1^;)pYc?RLt+SXYy6f z96z(*#N*Y=YOAtD!k4fm8A`@f_w{~ed~jLT^v}oJLTV~MK0G?QG3J(i!*Q|cn>Ma^ z+3|Yr<R{)$Q^e1&UH723cWR8a#)`vnC+)<Tm6P}WOgn#Y)q~c^uS?phg`O<kCjiao zN=ikK{5)L^8v2iVG%WAzTDEN)cU&6t{MgwIM=L&D`K-2ja=ZA{39)y*k|wZsI?7ed z;;o48QDLjxaV*wcV}f)WOJTyZj)?qePt6SMSN9c9y0xnJv{a7EZ~6b1yT5H0c#(R9 zA+OpjO7>56D62Ui=Oc0D+gerZ?o|`xv!9;z4dv<mX7^}Tc|YIdZ~C7&KbRDKzR>rZ zZ~Kk8F%#Y#&z4>l^ZNYl;Nx3F>eqaG{AM{~Ibu;qa8y=RMSVi|#fHP2(O$EDCS;p> z7vIvV@_v=;9(z2+B!S_Sbgs^cRnMPpox0`5+~ae~jjoBBT}&x0@T~uS@6gM@dvEme zZC~AyO+6do!zQ)XPiwZ-JNq{*YG1!C-gEKTwMl7SuX5k$<R=!%+fQK=gC*~YlM7D? z9sIhM?^V<rmmhL#F8$3(*S&oI?s5C+(*rMNlz%;D8^)Rw*$i5-@#t0L&YJmm9VSel z7?3Y~&DrSe!+mL7S!-jbxvb5}@qTdcN2c8KeH*WT{o0?J8Y26&VCSwd_VsJmKYACq z@CbX<kMpZODffNdC^2)!gVTrhe$}}Zett%r9ZTiRT`wd%I!-K%ie3vEH+o<9>1$zs z^|PtpXH?y_4GFnglC}Q%y%|T3oPKY!vZ6oj^0&JnW!YwV@3+}jUHZ81p1s+9-T31- z!~gV%zTWl)TC5jIS*Na5oR(t#fThiC``0(I^KPHGzhD2U{$!<{3QON^*g7{=ch9bU zpJrs+8m#ANIKR$U<-lg$>3gmAcXlmn7CpGQ`sW6N)$@E^ecf|!Ux;+Pm&<uGU9Us! z)dso!Y|RT7YclNFw@-+Fa-((-b0_bH4+r)rT@yDmv|09e#<Jx<KL5C6wCK;77-NkW zOCF0&ynKBQt2b!tBxA09`=7rxFRrUMf_A%H*?e5)dsW%)x&LboW=jU2S5wkivik7f zgYRmUY;1KZsw<OB{#jJ**dCR;=i|YgXF4%%rMa@5g@$)3|MIBy$h|VtTfd>D-sZp9 z?D7;LA&CRM;eO9gb)U0dS9(foRpq<hNS)~2oXZcNJn*k}$NRo)&#r#khd=zkeFbe# zod5sf$Hjd=AFt0(J$7Yt<%5m?10tf%RiFR6^zICM+pj{Fm9BgK-gm!!xBBhg^OZmE zp8xS~vG~XDUkhXRe}9;MV`H`c=X=%H-rncFe)p>YbI_z8m-lW@G@Sk6+ovN*cB%h$ zz)jqV#uqey%DYD{?iIftcES2a^Tdt0|1EEYTybewesL-b+lrS9HeEZOwB+Ke0^7W; z);9yM9m+q}zH`z6KJ_bGcb%Vm=XQViwXjcDJ{867R1vf9Z~k9-W=+P@ZAa^lq^#*b z+Hv*Wkyiz~swDXPKOQ@rlHltoY%hIrr;2Of+^Lbbvv-u|NX$!PPFMeBWO1pxeyz^) zx2GQ)lufXglYZWO^_|M<RZ}}T_szZK?s6{YyiJWh<G;Eop&_7Q3Y#xSy4S>PZ*{LL zt`S{fTKaX5)#u`4eDXD?CU3Oe`Mq<;>u2)|uAjAk`O?7Z=);17>&^ZFVS#63xBqFm zu)yJ&PRy}<x!?TjZGI}e%&cY1$jN%Pj(xt0nbn;1|DPBnt2b4?T3Y_`>&LWPOA6;k zE#I-GY4-ctDfd2Z{PVSZ|ADm4A8-BM{PU;$zk}}U|1>k~7yiAsY}5L3ulE-7{@;Ed z(;r{=-T0LD>K~77x9?gv*JqKG!rFLwhO+dhMl}WX3*K(Mzopikx7YX0S=|NxPWlXM z%%p#R;@VmBONBwLNA8rlaeLVw$kech_{(W71*wzg`W`)Na$Dw&PWHp*wO1|Xet4f5 zxb8{%`~d!}Xqi15H+Bgc-pkR*dUSa0+y76Dbq{r$n}->um&-cNb89<VAuOMfSmvf% z+hn`ZYR;aW8@u*~uKmKbVaKzdRT4i>S55@Yu3xX8b3An=qsz}(C)eaWJ)C=W&g2)> zM_dY`TEzVx95tQV)B9QR(s`en1+DSDd{5)GwO8a98W>&_SNFU2%-m4t*zApkc5km$ zmX)$5+NGuOSlkHz@$TZnJC?f})|Xu`3f$jNR_x=(9L~?R<mR&@musGQB{y7Rlh*z$ zb$8v*N(o7km!(%Km5QofUROUj)yB5|kOteg_lNh#*UlGo4%+$R&t|K=e!jW2<*h%O z@6BHPf5qEfxqY9mE32QraZ$Z{UA5b~eJMtV*}f{PXb3bsbY|P2T&ypD_UE;!9P{=j zXkOh~y65+sWR@SljY<;ii@3WgU*7efX_gtY{8}dm_rrAam~;O(m*0OFI_)|0@%`zk zb9*N5RZnaYHEY>By{Ut1$A-RliCfG5zS(f=+O}<BtG905_Q=U~if%PKN21yq2dA<V z_g?qR`S|;>O1q4oSjX>wG2-FX^FHr6|9j8l1^3?ny?6f6&ftKRZ}Knkc=bG<Hno4F z^;ZdR@iRZJoOATA*}Jtz+VaT9pUr1?XXfRWX8m5$#^b@DV7>l=AjiInodQdp4j!o6 zILD^=q9DgPU5$e|+YC}1{`lVBFW|(X*dpNc<ykN%%W|=86QXW3&GvHa2s=Bc?w*ao zq4^K|zBWEr{Z+8?)QMNdU-!(7Jl<20e{ZMptk(A;7QLn44P>XU>a{6f!L`=yBscfr zpMTdF%=2CQ<oIo`&a0Uf6(J0)U)A_Twpip^TOFEgKHY8Os}foHIk^iCW+<KtKm7eT z>!zBF@2TR)Tq=t07s$@mH{E2ny3t*oMey<R#G?kXj&WJ{&aFxQdz9@?DAzIf%8eIp zA5ZQ1Je95Nx!LF0k_-FRBsENYIM1i=;-^y^qtd>AKDf9$;r-#ozozj{54-b9h(k{5 z(ZN->7ysI_SK!g=m-lWz-<<i}(eB2U(}Em%nO8TLotE47-h1(mHBAo~>Zj?=Ie5xi zoaw{%@bJ(7j?HDT`SRm3!=2LCId$Lm{yu3j|7^8%S;40_uD5QT;gOti;Q!wbj*AXC z%ltmGXTo9of7{#U{86&8wV7d^Yjb~3d8ab-mVFyL>;L5QviHq9l(WqsGsnpO@4LT0 ze*gTk<9)X6j~kbJB&-@3=IX!R{&xAEO>Hwy7}Wi^V5HXTTlQsk`T71Cc7-DQ{~R=z z$(7H&dwPCc-Q}lOYjZYaolU!zchfn!nEPb&@6Vs#uT@bqT64Sj&!<)VKN3FY@vZya zzc}}CAM>8S7tKy-t>WP3OS$>T@=oPxA9sf<zKa)b+BI$eo=;}Sjm|xO|NL;Xw%F#B zdnU^_mM@ok{MB@}rjDMfj!H-Vz1=N8F9*;0m2<0d!gl*xUYV7m%)*Z&Osc)M7qk9m zZaO!Gi?y@x;*`+1wbAuYen=kU@jrC^dDgXeYcwDK`0#k|6Y=Rn^0F6STX?lL-4^#L ze<dvQqW@gDnYTUzg93x6i(|<3*_*o7Wk1oceUc7J(*65?%nSZ~zV1K&E2&u(Z+EKi zwz*%sQ{UcupIwyFVW%BaqF-cKSDJMnWESe+;(z#Lrp`3oS-c09-f=R?GVT0$kzvVP zo74Suf5Y!pebk)v>vr?uu+>vTv&}Xq{$|XQmh$xKdEEK_&hZ6DEDpr&uDUeI{l|0p zx?`<#YV7`0@cW)!+aqH&;l9nc4ayPvEs$Ixn^&b!ad~fH?W^Ssa=x68E>2Nc{%!I7 zH_yM^ydHb<^XJ2{+v>A3w|GZ~GhVTnE4_cV;H|edcS5-O>a8y>-Me}x<C%BQ&%UX< zcen3)qDKe&@m&()58iXn>0iFRxa_-uY<YaJ{*Lv}BRM{PHK}~VaW8VaX!FIE_TAF2 zx4lh%ey}7=XQp>bh5`F!|Ie3RXLodRr2aZ`(Pl@DAhS?X#jp4OpZ4$nA@}!j@`tY< z4<(p<T)qEKcc!r0$KCU5xF@gdeg6Nmp8fB`-hEQ5e0A6U`LX@Haps$Xc|YFOhJ;+* zP<WhCN^17Uuh%ZEGXL<wzpj6_+u8SZpLFk-Nd5bI&E4kb^6-kMH|Lk{e*bRI=Zj`} zv(0<!Z9cPjwKj#{k327Ye$NT^|8>(|biDh&@BO*e@7E-s`Z4j(CwBgT(CG8~@Biv> zum5ar_vie48OJ;K=2%QV`aZs9uDsorIfcq>#fIA_96oNev-V%faS67?6Z8Ll;n$gG z-pgvNzA5dp-@MvP(d5bO!jfV<2X^KD{_)xV{v+wrc~8af$9o?8DKoF`-~JXhR)eA! z4h&)I@1NsdzxVhe%ixMH6L;?n3Ol*VboTn+JGi}1$w;pHc7ExZ85YM@`sY*|?AfrR z=f{f<yWZlpZO77HNzax&Ua_|Fvf77tZL%|ba(C>!dH;=}gzvWpFAksHeP@~e_ovSj zPaI&`^tnrBzJE&EM4KJ<4;MP_`EmdI#+x}BB3yb;#U@IKUrqLX5O4oo%iVwO({_Gc zbvvu3UTeM&f7SmVI(Gek+xBm-q<#1Qxop3)^jk_?^*c{cbM4Vf@yg1pQFWhhD9?Yj zkqcD#awzVrNeLBFZ27^(#m#vjYir>33mz370^fCJ9<TKlw>Tx-<LUS4!bYAlIiK`j zM=r9wsNu}j*B2BMa*6qJl|AhB|L=2x4|wI9e7e2=UwhLdqeqJlYiejM-MMt?)9&Y! zrbxI4CCOY4cC-Gq|L?=FSFfZaf6uoUe35@XsHd0f`L_0X5B@B*Y2)#EQFcF8(!7Xc zf7O?)-0SM~UldlpTwa-f_?+J6j_S=N4|(K%KeO#Sujt5V^X>NYo8?cIc(dh{pNl<n z^zz}kzo(sZUm0SgVR%mU^7gYi5B2x|5@h~;lxc#1^vO;6|0e~f>kCPW`K-Qo02F1X zti?awom$RdV6)O*HC1%a$Ae;Se6k*^?;QZ89?Rh4)~vsN9e4lycK-K05>e^LjrAu? zjz7aMze_43H!IKe_0t%mm5+;)H-DBkx9u%n``!HAk-NT!&v+*9{!{nv3+JEjdwXSU zOZ!#|zbP&1pJUOy^6Z&4Cu8#;KYVxXb?whe2_uEZz3u(US;mXQG(iP>ZMlwulF5u; z$JC0r*H4fTKf3ge6WjLblU|(qc!v9pO~I7u^D3J-7q>GS*l14Ne1GSeUAezyX8vK= zerDF29rcHun`Rhh@*MY@|G$Jk1YDtVd|dkFX~er24#gv-8>4a$T-~)rYbsZ(lVfSF z?QXthpI_a6Z7}QBiWRHgmg@9I^<K?->J!HIKL3tqRuvnA=v7k&m1FM0vVy19|NoS~ z?X7Lo%Cm2_)V|ut1F9TY8X29MnK`)mN>0stqix>%+1SV2oVWSc@riT8Z=4mg<>vcP z{>!HDi@_8xRm-18Yvqy;tysuV^Zx(8Gat`z$9^lkyh7G7q2WbA^|vD5xqI#Yb)M1r z!lvB)+^_Uj-jNB6eV<ESy>aDn6ZRIjx_&EE>-WF@&tZET)8ng}KPtCRx+Is<GA~=A z{A+Ca<C1BU<Il{_wtu!zw0o|XUx}E!tmFR{iEnat?=o&z|FB4&G`UJA|HAFs%EeV{ zpWZqAy_x+;vRU*A{auHSo^G9S>z0I>#>5jF5}cZtEK0vAh0X4r^G9jYuj8fG=N2YQ zvar9BaeUBM$?N~>ebM}OmS4MT-tAZpEu9w`pX3m8>R7+vQkPbUmMCN0H&@NoS+6R- zEj2%}XTsqlhKD7M3>qEk?Qh+>RVADKciZ1Rzs^}XH8Dxp7jb+v{3gVh`<5}@pTGQG z%}33+=)H~4|9v&9uYVgW7qhQJbo*J?g#iK4_Z{jkit^o^`qCtC^*x7J=f}R5asK?} zTB~2@or>^UDx~kv|4MrHuRUiM9I?1p^Kkp0^sj7nUtaGQl9fC4`2N1@f(q}tqH^^m z6E{XNu2{RB{e76-uPMRy-A5mBth;W0<9SK$hxO}o%%u1KeO;fCm-%#izx8y!4__}{ zy7DNdeBa8QS3kzaAAfn_!i_Wj^MA5Cv#VO9ZYWFr_eJDh#AeCOH=C}eDVy3hAKzc< z-+%i{S^PZ>etz>Fw&dyeC3)2L*xcQH*KB3IjMmhyJBNg3&5HK)>N$M)E^kBNVYVVQ z?e-}b4_}b(;dyueuT$aH(%vgqOpP9|dvCRMwvU?ImgyWX`<zx5+zEy>5IHW+WNB&@ zc%*$SYjfd;7nyB59tBroY9Gz4XV~!X>vI|I9ZToix%=jxpV{2rpZ@9i^stX-{P!RJ zBl(T>^roUumAPNpme<)u>C64UW?S=Ly8P3_<JFZP>$44J-THBCQ}o53KS8bP<)64^ zcbyj68y9|R6~~32R(7jHxOApTbGMmpf03D&x%b`CZI6<bD!)y?zkJ)i#_8c}pI*HG zXX^EN)sr52{{6jW@455)KD_w6|F2=<!A8IPnzzJddAT-R?_R$$`$eJQ?sqo-=a*a7 z*i4@O|3h%odQP?D?(P8rG0(1q1q5+9IQgW^Kh9Xqd;fUd_wqGi+UNg$V&8i$YMynj zjsE&y4Z-R9N!ua}wr({{zBD86_xG>+_6RCAGQL@F={fu6o1nwnm#k?zVsYJ+%WB8& zof8G5J@XEVuF85nr)k^bcHX3`?9nH5H4fgrdvCq9mAyPu$-X`Rw#V;&x7c=r4m3Sq z_x5t;P&^WTX4QA|z@V^`cfFr6C1e>FD_Zxn8mn719SEC!cH-Nc2Tz}7X4rf0LB?r| z`MvA6UlYt>u3na&9=2L^^G&83%!%Lc+0B3G*%@=<9P^u{Vt(^aA3J<_?uQEs%k5=N zGj`u9FJH&|VcywYK6#0p!pC{ax3IqWqoKLFpk~|6oH;hd8()81cXHmH4axg!@6A2- zy7y#>>1Hd3=f@}8R|zz5Te8;5C4c##a_5eT%;_Buiso4{9sc`hQQ+#(H-5Iyw&ccp zG5+~}mv_z0E#3ER{&6gB<1PAG_vl87-`w3Vrf}~4{lG9u$!V_G!`HcU%r?)Q|M#D~ z$h0XRA6@RZp33slFQP!<@MIxR+i3?ECeK{bBlT=Y`0h*7e}8gY+9TO^FeB;sK9l9& zHb+k1857`iYR0<L2_+Jj?B~t-qjWC*OzM*fjD6n%53>bE#U1^4hMUKu<E5d6UE!I6 zRoSn11_eGX(l4od0I6(S1g<+9fzq<~JEt<c@KdW-tXY}-{b2GNf9sQ%T8(A6=kCnB za>S)&Q|58TUq@XorI~#`#vXk_dyi8{MMv_SmKh#4ws$Ji@0N*pvA)Zb`gPRx;*C3p zR+-M0oNO~AI9(sqidp`5|JR3M+um9qQZB#m7E{6^t}kBjE=jN7ZWB|()bhKB)?G=i zd7WPWVByp5PA>k1JJvLv;kNwq=Qsa?5RF}T%FAbN$y7i8Y4-kor+TJbymH0-)2rLB zJGl50Z!WsoXP4~GllFDj+dbQ=nEyUnbYqkD*4sh+`E?sun-89t(8xJw|CHma__rBU zpR#D<eZ}73w)mLu;%7;DjBBevOE>kB|2%mqej&p|C*DT7-adZYTU#a#iL0lx|IGcF zvG>Qr=F>lZXTQIA=hCSwoXQ&`b7ju&Ij|zJ*+bH{=YfN)_cPz*x6^Dhu4EnSlkf@i zvy;!gd;Rf^)z|Z%UoF43x#C?&6Z0R-s!uxGzP<l-)J;f8<iOg^>YvZK-~RDaKJJ<I zcYRgu<qf{O`97WT-+%deA=BT#6`%aq7ks&5Dfj=|-jM5N0ryt&eLb;|S$3(=I@9_p zuKaa>C8W*jKJ=#A%K68?J1uRRRv|R`nA+##)9)#4f5F8poU}72?&R**<rAhz9KW+t zxav;bi32QUOXZyN4JO>t6p#^?bPH(c%dPI;P;hOD+;NakB!%5SZ%+Sr(79Yc?ZyHZ zDXG~v=a)@-zi!Xu2M%|AEyEy5<;eAJaH;40Zu$QI>|Cu(@@vJJe;xgBJiewM)JXaI z^Y8inr#I{GKiNOOYTk_#26Fp;n{jn{TTUoDb@BM=%gyTYwH@L2B2Fj!|D6kJZmxEh ze{|`o6R72STRt!K*b>7%pD$h3+4JA<c-d*Ov&Rw)K7EqTUb$wS>WTQ{hri!>#&PCX zRd(g$_xqntHNW=h(f@nPH?C}baUx)v-i*exS*%l6ovtkx=a^?=HuJ@YfPY`kn;Xu$ z1@hngn%{BD8QwZ;iv@=To_+Q8_Qz{gMfWeUs_;u5I3@r0TI!zkx^J@IWUS8ZmM(kn z^5MC^<vI^;f7dOoSs$RWqxz)Hz1uq`vl^=zW#();E%E>RV)n|fZ%hCD(*M6~r>lQV ziADXt{qhD1ip%=LFXkQ1E#~C9@bR1b?TG!g_V1*4AG`CWK0MReXV+i*I_}OLlbpNN zGy1o^Q%yZn5cc=4`JHbM{CCM*zLNH=_4+;Lgv;leb8b~$c=;O?TB@IyJ$(4?nEn4B z#`9`l^49%$y<h0T^V8?||7R#(?)&1iMdHE6H`YZ$4g3H8mYu$H&F}Z|b2fEb&o)h! zsjn?H&Dz?vQrPWV#k^;}voE}^{ptDV=}Gxdw{}b4DE%OjZT8OT`SZhjUTW67Z?u-( zI(N5miUX7G+A5*Pi()p-a_5shv99^0%GUt-9fvpX|6`ZG?(dA!=<gp-Ny|T4|2g&D zm5+Mes?a98OT1=|+3dC7^PD&ok34^W@c6uA@y}0x-v9UGb6ZhJ>S+;p<n5Zp!mZfy zBWUBzyc|IbxcF-yri0Lm6)g5qRJ}0)%z_d>x+Y7ZsrbJ2JcnL(R`R#mKmWY0IE!Qr z$fO@3EAqcJbcc%vT+3lQ;JZ}eO!V274E->*-@>nI|L(RfTRL@C7&rH?-*+z5oSJp3 zLV5ALEsMmmzKAK+nCQs9IsIv&)fBD(Es=_qqB~ZvJ9ea7`qqt^x6d42{3kzS{@s)7 z42#~kAN`Z*C$U**kL=sq#j`5D=h*Jts%B&Ab<C~e(}fibzu0$K=Ekqy{^8h5D?X7e z0e7?1B37rR?J?)?x$yA$!lGBZD@qyFR`-@_Cw;tRas0RVzTg9g{@MLWsCnRPYX|i= zsONn|{IV}U3$st}<xjnW|0K?s>4iyGzR$6}T|BGu=QNH<O?TI4ui0CvJH>44-2jCj zIjxQI`PxTs`yRcdSm*L9V@FK(lljN90<=Z%m>%g5$Tyw+uDAHsyQHlXulrxU_r;+g z{90_rgPT{h@+2P|wmn?>;&x8X*}NwcdsTDxsEfr`H*DXsvNu0}SJTO)<f8_%f%~Mm zUi<DT-`4n-_3WNq8j}*%etx<pbL)pRH`)8L+Kll?F5h>~ZmPqE{q0?e3*{JkdcQom z)@Wz5V_%E<_bHzreu|jVwXgqb!iGB+WTI}b`E&nW(V<$CKh=RM_wv52xncQtPvnjJ z(>?CL<NxdSy;Awwoa}^}DdPTTIZC(adVYFZ)O%5og{>m3UbSj-@6~b_>(sFG-d`T> z>+kw`d7;)nGyOZ6Z!!y`?wwro{F{pXp*#iYXh=^4?7ojzKg@Jt|7#oaC!t1R|DDit z6Bmi89nWGsp<({v-pwk%X|FOj-;fY`bnd?|ui~k2=gB8eoe8b%Gd#AhO0prA|H$G% zt%&M<jc=#V*2v3Hj#!<RIZ0pJJ?89#yK`^*RBoPWe~z!1rP2DxE0eze`I~Oc_;No+ zZmz(Q+LKoAer}jCM{4n9JL~C1H|E|x^LqJfjWy<i&(=Phoy;_2enoPsHbaltZ102^ z#xMMPW?9aSPk-dHa^Cx1?h?)Qf^U~6-W0IEcVfljH79*`oWJ_My}c^nYSOc(U$W}# zwcoTo*MK&kz<HqP_ZhM7*%EJCgBWK%Wn<t;liq(T*l)u0uKQ;>p01Qs6fxiOar4}# z3>l_g*Yx@m114B2AF_$qZPT{(bn=JN@Qr$_C(hk@c8$cc$E~b_KAjgo1y%9>{v0jy z+gm$R^@R7^6F%=&??21^xbI+HMhMq&yWmB88LB1Q)xU=rs9x)?*X??;&2gX2-u;s< zr~Z<*)9+^gH7V@Qso>vQ8reqWH=q9y{r%(e<1Mju_KR&jYTtOR4&Hq)=W+F8rkj;J zXBJOwlb*L2l>VVUdUX1&@oMo0O9LOhUbo0CUw`+5g<%{1y^AoJdnxg2u36pg^-WDx z!i84mk4o}(tQM`vnsVgjI=wk%=MC)Nd0)G@@#zc?e?HNz8;rMizWn$tAv3hQxGX2W z^>@aH&jE`Vme+3E7Fqc)gI9ZUY2U2fhn;OTGIJjH_E@>KRmXkb#~_!r-uaK4o9ykP zSu@3+AN_mspC99!S7Doz^I~6W{JwB;ee=nr<eDksnuc*U^-E@5pYC$^f=nxt^W*d8 zN4gm_Tz&Q@a&bt))`K&-nBUJ|tG@NZyo=En@06zHuulzYWU78p9G+*qUT*!-jE!G+ z-BmAK6w<%%?5RhN`~2Q2AF?^Q&a8IPMtP~H=a*F{{XBPr;asRhWrj0ny=BPLA8{)K zw*1e(e!F~2`IpxTx%LnHm$DQtJayvS>9Y(g)-871jO3a}r{5c&=EyUP%ruJPxEOc$ z>8~|zakhcZ9bspGc<4X+`&M#Cu2^*WVTNxx_tS${pU}B(Y#4QVf<QTwZRnQLE)(|b zt8=ujCNt-`-PyeD>b#SCiefhg?>?G#e$U?}C30GFGB3~XJzTn{XieMI^jDG+PtN5w z*Kl6ECElx@n^k-&=v~3mjl2h5-YFAXUi`T4;J!U`;?91l(9IL#6ayt(h(jM`KQ-oN zk=MvL$kxNNeY%ZB%#~B}{9&KYoC$dLeY^g)X`!i4wocx<x9{tbJ|l)}_hsAH@3viO zx!1+N_g|LVhaVdHWzWqf2QJ(Ha1-y`mo{$?-gy4J-P+5rBtYYrScK`Uw~WcY{EZRj zQ=8m_n{L#s>^xJ%yq)(`YR#0rZXX+)#2&frU~BsReEWis13y;0>;HT^nd!#7%SV2# zakDX<pQ*G1;!3c49~FO_>B6!)>g=D_6}+7P@_Kr=u$vm6`toC!HfU&pt@&tbw0`fT zYi6q-Z$6py*lFrSR^}QR$As0qvwY6oKIi#C?S}W+;`Y^<W|4FEonC2JxM|C8)_Z$Q zyl&~3E$4ZBQE=Xll_D~`7pdQIfBfb7tpf$^{hMd6cwORi)6|V&QO(<}b-ZcP`pZJC zzcN;z>`t3J^}#ov2Ojaf!AV>9Obv7obe<i2|MXV1Yjg4w{Ot3a_U!6^{d?Eyij)$D z)qdB#GLZ^K#eHdZQ+pmn?QQKTVrJVsb&Zzt`}u2+r!|X<wOGEo`Hj0|@x_ePt1qoU zQxvOw&d=J+tC!5n`SC&T<<gv!c}~yQrG&Jo8`epg#pW!Tzu!7HOgewgI_34}o^Whn z%D6kl##npG@$J(K-?tyVV|Qb^!P;4KqJ*>0T{X7#JN=?#opDBcOGN_nztT0+rex?l z?Y(;BN9K=*KOFwe3v=Fl@zfOyU9%h+{fow0hbB+S&|hxYlP0}>{;H>Id#u8EE-%dA z{OQ+AD>nAslP|<EDepgb<d}DF&e_Z)&q?|pt<1B&h}qfPZ<xP((o)a5zK?Z=sx$KQ zcO7be?Y$$rL*B4X>eFkVHG3~O?ASi*xH{YSs@Qi@kB+xLm);SOTEg-KB`?=<%|83> zB=?=NO%<h#sc*Zt?OZ9+l5y3i>*J$F!GA2}s}i%B|4j@#`|OR{8Z&9*M|*$%+u<O# zFZe+G^EN}vFm8v%7eU3KMdT{?)q$T59V*ZXt1#O-=}wgJMk`+aey#-z?j31t61x{A z_10v5Q<d;)zw3p2T>P6aI!#&Mrs}y*M}C#_$_?of{=f3|`u#W_?Ms=Pyj%S8s+*JU zw%p8me38>p$8(du(01$XGq)SRKC#yL;kqCLyHnlyeS8I1%-^k9b@j|=_f?irce<{o zo!9#J^h!dLb?UpY?XxOBm)Nd!)eYG;<Ks0AN%5yA%a5}O-PGK`8<4+Y!>bb6-=Cvb z<e3Vu2{qO}I6J@R%kkr9Eq7Lbe8rTeTJbr<YeH~!Rw8$QzW(Dz!GC`eY7*l0S0iT= z?>EcXn_2~&YCgWXQ$OR?F019+K1@hR^O5>*dDa7-3g<69pR*CvIGjKK^v_n4ty?U% zipFbBcGv(j>Z7S5sCoE9Xj9bMDN{l(T)Xz{)7<{;(<Uf9zocKTH|zNB*V__IX4<XR zgtksw1Rim_e7zFvZ~L{<AJjtq8o9kxoc(fNv7+_$r~Zx~MUScQm%dsbw({gj{RK-y z-(Rt-ypyr~d|G$w^SGb#c~ZO+A1<8#tMHDG+3eow@$tU@TOw?1ZRYH|y&>0}ZSlkn z6B6#l?VdR2j}sfe$DcWAS>;cTWZsM2-rAY$wkSYj-<9Y8E*HH0`EyU~sk6`DZk6Wb z<vSAp{Q7UUc&54a;)}9FO-uJ|Op|@=#`oXn`|kfI49(u(IX?06at^L9>KEd#|8@hH zGEQHdARTp$?F%><wtBTXy_8Y;{Pmhut(lbXp8bW|Q?G6{FXdxB8lI7P)i`BAv4iR7 zL#|AJOI=#q?_T-)^_f?ts+?RNON{W6%@I0J#HSlnzdCZh#4bLhl(#qK=@X;EGbheh zYt8TSfBi35Gc>~_D`eH`?#*>G&p+L|zuRo{%%(*`=VEvHl;zo#>(29c^4W5_?6}|j zhc3@7dDxT<Cq6tg*YN1m_j9tRhKFr_{~_>{)~XL*3ep4q*ZD}=OKpvMJLB|3VaYkW zXY|J9D;$VF{-kiRXHS1&PhdbztEu$%T|Ks$cQlSOuif{B(O~vj8LP4`?wivuO82z1 zvKXena+z+f$)NXKe1e4h?Z+QuSMS=^cbe68&KaBb_1n$A-!Hvgnma!{#OK#aAGLmI z----_g$Et)etY}&j@|!PTDNYUiOsXl_Ud}PFfspe$qAeKiNZ6VugK3ha{hX|=VQ0Y zSL`3|>hlLD!J0Z10i70scqiG{HTSkwFd9yLc=wyJMDLoLJEnd*mBnCVYdd3}QQzH_ z?z?#TzJ!+L*?sNx)oXn4c=>swl7Ro`Z3Jp8_c#3eSg7}wRdp%Luh$>0Rn;#0{Bx1k z`Zdo^e7qcg>OpFJP1N`Jq#7Rkj{WCXzCB%|xBhSJl+cikuMY_7gk^8PJ;$baUbB0@ zakdv%<G+709@fX$rMG{2&}BV`>B-!!Tef}r*Vg}XzQFN4lEE2Sd1<fbHP1Mk_RME? z%h|NYe|e)b^D+~oPDN~qn>Xj|sfUaE%M0GicFSB3%r{^v_<hK7#gy>xS1qk~>(}O( zNoQ|=vtZe_KF`N)3qOBVef-Duo2*~@&s^@<XY(hApLp_daqO+?B89gWqEoL*@VM3N z-Mc<Jx}ob-))X(*$;WzMZH&)<E|zez>E?|!=UzL-pE|2<y}qIG@1x%~d<PbOnY?7~ znS?_xQWhy6(%cnvYTgy)Bgb7HJ$zSp_qZmwU1wJ<1Rl0tv99Srx&F@92L~Abl<tes zT>Zo4aXCwD%x&KJ8F!?oP7XhDDDra5E&b;^**fh1J25Z#F()nY$DDQNzwWyD`E%sG z`uLXO%*{9RR+Jpuy1#qIiGqFKAJ|R_5BvCxU3%A@^AjI0m#|K<P;TdAOE~%G=AYkd zzn?s{6Lf&du6zEDf@$5YKaH0y2-4)d@Y68$k3^Zg&7nD&lLItFdi>;^N?a_W^v{3W z=@JkZd32?*xJ+Y0^TmeUv)dRs3uE6cUtfDJEj74iX%G9fyM7rPY?&?W)VL;}+<LF7 z*jsz+*RMz1TuZFu!r$#k)nky)yV)35|M$Dc?3<Tz6ZUStcTV@gq^oPqC4N+#XH4_; zJGk6-@^1adSFV{)C^Kr7oP5lBQ^(^)%98e4lI7;xU)#AsdM`gGfC|GJ)~_NgY#n_Z z>Q;+>`y_3R@_qKRTgG;#<LY}3B`y-&X}->{pLSl%c+`6RUdflgpHHu6EI2*qWzC*! z`-Jly))UI+EMTaY+xOh>Q&-o|g3o;Kb{89FsvBwO>}(2Jnd0Civw6AS5#Pm(2a+}x zDZG^sFaDHaD#5|am2&Avpvn=K<jprLvfr|aXhiJH>AYN%{pywBEFYJa)*UjZpEfB? z_pzTE<?0z}SsmOT6dLW`aIU}7SWQ^4s`U4yO+|hwa~8kw(iB@g^}_^#XXj`1oI8L0 zBB*5S?C(`lF_>`pxPMUe{Tojs#JXFre3?9F|CHv78A^tBZ1M8*-{~i)i-wxMv7dBq z>L;!{CQ@yxyeY3*3~kx|pNrYy^6RA!crN#2+LsTCJu<V7%$CntuxS_Dj;g!U&dfi1 z;K&a<+5B2(<!XM}r5l!rTsGwvy;uJ{*QKR(fw{zua*Mfh{y41()Bc;Zc&2TsP~5z8 zrL(PHzyA3$v(K`Ub<OQv+y#68_oxXkKOgtN>09cnSJEG^RT(B_2t9UJweF3Njdp)^ zQCK8abMtvyy|$T?)gP?=s<eK^jIFb`eLk>BwWXD1^Q*t5cjtM}KI?X?lgCIuX35r2 z{|FC(&DSc9S~Eb`0xb7?^HH?Ep?msgiz=hZvu;^!iPCRV<yA=i!ZGFT&9!OWt^5DJ zE`7J}Z`dcU?vobNU2{TMw(HNiygd7IWcdE>c~e5eF0L}S*yM3=pFwI$gvL(Rqj%Yw zLcK&24kzuEy7T4B7lxcZg>MU7o?l|(YHfOOfI({ZEZJPPX2D$j$iKBOi~j}jac;cW zr%=FdZr<yCf6gDKM@fqUR)+L#n>_QmMddS_uf4u~=Eeu)eB!oMIQIX3_u)|ey^_cs z!3zUEOnz^3<oNFIg&<%x3r6@BbsE=-6npBPnzG<1bI|#A&~EVcT~vs!f%5$GXBz zn~DoBXUOm~T6qXWfJ)y-r(HoqK_5kv4WugT4~J>3y48F@?wz0GgMA+MQ#<Fc=MN4( zcJaoQBL^3&TTCeHY2Cc+;j?8ACsw~t`h2c7<4V@E^K+OQwqNURf4_6`|GmEzlihig zD^Dm~naiYMHoKSib{VKl<xclqx@FHK-M5X8`+V+gnY`Sx_@NSay6^GZx4Zu=5&|8a z($RS=Yim&S{RXBDQEU4iNI3Y#F?JSi)NAa&^vTO43$!Qv+}qTtIcx1s?3j2saCL}` zkM+4{bASK1R(m=?LuAX$vpM%RPCwFOkvG$rx%=j!dCr+@?r*!Ts!?q8+2-NGgLjOo zt+KYxI&1yis+V;`;%~W6-CZ+H%0v_$8>fVY6#e;fGj6@JYbfvgnk}7m8!z73nqhZV zckLTbU+2Yv<<Wf$RxFv4Tg`7&`^e(aB4y3>tJJnHnDIohIbv4<-^=AjmXk|6*~9NJ zHuQ(xUjEp0_Srq#A10UVv%6FNJjrL7*|xW~ptB#8+tePe|9mth>+xKE^Myexca(lB z3DFW=>F&QF^SE4?&d#N`AHO;M^JQ+|#)}j0-m8~<t_M0>;Kh@LFKTK}oYYVHKQZ~o z>pwC#7mJ3PuKAZC?AZA4%xuG(8)IXgou{X|?y{cFFuVMn^8OtyFNKc_zIcCrCbxKH z{o}BGn~PkxH*TJses1&c2ZEE>`IAolxEONvTA{^Xm8qeoclH(Z1>d(_naRTXV#oJB z*B!fee}8$a<l5c$i`2K4er3=z-N9T^HzhQzY<KMcmIyxC%bV(6>xrG6+c|wXd-`U* zi6#mgkGD&1{rZ)KHRi9icfLWA(bkXGZt-5ZX8z#y+p{m8D5~(wU3m^lpOZFmEnC|2 z_OjvgC!$6r3H8UH2dC?A_+DW3d6~bOmC>9vZ(@Qj`x_L0YSDYmU7mh)QftKR)23Tq zeO+^Z+w6&l*%k+B&a|oH$=W(=%^aI|aYfuxzTf|^s@wZKEZ<;4p<Z|E=H;>9EsidI z>eAZ&O*1$Wl*pZG3OyAfI289e?c!ouzvG;OfrCp1NB8ryB`l1mv{!5DXtKVUnceu$ z$|UReqsY18o3Fok^FQL_r!Oyxrv5(qIZaShj>}>H4vAy^Qhr&#JeT=NbZ@`bed&{z z(jh0w3;O2_`}wq{cCm-wX=Iwybb!I~XKO5*Tk$9Em-mlmKg#NzHMRU+TYLN7b*Zy= z_RjsyfBD9hp84zfrMAw>zq|jC=8KDIdC8~O{k?MKs<rIwbLXd9=g)mU<MNCr3v+I6 zy>A$ncv4jFxwujJuM{^v-y)gaK?|Q;*f=?M&fnE#%jFbJG$yEWr&-_1F}tzzzrbU6 zwQ|WRnrm0MEDkizdr~06#k%mIW1qu}`Rn=R<m4I-J^l5iY)@<WDbQ-sbJ5R*Wit2` z{Cp*|`9G=YZDFsy?0;#|_0MOk-#fid<)6p)<8{T?wcj;YuTZivxskfB*4Dmur<$ze zsqFXrH!8Oo)m<q#{`|%Yk0S1_9Wy4s=3semSHZG&y88D!b*qyb*JK-qTEBi5BQ|Zy zq^XlnZ#v4|(cj6Wpk*`V|GGHuV>@-G>!dI&K6&Jy@^J|xgNq*%md3~MMEUz~duQq3 z_)+xHB4ydXqFk)o&&_=JqxPAY*!QYjtJm+!FA6tboOiG)_t~1=yQSOmP915mO)mNQ zi1p9=z5PGF&wei`D%f^0Bk7^fbt64lE^jZ;roCH73j4Ngn4pmL`jw<<4ad88d2{y9 zIQ(tz$_Sk>H(u#G%kA72bFRMHHGR1{`=!3(cS&YmODFx9p|NavPw}5xh6JOnfk9#C z9#tC4=04xF>7~5<=?@2)8E06OsZ1~WY%t5`dZ?X}&XZT~6Ao{?`=cUzrrANcIeZs> zK3scsQNV?#(tPuu+(}D)z9?vQj92=X)Hz{$=e_7KIG2_>xlT)X??HzO4};6<z5Ca( zbAkIEk3OsRe+5l;Kf0x`!M$4GN0rf4tCn^)>(nVfU)N-2=KeiW91<_Qqo<4GaMsqK z*l6|x4J{U2UF$d0=4+Y0mF$@NvZnUK=Tbe%3zu$rmHNtVoXeCdTl9(Rg}nUhOL7Z7 z7jymk@%tuo$Jx1kflGsuHs9P46n3!lOmWOPeWnE~cOK2uSv!4saKf$Kw%S{g*X%hY z6rwft^6DE5T&d?vV|&$vRhK^1yY1@Ql4vqBBO~io(eAznkAF+sm9f14y=eR6w=;5| zyErd(YCM{>^lVOig~9d(6Y4e^_9+-NtluscpRX(WHdSO@sqORS>#skFlD)os=hCTb z=GX*X_D?X3&d9lcF2e{E+835E_9=YmJ*BI0DEjr&9elD%hn;1Ys;mnwS<18d=9?*Z zxeQVgl)RQsy3?ez{M(X$oPPVy?~9pzZrAVFFH3gszM8h#^8F7fw&sbvx4#=?-AG9D zndgukY+TCA8>9Jtm)p*jYkOsX2X%J$m8{CQu5eH)*PG?<lw&e6ap9S{b~AUp@VMlk z`faDb`^lawUxXR%6rQ$8^PA@o=V%yR_O^JIdt9KQ;6lZ7-3v4ePHqX+5b0C+`E^%? zWxw~%pE@%vw;n%p|6R=coqMOu_Kyi!a=LlTzMkZ)Y-Q{94X0UM&&)S$z5VR`v5c(b zv&YuzrRss3=10V*r?7A<9tn4do_$l5qvpG*<Aboh^LmQKKYqPf7JYuRwb#;1AGJQ8 zT@rYEGq<(a4=F<vPI>wKzIhgB>%-Tp>RC;yG+wsg^V@y%^8D%q3olOeOVwa_^-4O! zRH7s2yu&+B_k<<IXV3S17Pp*I$0VPh|7ejiC(nlT+9;iAa>rkBh?MqRU1k2@<->PI z`|oYp_KNXFu|{ug`{mgE*QI0PF0*s+@+Ccu^|q*aBO;%3t8M>${msjk>|jw_fA#jq zV{WbjA`j00Q$8MHP^^`kn=4~i*Y#tDhWmy!OGEujb8UD2FXW4vb?erJ*I#4hpO?;= zFTGdIS6BDVo$`)Jo4ACM7IX6R9y@*d^2XTXJKt%%{ouJ}%d5=HtDiyboGkNb9T)eO z(w)A?|Lxs7_xt(~t&3Gvm#WS-C0}P#{#}%76?6XmBID|Bn{6}h?cCFPF{S9Hd;0C~ z%Y|ONKYr$<FoTDj&4jz`{Tm8@=gIAQu2-|(@|o`LZ^<SzV@`>esG3<#YI>x-W#-w8 zU7Qcf-(5C*A9$F}+Gz7(r=|@vbaU=)<==a-A^mq@nW&DuZH>n5Z*mWc>J$wF1?TLa z;+$HlyLq|ao6>dHFG=&fu_|a0bY}ZH%eO}3uZp|hoU$6ZX(kP<#>?Zb@7x-pGi6%1 zQRSbE=^uX^_3fT5Z5O4V_x?-Sp+`TBD^suT77>XrTqUauP7M2Y?3>W|V9TShx-DC$ zY@g;fS>(>&`WOzymJO>{t}Z^uvhS>^@Qxi@=3MzATv1gOQ?Bsia?t%791YhlU%q%v z-)vUh#)~0WuWYK#*UDde_dt2rx&j@I^0lWcS$SUFKfl!0di{hWJ7&neo=~Q~eZvgd z-$9Wk>1@sHYD}Om*TdxH>#B9~*NU&La^Bu;UV40UZQ)kWWcSj@MF)1bFGvk&u-|@m zzN`1@dCZx|BX(C>f7gq>lKWx3{_)j8D<y0cCK`+DeY$0x&A{6E(eTWyNsnGUe)`hW zC8I-m!IjA8JUP!FzqtMLr^@w|zsJA1KH0aoXs2>UWI)Z)iBInd{&~H};%4usPhT8f zKRsDnu2c4N-R?E#`&z%uijMm5ev8HYt6583*S{}ZX#3*!)|Ul~_jmVw5;raV>Zcl= z_3Bl%4sU_w{tGLQGz6_oIktpzj@@+EI7dO{Tc;Zt-uU?{uiwz|v|Id}rbfQm>_82X z6;tl+e{gMQzuQ{3*H2%53OIfL{y&GMD|fQ`^YgC>)85&7)W=)$`IYtYIVN#(-!=)A z^78)p{c~f*J)cE~cJqDso^riWc}0lVGJmQ2+4nD=boP)c`1*cFU&FVrb8f%7Wpzf3 zJ5g~Rx7fGTIS%#qU#?GK_;@kv;)<(#)1GjH`js8}eY52_%p!C4%nUq!?TwmN)ESnl zRWsz?pLJgR=i~Ps`*Ji2ljq$CbSre0&YpJE;?}z7yWX77e|UHE*C$sb0<{tx7Fd5* z{cWsyta9TV-RV+4@BZ_W^W}WB@8P+vYUVLHPx#rjEdO}e-wC<<|9Dztuypr*-6t<+ zF4TE(zw}uA@wx;5vR3u)?rL<*yJL1@dS&O`bWX01r9xstXL>vzTh5+(c5QK*fYcpV z%Z|Pq?Qfr@eA~5iXX37BQxld3bw;f{cIDYGE2{@W4JU2t1<TFN-5W0Dm|4f2<>%u` zh&mN<@Ad~n-d<l8cD4%_GW6Ro1j-${a?LF;Q*!&6neR5OKmC)n=k+4F?D#2DragZ6 z?j45(lb+**eO$bJN3ym~nj8LLis|)Bmx@>N@|Tw@IXR!u)_J#ST@L%=i*ag;lt1Ke zi;%gwHA>(A+4&iVc6M7%2@eyLl<S&3o2~n3)6t~TE4SaC{<v++D^FkhgUa9UT}@Rp za&YnynHf3#LWap*HvL?)=xW^;6TV3utF^YTotYf|eg4s;g=;o--3$(raZH$fw(Vj? zX*557xl?nqMYZ8<&SbY8Iz=~PFKk&|EGaL2wDU}{iHVuuW#?t-uA#hE_VRb`-s$M< zaabEv_{_=dqTs_mJMm4$8>7~$9C0hR=KJ#YR>_Ww_gymz6z)ao>&2ccXK9k2Jxg=- zilQqoSYzrI&y$l2**d-M<%N%I4$s@I+xzD~N_l1}c6P2~Ny?7k`o$-YJpJR;RuZ-2 zEGTfY=XVFKd=o6+aO6kCrlKNGN#jEo*Du;6wKS-6eZP5v{?&)iA3y$aNAc?o&qd0I zBTUNG=DYaCF-BVMyt6f<ZhJR-*|V1qA67&Z=2pj_({;$*`*-2&`RhL)YOIx2H?*6! zwwmwKl}nE}E?vK7ej&}w+IA0Q95_D5+*aVvm3>@%V%rMd7sz%pz6&v#9a+7v@$*!+ zxcEz-vsXU4eEIt8PwyXZ{qsIV_wu7HHinuKv(FwocPFiG&)O;SJ^W7^1=mH||F@1j zy_UJ=LhY%>f6t${KYqP#(W<Lw=Iu$V+q%4I%cHP)vkGh1Z|C|LYMS??;8?HBz3St$ zRcusdY?%xm&0OBjeo^q@j-8nt{G896zNIcY<h=1_&X?}pzXGxzf4kcwYbj$NFRvG~ z%cm}ovv|3`)6$?slbJu>zuL;<<)g6D_VD)?D}DBCjbnN7XG6rAHC6wW9S-)(?UY{{ z<XIQUnW%VB&v8=N-o{g}qL#C6TjyS|z@BaK#4W;-N8DTkLZXhHJX36La_vCfM;7*9 zn{&@I&YBhd;rh?Qmql_nce48Zy`m+mHMOg2RhG{(vpaW8&di#1X!q-F8_GVHx$#Q( z?A|T?bn4ZJwPDA%-rJGP|I<}<P0Y5I4-*ou)$S3V>UH$RL+1~lzC8G|^fW`?gD98Z zPN6Gb9`Ee$Jaqi_ZvW$}bJpLiHq)M6S9noF)GI_w)$U%@o?FJdj`#biy)Ke_zwWlr zsTmVr{Ha-ypRr`gnx>tX)fNV5c-T)p*|_ELnHeVY3YFWx|NQgi>#UN}|36><v6x)i zxxk@bM@-w@KP@OU`nkw~S(cSd*=BjEU)^U*S|>?pEuB<6y@-RGGwITez}UFk>&~S* z`Is;ZJ&M?#D=vJzM@30Tr1_vjSzP1gMIHI|J0{kFHV(eFxpVjK46{O+>Y&R3tEZ@_ z9SMvLKE5zn-Lt3v?bbE!@#}cM{Mo%?#j1s8@3`g0GBaE?E!~l6Qc+nYwBWPz!T^K9 zHyUN~HcjWQw;y1r|0eILe&PQ4i5u@-%`Z8$BITQ$-|@qD=N|bX@uiCSci)o7uh*(> z-23Iw$DYkHUiK$H9Ay4@E$gJd*1>E4o@iMpG@P0hWp}T(Vb39<Nx!}y&e~k`>P+RT z?AMVSpNKJdozkj$%lwV!cj){2Bg<r~B`k9ce0_CgY^vr6I<r~IiQEvsT)cMSnh*_* z)oawYFF5h9yzkJz1INxEKmJj{A>Y8_)oke=H=o>ZuFn|`H8mSV>%6&9-?5^@V2_Qh z#`-lyJ@O(C>SIk;{VvM0Hrak-bJ^}Hhs)CoC;j^V_{vP~njMww!RkGZOM^DPFR)T{ zY}|WqKBNoK{dgH$Q}$P}vZrRB_ZBwVSbWMlQ1CJ#J}atv-Tm*S*C#5M|J676zHa^X zrzJDzUH89QRKLmIepZ3$><`x(_x-Wl+7;e+)j;pk>6J0=9bvu=%e%t;uYCG^a^32K z_kEa~?{Hqcm4EXl=RF?YmCswZWF2#<Dtygwl1J>(X0x;-0a~lFZ<IdZ$jg&@7i9uE z2rtdwH}Um6<~8?sanGH<K6paHryquM&YoJfWs%U__59n<%zLI0{P5kgW4WKx3xC|u zyq0sPi&t83;X<A0Jpxm`TF<5(j(^_H)T+E&Uw!?C)2{2SvMS2L&9|60v#SIJh93Ud zW4vVkxs-(c75g^UXs+M$@m*>E(g2Me#TS{rEm>Ch;YHyUEz!g5{7E18%v^JK&)t>p zZ#-Ez=Y-Ai2aSJUic9;tWN>`HzjMZwFOzfb?d0#i>Q#}kA-Jtz!T!FkRZ@FyH9!2E z?xSe>mt}VOyQ3LKf-lx5pKQ9>*Yj}33XWsFGUsNl$uT+?n{sT)M-_g_E3ZFRRaF?2 z1l0S@xAp(E(r0<qsm_lZb!OU2^Ou*0-P_vIoO%3a`40`Y#e((r_HI1BMJd-_{i!J| zzPuot|IoLu(Cno<&$?OmH~;5{&tzGC{5C8+qmlLM)yb3k1v%ovlIQMjzkh1sm&tE# z%<pnqs9>mfEtPTmxm{M%8LjN|X4`jv37(lU=k%io7avztR!zFHf4*|Wi>EIer!Q|` ze23}4j3)~#Dyt^cz2bSU_w2#brzdwzJUr7PE#<s<g#7wmucdE3mTyeGZg+f9Z^L4} z(xCq=V&`YG9yqbkbH>@UOMYn!%q2Q|yAtkwIoWrAanQ<wpS^v4pvqHP-RS(pS#?b2 zy|aGI(8!x@etKfy-tQLz8P3J*I5Lxa`kZH`_0L2mvGYH=XDv3dOsToQ{C)Wpiygne zMaxKD`J1%3`YrQ=$7`R?TiOj8*X1{V@31(~I4MJD^6}WUbE_@)Pgu(ReAk@C7Z0}= z{JO(x_WsWEEe^Amw_9&NGtY1T4v8+WQ#Ur$Zogc%+Wr>L0p;)aToXTvy34*ax4-e= z%KL+&-s`gq&)++jo4&S+nX7ftX(8)cN%w^T1=k<_d}BT3-0^C@gpCm|#HG)!(G-pq zn=cH`N%1jUv)`)iRptpXnZ2{Ll<~g2{0Z}2CuH90tUq^TfB*G@O(Fd^xh5y?t<X{J zP|)8R-1|Uw`s^E%?zS+^nEv8yvZmt-tF<b1D{r0ferY;qrNM)xfg3Uw=--!>_Hds* z{c^TNbmD`JosOVID4(aYIc>?3n=f%>MS=gnd0}VY?Md5ncgmglZ_a;O7#_be$1oC9 zTcR#vs<zx_)!aJ$a<+$V#=(q@hBjB4L2Hk=7VMi7cequH*<MEe$mW$(V^*1cIwx!R zg}>zSjj3UAmSNsyy%Wt&Up@VJSx~_b!RuBtuJ77r;u639w0`;2;x}FM&VE1kXldcU z>A%>TTaUgMGtxdd`@YZi{X)B*1}WFug&f^ne5fMH-SYiiN#8yD|B4>>Uu<&Z`1hlh zOb2DB)d#ffjyf3aU0s(O*0FvTXi7G0_1Cs-SF0*NHMhUpebV?<WL%(Owt4Pz>C^e@ zCO5XaJ?-5PwRX>!U)DAo-jq#0`o!*6h5Fye$&z*z4}5P<Z@AN>R3>L}#(diScP9>* zMeEEteJbtvKWCljJq||9_Ug5J%|7jZ5$hUi`g+^DN4xp&yuFgQ`DVo5i)p{qj~Lcn zxoWO2HG9_27mw#=T*-R3`|?)3EzmZJiuqT;x)s}J6$ZxbsoFEm-0%9uTh~e_JPO)6 zk^P!z@Xe%$(}SIVeElNu>Wf&H^sPC+{w9T6>Z)n``|+k#?U`o!T<S*I&YPKY+Rdje zC=LGfsHs5CpEK?9QMa(UW$TKkh2}na`B${2Jcr@^eNpFz<z4ab*FK1zz0N@8NHhPm zqXy~+XYZF=_o(RYRi6IR$lf<+a?_3)$m;8KBzW~qn|>+##{Bz#7fJZ4Y4fkuSKPZ~ zs=Ob^la-Q+GuE2P-HbT&)9ZQYe(u+|e_WkcBq#Cke0BNJ3;G9oy|22--Hkf7L4g0- z9nr({pS3((8MsO1<aNP@y>YdB^^SXg?dkqh!pX$^qjH6W<U7Zz&f>Ff%{Px7$<TFf zx?A}$<16pk_mgMHtbQ7_Rj~QzGTZY4kGvBD9`&xjaPR7&toc)C|9CTT(xsxBEm6}I z3TEH*3G`ffdiBLelXp&-{5q)3d2Nv3wK%zlZkyL1RlhzxTX}!?zL)QGn|~csTQ?<q zg23xP8xCJTE*+n*o3(XKGpHlOp}6ly-mm(tw&vzN>HN1&bF8t7J-(K?c8C4V`3CP- z@Ba1rp%&BLD|>cn2$gTOjV>u`+I~9XJKyz<Yiym%qvn{mb46PgF1;Ga_8{MVm88In zbMv3ISbAyQ*zj@r6|Jzo3kx&-xy_<;_Y`F>S={#4_HgN+q;N}+{tdNj@_Ts`zRs-b zo4RF^M8f&3z3DULzpK8MN$&6b@+2UT+q!u647vMXv##Z*UJ1OF@~k=4@W`t->o5Cu zUfuMjS!teq(Aoc1S0As<G5maIPr<U|v9j66pQhE^nPOw7$-ye{cDdr>GY)0F6V;dB zi%^iL+OL-zCe6#nEoirHJx>|O_iF`PT>5#R3yI~5N%#BmJX-iwRYo^2)oDw3x$~Wp z#Cut5%vM~E=J-BQq2<RfP)j`7o#%B~;I?-aJ9fujUwu42g==Y3re<>Nt*=$gm(}`S zmu)mEOkQ;8@QvBCj?Ltr{-!izs+X7csvDDMxh2K$1PUh3|1PqB+pnTrsoArhmS1GI zvX4LH6mvi7!{?93+*haGe^|0?X^->s=g!%y=UsljNke1bp--yZ_U$(zD>Djf^QxYl z@m~C7X5>N}n_Kfi>Azy*MBd0=8%xucR_2-vv&fSg<{#b~GWIDHl()6U{p}ZB%A{0t zrEk`@vufJQPk*toG(DoJVX1Uxa@ypno79XA>%J{m7PYb<>V(dYy?Y!ce9M}>JgT#Q z_av#mS7+^%Rn=G(eRhtX@r3B?Lm3+bFW#wr@YEwvTlugpXm8bD{TJ^K*ZW<$l(Xs4 z+qCmLz6NN6M$oxjf6w>J^-?vNX&2f1^xnE|q2G4ZUV`BoZ>~SQwK{F%O$n(-2lxE5 z`(wLy*7rq8FBVE2@lD+tJ9oA~yt(Yny7=(9uj|U5y?%UlMPjr4<C`^Kdu3*|oXvXr zWaj5Lezr^w4SvT@EcEP=vwKoJ@9y>J_;tO1^nRtiSnw})oAy+%cl-W|1zq;vRQB2I z3!8G>yl<{X;d;?d1qlbzZGs``eck=#)0`xi7e9VJx%ua_7Yy_6#Gbp%t|ck+sBe{R zlK7gv|6*59<<fb(UiA7__MG|ttDha!^Afu9Qn%0H!`5Bhl3F5MYp$(cuN%H~My1)- zt}{h@_x^G0ux^~Eb!*Mt{kLM4Z=Y~sUf`X`;~%eq^lVtv{o?7OM!Pk(_YbUA&)R7p zd3<S>GHAQH(az_)j?`YgTiSVfr{II7kGz7Tx8IJ-%u>Fw`uFQ^hd(yn`B<kYy-Dgr zQ8Az9{;EaOuKUO8-Yk6WAYW(u_L%V;>nUbi7Y1o@e3%k$)cQloyQA~jbNe69p4;+% z<m{EQYY7zk^4Don_UD(MuY(3Y&YZ870#~a}cQ*L{js3;oFWT?V^K2e}w?%knO4gda zIS!Tlky~pYUZ3~y_X&;qXJ3kSwFOI<8=qy{Zd}aM@U{H-!`FHIIm@QMSb4GBzI^WT zu2*8$-&@}**~_An{O68@;Io7G_N3iAwc_x3=cAt%?urv%@%l{0wuLWMRlnbQEwsEC zwCJ<FJIZiIZbi)GwRbbN6s-z5ughGsTh`cR^|O5`_5Z3@^&JnI6Tdpf?n-}UXZZTb z+i$Du`{!;wc(6&Vjb-=u9SU;={-3{B+io6O$0+k(?d82{{V0vrZ2{lzDKK?4Xy}Q^ z?D&3fhd_vft83e$CN3kFloR)6Go_YZm?oyNwB-HFC*R#~T_{-=;PPYc`OhCN-1&X) z`##US{8`24ZP!DpCD4+m|GU%X>gZW6pHn$8GUUpM8NTN(`W|?ew)W7u7}t(&%j~4j z8o|=rvK20F6SFQ>P0SN}V;SDkzE*Rd>A%pc?E8XJvvikV@|G0KS<TOsy=AMn$&=}s z9jA4!+P{05eRN{CDx2{Am8MbG=AKi(bC>D18`FZ@=R^eNM;?2$`|pjv83Nhz91lL8 z^SkoB<Px{`4|Tiv{}GE@TizJeywOW{mj1ktp@+LzVSmWk>!wC)wjMZR`!Xcs!McFo zY{&m6v@kauoWUTY6T)IK<K_RICKDoa*08#7vX~!!Ztp|B@VnFDo@@~?-<)=q!){L0 znLj6VwyB62DBa)_*B0%(nfj;DXnNT@v663>QknN(INZAYdd!21`_C2ETeJI2;ktI@ z>E&xz=eS!-#wWjh8mDKoPpeh@TI_>$+rHhHvAV-kf1wjI|Car`9xRyY)i{5z=IW$R z97QI}V-`PMu6$GF8po!6dtWM5pBMf3St9<{u34WGT9l=Qxhk?sx%$h?4juD3Dz9Gb zp}QjC6T^46@2f+!PUwbiR@0OJf9jIhv}Im<a(p)!t(A4TSG=x6(^{|4=(%fuFl;Tr z+9?9z#bqkulj0%{zFn)I{!Z%mzAdGu&rhy9SF_uG^5&gSdHA+CF21_SZeN4)%A<Sk zoSwSC>Qr1vdgh`hFV~&(xi>5A%Ilb?C25j;Vy<kb_q_GtJykttSBO`atL1bq?Hf}9 z4s2WEbZpDk^a5GQhmgz!o}}zJJ<C+UW>>GQqTVx|o>OUwA!a{QrDE3l?AW~4w!ft0 zO8VBaPn%NCy}ftFa>~gmvM*Omxp4gctiaq?`qlx{4a~XgB%U6g(;T^Hw`y-u@3esM zZndd_87Gc6+x#ebt{N9n&REYLEcfz-OOT)B?a5qUbN|Sm={T!#^rDmalC8$!n-aG0 zZ~m70;p#r0Q&*x6-O-(4era~V_G9U<-o4K6-QCM+{B6nP_*ED6&4V>(+&H)~Y{8#C z0qZGT5fW1mcfE*-S?gP|d%g7DKWo0^_SD8RsJU1OJ;^w>XobwaThkkZ7}v(0`B~K> zez$gw!Lbhs(bMLfP_){+<>RrbtB!@;br$TixqLSA|BtJ@D>WFRi&YPvd*&ngCNMox z08-w9$HZF{Tf<i8IytfxuC3i{Ke=U%Q5w(ZEB;y2!&f~#y;pKg=jrs{ha0!P`VOh< zAUa)~XKi)cu%jy5|M}&+*SlUVjI%CQZS+f<vC2X9{S2g(yr^^5R+E+;Rf2M2f68>) z8Q6nw?T8A9T9|nKrqVOHQ;#~&oeQ_+oQI_2(f|G_Z9n=owXPey4-ku<TrzoI<P43B zw@K%A7_k3hjfj8$kQ3qvu=DdAKufQ{Q4J<KX3q(kBZ`~=X3qg__d<v~QbXI8v*RRq z9vf^Nn8+)_Fq5DWGh^N}f*k-Q*3G{jU;np?-!WvCS?(><*S~kMHl@EgnNV9}x4-x6 z;hSErGo!rM|Kzl}f47zWmUYbfL?mB*tbhFVdi?%n2i-54T>tbp<D0{W6Y-NhbXPDq zFy5G<o%u8cRAzk1Ph6Xyp10`0rI5}|oJTcxo$1Uk_`7y(&d-bm)y=tLGAEz?Zl3wa z>{`Eqy7AvnUqAlbv)Qs&-tFgwb9WE@a740C@ksq0(~}%>7Y@yGx3*k(&A}~@wchRd z$5(A3`y^g@?q`TK`0;YxIh(szcY6M<tDZgm-}AMdtvc3IPp5CMNXT8*t+qSD^k2z4 z?(&42Cu7p&&phc~IFBJ?i-En-Y)0K26%N>bSWqnNco{R<VZ+>=T?y%*Pq{z)@@ez4 zYw_nceD!Ix6Nu4w{kwWsRrJexzY|)_3!0a!@`-6JKAx7h=mDst*kIZ_dAb)z>E;LX zFaMl#T08yM+Ieo@mBEn)CCt0jMACM2&DA&%vh={EC!gN!yE)(UzPxa@`L$Q4%z5Ic zxV)Das;D~4dhXdY^UV5<l1ptiKVzz`_jz)yHT}mo2Q{g;Prn|HzA5x3=iHjVyPkgL zPd8lFD_i$%S@<sz<mJ<k>|f7fYch@U&|dMN`|ispQ&vdcy|(UR?lYNFPfF4>^S>27 zT`H$H=bXmVpIgNP!uy|?DVQyu;{MO7f9uRi>)R?n1@VW69euL#fycIey+MrUzZa-| zax#?9-|vz(5flrtA3uwLf(x28I{t6U4w6a=^^vPT{%rBptc#0QfBTSAE*|yrwCk08 zpXlniHxC!pze!6z)crc>=B$tt4;*H@ZJ)nSy*VMhcp2Zv3*j>_EJ}TKu0*b<;6TXA z=v!BBcdfGv`y)I1_~W^A3pSbT+XD?jh^2Qt)_E%IsOOfJd;g|I?1Wxe@s}jS&&r!S zPU}2f-1v?+?{!r2q3!ebUDFWd@=Kp)CdHwrak)Tc>x}KccS%l>>ie)^$pRneth&~H zf1EvArx{14&R8Wf=X`e5OHRd>9T#;i>bo*I+dpjHlAQQEy1;yUR?XsUjm>LXJ_f$- z)IaldshDiVA^ShO`rM)UspVX|@$=8$kImil^^J=g|Lgn>dZxO~6NTfi*_#;#KFr8> zZ{KjuN2c6bm$|0rop((2^^8pxs*ZkXzmCW5(fzp9_~~8U%scnbH402WX5745Lo^|E zmBMnD%Ne)dB$+Z8e@pvtbzhIw^>EfEao5zvj;C+e-u;n~E%o@2OvdA^KRa3k9_>#n z|HfM9+xgVNPf9ZN=#AO4F5bH~^`o64PvJ-7jNe~pE`Aa|rP#=R^8QOgGoOeri=Q4d z=lG^86%1;>wjDir<<Y9+*COV>zBIYx)aAL`)8|<#fmVNmWA_LDiWLEyYu_gxa&Ee@ z<+a1!gSXX>^)F0+UN&XQw25<yCLYx`|8U~8{Kwnd<sZL&cx%bNBU?YO_Yq^iu*>Mj z>{<7>yt&<E#LJp0wb;x2M)ZqYHn%QLynpPM)Su|m`S!VYOOj7$g>5#_YHwGPk(A5v z&K57;cPHAqK&M5(yve9{*7U{YMc*Hm{+T+>BP&z!X%w$ys%p+To8v7jdTk1mxR*+8 zt((1V+qvoW+YHxCtW(jSE1BMB@c4}2rc++CQhR#8N+vyCv467imRmPqDJaJNcmJFP zPHUfaek?E2(3&-8&mXJXl{<G|S{BM})v`71%7wZ!^M0`{O?~=jZ=(C;-@9&}`TNyB z=yKL^+2G4Y5qk@t@3)#(uPadV!pV@qu520aw%}}D_10*~$?OjP_mAaAZ!-=TdX{!@ zUa@P%jaiQ(AIFE*KDfzlywNbYC_TDb<iO>-b1dgXo!PeJkak6y6G!3Sj7H8t>Bt&I zzx_HlZZ%rpVU~RJsC}td`Qzi$dOpw5-uFk*+P+4h_z?T1ZKq|wlzlRK@i{27aC86W zjds?zcYpT39(aaN`hdRRc9Y-#V5NY`-Dk1vFRv+1@q6pEVdJKh*Y7+QZ!6xi{pj7J z6SwrNS^e&{o7wm4_A|e~_L^7mIJh~XAS;SZ{>+@??8eXkuRi!7J4i}teTZ*Nnr776 zbuxz=rzB0Ab0RTef$w7BV}EN*W=|^8U6}W5&YqA{O^a{x@NH7Ob9YDd<oI__4?SKT zRFQa>^<7qWfA7w&8DE67Og=bNv!6?uzEMkUzWMJRNy{#=w(b5Maq;NwNs+&eUc60j z?F_njA`X;{6W`r@oO9lb@qk<EsWlt^-3eOD;}TZMx!(2tqrCMAQBl?}rbn;x*>QHQ z>)hI9Q$<aGTlBs(K67oR!AUmgzNU`<Evtg~^!;}6PxW#=ulKe`?`1$lh)-1-pPnCI z_}%NhZ@wL@jo6$iE`G_V;!&^v&$?H$8EOoQ<t83a`cPE<aGPT7zpWo*COdq%X55-% zyZH3FttO$5^7Btkj-4who_7DmHhJDJ3B^f_`*Y77ycBZqM;V{Zy`w8HzFpO_GxEb> z4f$s>XCB?v&76|GrDa#thlCbohWNLq4;(+&ay$CARL*xFb8)$-!oH>I#XHUKEL^v) zRp61m>i$JNlAZ2f`qSI_6BcY<?<lPv%>8V;bWHYb&*SEsp9KjqWbeM?SZyu7OkFPR z*i2=%x4+&-ulrvacqD+$;x*Ub<x|BzzHW`!mNG|qp~iHfUa5NT=wlUIo@o9r@DbT1 z?bq|xc$va%$KT-$1}BbAkH2;O9GBh1`6uUWK7Mm{?Zh{qg!bs>NIVofpuBJ4jv0~H zvgEfV3*LOXbkCJV%=+wQDXCFRpU=%x*=8W^y_9qNj$a?^R_EQAIpgZBFlYhz@BUl+ zqNb)rNxw>Z85Y#{`|UCPYF+f{Q{e{Vp4FLKqON3_sxD2PV_Dw#zAmoKiSaP|*Q}y= zb7B8-@qP1usrm2uxYADI&C7R-_?iB1P58CnYF-*Y%lcjR2Ue7wFDZUDGjF=_{xcz5 ze0KMQ8sh50_FTWe_Tbz1yyYv*6Qmy{oja2_uXNq-q8Z_HPv71(>-BeiP~q|QWx8g- z>sRZ(mwZ_x%CawPpSRty^v;P>vU$`$+QiN{yrso?&YANmem@SR-F@!=-2Y?UojR>8 z)4$IQm~#5MXQ0l$f?4vn`Ij}%&7ON(P2}mPKP%t<I{AvB>#C^EK7r#)FDZ$+@#J3H z2yJ;DIh*i#U9(FITXJ%4XVltd(d`C4Azs_w^{ttD(z^0jjGF)a)%7xhQfJ<*%)fBx z`s$OlcXP7Xn)R2Y#!Oc*h*{hN+Kheu-oZO2f6qI|{$0OozqM`jrHl7^`ycZQ1W({S z@I1Hbab_N`L$$RygN)Bv&FdKjrkkIbZ5R6yeY0qr#r#%H!ztM&Yxb42?Y$}f^5Kib zlKH$hCsocXPx`)y)koCpSS9P@^vu)e)`*m)#Xbm%6ck=;wrSz*j61JR@ch%(6=aa- zmi}c`IXPs`@p*4TYVTiUjoh-)@ZULMXnS_Y&CsbuC$u$|{C>+Xy=L|5C5MF{AHT4< z*!s*FpN}QQ2Txsk)b)FpWGFuy^L14Y9#A8-L;BjytjYUXqfFzfmK!ooD`Sbc^)WYS zN?l}lb$RoxLky2?nlEN-?fIJ1+8VSp{@$TW^U5E8WBTA<C1fjO+w*R-;^fEQ0!@2g zY)@pCcqqnj;PSt>6(6tg{qwN(t%@|fuj2YKvEaMaZ;978C!Ke$N)EHU*WRC-R9j`l zz+Q9-yu}3EUby<kzNl$WlheL`FGOYD<a{|@F5i=MFTeh(*2@P^-+9drD?RUg`O3b$ zu+W1E{@;%YFIp%1wDk670jG}DL5o&i`2XgE{<WQ<nj$t2WRnC~)?LWT$gH)Lm>V$V zw$AUaQ>QO{zk2MLr##ELPelptAzXJ^=AYI-_L}+F)yP#oKQ`ss*9u5nxNgO^BjVPd z$&aB8+atX>pVu|B{QP}kaj->h)Yc3CcPD4mn@I6Sm%GPJ-<MZ%-53^z(-yyc8lBs9 zMU;2T9y7itOFovpiDP>k@A%-_{2kv<*#9c66iq$5ssG0!nZM^_W$$FK{l0O-!PT42 zxcF6SN~Rv&dP_s=f9Ugsq;>yy`mD~IhDfkUzwaIX@=`1?d*|xS%xjzf+}!fIA@Fa= z)Ygo?eMhc>H-p_-u<H8Z+;u!L$xEh-8oxVX<>tQb+49fJJ9JN|oj5g5QLpZonN)7< z&Yix~L&FyRzqz#U*M5d|&%%DqH(tFpzhhHW%8r?BTF{!;ymwF2A*<%?47I!53ZND5 z_3-isFHWYt_KvY#DF~|bSM+_$)A8wKOb9*}DfcP!^ZGaCNmtzZo-Aelup{2W|3~}d zw6v2;HzirU`Lj0i`_q&%%hx;C<=mfjdi8d3aAZ4i6sGd6`@8dAX@9@`;m41UGdxI0 zznyS<-rU=gcc<_8rlK6dp_mtNIOgxy(){gd^PUIfMeWU<9klA;nFZh0C+^A#iEFdt zusLPh@ja^4^n}m8Np{jgA-O_(nk~1^kN5Iq)Kq0<xG{Ui<E$eQP>(rv{C9_>_bF>T zC55#%H*7tieB7*Xf!hX??Te-?_s@B}?r?VRI^{QsiEIB`E;Bft5F2&#Y3J2FtF|)V zm{<9)>sO9P%UtcosRthfvqrA*_BV^Le|$#p%GAcE*0#-ASDB!78;4>`-;_21rw-{G zvmNK&oLbr#%o>?8WvYQyk*Q$WI+n<rlY;|K&3hBlrOkX`^Q1);wkv`c*OqN5PCeOb z!C=>M+dnE(aH$mU_T5_-v@V^y@9z2Mi#Hk@9=?2M)>p}sYxYhlNv(~#d3Cq!f!}L) z87gKmM?E+x9KGYXu|&LgbXj_ALUkAygI=1L&FlO7E<RU-dH>J;NubR#cMhDHqBX5l z>Rhn;wvB6zl)q=hS-ESUHV=_}_3C^v<1tpR<5k;|svZgIO%*L%xn>5x|Le4Zt;U9_ zP5#ksyMAr9vz_TwY8fod_j3E|r1ySRk%pc}D}7&WZVkQ7cHH>J(dqn6yFVX%`FBdT z$*)}}LSxSA{9Jf9;m#^wDRr1jIGlq(gOzy&-_)Mz<kWL>E9WK7SZ!Z7ZQBgZ&>gcP zjZPe$E`N*n+3~XGjUkfdZ_hieO!7RQ$W!v|pj&EJYmlpVHv5{8WelM9R59b*kK4B# zjaj*<w^w-nws$AH{FF1&pBK5-nmrS|AMo#;&7{D0jukVa6W4_ZW~81E{`dCAg<O-l zZ|?R~Z-hCh<9{&M+HIVhzd<WXuy~%<`u+cYeU)okVUl}mOZK(x7#;Yf&_Wm70vDjo zpa90Wg4*?J1}6^1S?@l448C5?0nJT{Ej!q(+P3di`>VAjYVEgKUy!@Y0*~w+jhgZq zs`+FSpYL;aY1x{X@&DfSY74k#P-6Aj%-*!T*4Y35X0N4(j@{y_m)GCr((?GxlZe%O zqt+^Zy20spY@V96Ie)OQu+5#AmqLPm4ePf%-i~Egx>@_cK=$x$qb2d{pUG8i?zED0 z4lLxfwQ`SnzYsY{k8C~7!T066>*9+OrcFG#F?i#gp5F8$5B_b*6kU-Y92j_T(*A3O zc3+jaTA9?@tG!O2^6;^9Px@rZ_T`n^b-uUjt_rN5xp$(wrk36`P*R2){mA~|EY_xc z=}Yq7+}u~Pcz5%=ZTfy8@LJxjw(afGW!uac-rSKt`SVKmjhnX$zMn|6u(o0-_~K&n zdi&d?+w+)zR8~KH_^fDc8)rk<YS)DUCeih+t*#nV&R(D2^z5}a+!`m2kN=;~y3P@{ za>|#t_gX)%%$(!x`Sis}iC<;!d!p8=y-G1*V6HB|&fdtVbm-QE88v;E(<fOLJrX(0 z_RX}aK5Ff>6Upk9Wm?nT%!$#_)#>2KcHZ9iHgM&X8q4qLZ*ta3n&xo)&$;P&>ZnQH z%lqBma-9QKo4)C`IkoXcL|2!0L1EF7{O{+seE7`hu=rwumR{qE$%ZkfPPnWLdi40= zxe0Z9H*DUj_$q|wf6mR7(jC8wX7;qdlWT3CoxS*PxTQ#GlXIZDhKA0e^S6cF*?+ID z<OU~mDDnUKl>gWIqS&`GD5!o_Vpuu-lBTZq@hewa9vo<hdh6^Q#W<nnpVQ=Tn~UzM znZ3W`?UyHaZ{E8VJ|Rbrs4u#h^(FVyC+>(%MZ8B<Ra>^?H1;oNk6JrTG~0Z`YX_BO zYP$@dK6}17=WA8a<x7km-abiZm*qZr^7P^Br;ST@T7L9QkKC8W%%JDj*Am(ny)xvI z;T~Pt!?%-CGc!Z}GgyC<P5FFo?-Oy6M^E3m`Ni3__s`9_l&t`DIXDqtjs4v7Kr8gA z0#|nzqlShK(}8=}ww>F=!&kPA?QM^s@O+P$Bq6b9&wBR1=9?q)=3>@Xk?B(svWkAL zoHlLh<JV75&Jf)G;=63ERpXH-#Xl;l3f{jE)R^jZ$$0aRkKdoZu@^eJBAQ+Jl99mW z+ddp$zPm0A2v`_q{CxV+m{TX7JX%_^$M(*~jhi01oXHH)T6(ah?AVw1h>#=uPG~S3 z>)Fw&P#@3m@8+h-D}oK(_Va-q3?%~Z?ib^5TWwkqA=<EZ-pc5?%Qn>pXMLaN=fhUA zRCSKlX-y3gt~ENk*<0V<T|3$F{>Su^+uJz#F0rrHJ#%*BwoN7{Zt!w_P_{PjfAU$} z<NOJiXv=eR_SD$iiFqwM+wiaY+}#aftB;;N8Y$1hwqf&T!(XP5!U|%2$E<%_9SZ#7 z>=?|hU1PX$>&3tGr}bSHUtAC(6}Ixk$+MTYZr)~8CEx10>&?SeIgi?A%$#}kMws}V zyE|&lrMJH~i%5^VxoyP`(5Al06KeRhy}9?;-U(b8!Z2lexQWrWW54zFG#L-9`?OUM zVjnmsbv*m9p0z32Po3$(>$i*z?W?(`i9HjUK1Hb3s`0|LwLG`vtwp&5vX!>Bg{1xq zW1Tzu&@Hd+x!3vLe)#;&BqBX&5%;%s_qWY%c~V^R{>Hq0w!0PtXhdwQvaS5d`fJ<Q zR0HYD`?pTjdl4HTX@aPb1)Msb6`WP?4qkmV=jPUa?#$^1rlt#PZwuV*o9bn?m76)? z_B`g8Qzuv)R$ndp@S<?ixupw&G+zqbyY`}%HEde2MU~O4H>Y}%9PXDpH~sm`;Nj_e z`2O+k1q}90On*2&d_8vmxOBsoFFX$B6X!ZDT(DzF%N;4lbZ>8Nhv|wjAu)HB{IiXj z8>k@?vuDb=*6!&HD^{#fP&GaK;<^JkOrS*8t~AMmtIhMAK?USI$3jm{t*KqN+jtHv zi(1((H&@wX=Zs@BH$RWuP{G>A_if6wX+a?|O->6F3hu}4u&|Wcdw$zNN15)vr!ihy z++zC2FQ1)y=MNJXcX!2)eH$%q-M+dzclHB?zT-zGmgu!wa!-Ho{H<$i)Y+S##dqX- z)HgBxDf#>K>E@)fY<FVjT2}vK63yD`XunKNt)hCz<RZh~*3)4R-z50omy7Lrb^qeQ zdD{*;>oW{@p(O@xy0cVSak4PoMhMGb3lqMU%2VJvljf_U6NP+4-0!%$@BX=cqVM zOpJw{)gY;$zGg3vw~~ek*R3sFhb|pzI<zS1)2GjYnp1!LtSEeaz-|j)R^o+!IbK@N zgMvPml&fkSSbuGwC>LvPQ!_(sWyhH}IcLtEd2wx}ZDXCCh6vX;SGR>>t6yHR<MHPH z9F-inG9)GKdBMXZDOJ^_Tllz^lm>90IeYfQ*G~%C*3-YN(ed&+{o<ZxlS6&H(4=!0 zwG0@_!_ygR_So#0GS9QjPtR3#>5t0lM{izS$oS8o`=?e@Q&ZX6e0tL%r6|^4#v8)T z`;H%Z`0$z6X{&kLku#Nv%fhQ!Td!9mi*YEfo0}a6YSSV@=g3!8`0yQAEzy$*9nv12 znUbQSuU^~sSUnXNi+!&MO+YOx+QF@q4(Str?uQv=ADr~swkK*!l&)~xj|OG+r1jqe z)}8obx!>r;yX6wrFM0RP`TqN>+_}<?X`l0s`BgP1^4pwWyuPMpZ~JAPpvy)QHRms% z`Iq{$^ydE~;`UFDo-|%}df)nMujijhI=XA^)@lDgepkCU&usU-w{;PFy7UgqJFU&T z#kyK|H~+===Z@bjei1SGc$Kc{w;EOzmHFv6n9nc1nzjCW04NMDa!h`0%b?gI5T5q+ z*xVX}V!Pxv{s(8%)viR@zdmmNBlV`#ym<xU!teI2z4>i**y^8&AGO?g-?q>04&MB= z+W2R}F`KabTSwK`+n?0^yX$(C{llaD7Lv11^c&w(woy6pqRx0zQN*@1?)|l&C)VAZ zb$0j9(xX=A;ye!Dy*Y8B^KZj{=MpuhPGA33Omw<I@xAvsw<;NyIvrfgT=n6P^7n+a zG%kn8N>*;M^+{is#XfoRRQSQ`qf36fUtAu|UMt_bHBdw3j(L^F{l9y9D(CONyX5-o z?e^D=i|^%sU6(KU;PCtVwU?IIWqa+Mac<gOcFFqZAF6Ki$Y1H6F26tizXfd2dE2Hf z2kzf)Zrr=uAn%EQj_#S+HhoiHZx?>>*wZDWVDk1{ztX>Q{SsHY1)Hlj=AD+Cw*GEX zNqlUZ{gns5qS?PZSR6iILGPo^cl*zJ^Y{Oj`CDCLlu`W7Nh(>cws+>__$B4nIhsq| z{f-#D+^Sjg@!sbzukQu!uX*@sYt7%oLetL7b6T)}d)?13mispq{|^lN_rua_sgO1| z_ZjW}um4vuyZcR=IrsF2MqA!#@#`NiU9+dDw%z~3DdET2Yj5v+Z%}^c()OF*GqV;Q zx^ze;c=G>i*C)?9|NX;9iEZyXpPaAXR(Sq|qK)y#cTu<BSeEoe+Uq@h(`pj+qw3?O zCBI)t$X$9+x9IWYA6ft2&*||!a_?N5V(spaM}8R2m_3v6*xcpXT35bE{47|z&$_MM zApO>Cx9yA?y4uO_7ES%LIahz@Pu4BDq6b#{_bd-x5dZdi#{0xyW$zoD7GBUled1K& z#ZRR<_seH^&%Al#c9ijg^mMu1^&)&_+kTa$pIf#e`G4TFHMbgecN=r3?MuH<e)Yc9 z*Pox;&wu<_lD*;XYX83H?{2eSzwI98Cl`P2|J>N${fk00Uy8^b@}B(e_}$R*yf@Zq zLPu4XmgfEb^!R)6dD-m@z5Clk!~SjVz5oB#fuC2rD|YYxbmQ-0iA&p~_dW(KcARy& z{<XfYVvB(9q7bc{TRt<axB1v`aC-XMu+zt6fAcmqo>ev9-%z=K-4gfZWkMWz4M8iP z%wJob&Dx|N<D;%-_p|F)%+^HqSmj%fo<8I{u-#ra^<%tr#ixTCw`7VQcqqK_%)eC2 ztgW-!-%GB%pZBS!a!!}`lf&U^3&XO1e3?C8Ls$Fx+~@Lci!Xlo5`Ed@{F#R@JIf!w zNjU$?cX!3l!|P}Kz8US(!X|x{?ZLN$wLgBfs~%CGyF9g_|Kj=VfcJVO9GAZePOq5O zzyH@n&3v2I{^imPX4k^Pzf^^8&wS3f?Y;G#1ce=Tli$hve)oI$<f(YUhZma9{{It~ zE_?I*_saZ)^yIrs_SMC1>=SIRivR9VQ2bA>{`bl3U-P%WvpllNH2TMzx9J<VZDKia z^yI@;zxXpH8-iA<m?_>=5Rj?VVQX+czKECU;6~0QtELICwE!o#WQsC0>|QOrx^7lo z=<omLIX7!NxHDgFWjc8Mb%kZc7Zu$<dkRX;YTk2kbz92Gp5L;4UhcQrZ!fPk*4Mqg zP;t0E@a*&Gu(*TP^J~}t-nnMax!gsMCs+JDtS@Pt!;o)lJ#p&m?VtZtUyd|+?fj?K z=Jg#lW9#Y5@6B=hFDG01`ex^nrRg6pPPY#TiaPe%-!|imrN#OM3=N<um(mIQ_tjTN zOaDE8Y|F)rt$RNF;}M#y|KY~p#UDNvq#m`u{o_;nQMUc>L$|%RKJ=Ks=bC+=ug9~U z<;xcb9C(q)obm9rXPBRycUbO|FEfkJ{C%TadpnYQnvn2(m%KW~cY5cx{(5&$bI&!q z(^^^;>9=y6qJBM&{aG3Dbn^B2CLAWrEI+RO-4$N>vUz5PNz}f%pQO~ZM2(;SKi4gP zCgoxH<iM37KGnZ(MoGSlE|X8XJ<o&f+bbTEe{x|nH^1-~)A>1@v%GhKb49jN|51b5 zbL&f9OI&+$9yGZ4$jbw?Q#&tVU)(zp5wVTmFBJYN+y964SA~xaYpW}ZsiH*snmc=% z(q4Nnz8Et(;cLC4ONK!;zr4EndWP!Vr{gzV&%f{PlA&EIuv!yTatl8`{z9Jr&DELv z?pg`lTc*k&dnju1w0S4x>+>(MH~G)EJbvwN`;4y_wM*WM@Hw<boxOc|-{Xgc+aEuD zcxuN)=NA(9q}17~8LYPEA6|L6Qzv%s%#I5QQ@m0a=Q5l*<MZ<BQrm2^_m6(Mzcc(* zxpTMGOXKx^$L1cqa-@aP);c+9QP!vIkonE-{(?dx1+KS$RqT3cyuG?K^ZWw4*vda! zHES&2m*1=Ycv0=^)j9j^!xvi~zqr+T#lPn*Pd+o0aOB5oOB65F(LKZY<+GCB!!>m? z-4;K5anfSfmVECg8#8LR%@13xs`pW+|6aBG<~O@7H3Cd-shRJ8_x*8|tp4rqvSu8+ z!f)1Ubd}{sB_`)azTf8M`uP0!`(;b#o0`sFKXWB#ws;-qi%l-CHzj=3y0s<i;A;O@ zn^rnIH(3bIK5*Xq`jzT^H!2@!q^73s`Fh92$Jgh>=Wh=_eoX%H=(p>he^;8_<~J9A z=4O0x*YuFWiRih8xncQtPCk5W_~+AA_Fraqty_abVuDuZR;BTsd>;Jr&OY4*r&a1c zU(PSwu>IlhmHCe{>VMi4+<st}^8A@(j{W1m;tUmqpLmLjvgP0F`SESlQ#<=F)$-}n zr=W?{W}TD^wcpI1KDxG(J9AEtZ_2y${EN#%xf$+Ne+<m4f1&zl^0~`aC+5pdoj*6U z=rh-kgkv>vb4upd#rN)QXGjm$+mvwf{+<snY=7xI%9A}*@nW6eFYa{ELanW8p!U&@ zMp035;}zxN*K+SB3vk5k&z1jMUH0fh;o+*a`M!Vqb{yHPGut|Jzs}1Tt#aFcZ3o}p znr^gdhTZdUKH2VNi=2G7^DVUbdLdRPes}B9`do$w52xF)JXm*|?eneRUHW@Aa-KZ% z>mz@k>-=M<E;Ze5|MKu8`}-^PjPrjyYX9=?mYjZh_`ctjlCG+%IdPw4@9X?%er(9O z=f{n`XJ-7?R)2i%!Lv6j_Rrn6YE5JBR@KMvWzOxG==|lezK&Mf%U5UrY%bM*9(1{& zv?%4w2Syu<Z$;12L;tV0vz({@{IB1Yl@@bk-pr^t@8QP#_WF~uV+F-!NABOA+-uEm zP<F(j`TMhJb$4gUaO|5h@#s$O%#y6@Zu{4~^3E<jsQc$f@m;f1+FAythKc7FCPzd^ zUfP;GW1sK+JlO!v&^Mhn=WYlxOWs+&+EL!CwP_mTz9n&|F6bLC<8@eGrugUU`EP2r z+g~L;p3K4ZVWlXGo#5;Pb6T}6s*L!wy}jl3WLtdi-xs?7--C<6HFnjCn&SEo-@iWE z-GA46`nTMh+teq8+y9el`0MVsq2#ODv3q7G6r5MDJmlQ8<MFk+HGk5j^=-=5+jYNw zanhnLe&@Usj}50x4;Q#)HDUX_xgGt>rEh<8`}E3vS7FWX%R&48W@<M6yQeeL_UMY_ z9n1D#%TIs!sdUM*rH>!JI&)XK9TX5DT6bShn>_veb$gw}-}?@SgscGN?)7$-a_-g9 z%g+DYdhq_^|BJRAY?QGm3i@xMW+%Bd>g-$RUk1tV@-wzZiEy!MieJ{$(Yp3OZ_3oE zm$R=dw)ua;)~4XO!QXGk=B%zN;aeWsp#Qlp`s7XS%pcX&AD(R%=E%;iu@t`$t6*7W z)Hm~Uox0-BJ&yK2TU~kfy!NcUy~;>>a{Rm_PhJ)`-a77mwfNVItLheFvge=0vTJB) zEvvm9w&&v)=O2~TFMemgu$XE0Jlrhj{&9cf`^PWeb=}_^wmS9szs03#b$PdiJ@?DC zsU|<ui8**ncekd7&LaQqd=<NPUb*GBHth4|OQvgXZD>C8CWfiTrn2BoL9?~mH#fQG zJInV!n7&@^dS%{fA>sK)%I)>lUxmm#OI!Bkozy{N;rGW*9`w7vY~T4=iyjGqlCO06 z8+GmD1`3hkl1pcu-)<<icG}*F$1C^TVzmZc0TmY;u`jK7@9mkhW-PesR9V^j@0}dG zwe*%KU8%KVOPvz0SX!(%I&nKdY@cE7wY;0Y=g+;(V(nV1qnow$?!Na1cdgqJ(^g4; ze-_JbS+3Z-bN=2`0T#9m8@J_rP--$fH^=wk^wjK%FZ%-7j{ll!v{t4(^5;{Y_p9Dy z_}ZHGi|hQ9E)Q4FlfLu2$lh&F`|Is*58t}fWWD;YFN23b1c&00{jZ++92Row_%E!g zn#%L`{@l6jeXop5O{92dm&rYuR(JRH+RW=S%I)VL-g(8l=Ht81KK1`ub8^>o`db}8 zQn>xK@vLQgK8koh_j!8pcgf7<8#zzfd^&YJB0BQJ)pq^QmzMmF*qW%${VyW-0>}qH zbDvh(RlVgDJF_E(+u+w1NxM0g^VQ{LPCt5YcktxFc_4e1Twf+2C38alzJH>}{Jffv zf0Z6hKKFWi^u|1GP@`vF;PwwspG<#oS+^<DUN7<XJdftTZu9L9N6)W2&0NlxeDh9b zNhinC%aPn3J7?6nzLg3NT2-C@@8&M|{W^+2ZJq~ResN84O{4DXG9@!Xb@u8xvTvnx zrq3x73{PkOD}M3G=aoOIc1owboH=vmqleFYKK;D%>$m0nuI;<C_r89e4JvGR7(dt0 z)y{sSc~w(QapnZ6gY9c~^M8CI9h`Z6ndtr+)0ye&_l|~t78e$t&vM}9k<B*W?}^{3 z{hc6oe%_%Qg3Ld&|CX6V>F(XN?fGi{($c#6|L=si>C8Rb-G8^-HF@<q|LYuDT36<D z`LdL}|8711?6IRK8~Nkr9eFZc?s1Hl)cRT@?uK=O3w37NvNrs7zklkIW$?_O|GFDK z9xs^ce0<T*AFJghE4}0EX8hB8{9fwd!W9`;vUnG)=KOo&w7hWbFCO_lHl641SN2`m z!gFulFIk7?{m1`@E?mpJbH+T+xJJE>(iagX3)eDta&W7u>(6g_BH~ak7o;K5vSp3+ z<&CR)4WF-4t<Oz4x@&FChfgYXzn>|Gc&Wax`&PU6;KE-r-F?p&&-^TDx<x+U&baZ- zotj$vYhlxL<{D3(Fpbfrg>7@mxsYk+W_taXlYMO)x2opLRsM>dyFdIcpT8mDSoM=9 zq96WLU%r@O^6UDFg^!<{xyhaK^vPAOj(HuvS5gzhwYM_{#4TJc9b+5(<E;Pwhu^2Z z-uZf)W6iH;mw#05{CxbrboO30P`xEz|G)d<_HXI0qR)fN#^q<P#ZNG}wsMCtD0NPm zGR^4c(&H8H9u~@Ub)`M>mY)<Kk#b?%y7RO6)6b>9p66j#_tx{@jL(|PRb_`R-kWw( z-+xiQ`Qe8A*z?;BGhfb}GG*Gscx8u|@83F><?Z|TW9`cN{=OYn)*o&i-+bcSS@s9- zd#xpJ?XPZ@yk>g-VCB@APvy_eIsc$~UfPqE=`+7RmS=nZ_}HzCEm4d7=9=wzabtq) zZ$9ZOf9}<OkT}=(t%M^x_sTclg;%qFK6%ahqq_Rjg&TsU+cdS;FIclC=KuPQp4_%E zb0sgVHV#hvyX3!5<lap6#((!%wtrZA)y{l<!_(~T1`pre=Gio{x01hqPS4WX+hPBA zTHSEsQ2e+5&X@U4x4+9MeEQ)TS5@=qt6Z0WlgaK&pNbASM?HFzasHa^#2$$&-OYi^ z12h(7yF{Nl{d!&EjTyp*A8pG1XZ#i4dG6{yfnDME*j_$-mK0E)|7(sb3;Qp_uWQr4 z#P@AEa3#O)*};v6zsA>`i}QGV{^$Jbt860!7e3qVAAkM6U)}u|3-=g4m3}8*tbLgM z8&kq1=EXn1p0Bqkc(P<4+uPd3ZJ!RzNc>e>mUq7`mc4IN;_<p)-`}KM`2YR#y({Ux zwq^G<{zdJdd-!-VPZp2V?RADrQ=i_swV(aIevIF%r93uwV<PtF%Gd64dttnM)}x@b zZTo7RYCnDAj@+Cnp4`TNLI1SA#-UrQ%EYGkPF-qeyk=Q*;Bt%FXENvQY}VbYy?XuF z<+H3?qkPlC*6o|Naif;j6&01a&-=1&UVk~$a*utj-g!G4zxv<x-1hm`a&Dg8cUYYx zQ_>-%#KtTvtY>eozyj@=MrkwNnFh?7F`>pz)H?dL+Ev}Wp7z!2rlq=-=`n~sOZ)Tl z@N>5K58dA0mH)eUs?7CPJ#byPUOu+q#KC*l9+V%yk-Xzn=L{Ad-7}R5XVz*=^>T`0 zlSo;kAG2-Rn>jYq&dpu5zu>|9$0ud^_a8cW!^J6@{o3#9Kk=ecG8`|mJj(N~x1C77 zSi+IpyL>kHyLEmpa^1^P8~8VJp8WB<!emBb`kS4nZeQ-zx3BP=pIUo<MRdjg?wv6{ zr!y{X%+1U@)->~da{B7iGWvR&skgS<zy8hn;p>q*XGFZYi<`eM+V^<rDdq1ySJEx5 zEpL2$W-MIsV=4d5UFwq@_wF{Sn&VUXSu^OeQC4d0yA{iITv9?z_RY)t75$K3&h}_u zt$W4ene97@cjz77Sbm)&L`$@|{%`R9yZa8S-`Mn9;JwZN4gbn_mrwsTW$M(=XZ^i* z<`&2=-t4k}#%7Lib@zR9Kh64An<X!GCbob7$wR5xm9G|V{I$*0KD*1?>*l840_$x) zGQ=vCr1IRWd??6v_pgZDx^r8Z?wihEZ^*?}a`45h<MCHNpVrq{wV7|t)~TxZYd%SR zxA`fitiH#keZ#dU;v%LIRm;{DZ&<!tTX5k)P&KH2tY7g{1<!r`7{^mby?tt5OD?`8 zA|etPxbWD;dwu!!QKx2|-5sDATJm1x+-BkT*W`~c*!`m9ONxyA{yNLme}mk@*52>$ z;@bL;iS@;%g6wG}2FJQeqb=ox&;L1pf93X)3oqQ`Oe<=RU#Q#jx#sQ3kE?$F*s5On zU}kycho2`)-b?s7eX88|^M~l)_jRSOx4%Dp=FFCBEz^(fX}@V%>C&?G+52AW$Q?Pl zmX$xZ@bW#`*?#=0)xQ=2r;hBUH<=G^uKzdpPm|NUIR*OLuC>*_m@;ju;p=u+hCQEB z4$GgoJ~?V_+WCcx=X7)~-m!y4-JQLv{H@Drv9`@m;`U5Ac<t_Q4`1)&mk!OD5a#&h z<uy)W<@KMWcF%uv$Hpw@_R*hLOxEb=zPPv1R`$?svz79_ZioLJ4s@B@wRFP<4r^=a zTibaTX1AAxfAn&^v{QtuyNfgT?xurfl94x$sLxe3dc{&^X4bQRb=li}k1rO!>9+Bz zb5vZX=lA99J=S{p^=!Xmx73JguFTvzZU4VB$-Y^^!IyT5O#8ES+qF+|vDTM%XMa5q z#JZbL=2=LL%~92*6+3nsEXnu3^J>N$rU$2Y+6&)Po8eenbtUTi-KP5)!ZJr1;_luk zRhV>_o$tD}U4!T2;}0{|bB8>A_H^_60+G&>&oy+kjvYKVtz&~(NtSq(Ykfwyw8zu8 z7q)+UfACjswWQ$+ap`iI2h-~A25L<;(anFmiE*#h=7f{?Gqy&#-MzK{+S|FNq9S6& zPh4d3?b9RH>o3YRU~P3>vMlvQ{=+vSazWZ0JPApQj8<qyT|IX6V^Op>cX7_zwI|l_ z>|^|;pCuV-DPt+<?R2Tq>+~s4@AIp!)_;v|kByaK<oT85wfk7+$C7eIn<c8Rx4%t3 zba(s4!sB&u6>sioSH*w&%)N1IX2qo~nfL!Ttz5~;AG&+*&V9iR+vb(J9#yTedab^z zlw)<M_{AA!+on49-Dz^#lM$t0q4?A0si-L1%{iy9=NvnB>(qihYz>R|%BoJ4d_VX0 z*2FYV&dJNqKRtT<o$-p3JiBxbnd!dXfAx=7NNQ`C{XJh_p9>i#b2@w<gxrx_<Tsa1 zL05V6!GzTtj~7gRCwuru;YY1`RoPPgcdFTAZ*4b?*#G%JU{z^m{sh~1?_RaEuQo31 zOy|s%tw{C%r6u__GvqwuZKDJ1#l^;tgw9<uv}swa{&+|JmjDK<w)TP_6+DmK_*Tx* zSoiPyF3sm!>F(Ce4ii>?ep>7p%yh8MPLA!MalHO^?N`gyjDv%lk0-8WHZ%+b4W&U! zqZ>CPu1ik2v+uh>zMb{LZ=Y)0UtWJ))KGDLVe*WbvkHDcuw#2WMeDFM-**|Sw$9Ej z!R9Jyo&B{Q@?rV6T%UZ*SiC9kGk3Rzob34}zul!{3O;@<Qdim{x|`oklBFrT?%In} z?Go1v!n8_~&#qSv-u~>fsh92X_1j+61fEZ;{Mibs<&NDm<FL=?7yG{z)DY@(J$`v_ z@>^?<SJv#?c|IiGd!GMVetYKCrca-^K)ncYy=9M|KD?D7-5O+m>V19WxwXty27mvG zd-|S!(EVO~;=Gw>r_1kIa=+~S!sM2%d`1?1Tc)N8tg3$5Jo8Pj&AR$MCFicF#W$Qf zaq8i0R_~p~KNM<X|Li(b@t;-ZjedPw_<x)A-C?Ui?c#zB+n;W3KenmlY?{&L;+q@) zYv}&TVo%@x#?Iq<$AzfIjO2TV7d;Z%_O?^S*m}D8{J9Noi=X~(Jze?h?fD3^@>Nqh z1e`cNuHTU+dGKN(=hmj4LQc>BKRX+@MCo>iuUooc!-P89T?x6VCqKTptP{U^-tYH& zWaa(uPH#T6NJ(scjPvRP3~hWboa-DJv(4WxShT1~@o$ys?YdK^PDk!3;^q5RcE|Qp z*riLxH+LlSr=_K}Y|G0mv5zi$tE~7^XYcN^LkG`ITk=^m=k8wltx?YX=LEz5R2@~F zqo}UG|DwZ(Z+qE2cTaKj^wcafGuwJ?en;oy`D?9T-rj3`Z=T$dW9pxduPVJ`oyB4o z_x1XJElo|;C8-LDifh-c^7Refez{-HjwN*K<Es}Rewv=OHth7JtFKR<IkhbOdY{FO zn}uIec%sYSr{9tFoj-Not_>3s{#LVZNP5f0RI}&hjd!0~Y_?t7)evy%sL8ayd*zCY zjjdX?9=vz1@5>pTZSQS6f>tg`uDBibw|n;a4~@1zQ*TObD*AL|-*<!f`ah>azkYwX z+W*7xRlPd@vXwvAN1x1f{`KL|;_peBiE-(_SDlPcJM*`9eO*M*@n1Ey1+FVi-aTq@ z3jChl>a^0}gpSwwGtVwZ+6$JxGO@MZuDqpG;auOh-Zba%+Q888*RQi~T}{7nVBVjd zdD45Wwkxk+Fd=U4?a38pPrH6)oyf0Wm;Si#Z_U?-r+<BBZkW5)cW$cgC+@Bdn@w%x zv$saw`=6x8+UmOJf6(2T8NFLCW|gkLJT<1NtJB|UWyqyfx8Cjuytw@2xwFX^b}Z+; z6&4cmp)7S;c*A=2;$?eJvKv1$e75m=#oLwal2L2Fy;!-!h3(tBB39*9_ghb0zp~cI zg5$&UUAbo>w=kKDgNm%Bt@Ga{rBznCHrJYdmEg;iJa9gK-}yW7;h*m8j(_m_<vH*E z`|J75Ql363dX~er`(2mOjdd$_EV<_5`(Lg5)Mt0k%(t5qLmg{ZSDiD|n%eci!Cq+6 z`N=cpIAzX!m&b8|wduJ|4C8^9#_5$C=0zV{nE8CwtW`~I;Z=Gok`@_dPOHlb(h!+3 zd*;N+%XjPU-S~Kk-gCVr6X(wM|GllP-Z*n>)VBB5i}W`$?XtR3w#{tD%$e8T9CIl1 zlk59dwv{P8wDId3na6!6=bXCzcD3HQt8ZTCoN{eWHMP$!*}CBOri`QZTljg8-M!kW z|NL*?;=OC_oOgJ|p1&^fZ7SpcS*cp9<gVL151VO}&G^r5-mguji`%|E{(Q5$BKed# zXbk5;o<Q=s%U4S~Gq~-YFa5kyrEe3GA1s=(_w~1fzpS3-MzIBig`L|yzdql9@zu7y z6Thq#)G045d-CF>MRTgY@2>fO4k-yuKL7b+xV@Rxvt6Lkr)gr(Y-|&An%_pT|GYl) zsBQYi`G0m)O#SyUx4HWBJMR7sIcL-O=65{pf4@8-FU{@$ytzNpU&r11oy5nuZyuYt z=BZQK7IKphJm&9Nd3C?x`-NM#it5gh{rTo?x_<umW5GP~|CxUG&q+yGf6liq7Sudh zwo9!sLEfL=@95F%TrBgux{n_}-OMenAN$pAl^UyIo8e~D*SEDqO0wj;)=yvlZ`GRl z+r`E8mlprHp;=p?XZKP^G|O~5--~9irAJO4oM(5}YIEjsxy4KekG*^TV`W5_x7Q4d zJRUKzXFsYcCrzDu`rO}kj@-MKUex_6dF?a*-CRR+W9AF{`3pPK*J%ml<ovy8?fxR| zSnRec+oPptEcSfA5O~PB>E*SJd-H1My?Y`qvZ?fZ-Ld|)_0QfvniRCh<_-tfhuy2p zOs7tnmXMd`RgmDYH@DCIc%h!^)b@9Bz12^359$7?(a_$#Df;8;;tiWkPxORnO}TL^ zLij=UjF|ypapzWjjoz?*^TT@=x4*o9-)wD3<NIf`Hpc$>{_}UmC9MO~_4mcMH1Flj zjbgiU({E{rS(HA1$-(p0?{>5nDz|Sa{vWvPOq4@b6kB|KNO{A~SKbd7fA3B5=;h31 zh<SB_Ay038h~I&)&->@U-aP4>yrpAWSg>)$`d-D_U50;u$47oRp4Il{W!U?-YkD_s z-Kw^K!HRRGv&&_ltd_5PzOwz;wNn>(KYUGj-1nDFJjwg?sU0)sc`lg$Fjn07*}r4& zngeS-pIrS*!PmEU>q@D`wYH4?ZAVm8E+4w?U9ZQip`(@fXYOHMqrb0&u32^5-}iTh zC3pCTb6aj!?A$FRC*<OoX!txx-*kp*mFl*)y+_WR37H?e`*(s!aGEY?uJyq+#$CJZ z7WvOlytiIk`t574zK3FU_dp%{l&4QVoo!lb^Z%asncshMZ*9$NZQd)JxVHJ#n${Rw z<FEIhy~*egTDju$p(8&-?%r?vDqFrlo4?RTZQkUKoLl%lUH6Z<s%g{Gvqt8T(D_O8 zW;)+~@az8T*OlvbUHkNjTT@5t*veb3uiN@2@5;F??KwYBaO)(qMgHoESy@R16G3Ay zbN2jkn`|TVCimpIv(9V7q*Ef&Q=T$BxZ!au?Q0!_k<sStwWm*<x_Dpp>V%2gza$>t zci86ty^>E{T%6gmC$`Vu6Q(V^dEN7Dp73<{HEVS|t)_cz%??zV>wWa<&4u@bB&@&5 z8fqvm2wGY3?_zbt#ysua{H`y(?=}=ZfBDMGyR?3~naGCq_l{k=#ih>vJE~qgBvxVP zl!>i-=kkh*W_^>fId)n2ol(a1waF5*%j6zJe98P<Shn?PdYP=nscCoHfBd=oe4Ryh z*_{&y*~B?k-|LqB-FIPYZFKYbxzX%j5<aft&AGAfzJkD<88!1ZZTe*O|CrG;Tb>Ue z*Mv?wdG)3scd@Zv>Xlk{P>p}_&N|PmJZ}4Zz0{P6Gv_Xj4-1Job92g-s79TJ&nv|v zcjgJlpa0)Fv$#I#<EgDruAGR7-0?;Kn~cq&lQ$~T{{OL#|Gyz%zuvzykz%^>M|<9j ze>mIUePiSM2?yo%wS+}~vbL^?*xV>tEcW5Aes`x;=>MFzin`3a|4syGi0rVkeyJYL z5TF^_Ahz|{r#c;7U52&)zO6qdv3dTH&Cfr6|8^<;;)`wBj(KtW{(UuFCSP1^+-zUq z5U#gqp^@0m%AYxR_RYR&|Nq>VoA#R$J{Ad`pU1pl%a)$Z`)8EZ>?RtgpErIxyVB=( zn%q&<t<8Imoj7;)@aAJJ&WVZ#V|G+@9$J*dVD|pb={53V6QgIoWC{q1>gp{$yxq(E znwq+Kf26%m((8ABr*GHPJi2RQo&T|UY8UQ@%d@Pz6p`jr++{h}Bd(6o`PbJ~U;kNI z-uS<K^Ly9N(q<dfrOV%>-)NZkbz5Q47G+!Q;|Y&uI3Hh>y>)fe`T&g=xA!tHZs&cF z@^nc=*wn9StK+Y1+`Lh3O{qXNpX<Yi&w7^c?moCb+tko2vXXWABOyt%4a@BsmR-zx z%{#+Pyw@!`#6h;Car?Zvw_o0y-S~CC`Oj9@BdYV(mhWxv78YN9mM=c_|3u+Ezi)o; z*|oKPt>k;gs?tpVz(UUIRd=WDE-hDyT02c{u3r3xx&Lo_O<Qy8M76%H*YOV%td1x6 z%)YXP$HymxEtNCqvXO`HYTIwKk{(aa^8NJm?ZZ<$xwoGF9ipkFchUbqN><V#(1`iL zbJK3Lq&S!#-V?U^>h<VczKO?^A~si=E4P2S$gbQ!ujlZ&V^Q)fY<HJ9U0oTXb>{3@ z9=%0zCk<o%HZ7jqY@2Vtd^Y>TD=$?Ts>-;YpXjvE(K(a-S1;`E-hk`x3!RgMCuwTv zn61jKU8AF$ao=o4Y4o>%FlFyw=j*pUeEYC%{q*X+x7*p+Crv1smwfSK2?y^r{qJ9k zj$ggmxc^$d`^pd@nTY=`g=cHm8GXBv*E4nL(z-+EwMu36uZCW+U|$=tU9@4|+|vEm zdu7#2=N4~!zjn9Gp>I~N*tYY1TE58X?6$paOV?z@9e8nbr>v-G*0tQ5$s7K>@3l5G zHeUNZhN<oN+_hUp6W2CJ>`vtu75$(6{@mk5yWaop-=8Lta3g$TExTx-$oC05RHcNI zlf;szspVcW%gw94ea~#~+x6S``WElLSAAP0c9Pj?-!o}ukHva_?_0Q_Lt(*=<_7NH zX3WN)e=|$UG9GQcG2#2?j~_l3oU1wi{kLs8AM@v#=YQ6mm#?mTn)yvcra<od(m&tM z=YRV0n192cx8gT8eF**c@ArRqucYfPjqm!loAa<S3%l_q-_2XH!<_+oN5D0i=VrU_ zp8J(+nbK=HzoPJCsqlmMrxzxt>eXH~HF;EE@xg5V`j2%xzdvZ5pIcyQ&am1%_3_J> z57)5Xooyz3yg%jYF<HI&nO*#{M^lQD6C#e^-@E&}X!)NzEv>u0n7*C1v89#m^Y8t8 zOV7TSyzo)(|L^^0lfACJ&?~K6@3NrYeeK(G^$QQm#{XjZ@w@27qTMBL_}ELo_Qt*o zc=0FpN^Dwbe%#^C$L^b!FPL#zyk=(Mnl(*f-BVw5Y*=k)CMY;j`=a{%Gk5Ra?d<Mb zvSG=T&d1hyg_?F1GdeafR?LhQUz3@gpZ@YxsfzkB<KkN)Id9Fb<=s4Y==`-0N1WGf zzdJ?7s^?%r%C#?=71gCR6HaRDq&@w0b_uW7vt<{RSLWv|+VDeRT2INIy;hs}Zr#3B z`F-+I9)Ia07aTR8JQ3ee^jGZBqQzBn4I^Wty)!=iyxkKd^!Uc6%k8bF!;Q0lh3wgT z=8d*iqDR&z)2k_aE9PuA-5R?osQFy&4!h`JZ;ycQGquIP7ccyEOzjg_m&W=PkN)k> zdta!x+C2Agf`Nf*w#+;^xs><ko=;9)UHNM@|HHRWkDANPJ$xzjb)osp8HQUI+s(PT z`FFIH{_)$VeIC1RzgSsW`Xw|tyuW|Dc>1dBjJ(W+JC{ynsJCBp&FoE?bv0L4#P(G7 zvfXocyzo%FZ*s2kb!`4E6VvS%?p!)_^VR42DO<NhZHT&E@p`dq$n|Rv-@iV+qGw^s zlF~mH-xgSCtX`3HspWO`>W@>ciuUlt%jYjTRQ>OPPQ2W9f4TGNueZk=3D~3^3Ah)% zW76|^^>Z_~_o%M_!0@|^f9IBy`c^0U>%J=a+nIC+9&Rt#wyf{z>up9_i<1xTIC4W{ z&zX69KA+^`abun*_l`$?(xLu+e>Lv^`hNdYbNs(f%ksNj>-)`*E_Kh$-)<>xvg@AB z9p58vd?_bS^{O0oyLj#1x!Lk{ryeFht^Kty>)mDh#T!?)^8fpHJ1;vY?#(@GwdCCF z*G0R(w*GtkU4Nr(x%}t2ify-hj(s`kdF6^}!LOXPo8LX1*CaHr@}29XM~i3L71~%A zeYbqg4=PS32{=3Xs9aX-dt6>$IeC8F^THf6>-wsvvG3*@-mKjHaW{APhyHT0qVHci zc{uorUaD*Ab#1utAZ}}8-vQsOq&c6xH*Wh@Cim~$c|!@FHI@I@-__g4EPHTLv%8<c z-$N!=3Fl(BfBN$Ox9$4#@n_bW_b*+za^}<5+dlpHTP|d1FlGPVpMsXv-9K)ApQljt zfMMF&yH3Hy+{x$fzRLaf=EtO*>UVZ;%Gebh8K<w6tlaqc>C`8patrn??3`QKs`Dqu zwt4d7Sg}m6uKs2FHg=lZMVxxkV^a2B`&qN<>Rn%^PMdU~>+9_k9^MDv6%>4)(WAYu zt^Ug$?j5^#8-IUyn}h3vy?BE0gvz|a<Hw($N%{J0uFco?`yZa%SuQLqc&xKa>)Si~ z6aM=?hxV{J_uC)8do#SIL%sfojCudr2S3y6Z{*It_v@W-amB0q^~cTU{WRU2?sMpF zO48S5bKl&EJs^KhH|^@=h0Q{lTO%U3o3^LdKZ$x?pYkigE_!?KksBV*v+qrQ{Wb3D z?d;v=ZG2u&&hk(H^m3Li%dg*)EOQL*#XZYgKizNr*?6DeV(!E3D!~CoGtBM(Ou3yW zd3wV^Pub&@GhaV>^nK2(U2J@EmIrrCjP-U0H4x<O|IRqQZKZj?qNd)g=kw}&gVR@a zcFLT%rMo*~zwY&=cUuAv&oHr@eE)B*Tzd9v&%XY&)8}lat-E)If8Wmy-kP(yOUv*6 z{Se*%>FxYK)87C4v%m7iyO$<gw|qKfJzqdf=t%PS_<cIlFP=TI?9JUHF1$xBA7(aR zJaGYoy%O6lHsjsaaW6Qm%Go}?;bRX?Uv*O3reXKVCwr_PoZPwj$1DE2qw;Z8-PX(R z962N^ZBe@HSY+D5-LIdm=D&Bed;Qtt_s_S_KHj%r+q%a6f9|vM$OxP{@=>|*^nQP7 z9=CtLj<xH=?(JlMKd){7dj8pEZyruQf9><y<L?fiKR)|%dba*;wg<EO?;KXX|Cjau z$M)$ni?6Q@nY-@U(n@*b>SHO--|v~1rSZF>`s3{RHfQ<g*UsDN|G($=yBR(qE)wah zvLpAEY0sM{caGKP^($%1qDLwWUwO}-JNlfVZOM_xFCQK}ov-`g%1o(wRVIg*o-0`X z(0S7OmD}DaZ%+SkR{lRYq}kK&w#}X`{aJkNl22bE-|bZpmbMbhW!)8PzR-OA!!MqX ze-^xy+V}so{YU-yS_b~fo#OHJ^QRoSA(#EByQ3o}zgCDNZ~ILTZ{M`r>+YU&`0%f} z-9viH9o6PjcT*m%JT7<WZBwi2ty{N$lzeT|YdrVrR@J_*H)7JumLJVZz5DF#lBH^f z*|&biUr}z`Rp*?y`S#B5eVOOZoV_qXA+Gwnvfq^OFIoaMYu>0VKNn*Ba@ptY0-)0} zzrVAtsQt(E&o1BY;>3p$I$`hTSiKaojs0n{R?K_4&-ru5*V?9Zlw9{;KK*`8|F2_e zK6!a}Y#(3CGu~o-xB9rr^y{iB79Ait=JtL=qgoC{$HpDA?-Z1qf0dZ<Ztas6i*F)t z)HUteK5Sr|V-b096>oIo=b4?~&+M4G>zCW}*BJ&<9sQk3c4}QW))Zd3c6D>&ZNGcb zKQ#UAYV76Sz1y25ENVDm{n@?K9sYlAZ2YhxU{!Y3Nf|p4e}8_iZvIV4chhprtY;p+ zv>{^6jkjfc_U^f{qgI^tD7%4FugVcO<H|!3(|O+QyK>`-OT+wA_8#pI4lvxS`gqfO z+es<gIqJ{OC4D^Qn{)o;^KT~~|9qWacc#aE|MMK<oC2f!|9{0i(~mnEfB%QT=9`l} z9~=KXXfDrYwQtAI{`dALz4Pmi?6>`Gv)y0n{0BwNCH!8GzS{q5s^9aObN`R|^%t() zJ9puV%k%d8`#!y%Z*%tjKdXLuo8Rh>79INe>+tu2FGoDh^7eme>b`#H{Pp(5>RLDI zADmEqom+NFYO>=sR>nE+j<~u96upS(=l<Nv#x5i;?0D|p-*aak?ceiJajls4(WUM` zzxmfczf^Z@3g@5e{rh<j=+}KHomc<W_TT6F_=6b+1<%(;o>N%1b?sd7xViiXCWX$9 z*pxNd+y4K@zv?@Sv#zDyKC^G{<L~i)brX#_xMd@IH%??Wl<1wl$NS-n&b~D(&h>2Z zn|YY+^L_jOa_jeQpJ8tI=gQ2|+dmKf{~cf75q>ZBgn#|-@K@5aJ$yT!9{vAo;%BpG zQ;tNu+h44;e&6nn?e_nA((AvR)&6(j@2x*a_n6fi#-;fuEk0EFO8fiA3$~YI>g?~^ zW!k7NJzi1%kn7&R3d`V4ZlBM^&wG6C_`kDD*UQ)c*8cPA=k*^S*Z=n^agh)<y1f2} z)W4hG=RJ_muRo;!@ArEXv#kR1!UyH+zQqQePc{4X``3qOpZ7mmYHt7N==J-{_bu$4 zv7+%#`Ee1MGV2{Xzy2t`GZ(TSqhtRWrgeJ_YdpCA|2X{r@ziqhPtUL0AIRH2d6vZK z`SbpoPgh7UPf}uk^!~N8bFi`UrJ&e(r)A7KLZ!<Mel9zm&J(x(`>K0!xA%Vh@aE+d z8LMOe_xv%lyO$RC<7&T$Z_nFrRfX@0&zGz^7xG!YzCtoz-?-ntV7d3(OQ&Pi#rHqY zId|{yiyp;Trk78rF1L)0J>0Qy-Szg12@j4wuR9_iUpamHv)Z2acI)px^N-}$eKNWK z|GfRKEr0)>-*@_d?S>ZrY3m>R_{tVu6tww%X1iYHbeHn$cQ+jL-1BX}{qy|%x-<I! ze{j8fr?$y0{lnh%=ii3joa~-<|J?ikX8m)kxneh6dYr8E<8$$O0Yif=#~-s+e4i{@ z^W~+~^T(pEw{K4RTh_$P9Pu;Gy>t4M;_IKg*Pl%XwL^}%em=Cm?!}q1_wRO9zId1U zqiW{N{S~71_1TPZacRfWmwlc+{~!0gxMy*D{m<{K75W_i%XIyo-5uib)$@1#a!XQT z|FpUOuhiyrA2uto#Jw@n4I3^b#Qi*czT)B5?>`Uf|8JRobMo(ZGY$p!-+P?{8WH>V z-G2Z5x0P~+CR5A*eUkZX7kBK@)Y%rnvEBRU^C!FWJvFzlycKy#Nqv9E{D0rp>;10# ze0)FSIem@oIcLRW_}Kq{J@oo+-`8v1=i`E3&fju{CGOu}|DV5a&;PJ?{vW>f!v`-o zcJBFddw$8!pl#dMF)qG%;cXS?^lILPkJF!>KW}@ud;Qtx;q^75+0oLG$wn2=ZuiGs z7WY(AQVKux;6<)%b6i#By&AV={EEdl0{(rffB)gbo0&g;{rYg~_WRFs)#a9MSTcq8 zcG;&hm;HCWd0t>)5n0*Q6}((?{fb39z8Dn0-+5VbMa}QUM`xU!cV?#P;hp|3CnoDe zZ0mA=x4V1BiFeulxp%frzEj)!=R>r=#rB(T%l<uIdVQuzBF|&@*j;w(wyy0pzyH65 zq27Kv>w&0f-81o9dUm|<XkubMaW~qb*qeLvGJjP?vtM23qx~Q6`SB{c=bVRn_8V4i z(TLj>|E8Mn{Cv%mM|#q&)pb^LSFT&QZ{fsd_r8hy_qV*9ym?OKI$O)=VDCs*)vKnZ zZ|+P!-*QoThQ&T*;cs_Yy$j0ApC8;^J>Btgr1FoAmg`FEb;Y#juf2by(b=7mgPZr^ zGDGFa9W|!?_sm~U;yxC;V$Y(kaxtBk-|obC&VE<3p~CX&)>50lSKC+SXFPdY`T67b z&#JnnGaWrSub7%_D7##C$f>#VLDTCmPWpSS`V*UjcYdA589T4~W$$;1NwbbjSyLGM zy*gFSnO(JfrTyP`O{zC!`@F9OicQ>CcwX54QUCrw=93<;|6}_<>+J6g$?EU&PyF}) zIr!Y{+0=}!5i`GCD6jZ^{(Nk)?}_ub<^O-wW3c~qZLxWUn)$u-*V{HG{IrVueSiM_ z7b`u?*IYB(lvdv?U-LOpZtwQr`_0!K<FEh9G+8|b)Ed^ieLr?b6LWjt=hf-+cI74C z<yd|$<nz?}zy9;;zqOxx6TADa-^GJ{`j_N(rCZ(qd23Ex@t)e1JHBYx|66arx#Zsb zye}axE-p{FzWQEtvwF2;naYu%m@0{S`*@+GMZ2f8zL*joac0^ZnLjnPo&B9kPh!q4 z>)zb1ueb9;r1iD)&rgZjz5Mg-?!9h_AIn#pCv1$``PuBc&wWv8Ghrc-16O8S=Ov!? zkUlcY_jbgdBwl|zqvhe-xxS~#Y`!@;tULQz{_CAQH{WgYtA4dSIHN#d;Xy~0V@DsP znr%*dY!)Q^cz12?DJ`wYy@lFq#k5a;+}P6EmQYlDIBoa7)iKWQypL}h=PkaQb~tI{ zgU4@uZ=USCI)Cr_2W9J5bTsam?W6Z~<@#m5<&TmUSyU~Wv+Y}1x>&@s4JOZ-${!{! zym2d6CwA|=Y1gjhonP60a_+Wo@51}HZ`=OxVO{Fi*4o+{i@3N#*WVo{wpOPfOy`ji z__UL)k@4L;yNQ+Zb*DNfhfZI!v}&<V)Xs^C&6D>RI3`TgS8D(J>uJ%Js5MWXiGS>t zui1OLSbF>WXAi5F#c$u3HzjxH?+rKKo>MR=sZo=dawYK8GGpOg`(^UuZ|z9--=3-n ziiG*`^Vg}EmIQDeUD~dxXX|ro!Ml8Oo02yy+Sl{bvaVI^`}H74%~!&?sOGw>^sdX2 z8M_Mtx4h0g`|PcZUD=$Q#(A%Wa`bGAdY=6FynVe?uiLVe-s4HRk3U?TC;ofqr9!7> zrj_eTV@nqQieWJRvZ#n>`m5#Eg%>Aoxt%j-?K>%f+`P<(hgIhbO4?1xxBn+_SuJ&< zVTl3T<Ez*0-|<eKEp2yCcB#GJoHYlI-#(rC_4VnEx8L4)Q|2>$$KF-uxw|gkyVrLx z;lSApoACQ*xPQCKAF_IFZf;^$dYyIOzI#`$nU>tVcj;Ew(WJd^4wZ{{_xCQ^x%8-{ ziTK2Q+m|nBdAs}j$NTpGub;1dvw*?=**)XAtf#NlzDthpJN)p$WB==)^y8}^xcNU_ zRZ%??)Q@4G_iN>6u{Zj&Q?s{!IuLCC^nJemf%D%_)yba}kIt=SzF(W<H~o?cUwd=m z%$Ggy*}r;UW>>v<<<2SY_2-uF`DD`TtNX^jphf=QE7qF5dw0A)xAO0+ir+ycE)w5k zL+ry{TwL}^{L)dDP*60Jntk@z%*|JqsFcXx(Y223ym@)@7RQt4a&6c4)oh%xqM*l3 zxtgo1WAB2x8HXS4SjKvrVcWY~zVGfarTNZx@(H<qMooY7%**0Bde;o!_g$T*f9BPe zn>o|h{4Cj7DD*fvV!P^X)x%qUJV<O}V&>ST;83-*?wg2+VUEWt?+=?7y%J&AcQ-{p ze6F2$bTp`iIp_JMq^)Hq?LL0^aG*-h`DfIPw`DSXb4)vR#k6;Sf2*$h^-pQy#)y^K z845aE7P}RAz7$-f%x=YeoI$m{FKPSj&Mt`?ug&HjmzH?YzPz1XZ1vPj%Eu+D4o(*@ z+dY@Ly-&c>;LOaxd2<BZFCKLEk*M9b$K&csV~Jk3=T0T!-aWmE$KTnk%6=Wgbf=oT zn{nNaH76cCaoLvgd{fnBGr67b^`=)%U4B07@}(@rZL?oHx~#i*;)~;-x90!r4j-#e zdZ*))SNqHMU8tc1&z{fIpX==oxNg6Cx%~e5%jNg~ck_STHmfpQ%sBt-t{Uf;<%if? z44$vMy(`CDf~V&1!rl1?de-fK@*^Xz=3V=qpAVPY{M#FUDQlxafdj|(9_fSY=T)AP zWO=WD{Py%Oc8W?$pN?K#-k7lX;)xXxUvAmDJ=v(#{z}6Hg(zLIZO@+wip!q-I9c?` zJKYzd|Krk(Ba@A9?onocti|jcG$|u5Q#Jj)-7?=Zugnx~N$>vjZKJC7^oN<vAHIHk zc;cgx%=2qcWd&qFm+(C{HjdbCD!qBR`bo}>TefW3R2OabZ=aotdPxe`d;5ZprK_)f zjp*KC{&)$$U+VLBHDYz!+M<v3F8Xvu@>93h4AWY#^}h|JdUH;mOUzFcTx{I-@bzQg z%2ZM7qE8;)zOTv-?wPQ_p~p@6cJVg@E#<kpcCl@HbLQ<NK^Z}_hPOK_MMUHeoX$~G zGdi?0sAl=JYhme<ZDHN4+0oLeqOy`}9x^)_&h*K-wXyqCm)5b=z5}<exqW+QbLY;T z9hql5((Sv$*F8P)(MYboz)Uca`NquY=Wpry_MAVXV4*SLRPgef(>AyNn4yvGu+==* zFKphUxBcRiMdVL2m*4e^bQL{)E$7LHjYe%tR1(W?+?*SKV&<zTxmmWCE$6Q>oVn-Y zKc;DGVosk(%rr4E*_e4;&y7d6=jP_$M<2PRFPR)4a_CR%d?PDmS$lc;Q(CJ|XzL_} zxK;HtKABfhRbi0*D@05u`lR&x`a>NHn?HX4`t-`ptfJ4{p1wW73K2`@e=K-^IsWeT zC*4vkVn3BWeke%4{;ATuN-EytvD-4^yeCh^e~1VQ3cg(b>(AvUt&Mx$Em^7-T>49A z_oq)M?`@v$=*d}=`>uA+muJ;`U)O)}_)}AJ;%4-LMWWds&1Or^GwV3<VZ-WK>(8bo z-<>AQ@Z`O|Vtsw*>CeW??m4;LN^nbE^7!FH$8-0X%+jAfc$lZ8Xf~@lZ~s+Ej?!Y| zM-Simy`1<smg(SL+2eOplHR?Uxh7`+O#bO>4%|L{=8I<}kEiFZMRoHkUes-Sb0+oj zw^);{TOK@reR#(ip6NN)xPSisS@eAE<QsG59zN)Ly0cH>#2f3p;=ZeyUph)wotu;T z^;m92#SY{2Ydq=4@|HhN71fE_cr5kyZtiJJA9~%N3kZpTlKY&sE0a&I+B(BWZPKHp z877Hqyd6wcG$yRNoc_^ny5!#vZ)T>vKc{ZKf5NUdw>@XmjM|qLe!lTpyY2h3-tE&t z9R<bbUb!kqkA8UZck_*TlaFsQmCo3HlY^i8>BH*uT{>Pbp1(e<{QYdw-)lK`al3@d z%Y~IMweR>+Yq<I5<l}NX+Iw%8Zz?`-rxT{#_^;0Aq}1^jJ*$5w2uX_`d|aHi*;c*( z&L5|!C|wrTAI6!7B;0uAt3qqLIv~K~e^P-()yAY*F<Wb0*)?pd=2X9bQMG$6M7E=& z<HYla^Vgq9u)lQS%8|ail_`AQyDtU{!oWm*L)NC>7iRU|o?(#1QYfyIqOJr3pDKeh zIbaF}C)W8%9)w9LDgB+pG=h0A-TWVPKl3T&{VcAhtZ`tz`}_H=2NQN&4BnOWUO(#G z#!W@<_SI@R2TjWRQsM#wOZsEKJA9D;_iNSX|9N?NKYmpRi_4yzA$XXBm+#f3duf{| z&yIIUJn5MA>Q$lnOb&kO12Y5<cl37_W$sQ**NZNHr&b&xby+Pn_WjE5Ua`)~XLWVA zY~7l;`KG~4y?U<xc^b>tESe<f-2UM8<G+??f?(FVJlSJ+n!~TB`(WPo;L>M0KYx2` z=xC-s%bhGaY0`_F%lGb`WAC<Kyk?P5^FfD#1O~CyQx6~aEBJAPb6HAn@|zP6YfX=? zo+KiE`0(cRM~@%hU9Dhn;2-nSH`-PXMKx=XQo*O4uQxk<h`p@#IMpn9^Ua&Pw5Pwd ztkj9$+_>U{!Jof1j5p@Y1$9sU)$OyX_%7SR!pbxuJmAPF-sl?}a@98mPHbs!{dU!4 zy;n}j6Va{tS$R9xJ+_wV%hvMz$hsy?5uWz0FF2pgvU{iGOp7|6RMF5m8tWC-Z<x{f z*gbjk%^T4XEC;U4K5pH7fI<0EJIEJ&a+b&DHT}I~Semr{m{sXBo%}ujIcFYjpCloD zcGp_#73)?$UU~ePkjMl7qbo1x+}hVYdFpb5nLa#TUI|{;EbiR3_H(YTwvH})w`|83 zgRi{37BYR@eTRF~=ha=ZY@6TD|NqkwWd;*7)6I3+X72t|l5?|_YaBF$-TD<Y3>w1k z{X1~;_#S?7#vLhE@9hJ;zP+nim7VqR>&LVZH><_Qm*)Q7^Wl`upT9LTYLA<Qt-0+} znJRi&J$>RtGl|(}&-LB0`PA(Ns$fklIyxV_PZp4Vd*}YGYsZe|T5DQWaO}S87nNls zE;9|D-D@}{?AJH4sj4yr#07FX99?-iVomOj-LpM>d){BFd+|Vop>OKkJ&!i_&C_^1 z`RVG9pFb+<n$BFnP~SH_{KLB@RT=&D3W{d4CM<CHCh{iz<f_thf2Xaz>GAE|UKVyX z(Ckm)bEEoZX68Bn-=BLlHT!1$f+-(11hg$t2@1b|VBMbDimDxxEp>SL`O6vD)YT_h z>hv};J2BjtIQ#ge(ASw6SxTmwjEiSa+&X*vX6^j>-v7Vy_SS63kknnfmdDRe!AeP{ z{qRBc)8QLa)Aimh>no19e&N9J`RkS}dS!B9qUE29mqg#(+b+NRu4Baw1}{F@rxB4q zMdu@mv!9P%eeQYSH}|Q6)oB$IGgD@P2hXqP&TMw5x1U}XzG&C7K2P)B)S9%m;@hiu zqc_}qV`Grb=2>XSpz|w-SGB#bVA-y=3l9|d<n0>|COr5zbNl0GX(=wh1pa;bZvNrx z*Ti#cB=7d6Zoa8$9of0OefMVH-Dlg*rX9X~xH)t3CJoyvnbli+3uhkY<d<e}a1Iup zUG^lwtoqZDJHJ1C{<?7Q-nrrTeom0xSuHtt;yW9Cv21C>iGp{`i+2@AUp(k6V^`Mn zqN6}=U%8sw;)$2jSO47qll#QI&C@~swkH<^Px*yCO8xdEoBwYA{`LI1xo`JuPB2`4 zE+qbAr6{bFo~Xa<ysq+(M^!9y8GUyjzL#74d*`?CVD9U0UY@)mcz90#>g?AR(ZSve z_RA+K9yBpAyLjP-%aH?p3v$xga-SS9kl|xzJ<6VunY(ns4+aJ`^X+oSi;9hf<ixs; z-a7WXds<-C6Nx-G<#}>))8{;1xLCcwLPljCx0ktz*~Lp)iZ(e6XLWV2n49d{vcK|< z#`I#4at7z1$r)LB3m0zW+`L@f?q1xv$CgEVcp4Tq2YvYdmGQvcyDigizBWn^fR|Ul zCZE?;-mz^TBSZZBzJ?|DcOFQobrvq$ExY)lsakAw`2CCLj{ojDUSvKq=2y1e^wyZ@ z`v<)9_g!DQ_h=St!nH4&du-m<hON1Ort9l$@Yu$+XtkK4Jv+<qpM2#Tt!Y&;BRN%_ zljp<pb(xbpx#Vv=wwqggD?aGdze$(mo?kinc+r8P^t7+9dZQ!v7Op;BJlFBXv}s`v z{_GS(g!1z9x&kpZ9}E}_10OQ9@N*nJ{l?RKb?c($b_pwuqf2Z5{S#uC-g<uBwC&~Y zY-`r{n;S2?bLr_%#)Yz`)y1E=4?cXba=nd5_tB>Q>Eevfy+UHTZoWCW=4J5An#&eN zpSf@BOqZ9}i8{C6<|9X%|M|Slv#g&_5s*H+;-T|y8+j3lf|G`|=ib_vJt;_9tQ0fP zc;=ls$GM+3AA=W>pPpWM-k31^?6G5ScUwf3a+Q}0OJ+7R8c6l_NX<JpZSKyT8`~x` zDjsZUZF^8)0cy=%6n?s6r=+B%&f8hf1!N=~0umTZx0c>`TNb1jG3Q*`=7(kLz8u~t ztX}xNK;7WL`~}(?o`o-76bdCR{`mQ8;wRt77Dan{g40)J=42gv^RjdMO`q6W=B;0O z&q*EZ+;~xfhfT|Wu9}L*gaZu!xu2yRKl}DlsP&{rNjK{s2s{-Hy<?OoqBeQu>5nBn zp)MB>I`_yYxJ{E_U=aE5>EakNwQ>4QpIT>S)6&wtpy_pJJp6nFs&7C8Dcf(aw5n~J z7RH^Imv_fBx69aDG~v(-!71Tkg-<FZLFK(;BV&Y)*sSO%LkXTcW`^At9xQlmH2>w~ zO+PYTa@j@ho3-PG$Df*7%jjTczKTBwZ!++3@Gjf4scXAklut&10$Vd9e|dQmGqc2` zSuN9V-dTFz`MBSQkIS_|<6vq=Ox;&ctu(&M!p<rnB*Nhk<0B%v+;4Nz-!v|7FHg^o z<ceDgn~tSzQnj9b{kgt^p_$a=lSfXj3SOdi%vd%1j%t6pN0!j<F8+cqE|&i*elsU6 zR?6Id(;}{H((YxxYMOS_7B&ann76t8)-SfW+V9FvOw22-YT1sfRwGj6zh&o{4z~Bt zJ&<AY==EdYA}5(-cfR*RS4^dPZ3?cxeRFU7{90G`6)RUCzMG<?X*aEK=HbrHo)-(h zYm3VZ9}R!EfA-qlWx-*Ao|Uem%<L_bW=?E7{O~}6!Gt*i?s1NSrM$c$^Q_)(s`sl? z^sjw-Q17qWF}LF5S32L^3->5|nRsTN9FL!0$|v9CxvGk4JyMRf&dTlm^B+|F^ki#c zVV+>BHhBR<ebG0uf+rP{Zi^@0Siupbe<I>t=fQ*rjl0t(?5);kRb|(-ERoRPJX2BA z^W49?cY4muwViA_dt2e2H!7y3rFTryRPyrj*4*CoSnB)=M12=1A;Z@$<kGmSICAr0 zw&exCSxZ}9OG{OLoy(uO{pOGD`L(?K<=>?(yrHQEv^wMaPF=C@=hv;>D?9t_v4hIT zKYaeIdf>eH>aD%Z?fsYXHXAC{b~GJ8<fhgoJrB4=rpu|7=PR0)mTuV+_2J8xgoF%^ z!)(hZnQ8oV^Y@3BUQbqO2<X7IUOF$C|AhrE>9QnW6GfI5ysy6<J{-%n{(0H{-j0ix z1>pYPndozU_u=W!&n{oMv2*$UZw7UCc6#R{*M$B1^vjyT=JS`y*Q;N=K9;t5qpo^? z(<A0BTeb+vh@3c^>^^ah!0SuvK3$Q#mVejL^=jsxGxK=-JReOfTx>A2sywRN+Rr!E zcC}f~!ZnMy^7V}$8yibl>b&jxwej}bl=t^e-}|d-Vru&M{d;e>TM5VdWa@a+x%%d5 zEMK{^bz$=){hRN6N_m&M_fOuvouNKHUT$`=|8%q8U3?pq&HLMqsj;=N85jPMc(h1a z|K@vZ?r8yWfmc(1`|taGRy(VB<6`wwKNCKF(!0I+SX$BN8-eGJzkT~Q=jP7Yf7!h< zGq(!JiJjWgX)Y)xbt!kh{vM<LMCTxkq3N8PGf!WeySsXh{DI*9v#J^g<QsPVVk>)d z@ASiD^^B}M#S8cQ1z$Q#nAT{pH9ws67nb-u{+HinJ~+3FPv(_SicP@_4Nx8RalX0W z&4&da{w;cHVrFWXc}SvW&)ys1B@<XrhkbhScXLM{2m6ARJ7<0u*Hu<EoOgTq9Vh2x z<<r;m7VX_TH*@l)b+;|9Z8N(Uzoq8@L%rOdYPQhj=Ru=IHa0dARvJ66|6Ox?Q?s*s zfAQxVfh@m%7j9WI=WF!ljW^%;NZ3AFb^dyzv-^s*`8#qHDjt7}4Vi1@oV}X0KK{Pm zd2tc>grmRC`pDSNTG3J9<;DN`;iU5w72kXoDIczWvwiE;Ll2&~Tw-4y6Fj?n>y{{n z9pBGo?uaee%f`xP@&A2+#g7-4r_NcsPBA-2t?}Q#C!%7Y25<5Eotv*Gm#Wtmtopo_ z`A5o6tw)O&pOCS;vh(cu<I)YEPHBO9y#D_DpgETV_vc?uUwv~&t+?CbiD$U?nZVNK zME&J<oGk9{Et~&4WKMVZ@Q-<^i+fw~rcYN)`yUoqRLy;vvEaMpM7HL}KuPD$&YlCu zZ*w=?SmB}NKR2!XUtM~^x-TyZZ{?b$`RrshH&;H`$au#n&m`L{_jRbkj_r@%+>Uqh z&erxnvzLGK&B-%PaIDIH1sXEA;COQHyXVsi7w=5{lVM|P!!T$4;l{)6>of)KNE+;& z^E=&-{lR1Z@Jp92-Fo`-tz{*T^qf;W&h+&CbmdvHaAW7!+nXxiG_JdOSiDbOQqC=? z=8fsroe`^-iu&`H2MIr}&e^>F1%vu2?H{k2zZ(@exU&^F<(PzJN3TEr(sRLn`Nn^B z=Z?EI3);uaKT2K{b1U-pt%yxUvW)-s+0?v`J$Jp_!^{1_??ZO5!sE&5)&5KeIX4F8 zoICe4$5&U;v5~=K`<8+|dz#j4oEgh>FjaKwlP97Dd;X}H?Vj7Q!640N=gb4e+xIf> z`Fk;G(xYU~58sn7_r*rszV+juxg7g~FDDAi-kf`U<>hA37>P};L1ePqqi4_98fKsD zZ9AqGmVf8e#Z5(f_U@TsP{ksd*}Qx1{|8T8rXOc(Ze&zEc*WerYWq&fyA14RyLrvG z_w@wo>l;6KQ95Cl`C}QoIJcM(m9)*zS%0f;Se~%|^Pg|a<o*5o^&a1T`^|gW#ucmc z6Q0kj@#>dbzH?{mg9Qv~cTJ`pxgnt=rmern>io@b{Pne>4ex6o8}2#t?6lnPqgk(B z?XD@DU}rIv^>o;!D|eduw~J?+=coT~bhfd3F2{6^)goF~tmb^`v2Ra`a<g8)s{H*} zbqT*;qSv(@eYH`#KVp{MKQyUX<=9b+<^ywWZ0_jqy#F<%<^!lhcc=DuNV>p|;18@f zPs0lCPfxF@Hzt&qmp@vhtf`}!`sl|+2loS7N;wYG6%wPXt-Zt7DO(!On|XOzLiYBJ zWv9zPBbDlMyUs7oJ-P6(1dm&q@BF6i;qKqE;}Q+Euji}f1{j(5%6Zl%3%4F+-<Y!G z@!P9{9C`WK&+qzAGqTAQaAsdRVRHO|Q(vPyy8B+09!n|B)m?b-;JM?PorO6!Umia6 zboETrTCIC=Y2QSr8mO55oRzgH&gR_BS-12eS2{W}o_lV^{C4{5=T2XHeV>Sm1jYp( z{ab$b-s70C{9A1Y6F^;A8(W(b_vW5gKOOe@OSt@@+o!wpZLHdtuD<p-&&V+Ol`g{! zTifb4?}PU2J!4{Kx;y9dr&ljlFIy)kpRa!|<obm>mz;{dwHg1_MXb%e@wV)nh{(pg z(|m8rKyxBK`!Z$z)yY0pue!W!<<8b;)5Ok&UAH)%m$@}z>$Z>A+`Ct-TYLEa_343< z&U54CEM)jjX|0-Jl6WRm_WjqQCl!+W?C!a=^6y#r8D1jP=V4!2({nbhIP-O$(Z?&v z{Fa-u7zr({5lP=I=p1WYn_Fi6{hs03nL8z=gpOptuRGHDsVk1PsekI+Cs$@>sogcX zw)5=e!_7O(?;m{qS^UHI%FmsBJjatZ7Cpb>x!2ZruhjCZNiQe8y!ms-*7i+2cfVeK z`PBUW;(Z%AC(o8HKfhzE_sT|Ya+lWhU6*_?PjY)u`280(vb=809}NSK9Cs0%ZQ6Hh zSCv`L?UU8q_D@f?zdwHX?%wd+MM`X+w(k5c^rGI5+15s9%BxvXM(zAZFJEpx^r(4F z#CFNqXZ@aSFwqgyF54}eudi>Gci+|VBV&)7GUvvNKJyH&sW$J{H#IXAe6aizKP<f$ zW!7$vm~;5xf+Z|rxpz*TJQe)o*RO!eS0>-j&+$w2%$)u#FV9Vek6m5cKd|tX$y3o# z1``vroh%Z`i<M&XKH3MyIYw7oD_?4lDYDATbDMtqd-J)eb275>-erobXGcqevVfgh z*O40%&%a#@<L(Yyqgosx<=Dvh<elz<ol9FkozfCYTC9INKmYj4ZTmJpzEgZRMeh3* z|K*nD_d$(G_I{b<i|N@j>?~Iw7m}Ro_+Yc?)+wPOL9xN?4$jHR+uyD~I%W2;i&+~# zTyyURclxG%Tnw7fp7&06so0r$^JcKm;oq=pwvS%-Cf63;1NW~_FBj8Uxa14R;kG5; zR`DJ<z_?KFv!}POn(o&>Ocj9-nOCk{tzP{-&ZvE9V(#k|%zG@Y+qYavc{jh(x|El9 z&D||?j~!E!n_;^6H}l?KDIeu5t@Pnzr4!}8_$tikvs$Uixlv@g+_C%Tr?<>_A(wsp znW)%iRcm(p`1nW3i#Rynar}#$V_Q@BVDrkItPJ+@^R;KqzIa3M!4_*hd57O6U)glR zw9D^3oAq*c(&03xCZ-uxpDP%QF0pM)yKE-5KH~7?{xb*fe?Rr?%4LhR&FX8#uAjMo ztypr?-PF0?uJ|v%@Ib+-x!I$q`{3!Ew6n)@m#7^p|9xvpXvn6j$6-;rVUr#wb8_<@ zeDbXAY})=s$*+0+{rS_*@8~U?%?s+7ZZ}U=*Jk`+x1A#{-^G>Z$la7jIlgaAx4!g? z@ey(NpK|%yy?19$os*gNEaripjgCn4?%t)VuV21&>(*P#uLe6WU%PiN_y4tTW;S=$ zui3X@eLw&4)7tAY<YBGRpPvll_MN;cZKcur=+a?O+d4PEYkMxAto6ZDUuVypWjb%Y zoyBZV;bRkI<ZrM3XU&`|uGdv&yY}XuxrdMU8CM_6jcq!+)V*(_jQsPO922RTlT78h zxAq=(?~mUOnYvwDd^4<8uR*dZ(6Y_@>*cvSUU=NfH9Hqp&f8(OeanZ3lg@YW$e-9Q zU*C~AdD96AD~aZf{6SIrpegg?yOm%6K5~+)X3ySr85fOr-|ah_cf2HT;epk;m*;-_ zR>s4|3>pQQC-<YGI&u5%x|tUu_wQV|api5hn%cc9*Ji)iw0G%N(e9&FH(TH9iOEa5 z7JGLaXXwE)+oid7ye#TR+>$rnv?$&-Yf8(z=H034+J@CtlgwWH$^D^gdu89=2%iuO zx5X1}SzYyR%kDk#W$&D|yUQl;-riuHKi9=4#AW*Py=T(=;y3J&C}H``Fn!Ir?#;8- zm&`fxL!xhbxW(_bzSi$3Q=}K`F2-oB@?(5(+xJ`1)t8&MY~4E9Qs?Z<&fJYrg)t&O zzI^zw;BCyzmh8msw_}ZZA@if<n&%TXMp%|UTl2Zl^W{Xnr?y^vvPbi_3yT_VxSqS< zafNlZVDy?WE^ofFnfDu=-8*C?o}JO~_v={v;(_Ayve4z{5=^A#a$k(qF*Ix2)YYYT z@bBK%qYU9OVJQVgO8e~Yt+}`5tmS{d<>$k+qa$D~od!D{UPjr-O^e%>U%qy)@8p%g z0nAQK8CxT6%$w{UQ=)R*KWxJ8?F+*HR?j?}(t9@LbDvDlY91a>&qX_zPMx#&_Y5<` z)wdfm^52}geSF%Rn6~A-hpr!QS3Z7vPH6-?3;W~euMht?!*eb7?6Eg5J&T-lbamIR zxj(IU|9bwDoU$_y{pOcRdbz69XO=<R$Hi_jS1n#P2jARjJ->DS+K1B$7q74>ZTquG zD9v~NrPp;mZpzV{if=?m9C^``_~Tbaa9rfkzBx9Rf+p{ZHPBbl5LkTi#J4%NJ*PaD zuUprsYhAoMg~h#vH=#ODj`b+}2cy}b*6iWKTlYA6XRqGO<GlK4)7G`Uo4WdVu6<x! zIKxNH?ClNLN>|axM(zo@*~-=Ba-bm&le8t9=O5L+4yro)?JZ_^Y+!tI=5+eoX==yP z(*$HhJf5z+oOAl7bB)gw;{~^7o2hI2fBbg5+q0|xY2)s^<!csorDmHI{fLls4w|&V z`puhj`cHgHb@|WEdpXDd+6<q274?kXVe3+#Y%r0MnssAKvbb^^-?2A0|0WeKHokOH zUn}w7A%Dra6Z_`(^QVf2J`oi&)KcDioT13y#@1$rX{{Fbw6#xqzuPAsxp45u?_Wi) za!hyrY+a&uOt5;YJv%%X)PKoTkSO4MQmU?NI&;<K^qW(s`+u9am&eQNL3Z)`$4kxc zzmEOC*!|J-$Ij>OF^R2>=-z(w%!e(GE^Y0xS8H<3q+f4)!=O-K&-wGWcg(!`hF`^u zF0mPFDa-Qn^A~*++hA$U&R;Ifx$)wi;@@k}IjopHTadrJ+^b*ay%5K{w-)czgp1S9 zr#$_2wq{2P>%F+NW&Wp<JiIQ6e*JvJ`TOS7biLWz-Y;6Yl+`|7{#a_7L1M{u2GfT9 z^YzQ`S#_ShX(<!4WzLI^#xwgKn>~-1>(=kF{MDJru>3o1?d{gZX=fF5OpYu)`*9PO z*xHE4o8I1K^=ABWY;iFMCs)dq4<+ZWUD=p&HOfa#*t5{kXO_V=)df;QA|6*?ZmyWG z&G`xYlw;tz+N#UPZlCViKK<rSgT$a1p8k9G-Jm&^=*^8~vwJ^m2mp;98%})QysB=W zolVhwooo4LpFLixU07}o8q@H;FK#^Bw(?D5^^G01>ek=i98TIQ^y2;TDQgOQ&Uw5q z-0$7l+x6h1<>s67CcEd=DeA5jYhwBXTEDiqjeqYdJ6C89T~cpovCdtV_2tEVi<qa# z*`C{5ey42la#+kNDa8lXMk)U|y>8*kPTAd`PsmI|l}+Me`M%Ipdb?rb6^=)Xl=H!h zsvu@R@%C8?THOQTx%{$BW$A|Xw>!QRbB!q8fB6eN?gp`co&+;6Ffe$!`njxgN@xNA D$5mFW diff --git a/.docs/system-databases-auth.md b/.docs/system-databases-auth.md index c368151a4c..90ba31bcf5 100644 --- a/.docs/system-databases-auth.md +++ b/.docs/system-databases-auth.md @@ -8,7 +8,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`bitnami/mariadb:10.5`](https://hub.docker.com/r/bitnami/mariadb) + Image: [`bitnami/mariadb:11.2.2-debian-11-r0`](https://hub.docker.com/r/bitnami/mariadb) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` diff --git a/.docs/system-databases-data.md b/.docs/system-databases-data.md index ff62c19476..7e02599f94 100644 --- a/.docs/system-databases-data.md +++ b/.docs/system-databases-data.md @@ -8,11 +8,18 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`bitnami/mariadb:10.5`](https://hub.docker.com/r/bitnami/mariadb) + Image: [`bitnami/mariadb-galera:11.2.2-debian-11-r0`](https://hub.docker.com/r/bitnami/mariadb-galera) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` +!!! debug "Debug Information" + + Image: [`dbrepo/data-db-sidecar:$TAG`](https://hub.docker.com/r/dbrepo/data-db-sidecar) + + * Ports: 3305/tcp + * Swagger UI: `http://<hostname>:1080/swagger-ui/` <a href="../swagger/sidecar" target="_blank">:fontawesome-solid-square-up-right: view online</a> + ## Overview By default, only one Data Database is deployed. You can deploy multiple (different) Data Database instances and make @@ -21,7 +28,7 @@ them available in the repository as follows: ```console curl \ -sSL \ - http://<hostname>:9093/api/container \ + http://<hostname>/api/container \ -X POST \ -d '{"name": "Data Database 2", "imageId": 1, "host": "example.com", "port": 3306, "privilegedUsername": "root", "privilegedPassword": "s3cr3t" }' ``` diff --git a/.docs/system-databases-metadata.md b/.docs/system-databases-metadata.md index 1cfcf69885..326ed3874e 100644 --- a/.docs/system-databases-metadata.md +++ b/.docs/system-databases-metadata.md @@ -8,7 +8,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`bitnami/mariadb:10.5`](https://hub.docker.com/r/bitnami/mariadb) + Image: [`dbrepo/metadata-db:$TAG`](https://hub.docker.com/r/dbrepo/metadata-db) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` diff --git a/.docs/system-databases-search.md b/.docs/system-databases-search.md index ce9965ee12..c01fa7c638 100644 --- a/.docs/system-databases-search.md +++ b/.docs/system-databases-search.md @@ -8,11 +8,9 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`dbrepo/search-db:1.4`](https://hub.docker.com/r/dbrepo/search-db) + Image: [`dbrepo/search-db:$TAG`](https://hub.docker.com/r/dbrepo/search-db) * Ports: 9200/tcp - * Indexes: `http://:9200/_all` - * Health: `http://:9200/_cluster/health` ## Overview diff --git a/.docs/system-other-search-dashboard.md b/.docs/system-other-search-dashboard.md index a2ac309560..a3d0e9ae12 100644 --- a/.docs/system-other-search-dashboard.md +++ b/.docs/system-other-search-dashboard.md @@ -11,7 +11,7 @@ author: Martin Weise Image: [`opensearchproject/opensearch-dashboards:2.10.0`](https://hub.docker.com/r/opensearchproject/opensearch-dashboards) * Ports: 5601/tcp - * UI: `http://:5601/admin/dashboard/` + * UI: `http://<hostname>/admin/dashboard/` ## Overview diff --git a/.docs/system-other-ui.md b/.docs/system-other-ui.md index 6ea29369f7..c8ca1c18aa 100644 --- a/.docs/system-other-ui.md +++ b/.docs/system-other-ui.md @@ -8,11 +8,11 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`dbrepo/ui:1.4`](https://hub.docker.com/r/dbrepo/ui) + Image: [`dbrepo/ui:$TAG`](https://hub.docker.com/r/dbrepo/ui) * Ports: 3000/tcp, 9100/tcp - * Prometheus: `http://:9100/metrics` - * UI: `http://:3000/` + * Prometheus: `http://<hostname>:9100/metrics` + * UI: `http://<hostname>/` ## Overview @@ -24,7 +24,7 @@ It provides a *user interface* (UI) for a researcher to interact with the databa </figure> <figure markdown> - + <figcaption>Architecture of the UI microservice</figcaption> </figure> diff --git a/.docs/system-services-analyse.md b/.docs/system-services-analyse.md index 93b188279e..66ee40d477 100644 --- a/.docs/system-services-analyse.md +++ b/.docs/system-services-analyse.md @@ -8,12 +8,12 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`dbrepo/analyse-service:1.4`](https://hub.docker.com/r/dbrepo/analyse-service) + Image: [`dbrepo/analyse-service:$TAG`](https://hub.docker.com/r/dbrepo/analyse-service) * Ports: 5000/tcp * Prometheus: `http://<hostname>:5000/metrics` * Health: `http://<hostname>:5000/health` - * Swagger UI: `http://<hostname>:5000/swagger-ui/index.html` <a href="../swagger/analyse" target="_blank">:fontawesome-solid-square-up-right: view online</a> + * Swagger UI: `http://<hostname>:5000/swagger-ui/` <a href="../swagger/analyse" target="_blank">:fontawesome-solid-square-up-right: view online</a> ## Overview diff --git a/.docs/system-services-authentication.md b/.docs/system-services-authentication.md index 1eec90ea77..41cea49974 100644 --- a/.docs/system-services-authentication.md +++ b/.docs/system-services-authentication.md @@ -8,12 +8,12 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`dbrepo/authentication-service:1.4`](https://hub.docker.com/r/dbrepo/authentication-service) + Image: [`dbrepo/authentication-service:$TAG`](https://hub.docker.com/r/dbrepo/authentication-service) * Ports: 8080/tcp - * Admin Console: `http://<hostname>:8080/api/auth/admin/` * Health: `http://<hostname>:8080/api/auth/health` * Prometheus: `http://<hostname>:8080/api/auth/metrics` + * UI: `http://<hostname>/api/auth/admin/` ## Overview diff --git a/.docs/system-services-broker.md b/.docs/system-services-broker.md index f7919f8bd2..cc4b775c1f 100644 --- a/.docs/system-services-broker.md +++ b/.docs/system-services-broker.md @@ -12,8 +12,8 @@ author: Martin Weise * Ports: 5672/tcp, 15672/tcp, 15692/tcp * AMQP: `amqp://<hostname>:5672` - * Management: `http://<hostname>:15672` * Prometheus: `http://<hostname>:15692/metrics` + * Management: `http://<hostname>/admin/broker` ## Overview diff --git a/.docs/system-services-data.md b/.docs/system-services-data.md index 698fc3bbb4..88e781e6e8 100644 --- a/.docs/system-services-data.md +++ b/.docs/system-services-data.md @@ -8,7 +8,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`dbrepo/data-service:1.4`](https://hub.docker.com/r/dbrepo/data-service) + Image: [`dbrepo/data-service:$TAG`](https://hub.docker.com/r/dbrepo/data-service) * Ports: 9093/tcp * Info: `http://<hostname>:9093/actuator/info` diff --git a/.docs/system-services-metadata.md b/.docs/system-services-metadata.md index 266468579c..e9a2e59f50 100644 --- a/.docs/system-services-metadata.md +++ b/.docs/system-services-metadata.md @@ -8,15 +8,15 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`dbrepo/metadata-service:1.4`](https://hub.docker.com/r/dbrepo/metadata-service) + Image: [`dbrepo/metadata-service:$TAG`](https://hub.docker.com/r/dbrepo/metadata-service) * Ports: 9099/tcp - * Info: `http://9093:9099/actuator/info` - * Health: `http://9093:9099/actuator/health` - - Readiness: `http://9093:9099/actuator/health/readiness` - - Liveness: `http://9093:9099/actuator/health/liveness` - * Prometheus: `http://9093:9099/actuator/prometheus` - * Swagger UI: `http://9093:9099/swagger-ui/index.html` <a href="../swagger/metadata" target="_blank">:fontawesome-solid-square-up-right: view online</a> + * Info: `http://<hostname>:9099/actuator/info` + * Health: `http://<hostname>:9099/actuator/health` + - Readiness: `http://<hostname>:9099/actuator/health/readiness` + - Liveness: `http://<hostname>:9099/actuator/health/liveness` + * Prometheus: `http://<hostname>:9099/actuator/prometheus` + * Swagger UI: `http://<hostname>:9099/swagger-ui/index.html` <a href="../swagger/metadata" target="_blank">:fontawesome-solid-square-up-right: view online</a> ## Overview diff --git a/.docs/system-services-search.md b/.docs/system-services-search.md new file mode 100644 index 0000000000..2ce466157b --- /dev/null +++ b/.docs/system-services-search.md @@ -0,0 +1,36 @@ +--- +author: Martin Weise +--- + +# Search Service + +## tl;dr + +!!! debug "Debug Information" + + Image: [`dbrepo/search-service:$TAG`](https://hub.docker.com/r/dbrepo/search-service) + + * Ports: 4000/tcp + * Health: `http://<hostname>:4000/api/search/health` + * Prometheus: `http://<hostname>:4000/metrics` + * Swagger UI: `http://<hostname>:4000/swagger-ui/` <a href="../swagger/search" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +## Overview + + + +### Examples + +See the [usage page](../usage-search). + +## Limitations + +!!! question "Do you miss functionality? Do these limitations affect you?" + + We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get + in [contact](../contact) with us, we happily answer requests for collaboration with attached CV and your programming + experience! + +## Security + +TBD diff --git a/.docs/system-services-upload.md b/.docs/system-services-upload.md index 656b82b869..0047179600 100644 --- a/.docs/system-services-upload.md +++ b/.docs/system-services-upload.md @@ -8,11 +8,12 @@ author: Martin Weise !!! debug "Debug Information" - Image: [tusproject/tusd:v1.12`](https://hub.docker.com/r/tusproject/tusd) + Image: [`tusproject/tusd:v1.12`](https://hub.docker.com/r/tusproject/tusd) * Ports: 1080/tcp * Prometheus: `http://<hostname>:1080/api/upload/metrics` * API: `http://<hostname>:1080/api/upload` + * Swagger UI: <a href="../swagger/upload" target="_blank">:fontawesome-solid-square-up-right: view online</a> ## Overview diff --git a/.docs/usage-identifier.md b/.docs/usage-identifier.md deleted file mode 100644 index 2a0135a501..0000000000 --- a/.docs/usage-identifier.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -author: Martin Weise ---- - -# Identifier Service - -From version 1.2 onwards there are two modes for the Identifier Service: - -1. Persistent Identifier (PID) -2. Digital Object Identifier (DOI) - -By default, the URI mode is used, creating a PID for databases or subsets. If starting the Identifier Service in DOI mode, -a DOI is minted for persistent identification of databases or subsets. Using the DOI system is entirely *optional* and -should not be done for test-deployments. - -<figure markdown> - -<figcaption>Minting a test-DOI for a subset</figcaption> -</figure> diff --git a/.docs/usage-metadata.md b/.docs/usage-metadata.md new file mode 100644 index 0000000000..fd2587a7fc --- /dev/null +++ b/.docs/usage-metadata.md @@ -0,0 +1,7 @@ +--- +author: Martin Weise +--- + +# Metadata Service + +TBD \ No newline at end of file diff --git a/.docs/usage-search.md b/.docs/usage-search.md new file mode 100644 index 0000000000..1afa21dbb6 --- /dev/null +++ b/.docs/usage-search.md @@ -0,0 +1,7 @@ +--- +author: Martin Weise +--- + +# Search Service + +TBD \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b2bb93654e..00b6743868 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -527,7 +527,8 @@ build-api-latest: script: - apk add bash git - git fetch && git checkout dev - - bash .docs/.swagger/generate.sh + - TAG=latest bash .docs/.swagger/swagger-version.sh + - bash .docs/.swagger/swagger-site.sh - mkdir -p ./swagger/latest - cp -r ./site/* ./swagger/latest/ cache: @@ -573,7 +574,8 @@ build-api-1.4: script: - apk add bash git maven - git fetch && git checkout release-v1.4 - - bash .docs/.swagger/generate.sh + - TAG=${VERSION} bash .docs/.swagger/swagger-version.sh + - bash .docs/.swagger/swagger-site.sh - mkdir -p ./swagger/1.4 - cp -r ./site/* ./swagger/1.4/ cache: @@ -618,10 +620,11 @@ docs-latest: - release-v1.3 - release-v1.4 script: - - apt-get update && apt-get install -y git make + - apt-get update && apt-get install -y git make sed - git fetch && git checkout dev - pip install -r ./requirements.txt - mkdir -p ./final + - find ./.docs -type f -exec sed -i -e "s/\$TAG/latest/g" {} \; - mkdocs build && cp -r ./site ./final/latest - cp ./.docs/redirect.html ./final/index.html - cp -r ./swagger/latest ./final/latest/swagger @@ -674,10 +677,11 @@ docs-1.4: - release-v1.3 - release-v1.4 script: - - apt-get update && apt-get install -y git make + - apt-get update && apt-get install -y git make sed - git fetch && git checkout release-v1.4 - pip install -r ./.docs/requirements.txt - mkdir -p ./final + - find ./.docs -type f -exec sed -i -e "s/\$TAG/${VERSION}/g" {} \; - mkdocs build && cp -r ./site ./final/1.4 - cp -r ./swagger/1.4 ./final/1.4/swagger cache: diff --git a/dbrepo-search-service/Dockerfile b/dbrepo-search-service/Dockerfile index bb0ea12c68..f5acfd093b 100644 --- a/dbrepo-search-service/Dockerfile +++ b/dbrepo-search-service/Dockerfile @@ -27,4 +27,6 @@ ENV LOG_LEVEL=info RUN chown -R alpine:alpine ./ USER alpine +EXPOSE 4000 + ENTRYPOINT ["sh", "./scripts/docker-entrypoint.sh"] diff --git a/mkdocs.yml b/mkdocs.yml index f4ee5e8f5b..bc44b686bc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -15,11 +15,12 @@ nav: - Analyse Service: system-services-analyse.md - Authentication Service: system-services-authentication.md - Broker Service: system-services-broker.md - - Gateway Service: system-services-gateway.md - Data Service: system-services-data.md + - Gateway Service: system-services-gateway.md - Metadata Service: system-services-metadata.md - - Upload Service: system-services-upload.md + - Search Service: system-services-search.md - Storage Service: system-services-storage.md + - Upload Service: system-services-upload.md - Databases: - Auth Database: system-databases-auth.md - Data Database: system-databases-data.md @@ -34,9 +35,10 @@ nav: - Analyse Service: usage-analyse.md - Authentication Service: usage-auth.md - Broker Service: usage-broker.md - - Identifier Service: usage-identifier.md - - Upload Service: usage-upload.md + - Metadata Service: usage-metadata.md + - Search Service: usage-search.md - Storage Service: usage-storage.md + - Upload Service: usage-upload.md - publications.md - contact.md extra_css: -- GitLab