From d60741df0333af7b6b8ed3ed97e06d83747c468e Mon Sep 17 00:00:00 2001 From: Lucas Triefenbach Date: Thu, 7 Aug 2025 12:05:19 +0200 Subject: [PATCH] Create wiki/website for TORCH --- .github/workflows/build.yml | 6 +- .github/workflows/docs.yml | 67 + .nvmrc | 1 + README.md | 302 +- docs/.gitignore | 3 + docs/.vitepress/config.ts | 85 + docs/Makefile | 7 + docs/api/api.md | 136 + docs/configuration.md | 250 ++ docs/crtdl/consent-key.md | 45 + docs/crtdl/crtdl.md | 195 + docs/crtdl/filter.md | 42 + docs/documentation.md | 28 + docs/drawio/ResourceLoader.drawio | 295 ++ .../.$cascading_delete_subgraphs.drawio.bkp | 0 .../.$copy_operation.drawio.bkp | 0 .../old/documentation}/.$torch.drawio.bkp | 0 .../old/documentation}/.$torch.drawio.dtmp | 0 .../.$torch_ResourceBundle.drawio.bkp | 0 ...urceBundle_cascading_delete.drawio.png.bkp | Bin .../old/documentation}/.$torch_v1.drawio.bkp | 0 .../cascading_delete_subgraphs.drawio | 0 .../cascading_delete_subgraphs.drawio.png | Bin .../old/documentation}/copy_operation.drawio | 0 .../old/documentation}/redaction.drawio | 0 .../drawio/old/documentation}/torch.drawio | 0 .../old/documentation}/torch.drawio.png | Bin .../torch.referenceHandling.png | Bin .../torch_ResourceBundle.drawio | 0 ...ResourceBundle_cascading_delete.drawio.png | Bin .../old/documentation}/torch_backup.drawio | 0 .../documentation}/torch_delete.drawio.png | Bin .../old/documentation}/torch_pipeline.png | Bin .../drawio/old/documentation}/torch_v1.drawio | 0 docs/drawio/processing_pipeline.drawio | 230 + docs/drawio/processing_pipeline.svg | 1188 ++++++ docs/drawio/redaction.drawio | 338 ++ docs/drawio/reference_resolve.drawio | 135 + docs/getting-started.md | 68 + docs/implementation/cascading-delete.md | 136 + docs/implementation/cascading-delete.png | Bin 0 -> 62828 bytes docs/implementation/consent.md | 73 + docs/implementation/consent.png | Bin 0 -> 263281 bytes docs/implementation/data-extraction.md | 29 + docs/implementation/direct-load.md | 86 + .../implementation/implementation-overview.md | 57 + docs/implementation/must-have.md | 36 + docs/implementation/redaction.md | 121 + docs/implementation/reference-resolve.md | 23 + docs/index.md | 38 + docs/overview.md | 83 + docs/package-lock.json | 3689 +++++++++++++++++ docs/package.json | 13 + .../torch/consent/ConsentFetcher.java | 4 +- .../torch/service/DirectResourceLoader.java | 3 - 55 files changed, 7506 insertions(+), 306 deletions(-) create mode 100644 .github/workflows/docs.yml create mode 100644 .nvmrc create mode 100644 docs/.gitignore create mode 100644 docs/.vitepress/config.ts create mode 100644 docs/Makefile create mode 100644 docs/api/api.md create mode 100644 docs/configuration.md create mode 100644 docs/crtdl/consent-key.md create mode 100644 docs/crtdl/crtdl.md create mode 100644 docs/crtdl/filter.md create mode 100644 docs/documentation.md create mode 100644 docs/drawio/ResourceLoader.drawio rename {documentation => docs/drawio/old/documentation}/.$cascading_delete_subgraphs.drawio.bkp (100%) rename {documentation => docs/drawio/old/documentation}/.$copy_operation.drawio.bkp (100%) rename {documentation => docs/drawio/old/documentation}/.$torch.drawio.bkp (100%) rename {documentation => docs/drawio/old/documentation}/.$torch.drawio.dtmp (100%) rename {documentation => docs/drawio/old/documentation}/.$torch_ResourceBundle.drawio.bkp (100%) rename {documentation => docs/drawio/old/documentation}/.$torch_ResourceBundle_cascading_delete.drawio.png.bkp (100%) rename {documentation => docs/drawio/old/documentation}/.$torch_v1.drawio.bkp (100%) rename {documentation => docs/drawio/old/documentation}/cascading_delete_subgraphs.drawio (100%) rename {documentation => docs/drawio/old/documentation}/cascading_delete_subgraphs.drawio.png (100%) rename {documentation => docs/drawio/old/documentation}/copy_operation.drawio (100%) rename {documentation => docs/drawio/old/documentation}/redaction.drawio (100%) rename {documentation => docs/drawio/old/documentation}/torch.drawio (100%) rename {documentation => docs/drawio/old/documentation}/torch.drawio.png (100%) rename {documentation => docs/drawio/old/documentation}/torch.referenceHandling.png (100%) rename {documentation => docs/drawio/old/documentation}/torch_ResourceBundle.drawio (100%) rename {documentation => docs/drawio/old/documentation}/torch_ResourceBundle_cascading_delete.drawio.png (100%) rename {documentation => docs/drawio/old/documentation}/torch_backup.drawio (100%) rename {documentation => docs/drawio/old/documentation}/torch_delete.drawio.png (100%) rename {documentation => docs/drawio/old/documentation}/torch_pipeline.png (100%) rename {documentation => docs/drawio/old/documentation}/torch_v1.drawio (100%) create mode 100644 docs/drawio/processing_pipeline.drawio create mode 100644 docs/drawio/processing_pipeline.svg create mode 100644 docs/drawio/redaction.drawio create mode 100644 docs/drawio/reference_resolve.drawio create mode 100644 docs/getting-started.md create mode 100644 docs/implementation/cascading-delete.md create mode 100644 docs/implementation/cascading-delete.png create mode 100644 docs/implementation/consent.md create mode 100644 docs/implementation/consent.png create mode 100644 docs/implementation/data-extraction.md create mode 100644 docs/implementation/direct-load.md create mode 100644 docs/implementation/implementation-overview.md create mode 100644 docs/implementation/must-have.md create mode 100644 docs/implementation/redaction.md create mode 100644 docs/implementation/reference-resolve.md create mode 100644 docs/index.md create mode 100644 docs/overview.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9942b856..92d40265 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,15 +2,17 @@ name: Build on: push: + paths-ignore: + - 'docs/**' branches: - main - - develop tags: - 'v*.*.*' pull_request: branches: - main - - develop + paths-ignore: + - 'docs/**' schedule: - cron: '0 1 * * *' merge_group: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..e89538f2 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,67 @@ +name: Docs + +on: + push: + paths: + - 'docs/**' + branches: + - main + tags: + - 'v*.*.*' + pull_request: + paths: + - 'docs/**' + branches: + - main + schedule: + - cron: '0 1 * * *' + merge_group: + +concurrency: + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }} + cancel-in-progress: true + +permissions: read-all + +jobs: + build-pages: + runs-on: ubuntu-24.04 + steps: + - name: Check out Git repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - name: Setup Node + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: 'docs/package-lock.json' + + - name: Build + working-directory: docs + env: + DOCS_BASE: "/${{ github.event.repository.name }}/" + run: make build + + - name: Setup Pages + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3 + with: + path: docs/.vitepress/dist + + deploy-pages: + runs-on: ubuntu-24.04 + needs: [ build-pages ] + permissions: + pages: write + id-token: write + environment: + name: ${{ github.ref == 'refs/heads/main' && 'github-pages' || format('preview-{0}', github.ref_name) }} + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 + diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..fc6f56e1 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +23.11.1 diff --git a/README.md b/README.md index c8b015e4..19503af1 100644 --- a/README.md +++ b/README.md @@ -22,306 +22,9 @@ This request is composed of two parts: The cohort definition (for who (which patients) should data be extracted) The data extraction (what data should be extracted) -## Prerequisites +## Documentation -TORCH interacts with the following components directly: - -- a CQL ready FHIR Server like [Blaze](https://github.com/samply/blaze) **OR - ** [FLARE](https://github.com/medizininformatik-initiative/flare) -- A FHIR Server / FHIR Search API -- Reverse Proxy (NGINX) - -The reverse proxy allows for integration into a site's multi-server infrastructure and provides a means of serving -the extracted data. - -## Verification - -For container images, we use cosign to sign images. This allows users to confirm the image was built by the expected CI -pipeline and has not been modified after publication. -``` -cosign verify "ghcr.io/medizininformatik-initiative/torch:v1.0.0" \ ---certificate-identity-regexp "https://github.com/medizininformatik-initiative/torch.*" \ ---certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ ---certificate-github-workflow-ref="refs/tags/v1.0.0" \ --o text -``` -The expected output is: -``` -Verification for ghcr.io/medizininformatik-initiative/torch:v1.0.0 -- -The following checks were performed on each of these signatures: -- The cosign claims were validated -- Existence of the claims in the transparency log was verified offline -- The code-signing certificate was verified using trusted certificate authority certificates -``` -This output ensures that the image was build on the GitHub workflow on the repository -`medizininformatik-initiative/torch` and tag `v1.0.0`. - -### Cohort Selection - -TORCH supports CQL or FHIR Search for the cohort selection part. - -If your FHIR server does not support CQL itself then the FLARE component must be used to extract the -cohort based on the cohort definition of the **CRTDL**. - -The cohort evaluation strategy can be set using the TORCH_USE_CQL setting in -the [enviroment variables](#environment-variables) - -## Container version - -For simplicity torch is integrated in -the [feasibility-triangle](https://github.com/medizininformatik-initiative/feasibility-deploy/tree/main/feasibility-triangle) -of the feasibility-deploy repository, but can also be installed without it. - -For the latest build see: https://github.com/medizininformatik-initiative/torch/pkgs/container/torch - -## Environment Variables - -| Name | Default | Description | -|:----------------------------------------------------|:------------------------------------|:-----------------------------------------------------------------------------------------------------| -| SERVER_PORT | 8080 | The Port of the server to use | -| TORCH_PROFILE_DIR | structureDefinitions | The directory for profile definitions. | -| TORCH_MAPPING_CONSENT | mappings/consent-mappings_fhir.json | The file for consent mappings in FHIR format. | -| TORCH_MAPPING_TYPE_TO_CONSENT | mappings/type_to_consent.json | The file mapping Resource Types to time fields against which the consent is checked | -| TORCH_FHIR_USER | – | The FHIR server user. | -| TORCH_FHIR_PASSWORD | – | The FHIR server password. | -| TORCH_FHIR_OAUTH_ISSUER_URI | – | The URI for the OAuth issuer. | -| TORCH_FHIR_OAUTH_CLIENT_ID | – | The client ID for OAuth. | -| TORCH_FHIR_OAUTH_CLIENT_SECRET | – | The client secret for OAuth. | -| TORCH_FHIR_URL | – | The base URL of the FHIR server to use. | -| TORCH_FHIR_MAX_CONNECTIONS | 5 | The maximum number of concurrent connections to use - has to be (TORCH_MAXCONCURRENCY + 1) | -| TORCH_FHIR_PAGE_COUNT | 500 | The number of pages in a FHIR search response. | -| TORCH_FHIR_DISABLE_ASYNC | false | Set to `true` in order to disable use of [Asynchronous Interaction Request Pattern][5]. | -| TORCH_FLARE_URL | – | The base URL of the FLARE server to use. | -| TORCH_RESULTS_DIR | output/ | The directory for storing results. | -| TORCH_RESULTS_PERSISTENCE | PT2160H | Time Block for result persistence in ISO 8601
format in hours/minutes/seconds. Default 90 days | -| TORCH_BATCHSIZE | 500 | The batch size used for processing data. | -| TORCH_MAXCONCURRENCY | 4 | The maximum concurrency level for processing. | -| TORCH_MAPPINGS_FILE | ontology/mapping_cql.json | The file for ontology mappings using CQL. | -| TORCH_BUFFERSIZE | 100 | Size in MB of the webclientbuffer that interacts with the FHIR server | -| TORCH_CONCEPT_TREE_FILE | ontology/mapping_tree.json | The file for the concept tree mapping. | -| TORCH_DSE_MAPPING_TREE_FILE | ontology/dse_mapping_tree.json | The file for DSE concept tree mapping. | -| TORCH_USE_CQL | true | Flag indicating if CQL should be used. | -| TORCH_BASE_URL | – | The server name before the proxy from which torch is accessed | -| TORCH_OUTPUT_FILE_SERVER_URL | – | The URL to access Result location TORCH_RESULTS_DIR served by a proxy/fileserver | -| LOG_LEVEL
_DE_MEDIZININFORMATIKINITIATIVE_TORCH | info | Log level for torch core functionality. | -| LOG_LEVEL
_CA_UHN_FHIR | error | Log level for HAPI FHIR library. | -| SPRING_PROFILES_ACTIVE | active | The active Spring profile. | -| SPRING_CODEC_MAX_IN_MEMORY_SIZE | 100MB | The maximum in-memory size for Spring codecs. | - -## TORCH REST API (based on FHIR Bulk Data Request) - -Torch implements the FHIR [Asynchronous Bulk Data Request Pattern][2]. - -### $extract-data - -The $extract-data endpoint implements the kick-off request in the Async Bulk Pattern. It receives a FHIR parameters -resource with a **_crtdl_** parameter containing a -valueBase64Binary [CRTDL](https://github.com/medizininformatik-initiative/clinical-resource-transfer-definition-language). -All examples are with a torch configured with **http://localhost:8086**. - -```sh -scripts/create-parameters.sh src/test/resources/CRTDL/CRTDL_observation.json | curl -s 'http://localhost:8086/fhir/$extract-data' -H "Content-Type: application/fhir+json" -d @- -v -``` - -The Parameters resource created by `scripts/create-parameters.sh` look like this: - -``` -{ - "resourceType": "Parameters", - "parameter": [ - { - "name": "crtdl", - "valueBase64Binary": "" - } - ] -} -``` - -Optionally patient ids can be submitted for a known cohort, bypassing the cohort selection in the CRTDL: - -``` -{ - "resourceType": "Parameters", - "parameter": [ - { - "name": "crtdl", - "valueBase64Binary": "" - }, - { - "name": "patient", - "valueString": "" - }, - { - "name": "patient", - "valueString": "" - } - ] -} -``` - -#### Response - Error (e.g. unsupported search parameter) - -* HTTP Status Code of 4XX or 5XX - -#### Response - Success - -* HTTP Status Code of 202 Accepted -* Content-Location header with the absolute URL of an endpoint for subsequent status requests (polling location) - -That location header can be used in the following status query: -E.g. location:"/fhir/__status/1234" - -### Status Request - -Torch provides a Status Request Endpoint which can be called using the location from the extract Data Endpoint. - -```sh -curl -s http://localhost:8080/fhir/__status/{location} -``` - -#### Response - In-Progress - -* HTTP Status Code of 202 Accepted - -#### Response - Error - -* HTTP status code of 4XX or 5XX -* Content-Type header of application/fhir+json -* Operation Outcome with fatal issue - -#### Response - Complete - -* HTTP status of 200 OK -* Content-Type header of application/fhir+json -* A body containing a JSON file describing the file links to the batched transformation results - -```sh -curl -s 'http://localhost:8080/fhir/$extract-data' -H "Content-Type: application/fhir+json" -d '' -``` - -the result is a looks something like this: - -```json -{ - "requiresAccessToken": false, - "output": [ - { - "type": "Bundle", - "url": "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/6c88f0ff-0e9a-4cf7-b3c9-044c2e844cfc.ndjson" - }, - { - "type": "Bundle", - "url": "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/a4dd907c-4d98-4461-9d4c-02d62fc5a88a.ndjson" - }, - { - "type": "Bundle", - "url": "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/f33634bd-d51b-463c-a956-93409d96935f.ndjson" - } - ], - "request": "http://localhost:8080//fhir/$extract-data", - "deleted": [], - "transactionTime": "2024-09-05T12:30:32.711151718Z", - "error": [] -} - -``` - -## Output Files - -After [Response Complete](#response---complete) is returned the result files in ndjson format -are located in Output directory set in [enviroment variables](#environment-variables). -In the case of error an error.json can be found in the Output directory detailing the fatal error. - -Note that each patient batch is written to the output directory and the files are written before the process completes. -This can be used to track the progress of your data extraction. - -#### Download Data - -If a server is set up for the files e.g. NGINX, the files can be fetched by a Request on the URL set in -TORCH_OUTPUT_FILE_SERVER_URL in [enviroment variables](#environment-variables). - -```sh -curl -s "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/f33634bd-d51b-463c-a956-93409d96935f.ndjson" -``` - -### NDJSON: Result Bundles - -The ndjson will contain one **transaction bundle** per Patient. - -### Global Status Request - -Torch provides a Status Request Endpoint which provides a overview extract Data Endpoint. - -```sh -curl -s http://localhost:8080/fhir/__status/ -``` - -### Masked Fields - -Required fields that were not extracted and slices that are unknown in the Structure Definition are set to Data Absent -Reason "masked". - -For example a CRTDL only extracting Condition.onset will result in this: - -```json -{ - "resourceType": "Condition", - "id": "TestID", - "meta": { - "profile": [ - "https://www.medizininformatik-initiative.de/fhir/core/modul-diagnose/StructureDefinition/Diagnose" - ] - }, - "code": { - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "masked" - } - ] - }, - "subject": { - "extension": [ - { - "url": "http://hl7.org/fhir/StructureDefinition/data-absent-reason", - "valueCode": "masked" - } - ] - }, - "onsetDateTime": "2024-10" -} -``` - -## Transfer Script - -TORCH provides a companion **transfer script** designed to automate the workflow of submitting a data extraction -request, polling the status, and transferring the resulting files to a target FHIR server. - -The transfer script will: - -1. Take the **CRTDL** and generate a FHIR parameters resource to send to TORCH. -2. Execute $extract-data operation on the TORCH server using parameters resource as input. -3. Poll the TORCH status endpoint until the export is complete. -4. Download the resulting patient-oriented FHIR bundles into a temp dir. -5. Upload these files to a configured target FHIR server using the `blazectl` tool. -6. Provide progress feedback and error handling at each step. - -### Usage Example - -```bash -./transfer-extraction-to-dup-fhir-server.sh -c src/test/resources/CRTDL/CRTDL_observation.json -t http://target-fhir-server:8080/fhir -``` - -### Environment Variables - -The transfer script respects several environment variables to configure server URLs, directories, retry counts, and -timing: - -| Variable | Default | Description | -|----------------|-----------------------|-----------------------------------------------------| -| TORCH_BASE_URL | http://localhost:8080 | Base URL of the TORCH server | -| MAX_RETRIES | 60 | Number of status polling attempts before timing out | -| SLEEP_SECONDS | 5 | Seconds to wait between polling attempts | +Documentation can be found [here](https://medizininformatik-initiative.github.io/torch/). ## Supported Features @@ -339,6 +42,7 @@ timing: - Auto Extracting modifiers - Black or Whitelisting of certain ElementIDs locally - Validating against Profiles +- Value Set based Slicing ## License diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..9d329a87 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +/node_modules/ +/.vitepress/cache +/.vitepress/dist diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 00000000..95f30b52 --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,85 @@ +import {withMermaid} from "vitepress-plugin-mermaid"; + +export default withMermaid({ + title: 'TORCH', + description: 'TORCH Documentation', + base: process.env.DOCS_BASE || '', + appearance: true, + lastUpdated: true, + themeConfig: { + siteTitle: false, + + editLink: { + pattern: 'https://github.com/medizininformatik-initiative/torch/edit/main/docs/:path', + text: 'Edit this page on GitHub' + }, + + socialLinks: [ + {icon: 'github', link: 'https://github.com/medizininformatik-initiative/torch'} + ], + + footer: { + message: 'Released under the Apache License 2.0', + }, + + search: { + provider: 'local' + }, + + outline: { + level: [2, 3] + }, + + nav: [ + {text: 'Home', link: '/'} + ], + + sidebar: [ + { + text: 'Home', + link: '/index.md', + activeMatch: '^/$' + }, + { + text: 'Overview', + link: '/overview.md', + activeMatch: '^/$' + }, + { + text: 'Getting Started', + link: '/getting-started', + activeMatch: '^/getting-started' + }, + { + text: 'Documentation', + link: '/documentation', + items: [ + {text: 'Configuration', link: '/configuration'}, + {text: 'API', link: '/api/api'}, + { + text: 'CRTDL', link: '/crtdl/crtdl', + items: [ + {text: 'Filter', link: '/crtdl/filter'}, + {text: 'Consent Key', link: '/crtdl/consent-key'} + ] + + }, + { + text: 'Implementation', + link: '/implementation/implementation-overview', + items: [ + {text: 'Consent', link: '/implementation/consent'}, + {text: 'Direct Loading', link: '/implementation/direct-load'}, + {text: 'Must Have Checking', link: '/implementation/must-have'}, + {text: 'Cascading Delete', link: '/implementation/cascading-delete'}, + {text: 'Reference Resolve', link: '/implementation/reference-resolve'}, + {text: 'Redaction', link: '/implementation/redaction'}, + {text: 'Data Extraction', link: '/implementation/data-extraction'} + ] + } + + ] + } + ] + } +}) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..ddb9254f --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,7 @@ +install: + npm install + +build: install + npm run docs:build + +.PHONY: install build diff --git a/docs/api/api.md b/docs/api/api.md new file mode 100644 index 00000000..4b5bed57 --- /dev/null +++ b/docs/api/api.md @@ -0,0 +1,136 @@ +# API + +TORCH provides a FHIR REST API for extracting data based on the Clinical Resource Transfer Definition Language (CRTDL). +It implements the FHIR [Asynchronous Bulk Data Request Pattern](http://hl7.org/fhir/R5/async-bulk.html). + +### Key Features of the API + +- **Asynchronous Requests**: Supports long-running data extraction tasks. +- **FHIR Compliant**: Adheres to FHIR standards for resource representation. +- **CRTDL Integration**: Uses CRTDL definitions to specify data extraction rules. + +### API Endpoints + +- **`/$extract-data`**: Initiates a data extraction job based on a CRTDL definition. +- **`/__status`**: Checks the status of an ongoing data extraction job. +- **`/metadata`**: Provides metadata about the TORCH server and its capabilities. + +## TORCH REST API (based on FHIR Bulk Data Request) + +Torch implements the FHIR [Asynchronous Bulk Data Request Pattern][1]. + +### $extract-data + +The $extract-data endpoint implements the kick-off request in the Async Bulk Pattern. It receives a FHIR parameters +resource with a **_crtdl_** parameter containing a +valueBase64Binary [CRTDL](https://github.com/medizininformatik-initiative/clinical-resource-transfer-definition-language). +All examples are with a torch configured with **`http://localhost:8080`**. + +```sh +scripts/create-parameters.sh src/test/resources/CRTDL/CRTDL_observation.json | curl -s 'http://localhost:8080/fhir/$extract-data' -H "Content-Type: application/fhir+json" -d @- -v +``` + +The Parameters resource created by `scripts/create-parameters.sh` look like this: + +``` +{ + "resourceType": "Parameters", + "parameter": [ + { + "name": "crtdl", + "valueBase64Binary": "" + } + ] +} +``` + +Optionally patient ids can be submitted for a known cohort, bypassing the cohort selection in the CRTDL: + +``` +{ + "resourceType": "Parameters", + "parameter": [ + { + "name": "crtdl", + "valueBase64Binary": "" + }, + { + "name": "patient", + "valueString": "" + }, + { + "name": "patient", + "valueString": "" + } + ] +} +``` + +#### Response - Error (e.g. unsupported search parameter) + +* HTTP Status Code of 4XX or 5XX + +#### Response - Success + +* HTTP Status Code of 202 Accepted +* Content-Location header with the absolute URL of an endpoint for subsequent status requests (polling location) + +That location header can be used in the following status query: +E.g. location:"/fhir/__status/1234" + +### Status Request + +Torch provides a Status Request Endpoint which can be called using the location from the extract Data Endpoint. + +```sh +curl -s http://localhost:8080/fhir/__status/{location} +``` + +#### Response - In-Progress + +* HTTP Status Code of 202 Accepted + +#### Response - Error + +* HTTP status code of 4XX or 5XX +* Content-Type header of application/fhir+json +* Operation Outcome with fatal issue + +#### Response - Complete + +* HTTP status of 200 OK +* Content-Type header of application/fhir+json +* A body containing a JSON file describing the file links to the batched transformation results + +```sh +curl -s 'http://localhost:8080/fhir/$extract-data' -H "Content-Type: application/fhir+json" -d '' +``` + +the result is a looks something like this: + +```json +{ + "requiresAccessToken": false, + "output": [ + { + "type": "Bundle", + "url": "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/6c88f0ff-0e9a-4cf7-b3c9-044c2e844cfc.ndjson" + }, + { + "type": "Bundle", + "url": "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/a4dd907c-4d98-4461-9d4c-02d62fc5a88a.ndjson" + }, + { + "type": "Bundle", + "url": "http://localhost:8080/da4a1c56-f5d9-468c-b57a-b8186ea4fea8/f33634bd-d51b-463c-a956-93409d96935f.ndjson" + } + ], + "request": "http://localhost:8080//fhir/$extract-data", + "deleted": [], + "transactionTime": "2024-09-05T12:30:32.711151718Z", + "error": [] +} + +``` + +[1]: diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 00000000..ed097a76 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,250 @@ +# Configuration + +Torch is configured using environment variables that control its behavior and integration with a FHIR server. This allows +for flexible deployment and customization based on the specific requirements of your environment. + +## Configuration Overview + +This document provides an overview of the environment variables used to configure TORCH, including their default values +and descriptions. +These variables can be set in the application.yml file or as system environment variables when running the application. + +When running TORCH as a container, it is recommended to set these variables or pass them as environment variables during container startup. +## Backend + +### Environment Variables + +#### `SERVER_PORT` + +The port on which the server listens for incoming connections. +If running a container it is the port inside the container. + +**Default:** `8080` + +--- + +#### `TORCH_PROFILE_DIR` + +The directory path where profile definitions are stored. + +**Default:** `structureDefinitions` + +--- + +#### `TORCH_MAPPING_CONSENT` + +Path to the JSON file containing consent mappings formatted for FHIR. + +**Default:** `mappings/consent-mappings_fhir.json` + +--- + +#### `TORCH_MAPPING_TYPE_TO_CONSENT` + +File that maps FHIR Resource Types to their associated time fields used to check consent validity. + +**Default:** `mappings/type_to_consent.json` + +--- + +#### `TORCH_FHIR_USER` + +The username used for authentication with the FHIR server. + +**Default:** – (none) + +--- + +#### `TORCH_FHIR_PASSWORD` + +The password used for authentication with the FHIR server. + +**Default:** – (none) + +--- + +#### `TORCH_FHIR_OAUTH_ISSUER_URI` + +The URI of the OAuth issuer used for OAuth authentication. + +**Default:** – (none) + +--- + +#### `TORCH_FHIR_OAUTH_CLIENT_ID` + +Client ID used for OAuth authentication. + +**Default:** – (none) + +--- + +#### `TORCH_FHIR_OAUTH_CLIENT_SECRET` + +Client secret used for OAuth authentication. + +**Default:** – (none) + +--- + +#### `TORCH_FHIR_URL` + +Base URL of the FHIR server that TORCH connects to. + +**Default:** – (none) + +--- + +#### `TORCH_FHIR_MAX_CONNECTIONS` + +Maximum number of concurrent connections allowed to the FHIR server. Must be equal to `TORCH_MAXCONCURRENCY + 1`. + +**Default:** `5` + +--- + +#### `TORCH_FHIR_PAGE_COUNT` + +Number of entries per page in FHIR search responses. + +**Default:** `500` + +--- + +#### `TORCH_FHIR_DISABLE_ASYNC` + +Set to `true` to disable the use of the Asynchronous Interaction Request Pattern for FHIR operations. + +**Default:** `false` + +--- + +#### `TORCH_FLARE_URL` + +Base URL of the FLARE server used in the pipeline. + +**Default:** – (none) + +--- + +#### `TORCH_RESULTS_DIR` + +Directory path where results are stored. + +**Default:** `output/` + +--- + +#### `TORCH_RESULTS_PERSISTENCE` + +ISO 8601 duration indicating how long result files are persisted (e.g., `PT2160H` means 90 days). + +**Default:** `PT2160H` + +--- + +#### `TORCH_BATCHSIZE` + +Size of data batches processed at once. + +**Default:** `500` + +--- + +#### `TORCH_MAXCONCURRENCY` + +Maximum level of concurrency for data processing operations. + +**Default:** `4` + +--- + +#### `TORCH_MAPPINGS_FILE` + +Path to the file containing ontology mappings defined using Clinical Quality Language (CQL). + +**Default:** `ontology/mapping_cql.json` + +--- + +#### `TORCH_BUFFERSIZE` + +Size (in MB) of the buffer used by the web client interacting with the FHIR server. + +**Default:** `100` + +--- + +#### `TORCH_CONCEPT_TREE_FILE` + +File containing the concept tree mapping used for resource classification. + +**Default:** `ontology/mapping_tree.json` + +--- + +#### `TORCH_DSE_MAPPING_TREE_FILE` + +File containing the concept tree mapping specifically for DSE (Data Set Extensions). + +**Default:** `ontology/dse_mapping_tree.json` + +--- + +#### `TORCH_USE_CQL` + +Flag indicating whether to enable Clinical Quality Language (CQL) for processing. + +**Default:** `true` + +--- + +#### `TORCH_BASE_URL` + +Base server URL before any proxy, used for accessing TORCH directly. + +**Default:** – (none) + +--- + +#### `TORCH_OUTPUT_FILE_SERVER_URL` + +URL used to access the result files in `TORCH_RESULTS_DIR` via a proxy or file server. + +**Default:** – (none) + +--- + +#### `LOG_LEVEL_DE_MEDIZININFORMATIKINITIATIVE_TORCH` + +Logging level for core TORCH functionality. + +**Default:** `info` + +--- + +#### `LOG_LEVEL_CA_UHN_FHIR` + +Logging level for the HAPI FHIR library. + +**Default:** `error` + +--- + +#### `SPRING_PROFILES_ACTIVE` + +Active Spring profile used to configure the application context. + +**Default:** `active` + +--- + +#### `SPRING_CODEC_MAX_IN_MEMORY_SIZE` + +Maximum allowed in-memory size for Spring codecs when processing data. + +**Default:** `100MB` + +--- + +[5]: https://www.hl7.org/fhir/http.html#async "FHIR Asynchronous Interaction Request Pattern" diff --git a/docs/crtdl/consent-key.md b/docs/crtdl/consent-key.md new file mode 100644 index 00000000..d5c6aba0 --- /dev/null +++ b/docs/crtdl/consent-key.md @@ -0,0 +1,45 @@ +## Consent Key in CRTDL + +The consent key in the Cohort Selection of the CRTDL is used to specify the consent rules that apply +to the cohort definition and data extraction. It allows for per-patient, per-resource consent enforcement +during structured extraction. + +### Key Features + +- **Configurable** : Controlled via the `TORCH_MAPPING_CONSENT` environment variable. +- **Shipped with MII specific Consent Key Mapping**: The default consent key mapping is provided by the + MII [MII Consent Key Mapping](https://github.com/medizininformatik-initiative/torch/blob/main/mappings/consent-mappings_fhir.json). + +### Example CRTDL with Consent Key + +The following example shows how to use the consent key in a CRTDL definition. +The consent key is defined in the `inclusionCriteria` section, which specifies the conditions under which a patient is +included in the cohort. +Consent keys are indentified by the `context.code` field, which is set to **Einwilligung** (German for consent). +The key value is located as a termCode in this case with the code **yes-yes-no-yes**. + +```json +{ + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "context": { + "code": "Einwilligung", + "display": "Einwilligung", + "system": "fdpg.mii.cds", + "version": "1.0.0" + }, + "termCodes": [ + { + "code": "yes-yes-no-yes", + "display": "Verteilte, EU-DSGVO konforme Analyse, ohne Krankenassendaten, und mit Rekontaktierung", + "system": "fdpg.consent.combined" + } + ] + } + ] + ] +} + diff --git a/docs/crtdl/crtdl.md b/docs/crtdl/crtdl.md new file mode 100644 index 00000000..5cd8cb28 --- /dev/null +++ b/docs/crtdl/crtdl.md @@ -0,0 +1,195 @@ +## CRTDL + +The Clinical Resource Transfer Definition Language (CRTDL) is a JSON-based format used to define cohorts and data +extraction rules for TORCH. +It allows users to specify who to extract data for, what data to extract, and how to handle consent and masking. + +### Key Features of CRTDL + +- **Cohort Definition**: Specify the population of interest using FHIR resources and criteria. +- **Data Extraction Rules**: Define which FHIR resources and fields to extract. +- **Consent Handling**: Integrate consent rules to ensure compliance with privacy regulations. + +--- +### CRTDL Structure + +A CRTDL definition is structured as a JSON object with the following key components: + +- **`inclusion criteria`**: Defines the population of interest. +- **`data extraction`**: Specifies the FHIR resources and fields to extract. + +--- +### Cohort Selection + +The cohort selection uses +the [CCDL](https://github.com/medizininformatik-initiative/clinical-cohort-definition-language/tree/main) (Clinical Cohort +Definition Definition Language) to define the population of interest. + +TORCH supports CQL or FHIR Search for the cohort selection execution. + +If your FHIR server does not support CQL, the FLARE component must be used to extract the cohort based on the cohort definition of the CRTDL. +Alternatively you can specify a list of patient IDs which TORCH will use to extract the data. + +The cohort evaluation strategy can be set using the TORCH_USE_CQL setting in +the [enviroment variables](./../configuration.md#environment-variables). + +Torch uses the [Consent Key](consent-key.md) to enforce consent rules during the cohort selection and data extraction +process. + +--- +### Data Extraction Selection + +The data extraction object contains an array defining **attributeGroups**, which bundle attributes together. + +Each group has an identifier for the group called **groupReference**, a list of attributes to be extracted +**attributes +** and a filter object containing exactly one time filter and many code filter. The code filter contains an array of codes to be filtered (see [filters](filter.md)). + +**Every data extraction must have exactly one attribute group that describes patient attributes**. + +An attribute to be extracted contains an attribute reference **attributeRef** and information if the attribute is +required **must-have** e.g. + +```json +{ + "attributeRef": "Medication.medicationCode", + "mustHave": true + + } +``` + + +If a **must have** condition is **violated**, it will result in a complete stop of the extraction for a **patient**. + +Filters definition have a list of **FHIR search parameter operations** containing the type supported, name and corresponding parameters. Currrently **token** and **date** are supported. + + + + + +```json +{ + "version": "http://json-schema.org/to-be-done/schema#", + "display": "", + "cohortDefinition": { + "version": "http://to_be_decided.com/draft-1/schema#", + "display": "", + "inclusionCriteria": [ + [ + { + "termCodes": [ + { + "code": "424144002", + "system": "http://snomed.info/sct", + "display": "Gegenwärtiges chronologisches Alter" + } + ], + "context": { + "code": "Patient", + "system": "fdpg.mii.cds", + "version": "1.0.0", + "display": "Patient" + }, + "valueFilter": { + "type": "quantity-comparator", + "unit": { + "code": "a", + "display": "a" + }, + "value": 18, + "comparator": "gt" + } + } + ], + [ + { + "termCodes": [ + { + "code": "263495000", + "system": "http://snomed.info/sct", + "display": "Geschlecht" + } + ], + "context": { + "code": "Patient", + "system": "fdpg.mii.cds", + "version": "1.0.0", + "display": "Patient" + }, + "valueFilter": { + "selectedConcepts": [ + { + "code": "female", + "display": "Female", + "system": "http://hl7.org/fhir/administrative-gender" + } + ], + "type": "concept" + } + } + ], + [ + { + "termCodes": [ + { + "code": "8-918", + "system": "http://fhir.de/CodeSystem/bfarm/ops", + "version": "2023", + "display": "Interdisziplinäre multimodale Schmerztherapie" + } + ], + "context": { + "code": "Procedure", + "system": "fdpg.mii.cds", + "version": "1.0.0", + "display": "Prozedur" + } + } + ] + + ], + "dataExtraction": { + "attributeGroups": [ + { + "groupReference": "https://www.medizininformatik-initiative.de/fhir/core/modul-labor/StructureDefinition/ObservationLab", + "attributes": [ + { + "attributeRef": "Observation.code", + "mustHave": false + }, + { + "attributeRef": "Observation.value", + "mustHave": true + } + ], + "filter": [ + { + "type": "token", + "name": "code", + "codes": [ + { + "code": "718-7", + "system": "http://loinc.org", + "display": "Hemoglobin [Mass/volume] in Blood" + }, + { + "code": "33509-1", + "system": "http://loinc.org", + "display": "Hemoglobin [Mass/volume] in Body fluid" + } + ] + }, + { + "type": "date", + "name": "date", + "start": "2021-09-09", + "end": "2021-10-09" + } + ] + } + ] + } + } +} + +``` diff --git a/docs/crtdl/filter.md b/docs/crtdl/filter.md new file mode 100644 index 00000000..615194b8 --- /dev/null +++ b/docs/crtdl/filter.md @@ -0,0 +1,42 @@ +## Filter + +In the crtdl date and token are supported as filter types. +For all filter types the `name` responds to a FHIR Search parameter which identfies how the filter should be applied. + +### Date Filter + +The date filter allows you to specify a date range for filtering resources. +It can be used to include or exclude resources based on their date attributes. + +```json +{ + "type": "date", + "name": "dateFilter", + "parameters": { + "start": "2023-01-01", + "end": "2023-12-31" + } +} +``` + +The `start` and `end` parameters define the range of dates to filter resources only **allow** a day wise granularity. + +### Token Filter + +Token filters allow you to filter resources based on specific codes or identifiers. +This is useful for filtering resources by specific concepts, such as LOINC codes or SNOMED codes. + +```json +{ + "type": "token", + "name": "codeFilter", + "parameters": { + "system": "http://loinc.org", + "code": "12345-6" + } +} + +``` + +The `system` parameter specifies the coding system (e.g., LOINC, SNOMED), and the `code` parameter specifies the +specific code to filter by. diff --git a/docs/documentation.md b/docs/documentation.md new file mode 100644 index 00000000..ef9395c2 --- /dev/null +++ b/docs/documentation.md @@ -0,0 +1,28 @@ +# Documentation Overview + +### Configuration + +TORCH is configured using environment variables that control its behavior and integration with FHIR servers. + +👉 Visit the [**Configuration**](./configuration.md) for a detailed list of environment variables and their descriptions. + +### API + +TORCH provides a FHIR REST API for extracting data based on the CRTDL. +It implements the FHIR [Asynchronous Bulk Data Request Pattern][1].. + +👉 Visit the [**API Documentation**](./api/api.md) for details on endpoints, request/response formats, and usage +examples. + +### CRTDL + +The Clinical Resource Transfer Definition Language (CRTDL) is a JSON format used to describe cohorts and data extraction +rules. + +👉 Visit the [**CRTDL Documentation**](./crtdl/crtdl.md) for a comprehensive guide on how to create and use CRTDL +definitions. + + +[1]: + + diff --git a/docs/drawio/ResourceLoader.drawio b/docs/drawio/ResourceLoader.drawio new file mode 100644 index 00000000..8ea0c7d5 --- /dev/null +++ b/docs/drawio/ResourceLoader.drawio @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/.$cascading_delete_subgraphs.drawio.bkp b/docs/drawio/old/documentation/.$cascading_delete_subgraphs.drawio.bkp similarity index 100% rename from documentation/.$cascading_delete_subgraphs.drawio.bkp rename to docs/drawio/old/documentation/.$cascading_delete_subgraphs.drawio.bkp diff --git a/documentation/.$copy_operation.drawio.bkp b/docs/drawio/old/documentation/.$copy_operation.drawio.bkp similarity index 100% rename from documentation/.$copy_operation.drawio.bkp rename to docs/drawio/old/documentation/.$copy_operation.drawio.bkp diff --git a/documentation/.$torch.drawio.bkp b/docs/drawio/old/documentation/.$torch.drawio.bkp similarity index 100% rename from documentation/.$torch.drawio.bkp rename to docs/drawio/old/documentation/.$torch.drawio.bkp diff --git a/documentation/.$torch.drawio.dtmp b/docs/drawio/old/documentation/.$torch.drawio.dtmp similarity index 100% rename from documentation/.$torch.drawio.dtmp rename to docs/drawio/old/documentation/.$torch.drawio.dtmp diff --git a/documentation/.$torch_ResourceBundle.drawio.bkp b/docs/drawio/old/documentation/.$torch_ResourceBundle.drawio.bkp similarity index 100% rename from documentation/.$torch_ResourceBundle.drawio.bkp rename to docs/drawio/old/documentation/.$torch_ResourceBundle.drawio.bkp diff --git a/documentation/.$torch_ResourceBundle_cascading_delete.drawio.png.bkp b/docs/drawio/old/documentation/.$torch_ResourceBundle_cascading_delete.drawio.png.bkp similarity index 100% rename from documentation/.$torch_ResourceBundle_cascading_delete.drawio.png.bkp rename to docs/drawio/old/documentation/.$torch_ResourceBundle_cascading_delete.drawio.png.bkp diff --git a/documentation/.$torch_v1.drawio.bkp b/docs/drawio/old/documentation/.$torch_v1.drawio.bkp similarity index 100% rename from documentation/.$torch_v1.drawio.bkp rename to docs/drawio/old/documentation/.$torch_v1.drawio.bkp diff --git a/documentation/cascading_delete_subgraphs.drawio b/docs/drawio/old/documentation/cascading_delete_subgraphs.drawio similarity index 100% rename from documentation/cascading_delete_subgraphs.drawio rename to docs/drawio/old/documentation/cascading_delete_subgraphs.drawio diff --git a/documentation/cascading_delete_subgraphs.drawio.png b/docs/drawio/old/documentation/cascading_delete_subgraphs.drawio.png similarity index 100% rename from documentation/cascading_delete_subgraphs.drawio.png rename to docs/drawio/old/documentation/cascading_delete_subgraphs.drawio.png diff --git a/documentation/copy_operation.drawio b/docs/drawio/old/documentation/copy_operation.drawio similarity index 100% rename from documentation/copy_operation.drawio rename to docs/drawio/old/documentation/copy_operation.drawio diff --git a/documentation/redaction.drawio b/docs/drawio/old/documentation/redaction.drawio similarity index 100% rename from documentation/redaction.drawio rename to docs/drawio/old/documentation/redaction.drawio diff --git a/documentation/torch.drawio b/docs/drawio/old/documentation/torch.drawio similarity index 100% rename from documentation/torch.drawio rename to docs/drawio/old/documentation/torch.drawio diff --git a/documentation/torch.drawio.png b/docs/drawio/old/documentation/torch.drawio.png similarity index 100% rename from documentation/torch.drawio.png rename to docs/drawio/old/documentation/torch.drawio.png diff --git a/documentation/torch.referenceHandling.png b/docs/drawio/old/documentation/torch.referenceHandling.png similarity index 100% rename from documentation/torch.referenceHandling.png rename to docs/drawio/old/documentation/torch.referenceHandling.png diff --git a/documentation/torch_ResourceBundle.drawio b/docs/drawio/old/documentation/torch_ResourceBundle.drawio similarity index 100% rename from documentation/torch_ResourceBundle.drawio rename to docs/drawio/old/documentation/torch_ResourceBundle.drawio diff --git a/documentation/torch_ResourceBundle_cascading_delete.drawio.png b/docs/drawio/old/documentation/torch_ResourceBundle_cascading_delete.drawio.png similarity index 100% rename from documentation/torch_ResourceBundle_cascading_delete.drawio.png rename to docs/drawio/old/documentation/torch_ResourceBundle_cascading_delete.drawio.png diff --git a/documentation/torch_backup.drawio b/docs/drawio/old/documentation/torch_backup.drawio similarity index 100% rename from documentation/torch_backup.drawio rename to docs/drawio/old/documentation/torch_backup.drawio diff --git a/documentation/torch_delete.drawio.png b/docs/drawio/old/documentation/torch_delete.drawio.png similarity index 100% rename from documentation/torch_delete.drawio.png rename to docs/drawio/old/documentation/torch_delete.drawio.png diff --git a/documentation/torch_pipeline.png b/docs/drawio/old/documentation/torch_pipeline.png similarity index 100% rename from documentation/torch_pipeline.png rename to docs/drawio/old/documentation/torch_pipeline.png diff --git a/documentation/torch_v1.drawio b/docs/drawio/old/documentation/torch_v1.drawio similarity index 100% rename from documentation/torch_v1.drawio rename to docs/drawio/old/documentation/torch_v1.drawio diff --git a/docs/drawio/processing_pipeline.drawio b/docs/drawio/processing_pipeline.drawio new file mode 100644 index 00000000..97a4e8f2 --- /dev/null +++ b/docs/drawio/processing_pipeline.drawio @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/drawio/processing_pipeline.svg b/docs/drawio/processing_pipeline.svg new file mode 100644 index 00000000..38705f40 --- /dev/null +++ b/docs/drawio/processing_pipeline.svg @@ -0,0 +1,1188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Core Resources  +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+
no
+
+
+
+
+
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ Error +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + +
+
+
+
Execute Cohort
+
Selection (CCDL)
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ Which method? +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + +
+
+
+ Flare +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + +
+
+
+ CQL +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + +
+
+
+ Fetch Patients +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + +
+
+
+ CRTDL +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Resolve References +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Cascading Delete +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Extraction +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Write out Results +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Fetch and assign Resources for directly loaded +
 Attribute Groups
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ fetch and build batch consent  +
+
+
+
+ +
+
+
+
+ + + + + + + + +
+
+
+ NdJson +
+
+
+
+ +
+
+
+
+ + + + + + + + + + +
+
+
+ yes +
+
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+
valid CRTDL?
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + +
+
+
+ no +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+
+ no +
+
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ cohort given as parameter? +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Fetch and assign Resources for directly loaded Core Attribute Groups +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ initialize patient batch with preprocessed core data  +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Resolve References +
+
+
+
+ +
+
+
+
+ + + + + + + + + +
+
+
+ Cascading Delete +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ Update Core Data  +
+
+
+
+ +
+
+
+
+ + + + + + + + + + +
+
+
+ yes +
+
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ All Patient  +
Batches 
+
handled?
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Resolve References +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Cascading Delete +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+ Extraction +
+
+
+
+ +
+
+
+
+ + + + + + + + +
+
+
+ Core Resources  +
+
+
+
+ +
+
+
+
+ + + + + + + + +
+
+
+ Patient Resources  +
+
+
+
+ +
+
+
+
+
+
+
+
diff --git a/docs/drawio/redaction.drawio b/docs/drawio/redaction.drawio new file mode 100644 index 00000000..596f083d --- /dev/null +++ b/docs/drawio/redaction.drawio @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/drawio/reference_resolve.drawio b/docs/drawio/reference_resolve.drawio new file mode 100644 index 00000000..452495c7 --- /dev/null +++ b/docs/drawio/reference_resolve.drawio @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..6f6bc57f --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,68 @@ +## Getting Started + +### Quickstart + +Torch can be started with a single command using docker and by providing a configuration file e.g. .env. +See [Configuration](configuration.md) for details on the configuration options. +```sh +docker run -d --name torch -p 8080:8080 ghcr.io/medizininformatik-initiative/torch:1.0.0-alpha.7 --env-file [/path/to/.env] +``` + +### Install prerequisites + +TORCH interacts with the following components: + +- a CQL ready FHIR Server like [Blaze](https://github.com/samply/blaze) + or [FLARE](https://github.com/medizininformatik-initiative/flare) for Cohort +- A FHIR Server / FHIR Search API +- Reverse Proxy (NGINX) (set by configuration) + +The reverse proxy allows for integration into a site's multi-server infrastructure and provides a means of serving +the extracted data. In practice, it acts as a **sidecar container** for TORCH, handling the delivery of generated files. + +### Feasibility Deploy + +For simplicity torch is integrated in +the [feasibility-triangle](https://github.com/medizininformatik-initiative/feasibility-deploy/tree/main/feasibility-triangle) +of the feasibility-deploy repository, but can also be installed without it. + +## Transfer Script + +TORCH provides a companion **transfer script** designed to automate the workflow of submitting a data extraction +request, polling the status, and transferring the resulting files to a target FHIR server. + +The transfer script will: + +1. Take the **CRTDL** and generate a FHIR parameters resource to send to TORCH. +2. Execute $extract-data operation on the TORCH server using parameters resource as input. +3. Poll the TORCH status endpoint until the export is complete. +4. Download the resulting patient-oriented FHIR bundles into a temp dir. +5. Upload these files to a configured target FHIR server using the `blazectl` tool. +6. Provide progress feedback and error handling at each step. + +## Verification + +For container images, we use cosign to sign images. This allows users to confirm the image was built by the expected CI +pipeline and has not been modified after publication. + +``` +cosign verify "ghcr.io/medizininformatik-initiative/torch:v1.0.0" \ +--certificate-identity-regexp "https://github.com/medizininformatik-initiative/torch.*" \ +--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ +--certificate-github-workflow-ref="refs/tags/v1.0.0" \ +-o text +``` + +The expected output is: + +``` +Verification for ghcr.io/medizininformatik-initiative/torch:v1.0.0 -- +The following checks were performed on each of these signatures: +- The cosign claims were validated +- Existence of the claims in the transparency log was verified offline +- The code-signing certificate was verified using trusted certificate authority certificates +``` + +This output ensures that the image was build on the GitHub workflow on the repository +`medizininformatik-initiative/torch` and tag `v1.0.0`. + diff --git a/docs/implementation/cascading-delete.md b/docs/implementation/cascading-delete.md new file mode 100644 index 00000000..6634a5cf --- /dev/null +++ b/docs/implementation/cascading-delete.md @@ -0,0 +1,136 @@ +# Cascading Delete in Torch + +Cascading delete is a critical feature for the Torch FHIR data extraction system that ensures referential integrity +and proper cleanup when resources are removed during the extraction process. +It is done in a queue based bidirectional manner, in the directions (parent → child) and (child → parent). + +## Problem Context + +In FHIR systems, resources often reference each other through various relationship types: + +- **Patient → Observation, DiagnosticReport, Condition, etc.** +- **Encounter → Observation, Procedure, MedicationAdministration** +- **DiagnosticReport → Observation (results)** +- **Specimen → Observation (derived-from)** + +When resources fail validation checks (such as must-have conditions, consent requirements, or profile compliance), +they need to be removed from the extraction batch. +However, simply removing a resource can break referential integrity and leave "orphaned" resources that reference the +deleted resource. + +## Parent Child Relationships + +a parent-child relationship in Torch is defined by the extraction process. +A parent resource is one that is extracted first and may have child resources that depend on it (i.e. a referential +chain). + +- **Parent**: A resource that is referencing another reference. +- **Child + **: A resource that is referenced by a parent resource, such as a Patient or Encounter resource (child) being referenced by an Observation (parent). + +## Goal of Cascading Delete + +Remove all resources whose referential chains are broken due to the deletion of a resource. + +## Approach + +1. **Identify Parent-Child Relationships**: + During the reference resolve process, Torch identifies parent-child relationships based on the FHIR resource references in + the reference resolve. +2. **Mark Resources for Deletion**: + When a resource fails validation checks (consent,must-have), it is marked for deletion. +3. **Bi-directional Deletion** + - **Parent to Child**: + - If a parent resource is marked for deletion, all connections to its child resources are removed. + - If a child has no other parent, it is also marked for deletion. + - Directly loaded resources have a parent by default, so they are not deleted by this step. + - **Child to Parent**: + - If a child resource is marked for deletion, it removes its reference to the parent. + - If the parent has no other children: + - the reference has to be checked for must-have condition + - if the parent has no other children, and it was a must-have reference it is marked for deletion. +4. **Cleanup**: + - After all resources are processed, Torch performs a cleanup step to remove all resources marked for deletion. + - This ensures that no orphaned resources remain in the system. + +## Cascading Delete Referential Chain Examples + +✅ = kept +❌ = deleted +★ = must-have reference + +### Example 1: Child Deleted, Parent Kept + +``` +Patient/123 + └─ Encounter/abc + ├─ Observation/obs1 ❌ deleted + └─ Observation/obs2★ + ``` + +``` +Patient/123 ✅ kept + └─ Encounter/abc ✅ kept + ├─ Observation/obs1 ❌ deleted + └─ Observation/obs2★ ✅ kept + ``` + +### Example 2: Must Have Violation Results in Parent Deleted + +``` +Patient/456 + └─ Encounter/def + ├─ Observation/obs3 + └─ Observation/obs5★ ❌ deleted + ``` + +``` +Patient/456 ✅ kept + └─ Encounter/def ❌ deleted + ├─ Observation/obs3 ❌ deleted + └─ Observation/obs5★ ❌ deleted + ``` + +### Example 3: One Parent Deleted results in all children kept + +``` +Patient/456 +├─ Encounter/def ❌ deleted +│ ├─ Observation/obs3 +│ └─ Observation/obs5 +└─ Encounter/xyz + ├─ Observation/obs3 + └─ Observation/obs5 + ``` + +``` +Patient/456 ✅ kept +├─ Encounter/def ❌ deleted +│ ├─ Observation/obs3 ✅ kept +│ └─ Observation/obs5 ✅ kept +└─ Encounter/xyz ✅ kept + ├─ Observation/obs3 ✅ kept + └─ Observation/obs5 ✅ kept + ``` + +### Example 3: All Parents Deleted results in all children kept + +``` +Patient/456 ✅ kept +├─ Encounter/def ❌ deleted +│ ├─ Observation/obs3 +│ └─ Observation/obs5 +└─ Encounter/xyz ❌ deleted + ├─ Observation/obs3 + └─ Observation/obs5 + ``` + +``` +Patient/456 ✅ kept +├─ Encounter/def ❌ deleted +│ ├─ Observation/obs3 ❌ deleted +│ └─ Observation/obs5 ❌ deleted +└─ Encounter/xyz ❌ deleted + ├─ Observation/obs3 ❌ deleted + └─ Observation/obs5 ❌ deleted + ``` diff --git a/docs/implementation/cascading-delete.png b/docs/implementation/cascading-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa7a8985172ca7531b3fd0fabc0bf48236b7ef5 GIT binary patch literal 62828 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੆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%0ADEhp{PaDJ0VU+4uu~ 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 literal 0 HcmV?d00001 diff --git a/docs/implementation/consent.md b/docs/implementation/consent.md new file mode 100644 index 00000000..6ea7c08e --- /dev/null +++ b/docs/implementation/consent.md @@ -0,0 +1,73 @@ +# Consent Handling in TORCH + +TORCH implements **privacy-aware consent handling** to ensure that extracted data strictly complies with patient +permissions and applicable regulations. + +--- + +## 1. Consent Representation + +- TORCH supports the [FHIR Consent](https://www.hl7.org/fhir/consent.html) resource as the canonical way to represent + patient consent. +- Consent records define: + - **Who** has granted consent + - **What** data may be accessed + - **Purpose** and permitted actions + - **Conditions** or time limits + +--- + +## 2. Consent Evaluation + +Before any data extraction: + +1. TORCH retrieves a consent key from the CRTDL +2. For a batch all patient **Consent** resources are fetched from the FHIR server. +3. For the current extraction request the valid consent records are identified based on: + - Patient ID + - Status + - Provision codes + +4. Shift start of Consent by related Encounter if applicable: + - The assumption is that consents are valid from the start of the encounters that have the start of the consent + within + their encounter period. +5. Calculate the Consent Periods: + - order them oldest to newest (by Consent.dateTime) + - for each: + - add permits to the current consent period + - if denies are present subtract them from the current consent period +6. During extraction TORCH determines: + - Whether the requested resources lie within the consent period for patient as calculated based on the CRTDL. + - If any resources dates are outside the period, they are excluded from the result set. + +## 3. Enforcement in Data Processing + +- Data outside the specified consent period are excluded from the result set +- All enforcement happens **before** results are packaged into NDJSON bundles. + +--- + +## 4. Integration with CRTDL + +- CRTDL definitions can reference consent rules directly via the consent key in the cohort selection. +- This allows **per-patient, per-resource** consent enforcement during structured extraction. + +--- + +## 5. Limitations and Considerations + +- Consent records must be **up-to-date** and accurately reflect patient permissions. +- TORCH only supports the use of consent keys that are defined in the mapping configurations ( see [Configuration](../configuration.md)). +- The consent check is always defined for a specific field for each FHIR resource type. If no consent field is defined for a resource type, all resources of this type are considered as consented. + (see the specified + fields [type_to_consent.json](https://github.com/medizininformatik-initiative/torch/blob/main/mappings/type_to_consent.json)). + +--- +## Summary + +Consent handling in TORCH is: + +- **Standards-based** (FHIR Consent) +- Per Patient and per Resource +- Only checks specific fields of the patient compartment resource diff --git a/docs/implementation/consent.png b/docs/implementation/consent.png new file mode 100644 index 0000000000000000000000000000000000000000..dc39a64ee8780796135ea9ce2d3e7bfafad6f1e3 GIT binary patch literal 263281 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%0D@KV66#~kZ`{DuHZs?wKb1- za-}x{@F+`lAsx%WJvu$^RTJEvn>qjv#>kc8j%k1Ab&ku>E}BGdq`cn^ZACIR~Oy5QXMUE?Y<` zflx|;-OK>gH7F1nHP9BW=yp5FKf}OKQCaFhP29^*0d0W{)fqNtqb7|U3LR=6m=u9W z>qzKXfoKLwtxiF^yhF( zk&I}=(G$0IJI7E}-m8jxYrwP4iqcYf$zCa-#y!*aaWXeP(;<>iujWdbItQeFBH~Cw z4z>6foY-P#jqtJ0&&nwtD!NU)@y&b%dBW8BmA@P=3Av86v?zGcou!}8HR~;bL3~Vo z*JtRPZK??Y>ZadS1Ibj^i#=e7ta9MI1_mmSm;XZRLB(7vDl9^Lkk?;Bd-$m?(FSMy;V8<-jgl9ra#B$&UPH>QJno2Xp&kmCojtp%Ac(6KYxEZMrW>>vF@%hH zQgW?@D*v2UvMXj)^HjB&ZYRW{#LAlGcdEi}2UprZ9ZYL%)gArTjiGDe^0trQRG69( zjTK24D*4{i-*fsb(9N(kYl{jgM3Ik9X*}Gtfmk-a-tz%E@(x|tG;*X{7o`wDYQdWi z&ib)t4I|a(=I1U3c>@?KF&wiz5lAv(m0ITg6T z7I*LZr+0Vp>d3p!Tb=6cU6eKKxv4}WRa8i1Q09oQ{`yLp$hCp#mc6cgOB`jZk6K-> zSRR;0h1@U;geVKM8oH>yO@D9x`c5s#E0LI0%YCNdotUpQ12@U>IKE+K0%sJxHsXk- zF2KgM6C}!OZQTN1ogNuqHa3eo!Onl0ZDTqm(<~`)19aKnUP~Vwe#pdLj@)tmEvl8$ zc(X_~ZkBp`kveau>z3!bBrvvML&RX{#Lq^t`!GO3ZlucnXp8gE0@|sXkY{Gzb|cCa zI0D-{L^ot@#*`PoaTa%9(!LkW96Gp}`f5+qsoxnCFDa8E6C2LXQ2$`}FPwlV|Iw4($0_#p zJb?8^Dv5&4&&>QZrLb)bE1E)wL#vf%-^Vz%s@I|Dtfh|1@Ak$0BLEFdH|2KJ8|AtDQ}1*Dl@88M z77Tl-OoR(ob%et&v!*L4&F*Ja`c@)C9 z0cJD}SbkJbBS@+I4;Euyl2J>%q43AEl~9B-nZNyPAWEn!{APwncVyxra^PI~*~N1;aKb7=ul1H)s%k2=*PwaU zS(njvyWvolw6t`XHqHC*_q3co1^}Vqd;YgwUq>|nUVYAUem7kd^BkoFlzYe>Y?nfa zoFsWPSp(_LL(5GUUm8=7O(fsZH+XAYnaNFoc_|_Y#)kZJ0@Tla{P+O$?tas|D6qaW zii`)C7I%LCDg6BWyfB(+ch2sg*!UUt`Hv5kssMnjJPJFbO0IK$p9&^koTtMBHs$!Y z{d8|7DW^huRBY#p55aVxTq_IOvvbqZf2_G1T>NuKm2toU$DB*a+no;j8laW#4UoXU z?W%5|^!_Kk>bkLGydWv{G`K&yRDO3xcI(V`Kzk7m0I+hLre+6YmBGLUhVL<&{9{hz ze|&Mb$>g7S1jea1$yQzamjHMG7bt*j_jB&1ayBmmvlvt^16_@zi$Fu*?lS-V!}U9q zuEq!DCL%j}?iw(Gfbg8KKDMc;k?;5~LAm_`z{S%OV(B{_HmwFgOZPRB-*dvGqQ}<1 zoW~R_b___gXCZZVp7*f*(Rcf10^4bc9sKY6_{lF{xB$Ld{Cacu=9uf>hvv&Z{g+=? z7}n%%;N8WJ+fs1 z_GE3kA^a~1GlQY@ylx+?`d$(vs1W=$vnjNsPw9LBZaCVyPlj`jasx>Es{6m4?(m+{ zQC#w@c%ITU3ycSqokniMo4CQp#&WX!DMNE=8oPV`9nYw~ybS=Sc{1tjLp_u#i@KvMj}11ZK5a|9 zHPa&rDe_!a4s>)RseGK9n|m4{-SOL2i~qo`YSy8(x8I`XWxg}_+jGHREz7PJEpvCh z9hy#8;p6byJod^A28!GmdaD(jGWaeo%IurPv_PN{cOy*tU4!I*pG~s~-oWfremdqj zx~UcvqI2*Sj=x5@hIRIiDK)z`_5RB@mhxZsU*CH}{^?7qhp&TfAA569u*Un1H`Boo z7M{Av;eqnhstL^1s)<%-0*8!(LY2bma74^Rvh5$Ld-hT@{`gT>M$M5Exh_g$6S0Tt zAWu+G+x}X@il!(#xV*zN&!md~efk(Dm5$WPmFLe<3K&V~U%vb2TYmE?Rt#W@E_%6r zlsE68VmNkv?=}zyhYsnMG#yzg8+xu@#(Fi5KN2pXepwFLaAX&#-@I-IL4232x{}ngECUpRkDwkREDo>u^*TnBbvAm>p8dX#F6;Mo@~kFh_!L)% zeF2Q8F=wj(1nV!0)E%Q5w-rz9X05j(EF8;|Rhqu^%f}Y?ADr;sHu}8h`}&GEcq9M{ z_{LH=rTRPfu^>_zd4IjceyTI<8Iok|b+x-T3lY8w#zuE@UEJziEgI#&XNa44- zefyc>B2h{F26%c}gui#nbJS`!{PC~8$msGUsI`$B#CuVt?9iNmFibN^PUy!O{2S4N zQV#>umZoGLqrcPJCqwln!0*u0!myKQ1FY2q?!$J&{a-C`)3i>W9p>su;o@rE?~MKT zADgjzf(f-AWy!*nWmTUZokTsP97Q?>|O?@kuM&UBfnc-!~)1dNm4oo`>?hPiNJtD(DnmXsk?B8&)vqtSHU|4KE(r)SrLdXQX7*6E@QpsL^DkNv={{zocytOdf|sI3ck$@3>tp_)!qD8^pj!wE)YE^=D@E7DByRk_z!VfEAMPE z<^jdRGXh|IAQN`@SD1Q}r0Qn#-(h3|U`)mEyZ?mo7zM@^ch_IS$au9A5C{JSMr{g= z-NRO5yD+||(%FZ<#_`wo|%0;I)*->M{^2tXx`xCtcF>@dxn%AoJ2 zl7YyLcgo5Kex-|of`s=QQxt$WMMC`Y*i~N!Y^LP0_88xv6cyqdr3kBFf{+J$`LATT z>Y0P(k^r!rzX$e_s=RX&wfoO4A}`e0se=Hc2F)UI;8z%Br4=!*F%q2ua4I>+P9-yo7DX@ zx92Bau2xM&x|BzA{_3n8^hphZlxaW4|3u8Y(*R;%r_YpxHF*9~g#Fy^e~4hD76775 z)k!*<9oj4E10ZJjV~@-I0>nRs%-=u7!~#5(^G3Sw;*Lp|&*H+;?EK^uFH9d5z#sni zr+>*0yN~dx@|aL}|5MWOiYy{8Q#UmTd#JTcr9+Ewj6| zpVZo=X%OJWsc=*8G96DcH6SRoV$yz!%->P%FGO5&qliVq0V$=O*8oG`DL&c_AsI&C z+L-@gU!%PM5v$f0&0Tij8`Yrdlv-hK#%kbV3;*2fKeq9YMe>dU5-YwkjeUoR0oUpb z)JYWUE^rQBXZ1f&Zm$3Ulfox+*4=%?FakLBHsQVd#C4v=^ z_U?zX`ELLM(8zZQh=7IM|H`_H6qi$~>L3Bxh22B_ufRGBxNkB-Z+|k02D3}bbCsvh z2pZj!_y5%!e(bXj$i__IGW=V#c1@J{{lMvHl?iJ5l^XrI-hYsvi{f>JBL&00dmR8K zFyf;?Xu#r$8=3a(FU{TG!T6s-9dZl~x++r2pw0s|En?iH>Fp+$Bk{&mqQkZe793 zUt;t(%%Ln2(-}V9`R#{byeb_`!@$+tldHeJx_|%vClGG?$yoY6xXv3YeCF!~TaqwQ!0xl-8D7?G&s@QQzZ^UOj@*7vLT0Zw5f1CuS zbJd8L)f!7XAqCCN&8IkSGlDV5iY%w$%B~`7&Dq|Msa7qqldq=VJn}yHcH221!xGW_ z`tr&)?Q=q*N&hb+GryrrfHqHLf9aZT1`6A0i$=WL;l-#u-3loHJgC8ubP^4iq&Y zr!mKLxvGR6EK%O`_Dei`_VjcAAqxN7uYihtvpW1v%KgW&V&Y$FU^RQ}$>Rn1wpQzN zJvVFo)@225?j>(;EXH{)4z{$!33L#7)t|+T)c9*=YbCc!->L9feyyEA7S_+}U+|u$ zr$A$zP7xQpFyVH&ouJHr1LCJD9|cBpuJ{jfT2_C5{2hORT{nNKy>8067AHp7*LN2~ z53OutVVaRA&QCN(vim^~`2op*n&SIk>t`CP5@~@jXPc8?_m02x{k$LB?}Vxl_QnpE zDLm9-qx!58*afa;2aPAB)%aZQ3^9JbhwO3l-R+aKozFWk=b5{GmfgyYEB(}{pf<4= zeckz|j+(l*cRU_)BL`nDvTEl!sh`&pZ(qh|sp=9G>%{6fxSZq9f~4jRlq(lOR@u1lWQpPh@Y3f~~YrtoYr^;j z$yEUn0mRh@1HLo2)12@Rp_*A&4z-PPiDrGZoE%$-c7Ejd-ef4Tv3VrZHp}tR8AefjnKYYprB2MjaErNI0 zs3$>D4yvGVn>6BjH%!-%XFEDQKDUo|t+tIHCPovL9(QuEMjImbalvTw-O&z6+pOl&Mx;Vh_Xa{xLbIU;jK#GR&kmN*tE#1ZW?{7c%nB^e%Y>s}~H-GD?yl#e~ufyPiqvG;sW;ZfO>p(*Qer0x8FV9#= zJ%LR9ZLm$L1gAu@2t^31IRGnt;kV6eCLlL&~J zyvGcWcFMUwY%febfBt+0nC}!(bTi8UYI8GJPqe1?LC=|C?6-HfwgP8>6Ic{!0t;d# zqNk^)U8HYZR?fRUcA+^JYD1-nZVzB0A&uxi4ZOIzRkcNzvu>jOqSl#@Wr* zyP{`_ui+rp;-K}ziMUn>J8t$90SoIl=n^=!O@0_}w9W(aeD$hkNWR+irq?rq*OO`) z*I?hLB$HG=O&*wG$k~9E05%2pis777)%p8paxd?5#x3469jbJ@v>HeVeZIoe`_M@R zc8=mOan#eeX=MpM3ct;`^p0JH-Ff%G&YD*N?Y^#j_$nfe{VeKDhFbHwz z%~#OL3zw1+BOrdtb8l)@@85r`eU>1FP~<)HxCTrnNjeUm3*QHDM@}uwvMK7w_HhLk zQA56cG)G=QZ4oE5y-@Rg`Qq-=ojs3Gi=Kk|d1)MqK3|aQU7F%8Z#3fC7en-b5x(;t zQN7cL4<3wB@W$Mgne{y8p<>g1oK4yxDdDuZWG84otSd{i?S;^-H?HH2y&X168#Tuz zEJEmxpH($1a}s5jb~w9zOyur$!%~OjiNaKYwW4eH?!7dw^6J2RxY(ziuwXC-+tYy2 zxc|2d3gnODXDz~#pZ`DhzA`MzZT(w7L`6kKKm-H}1Ox<>kX9*CIwS|_M!IK2R8&$@ zx};;Io57&FJEUP~n1KO?c^6yoxX;=9zd0Y@>pI_Z+AFq^>#DtJz#lri3C@JF#PNz!@h$*2Och5O2 z)@!kNY^}o3b#FAqA5V)nkOfXEcuIskUco`d+z@K{4Yzr1S6|-ARF#HCaD3;7SS#ND znpG#oa1^5J;p;)gNWxoQQCOg(XXdcFUZcIuQ^!%@$#vw%TW^Ihk*$ z-j|o^b43>#w34ebv(RK38mba)apend&ZFS=*P<*(V3WD3TcqdOP28~n3h@_zFUGdz zXA^(HgvW6wGS6w&hL_?}7DUcRN`P^+zv*}}HME2Jwe$N*exfg%NC)ZwGyx*$Eg!p3 zjBHF@D>HZFIOk?^AfyJt^u#2Hdm!ca>#;`*k$buTqXYYIHuJJ9UJauzt@BNqpG;c< zibv)>oT*;udF-9%>(`Q@teSe=8LHAmD_@9cC6cA1E?@c%m(GD=om18F)4n(RT57}^ zG=+;P!D9HGa@J=%#91|pv^%2Zseb(U;T(dEd*CT}=Pkr%cKOG*lGn~(MO^EF(kIFi z^ce)swpdjR*Qkm?$Bl_9EWYpju3pgnz-Q{!BJ@u0K?3ko00+^CHHCy2pA?hjHNPUHd?n@8n}@nJ89$0E&RK!yDJOJ16!Ky<5BQLS5NNo zqboHV)FjB{oO*Sl71-_Az*iYjH$6jrL&jm=9~`udETeULH=WLtUnWhlnCH<8?%MUh zlc^oIW15qZx?N#N-J2Pf^7;akF3wYd{E}y4|Mtuhl+$CAN>EMg%&p6*h~}(IY!L<| zp~-4J-8J@0y98nRn=w4&iZO5t%f}oZn**jXJ#GjnlcBP2D1nz?p!Ab8WKGIr?2zZ< z5Q$8oeLwSWV)H;l$AeHvOe2pp((Xx&%JQR7kn~|A3>a(ho+^|0D0p2M#iCv?L%DYC z>eY2YlFR(9oYmZ>-HjIH*w@4q^+55kjFwSaoo->vRLgHCKx463{iWgZ)rG>5dO#fO z&?{H2w3j*A2+Wi}&DP$*L?_8T{>Aq}T&%S)Q1Tp#ehm8qyKsuN$axx`|`Q)hD#=gYs9DAcx?ku@7R)ykC ztvZn)?#D&Jk@9%Obq9K2YR2ARi7b_ zX9CGC1ABY+n46Ci@8=ndjPosn87k#-&XiZe-g5@)oxzCd#ls~#l;I&iYT*^OE z{Gm-0hOoVRuL$Di`84V2pxHJP0gRJH0SDw#!`Hh5DBhz6KHKGpCP~erZ09v7cK(aI z>O^uI!S$Oimaiu>n`#FkH!Y>Zc7Ln| zut?Eksc)Q|{9q|KbB*szbbtZ{tEr8T{|IiFh31kt(MIWWwa80QA7uF1c6vz7*HVzSLqv5Dz+MbbBb0_BS|{S1g#JZsXCZ}|@v+YIC(KwSstBfGoUHbh>9!&3C+oh*(;^-!R4c$p}Se`a-98t!UI zZ;k?S?WqdMz7lk8!;zhmG9P(4s8Awt>nMfI=^G-~_)|$8zfj-HF&E)R9h}fEA zM$%(vkD9Q%+sVmXoaxU`SIl@S#|o*)Sdyp2bSWHNo%EuT(00p^Q}MzV#7vM1@WF(I zU$jNe0Qs}r{{Dkz+wl6WhpPj+ai@RZj)0r8X%d&$PLbRq&$ZCZZjK+$RAQMON{vHV zl%l5ly8?fZQq*d)7;U46Tyl`h#!eactxDZ8so*2t{&oW-$R`VVjq_ra4ide0ogBto z%LNRz4KTK?f!&^coidT7dV++p7G3f{XK;(ax~p>5nYQHnhsHQ-gbN9A^xsW zNTS-|iR4#KIhVX{vh(p_TtWxEPA{B|(8m#X3OVftxUM#xFMr|#Ap_dSYJUo^vnF<> zUZE-Re(L=#^ozwNlrS`S653ayxoR6xVt@$Bpcb^!V%4Zfg2?NSbHCiotnp{nRFjM0 zB&&rjOqugK%%<(>u=A@OmJy9x18xIhB0FNb-Hnu!u$IDL3ZX46%kb@O`egT=?wH`% z`LM}c6&jdw#*i*dSrPwra0I%}uYa=>-@l(O}&k3_yvW0seKB8!_+_-n= zZy{aBEC3}P_y9)p@e`#&LojR8QrgVGtq6J*$!d4gbyZmfkI&www+K72qotpDMLvwFN=ICb!$Kf(3{aXJk z@#I7o^?R~3S3u85kiW3A+Q4Q%P6y@&}vU=lWxLty^ z1aYTeO1byyN`t0%TE|ADyQ=;epTNZT;+ZA5&9wIj=}d@aFEbO5W-!o-KK9ho1U=bp z=jcn%m`_W2jj!)TaeG5u1^RTWu<>c0mL*d%AqSOy=O{zI@LJ=l5oYZCXw0yYbiqcK z`k9Z@bM5hO^cv6R#tsd}Db*W^bajVqbya*`j+pxBQ$cb|j>|kMLW!FI6VY{xjgp`p z>2;lar9Rvk_!DX!i4=rxz13< z{cUd^=DFM)E%j46{BChB>HTL2rlxNVXkQ9tv53fvo&KD<8dzXdSwhWA6HmCY6bjTW ziKXV#dh4SW0XG7%PB2cG&ncRDf{$bCQE=5(CoK5PI_ZO>1KNxR9Iw&z`60EU7Cp~ihF8H zNq?)31Gp1ZILWP(OLV zjO5atTI1W!nAOQdv%Z`u_8LE0Ze%vI`9MLi2NB7f7m;EJR9sZwZ5zY|tP4Z$4#N?< zYKrRC7lP$RN;)%CJDfSCHJe&W=7-A%oI5N4qA?dwy}$zf>~h4X`gn}Z1t9(QAU@wyGfGgrrRW=4^=#@LC}?))ar zg-c3-B}!7I*WW@k9}+53C5q&?izzJ{%iP#gb>}e~dHjyr>;sw1^#%Gv@3)vulRgq2 z5sPqUQ@!cu^wwG4UClrCef=dE5=~aE5vi#>y-196=uh0akaj~Ps-OUY#lnn`ZU??bl>i&Iv)2D z1_JTMJ06=2rm8!h>n1Eqh)zipB_>8_|3xLtCbDXEVC!Q`nN=BTJ66UJa88pe4^_>t zNJyJMPD_a)v%9pONckO-t7GMqV91P_nPm91qN`s8LBgTo%Rf}S^xDD~w%B*v{|#XI z^>LI2A4FIAZr9%0)A!)#jD||`gKnv|&$M)Iz4g zVg%h9&BcQWiOJupU5I^D?TzNlrmQij50X^0hobJeZhlVD4P{ZMkKi(IhsM!H*|pB3 z4+GXkkKNv&2%g1(>d9vfRR=QtY!u;g32&OlUXN8Jz*d%0U~%_fo7uni6vwR&C9!wE zQR_W>_AII6SyS$aGe;vw)bTMipWD2D%^p~)BZa0Yu4shE$qAfx zB`Mc-SM`)Y%|vgXYoKcU1{!&}6bG2JS6Mwc+qI6e44z%W3F{u+o zI=b}Mq*S$A{7a>c3+Y)y_Oj}E&&8VGXnatj+CbXKQLt&(AXRdD}s^w=te07G6`w4L` za;9-C!dfJ7Sx=f43ZpIA0;jWrdc>N$2SQ9B5t&F8_KljXhbA(2WbI>4&0Sr%q@1gI zJTBT+`&NLgmq3OP+XI*U;6Ic>2xWSV_3&zDdz=-jH`(yOwfW1cIIuK;kHic%w-6Vo z-TMazsbG-JGm?vtgjBfp4eqIQ8s*MigUz9AF?vmxqE?#B@)Q^qlDwn3J-LH{mND#% zWWgrlPpD)(jWf)F>L$CIm%={;DP?UKR^s47{Ntt(K zYS^uC+nxZpg*A|@Cr+IB@b>NTVmo9=vG5oE7w;R6MiQ?aLrL-sS9m@p0#_cLrYDs|-55PDK2U*J`*r2C8|9X5VRAC-JO zk{_nZwJ3NspE)$Acs_DOmwZ~NCoUSauC>%SfiTt@!)zoqV5Hh?*s1dCn+6>8o4P$# zH=1Gk-O1Qb3LPJpS~9n*lC>TY?{e2;q*R9J{c+Qi>U*H3ciilfX1EZ22hhkVIeS^R zNV@P>eF6kbZIfJd`Ou}PU0HLy7bh(o6cuHmrEiqYi_<@Jgvr7)I)oeuwvW7K}86uOM*8IpEBqid}~e;Pm(1rE^c);Ii}uW#4XtnD>H}T z5uC+`LZN45bg}{7edP?_@1$6n`r_mS%SVRVc^j36(JXufT+6R@fWC28p&|;QOri$O z(QhP0b~fMXhlyFCHf|JJjC=qB0M$TN8}+Ryqsav>eHzHnuFZrHP)~I|6h0g@t9ESTbgA!5*jNl^ zL?s7mz?!ODU=%M#9wgx96zN?5k}uQ=X3-UMY55yK_nx|IOv!c$aKDE+PYWTJ3+q#8 zpXr-Z({7iykoxRRLeQpdgv)(r&QQqYi#roj@9@2AyIKpz_-PY8N3K+Ri8&t>jZ6Jz|9dSolbtY3v_=R~A57I3w0~m!~C;QAY)~+x?G)I$qvR<)xo+Y?Urm)o#vcJ3H+SuKXtZQU+_0 zgp(-+tcWL0n&I6U+C$f6^0Qc?AT-HDnjI3JtgFtu86LwtY zUhcVezUKAlFPy-eW5f&1cb1nbu{G8=is9lg8{`)##m%u0JuK%q_NgaED{fH}u$d+& z29z`PQZYVvzNq{hPC!ns?Zku5vEZI))7b)2XY)?8zKxL{9UUS}eFw`Y&4jdf0)vS) zQ59#CuuqxDpyu|@h3 zXQcIfFFUg7VHZGmWOyByW1Y+Z;Uqr)@pY;o_Yv?IfoAYmbg-Q-07y;G=#NW|fd+67 zJARwW0V+)pt7eG=(012VfQzCL3oz**ldiO|0Ywc4;DpD)5Jq-GUA&yXJCrxWU(|aG zE;bpW8pi@*YKevmmr+9;VeIiSk{`GYV^xKoH|D$V#HnOO^qg!oDLp>Ydu}vFt0X^- zMPVwd-6IY+nAg&nv^$>TBgQ=&M<|+PTW3rbBnTw&_Y-3(<8mV#ZnsBI2>3(H8R(0& zXedfGdN^|Um`l$@w|n$Op|T6%7Wwk%aN7PP{6^ww;%-RhoYDt-f|?l_dD$;(flxI@ zAeXyZKJXbf-v40AZ5GJ;JFBFF|4n3tZej%DEHd-g!UcIq}Av30Z z%-5#BY&r$FwKyann5MJnSoOq{uVoBCd#SaW9^GiVNA{oM0tk*VW{}q7nmF@Ez}%=Z zKGWIZl8Jh*dfaEit+2+x5Wzpa<;m z>ZFO<4-Y_vK2@6mRZ;9q1OO8`V7sol1CtG*P0l)hfQh{GxZNe3-dty@GukbJ#_Utk z5lW0gWF+zLn7|AAWkuw@cwmk8xy|J5TI|TB%b!SK;?DDKW@v!~#A9?T{J0$YQ~Bfc zVOk{?p%sRE!X2Q8_Rdvz^c$!H+lKo##0B^|dk8RHAB3<4k|YxdD`bIvX4F<)S_tD+ zGAXk6yjCZ>UfO)u3vHpI&OLG!J=s9k0%wbsr5q}p=OcG&CUYvIQ6Wk_Dm z1z!|cZm5#2YXDJ{gtOc)N=BXNj&@ugp9yVr^JNOt@!2S`hlC3V$@`kD$%zW2#y#<1 zl20~aWK_R}ND*b~%UAJP{5DyiukI@y5sOwvF?l)D0APtcqn{oDA7L3l$FyoL4VSWg zV_<2GkyxH=H9T*tb?)n)dYrLvFvA$R%Z3+O#^Gg~d`CLovN#ZF? z=fi~VKQeWnL%+8}FWJPYG_lTYYojRnTvuN{G>Hjoa`BS{$XnR9&wCS-04TNwXAxVG&D*PFj6vK}#{SjWObSqIib-7e+5$>tCfJl?(Q|SYvw=W{VxH9r ztzwWeRRgTWHPx8267Pir!zZu9(Wpp&dDZQ$guj#(qfPjAI0XaCZXJt1Obk|vO;is= zza#01e0s?EDH!nj1OxCSTvrZn9=MR%3zZTdc%I<^F38*kU=)$tSr`Ijc;>N1n%_Oc z=16u#EQ?Y-ntdI-Ah2)*s@~GLG#_a)62@t$SM{EZYv@tX+qyR?_TSIUlMoZ<&RUkA zy~$EZX}0T3EE=}r_bf4Do+L&2*d@ig??>%usZqZ>5FtH?eol&`QB(TI-F3cFVCq7 z+(xJ9+9Rf-;S&D7oHwqUO6!5AV5-?&7Ie6s;DN>mCG^X?Xs7tN%e8Rn+qx?wYTdY* zyEOmwRGR8%`ySSw)X2? zzIAxb5Kx;;lx65{^C^f_HW7+dbU$Gd(24M_YVvGc{{2$^vO}I13-8De7r9>4`1zH) zk^4ZQrBtc?LZjJMw&vBVS0@1Z6dGqi5EVy{RqO32@Riyj4LS^ee0|LUDlkQGA$@>} zTKnUhXH!y+em-PSUB3u8yh`<&Bl`wvFJET$6WmHM>;3%2ELWwk%qjPdY4_vB!FOj| zW!)6*aqW9?C67Y#u!)G=H8r-|veSIfogyCR0Qc4T_CzmNRF_Ixy3`&81>hC+Nk$Q_ zs^5CGTH3du!}Ak@`{NEcmc7`5$`TI3Kro99s}C)+X}3?kmu5tL!sL6(h*fkEWWo<- zA2HBPMmEZ?KpX;f_{yK_Bmw6N5RC4tS=$X&-JO{|yXNQ;Y{6nWD}pl_xyUlU2~j7R z8|vrE(BXC*9_BsYZ@;>8!)Y-S{>gf}P`}Z8WQ;l*c!*{@C*;ZnKvrbgW}Cx#O5_Qm zbA?N_M1i^igq_m&>2O*sy@NL~FLm*Yde(nM|gIG(nb7Ro#MAml*%{3}r&baG|F{dQmay`Hou1s2uC*q!!^N_8OPNHzJ-_~vg6X0&e)I-B3Fnc4FX!Y{~D zP6ND)iOH+tWULAvY9n8~8=SiO77ED#=%+AjgKw!!H#d_@(cf*lIZFS_OTwuN;L@H$ z0VpC|1j9rJ>r9d3>f2UIb|)YTuStC*E9(zB6G(A5uN&oR61H+1wF+CRc%8WHG;xkm z{?l8HqUR!KKp+gVJ2Ox+kiO1?sLjuZ`wTS*n`pX<*L9ii0d8Xi#x_|W95~e!fs{EW zd#u=cvRx)_*u%r4scA}r@*cy3c^%1YMuYCd-=0WvpOiWA-g6!zdv^GnJhS1~Uq-3xAxZidNX?7Hmx9M&_eQfw{MG>_Su z8dwNr$R|A&bbAb9qXLoK*B%nq3@|gfz_!J@CPIY@do`B&(5QJknUI1HBdo#2!1q2a z??u^vC*`XC`^iGyjbyl8us+gZR_5f>JcDF@^n^>h9A}C`eo!QFF%zi)+@GMP1zB^U z=jG>tyJ;piuJ^gn)V^mXNE*W>-;=%Ftq{6W!ypc^Bk7z5AqWZ9ygNyX3#-0mtB;9O zvsiX&gT6q{MDwtX!=7GY$ZLsUV)6&swr{vXS>5ffF*ossMvikHfZo&nWeqMy6S9ST*Xe-&;vVM zXU~&TcSvpS!ki=!a}$lPZ-Xcv3yj5&du#jvi{nD3wSN-hr9>@olrNZ? z2T!cOX3jA{;)MyqG9wFeN54#6Ul~k+u+aB?OOL_QQGCmi>L1 z&z-FQpcHiXZ=(Pz`SzmAf5F70JRru4e`C<5Jz0jfF5re&O5Vgj_*tp)|+=|FH z#|qlbDGI#B?qFshS)k^ZjF!v7T{%$o_9R(AZLI{a3p(TbnJi_Qqo7BQCn|M)>+QK~ z>ls)t3O3**qr;vcrJrHTZ4(j2wmY@PinIeejYl9yzkxpLo?QS0=F>crOwM}hGJo%U zvagc4n17L4Yizadh5U=p(DQxqIpah}kJf&;CO+}~9ci_No7@XEjnVf3t=XkIrxtCc zL6o;Htb5RS(ECs89aPuG`hJVoYJOCn=2z=2vnBc5*UY{&xEsG47lw+qbuurT=eK>d zl<=~!t3gXLT^|oOGs(K@?AML9=QBgb656tjd{(*DuQSE6?dw&aw3xC!uLvQT;6_iM zZf0efQ{>6vqacvl{gE4A~JDhy!wmN1c}@Jl6%ozyq^eP!noX0o2*P8pwxF! zXX_>_`I_;vFM&|ZbfUWSDP)exPejFT318K9p?=1on=)RGRd*WB@fOJ(j2xA({nKaGBPy9nkzIvyY z{cOAwj-ejb0XOh0u~xH2*;NWw&EQ*M91^ePUw;ZfufKoaU+Nqne$U(;_-RqEg4hgq z<8avctjyivbcld6`{TC-#|@fue744-a<8bY!)fzBXSlw5*)F&3!g$kV%8^8cr9ZrQ z!cs1)ezXG3If`HGG10bKwGPMf^Df{7sFsLZ|1vb%9S5$&biyCOa(kv{uIs~xue_mvYBJLg5W@U+Qd!8w2+DtE0^*>^ev(y;$Z? z%MfPE{z>g|-#n>z{H@bmc)6~kfo*VC#d~tuKD7qxte1C{rrZn@wWH}UE>opBiVdsS zuEDMxi|s2cq_D;fCZ^lD8RW~5;>XXNq#L|PmfLcgr41b*+to^wlQIS~)0zbqp&cMp z0HZf}0gb~}Eyy{eJ7a-=w{{tm)viJhhOt_DdoT;(o3RSC+87Oo)IZ7Ln} zMExqUvUx|0w)VUXoUo#>8-Gd24J8TUx@ zUN2%M;B{{;$s4E_-jM@bH#}5c=28kk4$IIQQnMKXyma<*HmY~Au+=fok%lpZ zeXaSziHm7^ofY)y!OTFNztf5k3`b)WAF9uM_|iPhS}9~;Ry}jT|9Y){ zv#&wF=F5yISG7vws%eH>RM~KDa0mRxxJKD_$P4Fy`pR>h69bT*s<6!wK3p(u$nLeJ zCm-P~__H?_s8qZ<80^0VAnfa7Kjf|_`+XlSv>&*VD@oYeav2k!0&fVq^@ICr9FwUR~4xLSA zLN-(06+F*?xY}~+ia(~bgT)<}|kpGU)p>z2l~GU3TB{gk2V}i}wDL zr>pG2sC&rJPFaY#sy+w0=ViPUMH55w%a(CI0Mj4;mX4cX8Q z1tE_jD6#;=YeDP{f_ZVBuWuLIj~8(Ho$CMU5vvy_2x27V$(<@zwml<68&j&N-}5a4ul zZBEZ|Og}aB><2f>CFSK5ZNW?x&ypL<=Z)5PYg;X9ppbrgOyt?Ui2p8*7b7J!jD5KV zK`))Gjrv-Lrja$ze+Wzx-iK?1-fubHMqtI+HM$^KoCpqU!5%+pphs_^`QR+*u znX9|JKmALhKX<^xr3nnVz4azJa6~LK0?gQL&Yn{hP-72*YE9M`E;P`(Q~F6}65u3^z3XJ=B421QLM#_Ih*)y( zRuxxruk{#()fmo2U1o+n-i<~@uMzZmy$C(={ftgwv{v_H%1`1oTU%q~`OozSD#lkE z-m{#4hPr;T%P1-G$v6shp2Lc_fsSWT%J0w__!tR+5YWrJI4a2AeY zQ?!E2&Ats}vV5K}Yi?7@r-yV1D;88116Qh+7?Ys9Z0FVduKqxgGo~_)pIHe?xI@|A z@aqrhb$go1kYdcX&fBOfb>9CpWyds=#hs6X!26tKLvW;6#j_E<{m0yQvPFO8Jvo4U z%n{9{Q{x9|lMu4EP6g@kleaB@V*6yv9UP*mu|}vzSpj?w7IN^3TTW|JWT;0?=c%c0 zJ&E9Y(sbqd0`91e(A_VW-Vj|;HI@BSJp@Z~$22<{j9I@tuQUC_q@6r@E$1BLvgoww zCi-rhZ7t$AN+LVZep1vM)RK0&S4nW?WO~mY4w>_axYo_#E8A3b;Z^}BQt|Avox7M{ zaB$x>NWf_2M+Qh)Yhw2L;-Kuk3J&EgEkq*e(A%PGw9tH6dJ?4ZgQRF#4(;!!A`0#) zJ*pdQA$qhJYsR%;X`(u#UcOmO&0{ZZiAWa6)@f`U(f_L6(zl*lxH9zBPQFpP5>Z}} zmT8Br2jJjNz^Bd>S&gKM5%GHR7E7Cw4;`WPE`d`K<|Eh=vk^*sb*XPwDlh5CJTCCKGi|~=Jc!;OEJV{5zpbP0xo7CSKXsIJ!5*M0-1{tijMkU0T>v7{izaG993pcrLL=U~(m`|bc3 z2s2cY+!)azGIZ;sxE33&)f#7|q{{yz|D%}6@y*Y|vgk%|_@+8+Z%4F^2R^@_Xo>pP z+Zppb+YV<1F4t6MuTC!3dSlAoW79`^GLOyyNhkplkT~oUH%pzZD_>@N>|teJKFNeC z&zZPoG^7$g>yB`Co9)-+GG`OQ77fus6BPW=sEOA&Q!}&GKckQPD2H(TUJ9|%y)(b^ zCdN+kkW4UKgK4m<{jNk-suOmSHjv9)x;6a({-~glvfM8GM6^nSGub43X}Fs}M(RR+ z;OMy9?28Sp`J3hUx~!S`7F-Le9E1||e5z~a_f*Y! z)MK@6nbQOWgb9&+%&*rb^ZIBmk*}@e>DFXDNcK*vc)J(%H&u}EXvz1q{v4Yr^+M8L zAF|^KP@k+_2yTnziFgPV^`PZtX{9eNSg=bS&4~AjhD;87ZY+DHb zcw6RR#lLV|;Un&y=ZXOA)b!dT$B@0y=9mE(%Xc%w*~I5n*|pQBb5W~=1b>-{ z?(e);qa#{CaiCNDwh0h-;4Cpe7RoICco_<=?^ui=Juza= z1zBJo0*&y%4LE9NOH7n+Pc>-K$`}*Zhp6uCw152OQ@;FVP~HJK z4pDVpzblaGcSrayc=R3V(>!NSvtgIU*)Q9^(ZO92Bp=<{6H$RcfZhcT7R>|`u7Mb7 zb)8&uOI>8exIr#(tyJEcDqv6!@4RWqIiI@L-D_4e{I-ac@j>;@#nLeIgRy@*V7#N} zZvhYR%Q~K4Up~JzIz7D^qw;En&tCU0%f{@0)K;IMW{>LnY|c1)68SGv4-lJm29Tk& z#2dFw=_3lVSWNoO*tBvV&^Ky5>o6!^L9wNS6i$k!B#x?8uai?76YcR9q7gq@faCiN zHJ@RJf!Ux>8Jp%YzfcgxbMeVv)}f>GH*&XqCm2BRuPZTj98^JpUzU;nE%El(I)v$X zkFt7>1c98hIwFF54S@iL2cRx@Q%tKoKI$Avo|%#T`a!6R-CW>fH@qp zaE?*wI(*2juCF)F%8pT)E;N$IK~g9)+%!-yrhc6yCY1hegJks)n4D0LdcHBjbscrJ zFK^n&S}WS-7jyhgRoMIt=ta3IQDg(uiiAXR{_Zp159O?2em4uJa4E;uRlfovqUMF ze339H|HCRg8T8xge_aAD{0AoKlU#Ur?t+&F8liT6){I~3FN8A_wK8w!7W^5w>x_AEIiO5i!IYGLzfvh5^2 zlckYsr=+?CV9Bf}LVwMZCA?oa?AWrfb5378xHy%BdnGf}^TeMk{Khx_#la*}giG>_ zQFJy9Fd5fV^&z5ymwM&jPqy69g*|2c!zxdFe2%iWyqLeEz?Vl#FwU1bh&wqWd^f}u zVN~9zu~TR^LK7m+V;gi0c7 zzBQLGXmS3GMmp;Hq!M8w1Bu{R`&Bt~P_2?H__aDo@Rwir1yokq3n!xN7=)4kWi^gU z1yE$JT>=w8h*Gik;dPMZl4FCg06#kgD*hLZ{Z4nIkMP>XisVCW_BGHKEhl(f9`lmi zUoG|{AU%*{2RraDR`Z{K%>$#rGW7MYs(f@-do|BU9Ul1}SZRlO%h_d60i6y zejOCYtc@vnO1c8?XO*0u*8cUc!%VP+g6B4a15NVa+e7@7 zdIJbXlR6vC{qdI{?Nzs7Dsg{(PzxX-KEBMl`SHoa%(2ix(ZiU!eeH6n2%@ zf7wo#nLtZf&+~2nMg5-Lm~uX!oOGs+BRg_O1I~&_K7K*>Oa5xHP^rRBScf!AJ&&S_(w^6@c$W=*o1@)TDVER8lt7t{V%udFJ99RiQV|5 zx(y#XdC-HBfEBC*kD<%|kgqUj0Q+dKZX)vY?Uk}8!8zPSmH&Om(?9P|<`wY#rER^C zpU(?>9q0Lg5ap`Bb1Izl{tY;kpeS+^pDAtJkKnFVG~21WmxbpLZj<}6?n zx(7_He*UXco7mQNeRo{R&~RE?re^#1_5OMH{`{)gSNP=&O^ue4FXzrq&{7*(?h`W8)z+SOJNasvS5Jl&1IoWO38pN|LKuY9+Y*n2GS zALspZKZR4l@KWUh^!r5dfkR687&uXy`Bp*0X#0;L|^mgD?#I9DAbppdHTBGw!~=!?3cnE|Z3~y39Y* z%+DGA)vH^x_Nb}fuB!Whj%#lM-r!xNw$JkZ=|!r*07b9PzYaU>@EKru z{UOS=eFm#04>$`;u{r&dLv7#@cM%}xX%#KluKnD@eogTFLdCc4!!qY!in9|Crw23# zJmB>UI+)0_!yO;k^77+=FXJcdv(>Xt&;8;I%6 z$(tO9!|r1~AZv9OT;sl&y%`2rgH*wlq=Og!10lJeKM7dFbA`w6e$tVV=HAs_91i0> z1R3u=a!d+b?a!aeJ%2u*@(PU4oZUozND1d2d>)(wqaeuvD=YzYh$!`xIqVktgZU@Z zGaXz;GV-6SLAeM{bZFM#w#Qx#*)m`KT*FOwVR7*#AuT(5`w;CnNr$G12P~~F?Pe*4 zQ`m#qkYD)88psD_73dH59^qr)Vx3A++gE41$iN$b7No3sk@=7^|A_m2U=hULJ~;V| zGH@g+!?Hw&E{m0>f9uASccyND}wGQlw{(6M)Vb9>Kk(2vypaBcw4)MV;o~i)HNHj7? zb;xzJnt*v{7U)h%?F%loJ>6~ia^OD4{Ks`Lf?FY#eVTq>$;k5p;}7UFWbP{=2lF~u z=zqKq1D;>&o7-oRin3sMvO!y^L*9c*YjCmI7(NahEZ1$%9$};D`Hyk_hMZzq>1vmj z@b=l5_7TFZldC-@`FO5@%7633e@LFzw7o4Xv6xma z2ELG8U3o%H9rMDlns!54ygpi=P_ll=kyRZ$<9d>crVMmo!ojEcRo`t@v zfAYsTu_(f5EYd3zah#d1)w8lUUwqxF>&7APY|w+)1nQ34#E1O(Z!4BP4Q`vse6G?y z!#eEVg07L0djytqF6oe3>~8|8>nt$xs|D3>{Px}91`c`%c;j`dXO|B5^ZzaMzuDpc zo#=1$@;BoCf28{#Z1&%G>VJ3iA1~eixb8pl@Bi@cM zQ`6m^_rAXRIPAA7FN&J4ui5TIL-KXI9IL`j$;;Ad7VBw@P&0(Z4Oanyc+X+(Lz$aWj z&%W(E?a`m$`$yvYd0*>U=~k4`G#o!$63dFX8^$=@EBJUP`zb~;Ir=hg_Z{i`7VPO^ zSZ!X>c!4@qVYxBVd~7Pr!NKKIG0u6s$4`}Hw_pIZ<=G+4d!@n-!+i;5gRqvPww`(B zV+F&RLbH-xYJAlhxOzt+IwPqaWBv~WTgTbXt*;M0AQ3nls_87L0UPRC`TCM@$RZUN z@P$4?`aL7x(s_nRM>X$Dchd$?yMjAENDyAktcX0T0cCY_n(Yb~#O`IQsGo-3KdP`t zmG5i!`4wos3v~?If8;X zlird#7m8|t8a{9CgLrEun+ek7yN+zfWy&Kjt}<}M-&4SP<@ z2=X!{J#jPCaNI5S5h@(9m+HAOa-jYG6S>m`0_~jhi^;ySe=4#P5W;w8U{Vd)$Sz3E zfVi$y@hnWtx(#!Fq}Uil(qs>vQMd%3&*;)=j%3h5Cm`OHE|nz6MQ}S^~aJIW^Jk}w?&Xt zsCYZ8*Ai!3=Qgqprz&~9nY;+oj)Z-=!S1@bJT^>Y-#6m zSG|)W*eYE_qbDeiMyqbI;k$0vH;faFlwP?EopF!%J1{E#QIegC7OojBua7ubGc&{U z)ps@G*iLM8#bww|HV>{0lz34r>9?>P5I{TCR8*B2VCRN)2Jb%otSvI0x0BTZcN?m< zTJ(n75wAFCro&>2+Dyl{g~BO8SzO~FB;xvVCUZrftCX&5Pn5&=FhkcQ^|!Fn1>8!* zk-Db8ZMOdJ@P%|p7ir@Duqv!tvs>xbxXe7YP8Wy3#FKbO*RM=2rdN4kYB+m z2%?HFFEJ{t*il)^Kb~HK;au1kFAZ|7g*Yx23vml}%Z%cx^>LJ-pzmDC;P}S5YhvF; zh-lR`N~d8kEpL}g^LO+^i&jGT#zE_^k^hP&Zr@UXm>*mT0{Z7$)6L#tg~J!vZV4pr zrgJv?5|B7sKK}Swt_{~rJ93$OcV^qCrF6c)Wxl+nbj-UYT3Lf_d^B08IQ?U{K_C}f zwWbH{?r5pzw_f0X{0>rSRb3ZNm*cMa`F^-2#%0m>{Ok9LZW@PvUe=O{_l^zr12v{v zxgz6Rjp~-tiwghDK7O9NyDKmwF=lrAmhUkM?VU~3xKL8e`50_tUA9qMJkM-k%-eK0 zRx4p!imm(tL(Jy8YRBHs&#bB`THZA`H{&_4RTiq=hCw4yi7hpn4#UGng7))8fUpSy zDTW-D*xvVl>ampb-lj79{N;_+SY6B9`XDto0m;(LPB663cX zQHtibVTFUeA0J^uiKC%gsUHQlKYSFj)Jjk$S%ElXl(MTYnO^U3n+i*Q-=7p=q3nJ7 zu=4{ZE&w}WB$+=ip5lG&{4QlL&X(|V+X$DXYG)bVl}*shL_X36P3hBu%qZ1*90RpZ zy)}ohmBn=o^mHaNtiVebOX?(EY)ne(oyFLqfD+hNJO}#$HuqXrlM&%_G@xaiIEi4=g#QizxjT7LG}Wh9lSxJrP=9cBA{Gn18xdg3t0`Z49d~C5YLn zBMSx=&JsO#kttN86pXZ;o3$G7gDLM6Zzpe5Cm>un7K@jDY>u82=T6%EO3e1%s)qU; ziO`NL`{dmoHD)pIi*l~e32p>y^|3>;YP!~~J(vXHsr*whV7hS|y0gWOeWl=a*TL5I zduVgGoU6s_FK?)%z1gDNw5Y8n*nMVMRdcR4$5`1HrutD8TC8BWU+%nqeOSiYF9NK1 z8vC|Oe^8Ea)luJjTO&F>g$w7@rH7dWw^nAeG34q6pDObRa2WV;{>{n^3sc9n0!v0g zp`BKOsv^V}Aa%X062!T7%@7L{yA}?IRteq+YxkZl>tH@$L(Dfm_nV|w<@dP35}kv7 z`~VftC_0|z8CkJskqo2Y+f@#5M1kD)BC6;64{>TT%YNqwi;ea5A6a}bjUWb#^?n_* ze>Z^s_PS1<16ZaL`s?F;#`6BeAasDG>b*m+)gv&Rz01I2c5?~xu8CC0t#{W*gziMc zb}fe%oiLu$(c3nzYwccMtI`VgEQdeae+Og9&ZTsjSp7ftzB{a`^!ay1v4DsTkglSj zRFPhT4Mds^kS?GgU3v`>T|l~m^e!OMdoMw0BE1F(5G3>#LJJ8g_n=>QU2#|Ud!Ogt z`+F|`g>rJ$u)^sMO>Rz4+@}Wa=5y})9|ahb@Ql){@F-xldmEfR30ri%kdp3 zU_IYgG+loU-3TH|vtZY9l2}?$I0h*f#rbkLyh555ff+K37oD9pLD@7FwW`cNuVM|R;OCFm@uet0%fLn{ifhV~1X!JI55BW`d-o6h1Rejw5 zN)Av+NmqULFV7_teE^R)2KnIPtE-FQ?y05I!OaFO5$YHx_!RW9gSn`_L5#!l>f88n z5M-n>g#)WMgsfT{n-f7?jPEVD)Wh^f?3 zQcgB*tmz$_%Mz*fu1MEls8|Oq_49MzVblZBCp7pmW#Lo;QU6 zY^4k{9Q(C|c!GRFl8O0$4kCP2$6xYX4`>gMw;#-u`o+NNo9}!CTxr#J;TKcp-?F+$ zz*7qBHdFa2Mcwu!QNWeaLjGUj?N<#I$mjmG?(*vw{^qfDr4g0kuR6a!73+ltKwN*l zYW?ShG6}$yP>tG%Z-w@2OWxVeZ^ZZ`{o2{ipE>j$>-+}fexyx1*0~Lr|0=N^u>F}g zeMEaN#db#B_T7I0@rOTf0A~)|ip77m=>Mk|@c;^ppi{Sgq|`sc%5R?Hul4eu?EjxP z1is-Y;68u9`pb0jPfZ#>1~3!j41sS}@oPTt@O7Yed+aFrf8nuJ0Qtmcwf*9KzLDce z;J};8_2Yl8{#QjLBMr!BXEXoaDeY|LU(9KnhV5A9KbzW)W&Se`?!fHdW6u`A@A%AZ zkn_5}sojCKGX!Hjb^M3$lt3)Tp zzxD#y#u;|Pl$|hTCmXcQEdD~Jfil%jHt0Kve24lw*`V(P@*V2$!0Zmp?!fF0%zj3R zoz&hxW*&A@d;jcfcVf;T#8H27zdNbDe>AWiHoKGB0~F+6R!}@h#wh8U%(siuzmaAX zR9%kcQugPS)b+d8K25ln)L9o{^wC(+AV9vSUx7PM-^z!<(66e2meMztlR1UA*J_d% zv&dUOS;0-G=FHJP0ZeV5YKg=I%f-1uY!CgBsrMKIdRNi4tF`|G0)L?2C)t3ve@@-{ z!C!s`7rsENAU#PfssG~OhCk4@!t3fUANl>01fPoou0)%!eQgHwUA*v5kAD$3f=Yjs z{Ga~i$3!c^3AnPpp!dHxy72)x4QqV;_@C?l)%EUd=+7m!v!Oc{`o$ydSm=+D>l^*> z*n!-iAj%Hp{zO0k+t`8JZ%pbB_Vw+D9a8j{kn%^kv_p!%RhS=1XouzgB+@)7vlF)b zERfkDML#mFzxcQvQuMRPbcYoEMPYsj+&iRbhZOC^p}&|w+=1L3$o&so?6BM&miyHh zc6{iL58d&h|8M)y0D-d<+e4}_znb6Ar!-H9^Im=;)4E5zm?ur+TG96Z`|~$Fw`%Vu$FR z*V`oWLp}AVr%;TzUEaT3T7L+{s;)UZ9Q_TaTjHSSZI>u0(|#UF^$f*`FR^^Du&To@tv|?yvax`G-A$2?& zsdNstKd#2Jgq@0SP!iFNmndsukFF=~W4dd9E#)6^@VHLGJ6Mz2YDVdHpDrVN|NW~j z#et8SOP{=J$DY@2HcrKZZ?iqM@6+M)8nV{Qtj0wNr9<=883c^%=AoEupkJ`DnD4IL z`x;Zi^$PL}9xOr);lYZLWPg3Co3T$&4(TDcl<(K?->@{UFRkF*MJ7ZSQE3qrrLGq8 zo5yR)LRaetojG~Qlo2l>@|WATpHw=oI+`V-7ew5*NYnjBnMd2Wy=pyR7&FA-vN|2f z#mH~qgr7@<)FFeUf+dLO4iHg!&5mQleXM@cU>xn>KoiA~Yr76QT90_98gFxBJ^AQg zm-wBdRC^9=4~4$tt!@A1arZuOv^<0oQks`yu{9My~{Fkk2BZKF^C zSxL~P5X=lux_EB;GD0tpe&piyq4oyfEQPHQS7Dr2@K_2hizE`)5=$bGb`E}ylb~@A};gK`h8kE>=+=v9)WFHGL8ei|e$mn5J z@q``=U5L-!+}0Pc$Izo%(ofVGp{otS~!%gODt+y4^ZSn0Ojx8&Um2mVSZ7#6dY?^!^ zMyAI5vq-s|C9L|2=#s3m2Wl=oV*}qzEMJJq$oW9N!YKIYurZ!E{|Hfi#a@*w)CyV~ zSZ1aYdGV~S`waHR6w`LWeEp5u?=>x0%CW_~J4i2nfw5s{J$13)0~ke~Bg;#Ci8_N< zQ<2s z%qr>6z4@@SI9$i(Rt$J@rffxB&(#*diWirMeI*Fg{akUb>uK7Zxhk@9@Ztr|xV8n- z=WG-&;M0Ix%uZ3&Vd$X29TB1ex9NiHF z>W@1+fO zR9irvA@n(a)A-(F97_I&79`ja*i2fTa=UlZMK2e?TuK2to;6@~ zvYz=GVVaN>X*;&$$X;hGzf{Q%7Y|^li)D21)oqRLNygpKFm9Q5wq7DN)aPPVqa9Q( z;vuMRX<@T&x0Kbi**EYi(fstW3C&5p#^z9X{dVrUOlDP$b#WKbEHSx*JPa9pv?kQ& z9~>Nfj)%wf#8_6zNT%xMd(ZG(+nIVg+RONvgB#vV!WYVv+fNADI3;uKa>Gu%DqWjo ze63&WW&Q42xGEg}A(`0ujGF8B4S10mE2DX-^?U`w!y1sjj_%Ae zOjQI0N#U;Z*2Tw(=92XNsL-kQ<@R$d1Zru);iCUcDEre50D+%`6_iFqn^aOt8j)a& zeRaPx>stQNu~XiM{0##oPT|&v?{{_wW*m+XFjlU_EW*(Zj5+nuR+TKalP!S(A_LsQ zaPyV^M@XflYkstd*}`DkD1RNh+d6VP~f z-}EAEGug8(Da6*bO60s(CS2ITBwi=ch5R7=?6F;!+#x?`jIH*(X2Tju0n^EGM7(!b za_Abxi_fhGuI?MNV+6UID@FCDx7oH!Gf%~VWwVtS%AuRp-lwTnrb_N86P%fHQI=@5 z9BTuQhz@Hblk4S7=p`)YF02a{L*Jd+_)?CU4zyXHv*p{D>&v`%XK%to%U+PA91-*! zv2Hg$X}fa}c1c31nCu?7!?w+dxbI2n7Q3ge4TQ?vnDdO{0=(tiKgRSrDxu(IOAl{)l|41Us?X`=OCWB zo;2GS`?mP*VeP7lMW$eQ&SH=)(Mex>1J=ytxzSy2QVN0&Tf>#G!|z?iwMZc+`^cH0hI60w<4-aqRXH}b_Cv4RdVjW+gb@mD zX*V0Uh?eYl1aTWCXO{UxqXH z{=4@@(q`{oQV*mmF&x*Q3{6B;g)l0GXAcLTZQfKB%U^KZuv{FRxhG8+M{>?3djbw8 z@R+h>*~b+yZZ)8_WJp}sb#1~4gnhZbK&sL>pGoR?M!FuRq%sxdBRaqIPIWzT+r;hM z(|Z=nHUmpBaS{~ai;$%!r5pJfNg4%4p80mh@nB34D@O)noZT2ddg&SUcw0)r3aWB$ zF|U!uRXu&~WUx1rvX9R(j`4HF0}j9hj}&!a@Je>51aY-nWi0tvV4w)XiHBV&>I9@} zy4`x1s>I+6aX{?%kZ1^}ZE$`Z-B6~1p(O8}XM$?No!oDjNQ#2pvm2NVjT@}xHR>0d ziNC-}v@S|g$*#393hov&{>NUyH)KTG9ke_l}?K^q^= z`#ef0Tjgsn0Qsh8`=p`-pG#*kG_o*j)~{P=anJK?uBWPSG)xbyB-wV$TH`dC4FE@g zw!2uI%HHl9*UEUU{XrNWmfF@P#MED;w0OzWobTaTn19Sslu~>MC6eU6aHum|K8Z8K zUC>t9Uu(m>ZXH0qbk!cSSNOnUhwi=n>8o=?ru+5IAa5AYmt;8sIVlSh;C`$;9Mpn z-IgUd%_fg=hU>^ZbEu0`?Q_IHm*bA0Xh27bmg(lr@MWIBg*p5#NB_kii z?4~>Ty@uSa3QdR0M}zm`+Ba&;%IG({--qkDBtCBY@`A(LcCsx<58`TRAXO9%!kkJ? zhWC*~q}4&Op%A;7p=sSy&xs?e1N`I7`A>*}3zK&l#~}u{O(dg#U+G@RB-i7(L>#hA z0V%sVnh#Yx_S(ezs03Ssbi_HbqeR65we2-yq9ylqW6 z>(IaR+B_TooDd?P*k{&Rc%iMy7Mdyi0c1veDr(&09}#&l!Q$deB6&aoHPd)wm^9PU zAbYHhcZOj0m{+jCN{AVC^c@F;$>T~b0W`W2;p>i(&zx4NS=%N~t~8k`-ib>@{i1`* z?eQRxH1W~BOWC$l%heQ~_WkrAOLN6ooNA)CUE1ysgUA;6i2dBH+{q=<<3U#`k=W5BJ3mNUrxo4L`nWD$7VYMVKQ> zpV2HfFYC`JvFv7#lmaF!n_-v@7l+DTDkm(>3#c^mRxGNe4V%c{c3rEad>M_1&T-jkbi})-za+FHF)z-89lZe z6(mi<7u*A{2`#5qeUAM+T+S~|_H?~3)#UiJ>U#gDi*`~5WZ@Xn|$(zu= zbgq>@2XU>5xIzJv=m$w~j9v>??Lw!&X|LC%IPlfFpaP|EM z%P(qPvW9tYz|Vp$I?7GvVP#5qmyN;=&Y3AR{fgmOjB{tAiSS3lbX`6`>hws(N=Z!y zYHuw2axZ0eR^q%*-^mdG#huW5HL+oc=nG(rO+=`H_T9*XO$#E9N z*FGIeF#!qy8Oy&$#0t$ez= zy6%}R*r!u1t0a%5xBA$M z#mcM>Soz#qniFS1ygSF*vk*uO7s4J>b#bcusog}wWUJQkHX-wS1nw%&8(&yJ4F&Cq z@ZbAZv{39tn^x)!5_%=p&zvM87o>+9TI1qf^}-;MA`gvX1dPiSHHFtlHWYZ%+!<`N|hV%@s`>vf*uhsns#ZuF#cd#r;lf*GRoW z!*e|A+!oNEMQzJNdxUD=k9|q>_btv%HtPHpuUV&)rLNtdK}FV;wMKaZx7t9 zIV;HwX6cE%<~Z4MKKh+`=W;!BYI9jmcuULrNQIT$%zRhB5qu%((o16wF<=gX?Iog} zHZT$E4(|sDsp=ue*%$g*34aHoklo6kywiv#{(hp(+z=lOVn4v^qs%R$-_Cjd$!)?Q5cY zLoJ@1Q*XiQF3JrgLtbVCx3%bXH}TWLQf_Y@L>XQc$)UASWkrFmzDs{v+d0q2htBMlX)1=I#du6MgQg87An@1+_R4ab#e zHj5_8!CSCNf`1;;yQi_4)7}En|h_D z+PyR-1TCRJE*OgGtb7DQ4YJ1+b6tTzU-I$?W=*+g??LYPheSPU0-HuQKK<-SFHN`( zlM3Jr5=Uw{jnZ>U&*0wPVxzR@T1*zm3t*ObV{j{lU{|(k7tIfLsa!L{Qg_pErGW6+ zP~DvAfh>!Q6>we}m0lO96=IDoc9>^4&Se?xG%*oAwg%H}WoCWFO@&C74;iWk{fRFB zS=iboV0KcTr+y~P6H;#9_wCGY`+#ZOCza?#QRrOhfgrnuECb+ef*Z?=Ii#U(QD_F@k2F4oH z)UesSBNi%^zn9Up>g0(%HoXg79C!6PWCvVivA(>0XundL}}C#{*Z;%RcR+eQ%gQhb@+;Svy18}Vxc7} ztkuBp&BLn7_?B0s^}?TQu%n%(Y#)F*R$m6g1Q1OJ?QobEF`jq?@Jy9qdy& zNy4OARz3Q`@QeHB_b7{^$8RVElB6R;Nx;C4^y1V;)=kG4*L8Z&6(D7%b5Q&>UjGT+ z$G6}GVa3DsG~rV5n6UNO@1l>P!<3-cYLejygiVIUas|3JB+!pu!0343ii8Sb%ICVV zqe8d~s)Fc+9ZPX%bz4Q36;sl3Klj*u=-jI9M$J1R_#Ln>UUiFm2?K@k{l)npQhs19IP@DqqTWA4FfB)$0R@WvcDq{V(9 zSHE@xYXWU@M12{H(qrbK-1^b@6Y2gZ|CJ*8rF{a;q^gcI4Tey?Vz{gAM;5*l(USbR z@3@lE-7MA-ot_$-AYi&(5ZkK&Y=k8bYsx9fLBmE4de;s5qxlqAL*Oq%nWb-4dqBD1%ig%?eU7m}qTXQB{tV!&A@JJ)crYNVrY8 zdM33?ZzktLr`r;D2cC0-6it`01&L?hv}?2wpGm-;XlB-X@!1Jgo`geh4fXmQgGAV?YYlQ7!z7FGS5Xd0x-ZE;lJstkQ_jSFpSlDh zTU9dfW;Sb(G*+9*dE?#7wsT>Y02?r0R8=Junj@8P^*klR$ADB`R{o6&hXv%uG53f) z7*enVX%@($Z91xW2I z3b73ClPBQAl$Sc*cIHzdsj?1_lY05wndtD?A^ZeqRVo+dc!>&#AQ-8rAA;8pKsXLr zr%v~p1)Pw^7dS2Z$Qj}{tji*C-G_9+6B8$-Odn+DJUhg4cqM=Ll&E0*ddC!;k6zu*ygS=l>e}~ zl#sn|?5$z7Uc@I50s^pL+vXfS3+zASn0a)8`*{C0NFmeS*2*TVsV4S1TTph%ndmvd-LpdJaz@SC}G7{Scw{`pxE@L zmVBM72ak0eapzheK)QM!CIL82FT##^DP$5%kj^LuXMCA36c%1H$P*=tlAYjRLAZMp)!UhzBZjfE)@ zuA+KHG~IQ8qIIV1l;KCBl1+Q5Mp^noaN_((qR}NH>mg>=Dm~U{SFmIO?umOzuuVZ{ zLGx3RYJkGPGR-;C-7u8BPQZ6k*-AQ{^;q?8Bv6Z`EAX4T3{l7_m= z$`?W+*BuA!F$}F;VZ`SyAJah1Rn^yVQR4QdnRyLSp+?dblY`Nx!911<#spHcXLv&y zr1E5gKRrzdhmvntmS*FiSx!NnwIr_2)^D!-qiwv~?P~u`%Ljr5O-fOZqwWDqBV*RGmaed*X=~ z9fnN8&#qT3me28Q1xkllogUz4Dh1fUk46LGR)MT>%OOKV5Njz1EEx!Y43Yvwva+!T z&G8W8zzNCe(Fo}*^Swy$y2OQSB0M0p8mVc%4>%OFm1T7~bK$MRim2gg%g}R{D1J~j zv(VXUAX8NzxU~E!1nHxJb)IDloE|)V2daczKJZ%htN=m1s5J_DvN}Qw`~;j77JwYi znQZV+{s<(=lhPC12g}==lMFQT3*?t&-ql9iXUyIf;+*SF*GQ&5TPbXONiuW@!KK&c z3!CEoP$X5V)BPw0-=-RprP9ofzHSg{$p;Y==#yuOcx$?ueE9>^wmWJ~M-}ujEDI=A z=CAcIe(!yr)LcA#J^T);S~F;94#((S=U5DvYzQEnX2HUq<=sLE8KS_{&wE`~{fjN& zvbZbLYE6m+KX|#r0_{u&uU7dg7MPSA>DrqTUtbg}W@{AV*oLB14LqSO9IcgD^Jhzo z|J*krZa+}3xP-0&J5I^k0=d-&G=g-=Jb%VWfoYhF4|<#$v>}tIi<45ZhsO-`wsUIf zL>Ia}3lQdw(Jiv5=(nt3rf971muF?_2e*T5FhblKv7@abx_;;Hys1l;e<(o3D*Slq zw$Az|Z{iUS7LX_qCE1FuZ-k6huJFBe5Nb{-e=hqOuDh|h;oyh1J0_i*8OJT6iLVf3Z z;I1Jo|0u)|nS^}^YqfiE+`P!Npp@spaw?o!I^wvBMW2wSASXoTBoD;2%ReGF*KbX$ zSL!KPu_O#VIMsbR;1g?@wg8lQq{yvk#!bT>#aOJY=FJkH&34#&{rODZ9fN_Yr*fLo zu0Wx%vAtQHbud|}SD#dvZGoleAy{=TGv{P%XGWP1$SguwwY-5`+dWk~Vfn^=E;$HD z8ElOCb>`iF_muP5+>GP-UJFKxLitZUEA3J=Abe+5}rVYLpQGY2mPX1t}M3|C6PKli2IF2VmFc`fy~@! zQc+QGwD?az!PRjt@*y!@ntAMrBS&4`nZxl7lhjPYXN%3&Rp$p1&y)+AF;NAR0wSeE zSfXw+e`r4-Xbyf~A({f+GsAMF8R3U#sI(CB8=_4@K=TksQ<$$`mR=dxW zLa2WLdS`B#JZ+xvJHR!8`tniX z97}kz{IgPv+O|%y132}fB8#qb%JV(kyexX_o40Vk)o{@mEvvxI5t;hQLFAPY+8OCQ zzzS#ABpTza+>W5wkuG90$cazgY+bO^a6a+yI^~5qmT{}NJqy$paKY?o?P`k7gti&B z144){Z?jRACe?wMqmFEGUYWkK+?Af6axH+BxG571CQui=$wz z#Mi3{Vn$a&aL5YGyMb)7?xYi-EP$u33|eV)U2rf}KgzLY&d5VY zCrNeM)(o@K$z}`2%_>rQ@Yh<}LN+(FB^=cJRo>&VJXJ6uMxp0CKrX4EZ|3mK73yLf zTgT|!gA7nD|F%;{H6Ph7=-+T)_Ya*~95&HC8LP3_J1&QmrDBxDC7G324zHwE@)>&s zT9{SeU9e$^YW|BykdZpRG^~vEwyB>8uhW2%lzPs1y=uDv8HwlhH4KzWtbBHDon1NR zu$E=9yJEbs#Y=&Q-mOtWe#ex>Qw}?U7B@K>SxI*KZx(@S_7RTw(v2ss;_`JsRK_@$ zU7?$@4vau<7oGf2Yx59_U5G??#}o3qu<3^yf*2XM3R5lddbHORIn14=2<@-sL)cYS zbMoh15d)kfu9yYRc2)J#t*GD%$tAzMn@gz-<)9W7G#GGnqk%$kq_|PUVZNSa=T3%4&{qEm-*91i9 zyCb@s`Art_k3#q0VahnouG&4lYel8Yn~h2VNDz-}zcp&y-D>3R+*mqndZ=)G1QadA z(KSWUXWA*)wePsOhKB=RU<)np6hIGb_Bw7$m;#KHhP-P6Su*Uf+0Ti6r}`ZF+8_K~ zT6Hw~^inNrEJIEuQ8&izqe{{h@4((en~fkb9$m2Ew80g;39>M#G0yFjFv4bTND+fQ z${hSLo_BtEbbf?vFsNU=ZhI2>IqEBA=Kp>RYq9p=-j2xTb@{ZSc#v=JbNfZ zp`anpviXey^Oy?X3+dlFGMq!E!~M@MWSlrf)L5ab6N?WAm5P?SMxPzgQsOMM9J(NE zs&kZ)o$nMe>UmbFxY4+t^?LUAEx$6y$&4(tnn+}&1Q(9`eZ?-AmnRN?i(j)vTjv8w zPH&WAfnnW2zDL-kgV?B1@frQEulbdVMPi8(h=Dwumuk#;9-e?(NwTudv^-nZq1y9S zqjS6|#K5jgMO=$GYnDl$kv&*!L}hl1OXubNO$*_GAZeyBv$Y=EoCe&S)jdC!yIFp~ z&1PSx^6VmOz5=}8Af)c@s%bL6wpjO;Gapiyt~3@b9cwnCA(bgsZfEIs(N{q-nC>NbP;<1nUD34ZgCT((Z@|iwe*I3hb*y`1a zahI8l2sm)&Q*S@oYS7B|6w$z7E_y3`s_rG5F<;Ix9~9$dkrwk(jAJZ-UUQUi>l>QJ z^p)Ole8nsCxIr^Rjng*QW z*eRj~@TT=cm&UA$I69&f6(^BlzBDPpDu-D_3=J4_00n;_eHmyRk5!2Yk<7hdh+7>3 zkGR35KA#(KZl~~L8?A^PE1eDf&Ep}*eOY2kK}j8dGRg2n0xzx;G>R{ z*_Al2e#3S!a*VP)DDet{pf*gRPbG0KmdzF4z!cW2!S|!pk6M5E#xUK4Tgz5HBRtV( zb5c-A(nZ=?$<~tnsXBuGdpoyGVldMh%n+ByZM-X<_&3j4^=yV+t>z<)HSS?whFf<9bTiyN-I zwjMz9=modl+M0;N>fUWfM>qCT-g74~;y=;jN^aLI&mler^(uYqF%lk;Rm0CSEQq8d zkFa@d)q9hG1XUhzEI?LXzDdLsk9hMAXE_C5H7TbfLnwPR!Phq&Mj|RsFHzAv!i;^O zk+uP(zZ6vS+YhC^ZAUiPDOLf}*cJX~4noF)oT0DS1Gim5KmAQj7v=tCzN*-;pZ@3f z`2?ASKHyc4BKGdTG0uN_8ty6}!0v*Z$p8CmO?iL=`eqk@aAfVDZn(AY|Fa(TbL-5} zw8BP@JXGIj&t=hzP@y|{;2D5@~iJ?&vLE@@-vvt z)42N49L`KI*hF!UJocU+9VH=~{3jdEc^9A@G~$n=eo(0ViE4+Q2mIwnCXp=mZ7Toa zi42KIP$+&~Tp1kt;49gFK}J)c{{hH72*q8yK(xRS7I zyOD)*o_qnlEvH=ZSA(qar`$gtZ+%7XWJd%U8J6)*ciz_e6NEhm)gET^ZfN z5It2oC$w$hGHmir!+&}`l8@;>DPTdtEYKqXf)41ooGhH_LoimQG$T?E`>Rat)l=m-XFJzLA7rD6jyfv$3R=!WIbK z+P0&a+xGX%SFO=aBcPC`8$}bLnP;B;p=dSjWJco{y&p_Emf20-QraaW+Ph5?XikrA z##7LrYd!P%UP|XiQP0@x+OTPw0DIz_&aUn+?eR$*dUDxH*Zdddnt`K0B_a#m!SHju_|63bH*0y)Res;Y_3{a13$No0Q^3C@D z+Wj9W0L7)^hAU?OcC|7mr-0(p&X)e;-u%zoQXbn8(D2vlX3IqnHE1L_EEewbM*-ZZ z>Irn8G2z6c|MZBt=}Z<9znQqqkX8Q!jbk_ooCDaKkaqc>tnJ4(#;{cmPqdl+*T(ys z$KI_1`)^U4KUmOD)I1?^tDeu9`tJ?t@S`UH+Uz{)k2muVvH#E8Rhj0!J-1SP_B4QT zO2=ZGO!gl>C%1K;}p3G43sLyo`vK_-ig$E-E< zj{|`h6v!LEL`cCZUO7(BV|_&@9MRUBWbEEB>ydKKgZ=PQMcRQEvEMg$j5y`d9^U`Z zYc@mii45{U3#RRPgG2<|pSBr64y@34SNWYEG*SPM{)BNjU;N_WwFK;e(k4DV!$rbb zJ*3zj*Md4lsq$x2_hc>@2kujceSRpJNHU}};Y~}h?~#)i3djfB5k^Mw@6iANy`c1< zEt~dK{zu6DA$9biICA)d-l^Rwk^dSJUQh#G8GAym>gTTiyFJ;t=`Vo(j(C5rkvodC zqe$Oi-v2z4d8Bb_p+}MIEV(;wCKY%Kw_RaUh0k!EwxDrnr6t5j$<-e_xv3hZt~EB7 z0}X5nf%4Frz#SGJ4dhp{rlFuDX=&Va?Z(nGj3NGabY9(2g?gK2d)^9n3ya`?dHheN znEa!kc$))jVRj^?KcfV@nx=b`%Xw~CnS$i%w17#hNsu)f=nuIrf#+}K3!R2xB1+vh zIt0YF7z}Tbv=X?Eb5M*X}o7Vyk@vy-xo9yu6N2P+M*c8qU`)H`2d4F5VEmd z5?8F=&C;PLln6rhtl{fU-o|IGSB0j%llz8QQvi*s<A6 zoN_T3iGPS$MCaUcgq^cNelYXP5t%JF(Y9~>@CaxC7~sbDofrFAMEQsT@Q+H!d2Xe1 zkIfOs<|N@q6}VN+B7t@>f`_CYkWN@Hv=)VNiLAVMM$uS~^DT7p2KqC#vux5BH|pK@ zaM)_!OGma59|Q?3%@@5xiuQzQS#%1uNkJalA)H}_x;j2v8nC{Ao?^I!w`~QvHQzX!H>JDT(t)-tw|)?ClE_T#muh2mvM#h77MB8gI9S|NL?KoZrppj<=$3Ak z21f*#4(!588*N_hTxf+j#iOM)7M%DD*(PDhLn|K$dfbuQpAYZz6eSLf#Z{pEcLR;C ztFe>OKu^;OgAWNF)*Yw3VGg3spWQ)%R}Ij<<+z?3+BpDhUlmbRKhKYmTuH8fBh}!x zLf~x8;6bm!^cu&T5VU@U77~ty<{BgMc}+@|tl(9Bw~cq3{O<2Ju3JuOS(ddugym!@ zE$X?x5f=0aV^HNZ;mFg_E3uWY{YYJy=h&PQ$r z*b6tFx~We_2m-N}TUMHImpxbz*a)BPtMfUA?7w`$y|;MvVsnGol+N9Y_f67L!UChM z7-=%H3l$a5?O}9Zn+UhApQs)Ckc7L-{JL*yE~iSom1G9pl{dUD@g@gC@?Jn9gFyb! zb+PszQPBSwa72=oaJ)60)}Z4x;l?&#yq0%iwGE%5VJucr6AdxPF! zQ;rgFEXTsBSv6a#7aJsAo57TB(C{omW>V-3Hd5&1mfc0tmfW?$X1(dE+%RWs|Kp^9 zB*%DU5@6`P1&lH7Q?Vt;ap)$w>p<&Y5-^Lh{i zh_W{*@4YWqqZG;ITyT8TV6io_q2Y#3*g0Aav)HwwP_+5O-5cpB5g|R9=JNo#_MoR((zq{6-uq?zPyh#DLTGO0 z^BiPz*(Lh;4P+1+(a6HPcNcTNEy^JGCh+?H>~O8C+%Pk;5pp{-yyXR?X$jIp&)xq< zDZ1YoHf-2Yv*NoJ=Y;RfZ`;Jp<HsK(w;da@gG%PJo1+TckSqZJeCWOu3t z9jdMy$g2}Z`l^aDcMhydFOS}H99~N@OjQnW_*l>;$QOg!i@$^HT_<YRpkls}Zk_3lAt zn@@tSsnzq&9s1T|@~KM0r>=cwFAN$9I4YY77IBowKoyC&iS7vrYV7u8T+oFqgx-7b zvffW*DXVyJHgB0TBdj@@34pSwfG3#Xa&PfSC0q+M_I7EXK=r+i=WIbHJ*d1{OOK;l zHg;1dAus2=U@yk!%3i(0L7?^PYuSn-QjJWuz#9tL{;_-Z3l=|VCxaeWBCfLv&1O5T zzVsd&e!s_3KIUHj;3m*wmlX;(Xx3B9_5K{W3kCyO4B4l45%~RQAkSkVpX&3_US~oG0`JWWTGiGrf|b{^Di-(hFXN8XgXNh$@aKa*w-)HRGumIx(Wk+NwMi;oC}@`s zxI#SulGS##wW$BtCNZAyJ}8h%gk&I)44pAc2Sd>8T;(Lchjp0pEtEcCIuR< znByI;dr`Da9QjJn3~-nf<0?XDwzeGPk*Ra%Q9A0_u@rQ?KNqE0o7fa*M$Bd4(hpHG zDG=K0?3ag28ZFVLpRnQZ$a?utdv)A2xGUyupe@B;wz(w%*k<}YcctRV{P?P`0`G%I zTGu5?`7tXRtqr@a@K6XiW!=s>1X}3{F~Lr#-#f1a3%zI8S^v7-nlQ_$#s+DL28Sv5LyKiQvj|TnYmhh;zm@8FX00k9gO!M_aNiz#ZRmYR;|n z=NXQrbMg6USu$wsKj@y=mw)lV_^r_(Qi%fI86#y}YSwh)-oCX#4k96*)K_MsYQdrK zbc%YmOogE?KGVh?$>Z1vymGCYq*-DKKMrxEDxZETI+0vmA5Q{WNpZGGZ>~-|zJJ2- zP@&3c)B}nV*<5duL^=Z9sy#@iY@yYvy!_13mt%xkpfeoOcn}Q*9_aWc5*os%; zF`su$CgIkes1+rL1NWiTjdi1bZ7Mud(I|D#=y`Ek^%;5M$n|3V@Poc|dT!aJ%SM_v zKj&C(drT5_gD>Az*rJNoT?ZOf;cTCCHB>Yo28BG|;HCNb8A(kX*UCW)>)}9a$gT{h zHh#GbucH}T5WbgE5YtYUBnLe%LDX-KxS;=$Q~SUJo7RnJE2s}2bmR3j4sY9Dmpxn( zB(Ycqou6x>VmVB+mCQ{T0A5J3a<~$QIt0;;I8cJQ<=s2bv@134*3`U~{Qa)j62#G@ z#j=7Equp~)SomkF zE?!nzIhNj3m%QMaeTz^&Wl#zv0B=u`F(SD>eMM;9`4Z5AgbZ*^Myn`C^BCv#p3#bO zvtDlg2OTvhq;U0iQ|D9TSNwplZ+Q@!uDg%r_Q66>9^zFzR>4dAL?esiW&RV;bnUb$ z4hk*@RSUVbMMhT|HNxA$;7BZHI7fZRp;^f@MV*y<(S5$t8_?}t&RZ|Bc|@{z#8~CK zrsnoIs~(1AsAY{63bb*JJdUWG;^0~v!sNInwRd{cc5h+unM;uZo37=N!X1Zz1_K_E z=Q?5#3U3;t_BgTJE9G5n6+tNS!KJr&e?&c*fQwS%d8mpaJL#?FHM>uqbUu0nQ=&%Z z)GF}zx92;CK$J}2@pmSNNx`0GA8K<>9N{|7Zbl$(qL6v-9p$Siu~wBt%`Hb}O>{P< zVfT_sVoy*9t_8gMUUJQr`{3RK4{qG=N|v`C$US8*9n5#Xc>v(oH@S0VDhxWqDIM>} zIn4S@+~o?x0>VWyvR2*ECAQQNQCsX%B0A^&EECnRthVhnP5Z`J zhrnS>KNnbs6P>CR`DU3P1A!cc@X7>jrxUMc)J zu(~NvrYbVfdOe!)=yBU2G)HQxqGdi8X0u|P9iG0hloZHAWPY&+&7pPlWC4m-ibx__RbNgls4DGXxV^Lu|S`B*{&5x%N7l!W6PQEu? zX!33Ovd%wVCA@g*#h!H7`gP(`lwqLQM^iKJL(IrbTRz2RUAuQ>w=7S#ne$IP)mNQh zHC|@531L@G7gx<9n5kx=^dM42%9nT z34;KhLw`cQA&_XdHt@yRjvT%Qb*}?LSWhWdKHs%$L z@)zpUu8^&!177;&$wdPbymVbzU(iafjuMdFDjdl<%}QqqW~u$<6 zD#v!gRDA*{Gd{*!uakF9M=g8xyF6 zcsSfqJ9Pcf>V&#psN{%x@A4p_a!{t}{lzV7eNv-Hd(RDhmZF(Dj$V#wu)ygJ5Y3+# zM!5OivrbW+wVyPObGgU^b<aaGX4JqI_<_Z3JS_r3B%kfAq^I(A#>AHR zO>tq^D?*fsT1;A{FQUv9xbq&Mod+SZLGJv+MNU2!O?Dmlyf3+1n|Bwrq^{>qzmHI9 zI<9R2Z@Bi%yS`?xvg9p7Y1bBLb%>G$SSux_K~*xP*+_Uw?!zS`Hg_a3^WFR|tCXHj zPsI$2di(r)VfO^ow7{*`)tHKbGDN~ra?Z7a8VE~7ewSf>xgjRjkxL#5MDVX#LcY*0 zqq{OEN&Xb+2<|;VyU!S>@lT{WZ(vFls(RCb34w_aovKU|SPQ>A-H~_)kAk3%7w9=p zO!V6oAVN9CYd16WhVWzmi@o;@YckvVherevup=T;6#zciaw}oq?|KfM8Ru4Hjf8z19DW{WvpkBAc8{)Ef$93z5mQ$ zyfBOccbLj9_KoDBcyT~_+Y0m;e^KT~-X}G(5Ro zY+qb%koqGSGiH9@oVFU9=3tMS^j+z`<8)E0>d7%An*2CqEUc5Fbr6>G@0$s+%Vwk% z7d7Uxqddgec0Toqs|N5WNeY@WAoMyHNC*!DFu&tw^sxpHE~&U-UtH;VsSUKB%e*XTp+B{^ zkQv%7V_dfDx@4Ugsm2LzxL!2tM#SqSP5ae~c8++Wu(A`-vibvESfg)-d;a&{W!G;0 z>G~4yHGC)#cny+kt6ex97CB_1#Cz`|r$}@lzm~#Iv+Nr(zXu11f1`yt3sH>@OiNtr zvksCJy7606*IDn~H?&uL2CBN{hSNQcZSw6HicrHieZ8@=fMAA)thjBzDWCLZy=8X8 zM}MKzg9nOI!gAb739djN~2y?pbxM@7M3^q02P2ad( zj~gp;>FnmV+MI1~p+ex5#9;2mfzKZEQ&i^;O?}d>ar0z5OzLO9J5Zji1y8h9*?`)2 z2X&821Mo%r#Ae(~{;_pK8k`8U&9Zz}R|8SwVucy}{QGa9!)-mq!vV$?I_=WBY5eEH zobaBDHDeT(g{Zh43W`4d{QCp`l;cu+?1$C;w9Sq(=re z8>0XTr3$I_f=B&0z55#M?rMcaS@87Udxh7j&FS@#Rr$~ne=?K-&{ILO#sSO zICRBvAyZ*K*(&N`=L2icYyNVsL$%DR(T%IR;~u><3#!$hY5FUNQ(Ub~^lO)tkQXWj zM-Hu~8JvOkq7oL_rRXE<3c?ROxucc?Ove>~+;@7Bpo!=2sP+MlJRRRl~KED2EF~{J;;SfA5p}W z*Itkr?TcqR1?x=9(`M)`mM0(9FjQ1I_IFpkipt2N77ZXD63U&UC;CU_GzK-+m)Sg* zrX>Adp6sk^s9=saB?omF zMFdB{HDC6xIfY@il;v=JwWC!2Bl{q!FICPR1Wspb^q=na*pcH0&&%nFoM|9T*7e$x zIe0+cjR2@rKFk3QJ57It(4N?}znP>&C|!|kIe4;{S5i&7DV8C~oJkEb$cmBN%h`H; zl%SDxjxs4=g6Cmk@vq;0ES@Sq%SG$Jclvf%J^)`-&+IlJ;yw14E$SO}je>_%e^Z&G zb6Ajq@NTHG0yb5;X44A#_GARcZkQSrEG;XG{ zcI}!xYg+v_5iaG*6mMNYF}u8HnAi+o3oF*2jU2dvlU;pfWx4J%9}2i*VXZ}!f-sA` z-JixUb<3~a`in@YAGWs0t{muY-(nE7!uKt1et!ZIY^rCsjAe|Q8UbRW;@$W3Ls+GHq`WcKi6zAph1C5UY=FAE96P=2S)lMAP*(s`lEJr(fu>*-$nf-%1T=s@g<7ukGCFfUqp^N~AoLY0!!F>_K%A{@ROB+E5} zl7}sUL~Y|MRf%8PuK*tW2$iO=D7Jp91x;(7o=E__XNyu0p$AqaHS|zHNE~pUeePzV z3t4`=@`9qaxbpRfMFaY#K&eE+INP@Dr4@Wf=6dEFP+z&hHIHXK1}i$$`DDHVRg!fVAWdu8y!(1;aClPiRimI%5G82j zTA@ntjWfff7Sq4>ue$T%anuS5B;2?Rv+K3&Fr3amC3`tz@yd!-b^suA@7*El-XeFM zxUk>@vD?cn%ogIu(p^<^E9^lO1T;bAW+{JH2bR&EHT^dICz3u20D_8QDcPq^3{?Vv zM3ZR720y^Jp+)_pgd*FkSXPq@mW{DOwVny47L>pc;CSnKpsP}HYLrwb4XCRB^aG$lC2LEJ_H70H6<+{PaLi-%p~(QBQYsU(O`woQi}K4)hKxkufga zAYpBhE2TO$ZL-Vg=w{wD2LrrZ?2C5IW0a{!di$ou*e&jY;?C?0j+lddK6-b(CUD-<`X#?nwiF3mnBcLg;jPWJFxaW<((&-V4|9;Tan7M6V z)3aTW2zW4lkuHEnF+enkg$Z_xs*QNCG$$ z2nK2oS#wlw2W%hBvx0$G8>Wg|M%Yc{*_cPZ05#qrd9wl$vpb&n#4BycG0#wPqT2Z~ z7Y>)NhM?HnH3j#31Vf&&N)u6-6V!)okXYujpmZ82DhnDX=$9>YOQWxp*84tjxNn5v zPZ?}{reVW9;veo5#L`wOB20cziI(_QWo&!fgyTE$$~w`kbmXH;P*ZxL%BZg6gnNb1 zTdVw_u+h8E*Bg{Pqo3qvj#c4iK%tL=SXTydB6PLNlMp_i9<} zC{eJ&dPAc*;@Y4v@jD=sNDU2)n#{sC%~ zstlnuly|4#=cmFtg+pKZt!;%PzMNKiohY|68`yFnLH2ZoX@8F|;VJ>&YYcIXhrGe3 zYCr4(i`(OQ6U!Q9;fvdo1jpRY>*>i_kEfK|f&eM0PytGbT6|%?I|)hQjJM;jkn%Q& z_0Q~wO9S-#zSGa{JWw}|{Jh9jq5Fsua+NbSln&1{&~g;@&MqS;Rb#15b@<|Vtwuee z*LKNg*xYtP_jdnbxKNch8(^)ymlC`%-CnKDM^A(FPmF;{xz(7tVRZP4>f|LjaXV6O zAzh-R|23efP8^1265{55D_?ez+}g~XclVdi%CusuMxd8N9{i|!6sT;Pdq1Aes~xq? zf){V`&LI^SUVK~y#-Omm@z}GJLM*Jz7jsBJN5k>Edj1=v`0z>w;SpsLbYXHZ{0<|R zCgk$s~P&}}%euNFcN9%*@d>@j4`I3=9^((HSG;?<;KMMm)brvjrs9#Bb{Us_& zZaz6@*}4QtCZg-gHLErIa`g;>oE8``0an`tx^jPmA7<}!b;^tiRX8lT({$x$`CkEA zHfuOK>!)efS|Kd7p!W+izv0iKGgQWbB2VqGh1zEZzgoTj7X3u>>7aqQb0+|!t09tB zs=Pm5p^Zo|Jdx#;Pn+)ltGwL(%>bZw$k79NE0I>RQe?Kn= zcs0g-_@RAS93@euaMf`a}lWiw`toD2iuce?bvb0Z>n9+BFMt?lW zaJ6D0>nnCd{xs@M077dUgA44kUb%rR2-piS9jh$a7?2$7ix^FZ<96{fOlyf@-g zYSbp&Y>Q!=P#k!|D_po!gcBh2Wo6Rt7jIn9g4L|Ya5K8kH7R9KTs3Z2Su7t1%#L~tOeMC8DbBnbxs{@ehagPN@ z>kM(auv*es(F`!v>3X8J6V${eWzKR7?T8ECZ`btXF0C!RAv0R}w4WESDQ;IQ@_1yn zG6To%w%nD>Q)=HCj(pXdV6hta*`Ax2QuS(>610iN(Lndj#W(ZnFd>``WtD_O z1~g2U>ep*ACxeWSNh7--um0|N1gNEDhvC{Vzr;L7a$=mDf!yQ?Q?CP z)h!7ZO3fS^tq6-cHJ@Zt92Qf-rf2nw8UZ7FJxXq!noPMR@LB*;9C+c*>pE<`$%%#y zY>@pOQ0wiZ$jDMw=Sx5h_{K?cnltP&Wh5A;L5txK_PqOP@1;F+is(?P$7k9=IWLy~ z=tY+Lrs-WMBc%qsyt?Na#N=@4Qd<_=!KtUfXv@i_3rfv3iHVg_hS^7#|%syyN}UsRs)AHdahG%VJnF}9vOMb zji#4hVb}dQ!<0Nx{N~=kF^mR21{tcW(Myg(4?n(YI6T&TBZN&EzPhyT2bBGv0g!M| z@QFgDS0MfhQn1-!=3Op_Z}je`PF(@2Ja&zw{1&G=2aAvJsrm{`0Ut-SndgMk1)<`^ zt)<`TTnJ{>2oLgs+B38j_NZlP?Yz2$289Mq=OOd^=1>5B8`!hRc0|?oivuONcSx^- zV2a1=U~aisy0eo5`MOMWUl$6AYsxPBNf* z#sHptji>6~sZg=3|4c8?nyG}3rWBfhncuuHvI}Yi`oVI0zH#Nk7L(It!0snn%f;6W z{nK}xdZ0hzqYFTMH1am;o529K*jAu&Gx3D;V4=s!$iH}2;5e4GOX3=kpz<{w;!&7M z=@QhvGCPki~f*4LyCk%^jdi(X1+qr;e9$Oyw*)wvPLpNv9OE5Tp_@t_DY^_wCIq&t* zIDtNB`I%QO;(pXOD;j^!u2g1}hl5h>rX(AfdN-26tPg+!-r7u_Of23VT&M}`?}So% zk9C`8%QYrR5_9@*A&>=46Umo3@Zq%$a`Dt&yxI z2~6R_Fz@1q`G>tg-fA_7F3ns|qL@oPI!cX>FWp=HaZo&&iSOl|QZ=+|e;dZ?Avq^% ziB-vuU2)B+?3@2?Izj0y`1n^^in37R49U}wy#))dR;^v%V0qMQD|g|pW%8t2*5FEg zIFk)pu>sxQf=IFe1_6LK0`H~n>I>FyyzK?ba?2jYt_)slu=W$gct7E}<6ZO+JuL-+ zSVV-wNx9ah@L<)=YhD^ozl`AtC??MK6NbRaq5IRpnSeP=^i8o=P?M866E8n(ljc0V zP=7w^n}_*2OLfvmyA!49slSNWSp%{XxZ?@g0t-rE4maV2*0*k{-|Ar&V0M~4+~QEe zL@Rh`6TS((isa(feRH(NGa~tG-q`Oa2m31rW4_7T*^{*#q9rCbqwWKKN@9!HynJ|< zm#HAt=t&oX6G6*aZ)kc~&^ToPKw2Pq7dGI14{%TVs-Msh9tY9A4L-F8#;;Q=mli3q z;qBY296E_tL|iOwEixhne}AoF%pgf;(xGPZS(iT7|6_b&Wha93*C}n2SRMMHc%k!m zI?X#S9KQ+?e1ev#=bg0HfC`SrI*y`iV{Ig3rJ&Z4#WC}8piZ|1;f2Yq@!rLr3_|@v zMY-=_SZ2`E<@Y&>tth=;z=`*?zQ@sDE{i%@T>o;vTs}lt2R$Oatvznyx%JJziB zN%Hk8I{Z|AjncD;L(X;nZ65D`Qvp+L+4vVVjxxz0u|_Q!t|x`vj$k#d17EP2H&V?M zmMwY(O1oJgc5WvnY*B$ZJNH&2)~y6Q`07ZK&|dGM(g5D7cPEnE=6k|K^VD)CLjNx5OmZ!pFWY5wK| zC}Pd#30YoVHmdh_SwKEtt1m3PZmn+8wz zt8c%n50uX+y!kuth5_bG#L0^8@4g3IvY}kwjEyV&*@mNkS=V_AXU1Fq$NY-_zIq*3 zKpc4Z^e_J()=S|`O(f4>*71{s%AN(pK|`zX*S|?yfDt+r&bY8@{4Jh*dsw9%5Qn7n z2SNXb_0|BK!AMhz-G5UcAh8s2kSn17=Ij1DJO1+h|1T+O-)r&wKY9WD|4RE`RZ+(k zg5xQ>AH>6$EMu?RzN~xpzrOMp!TN6DLVk-lm~-J^qxsvfK6nLa1HD{t>Yq34{`KSk zQBUSBi#8~p`ts)}_SVd%PQ8f-_hoLh%V(Zg@Wt8Y(a7gM{t z3l#NFKLU({s15Z&0Ej*1! zh#%T4`hsfM)J?P4xPqs&7H`Y#ectn@yNAzR1579zGR*2btWB+2sgf88VwgpCNDY%D zQ&T-7mhrOQ|Gd-xOzdkV0Au=m3%`RXK#s)H+z6c3)(Uk*d3JPQrM{mE_zBAi2YLYz zFdKh3PEkpS;BVwH`?59t(BcEQtm03`4k|5x@hjU+`sJ7JJIIcwGPDTrkd%_zDHQMQ z0PjeF)})Y(KfAs6rhuzT0M1pWf2aJlaux9Cu3KFVz8|D%5AM_(lCKDmKV38aj`{s5 z)Bo`gD`1cVc|^JK;g7_a?HJ@`dux`$3FAGta~wbE!*pr^RTLnM+sl1d7=SdNp3ETE zv0kt6E1w0^@bBA)oTFn?mnMyuTF)WxdjDip3KS6md8>CT{n0T%g^oHnHWF0r z_qXV3Orh(FzdbM;i6WvpS0MIfaB0BI1wTkDKDddg5c^46u1YZ!_x+aHWPg}6T`FT~ zQc+n0>}p+7LgUql>p!XCP49tLC7?pBq?bR&{dC;OJ`b>I?e*Vc6F0yn*PhD6AL`3< z=9)D?;pw)&#ila=n^+c%1^#4Hyf`a({WY}sAPct7SDXK{;;ZtAGV6eIhR%%54#KdDPgy3r_y`&v66!61Z6#a`cbT z;y;?{}XCUf;npxbnH8J@~6a0@D;ZZXXPe?9Gycy}*Bc z^dGF|UyawcoUVb$7|Db&$fcDKIA>4ni<7fW>3=N=tH~38S z{=W9jQnc?t?m6|pVfp_~bDbL$?OS|e|M%@%L_I*I7!YmL|3Uk{9a7D3(ER(_7emp$ z&4s43e_#7(DB71DS5ok|sU*4yP)Uu%Ci_E2ADy71D6XA7ehp>lo29t&7qD+ROAc}d zfBDVUkH5vpc96F(h2|U}@AF50#XjMe3dt94jQcWE_}2&junJapRb1ia?$Ul^S1wyb z2YoveeGyKjpF{Y{{v)ya8;0}D#Q-Yt&FBWV`B(qWh+X48!tEX3+kVaUn(D?iDl6&# zqy?gul+Rp*v;R@e{$siSRhCqE=mD{7t|;yPuaEw#)&M^`qvnA0{MX5~|4wM18__(R z+&dlO0rvFtrp_aw)J`L#R)hZWNk}YRTbqTrI@2GWoUTwxI`NOu4FR{4jDMP>3EW)V zKcl)py4d#2{7Rd6k*dL#xWeUA|CEXYA-yU|%->b&56I@Hf1kQT8+dh7fzR6S7O^iz z3cGa8*I!>uI4^Qo=H0c||H1Hy3Q}=8zypnz^`9Ub?Q(mU=0Z_~xZ)|1)kL zQKF1tWLv5Aea^G^$LIpV3*JRc_>ZvG#8&p){wIJ7CQU z1`{La?bIhaot)8Wfu1ddOVX|2bXkQ=1^bR8taWb!wCk7ObeHqeT(X^u_FQ9X1FJ|0 z0GntE$sA*|a9o9DuQ+$EZmusbySOaR7J84?kJb2p+9nySNI6^WPryaYrY2D17qqL^ zLv!PbW>yEzE*SUoA!6HK`1n2c`SsC>;~$+SnX=?a!$+&0V7iu*y`DLCSx8G|Ze?0o zF2A^Yv=oj0T>Pb}4Ah|L>9FRD^j-HmU6M&!mi~#kVb5i0PDz!DE3_6FI!6k~tafp( zn=oUQ-l>q*{P3+=%9Cf1?g%?`SkX-`u=yZ0BnH4cK(6>4U!<}3I`M+m`e5+e6#oxL|EaUehWz!21XMkezilWktpq~)AKTIx(dQ7SjlDi;7#U8zQ~YnxF4<@LGT zfnWRBWMo!fftAaJdGqfb9wro9H7!)HFT>wU4MKU+hS{*`CXAeNf#%q`%t(63>ROGD zHa={z@j**XvUCG^_%_)j+2k%&U8=n0gkyIGC_2DauYR*LAJG@Sa3XAKQbdux8f>W< zm}U##X}h_6=5<-q_e(JUYjpQ0nMR$(FvWTwjAY!w%?NT7QO~{P9}-}0ws^7p0Jv@& z3PiU_$Dw_NDQOrPbj3$M`1<-rv za5ciKDQwUT9pnqw#^-oB@~8ygJmI5^b)z|I=xpQDNyZ|WpV{OGM{P+ZD1Sp>>*oXC z(OY;{B8g81!OZIWVzf=BuNVg2~bt9$qRAZW+pV+GufR}QN zOkN;3qEb{{MwsgQ?bqWA7y+e=!+e%>?Q~~9s@f~?Zbhf4FCWPOdhT8}pUibH#GIf#Z*LpMawJl zsZ4#P5iUs^$9}!zr~6?N4btZv_MlxNOCFL+Cu;=~wbtqO8!O*PaW-c~R^ocMiGeL= zB`p2-xl%li?_$RCcE64dwJCd=qiYl6MQe~wSoXY%)&4LAbt_b81M#bE*7Q|g_3 z-Q(gbQA2dI$3Rz3v9+Pg{hSY`kQ`A_Rg+~2fnJut(9)3G*&bV^yIr_Oj^`GPwg!lL zJ$ow>v;db*VAFG_j!e{C!+n(*I%#C+G#$Ip6UE)5v_VvL3W%n@es^kt)B6g?{$?;n zQ%mfiBC6+$g8==-4V2s%srmJN+4l4 zpMwT+<+ND5rCu1yhtT0@tWST0%9>IRIicNQB>S!+-*y^q2J~5KQHb%B-g$eziA+HB zgauEqyCATst-o$nLYm$)wY|WBd_ULk;>=bo%?Q|aMj`moJ*+y*pxfMGcwV!~1p@V` ze(oB1wapj@+EJLnuSdywNv;9ym5;IpMc-uKTxlP|duv|GwZ2JM;jg>>{J~(2oz^Ey zlRD6&CuNmMAedA`;OAoR-t@8i?`K~V=?5~zg)#}zh}KAKV4+)YBBHL8ZohPxutzb? z%bX5t3Me<=M4Ra&Lp`tMzm|@`FwvjK6l;brBYEW`IBpYx%uovD(1OO!~ z^$vCF{j+z54I;HGy-12XaG~=2ABjz~0JkrsGZ%%^YTv3AuZu01{O^q%uF8xlrc!Ng(3nlud z*s!Lea+5KZ<-)b#n*&(ok9SC3O6HuA6KSNC*r&KsDU=54S|!lN@+ySX*ut)xAkBNG zys*yJ)~5W)XVMoXGf8`O|I6LV;MQ3qMScdxwM*yn+&+VW<1g=3q;H|1cL&Q${Ujsv zl;CQEHTI~|1KeTzTb8}0&!HOgno%e{15)w$=)eW%?Zbe}$oHun%dahli=Db?aUdCw z@%=9TElk^XLso#Yx3`~(KYl51*I+AiBrX$db?6Diy#ujwXtSX~82^&=s%sa%ZO~yyS!BIhphf3lW)K`|}y=DRJ}qUQtmMetw49 zUBz(|;6{9d_l)L(+FE_;cpd;@Upz`h+s}f{M1t7U*4a&MQ8Wt!^s}5t%T8>ffsd#F%6rz-rz;{^>Ww@!n;gn-Jg?KiJS^R+sZck`I;m*?YrUP5 z`Un2k;A`)yc>Xw1@>mV_{$M^hv#X97IYtgA1xd}!NNv%|Y%>~DQJ>0c>R5N!ALWQn z9UmO!ttK$o3^m`aWRJ1NW@QLpA`0}k61J&1F*{GdgK37mRJ0Pa!$SN`5&~|03t?r# zX`B*u780X~i2i)dFtCDk;JC~1zEPUfuLn>mn(h3?%cJ%hEQeH)0$#JMVs7oT2ku}- zW3G+UX#DeAVa&yu;=;o4_3fIORQqgt; zk?IMr8~0LBZdNeoT&ezm2W$2iIS7eb3+51*?$Z)O6j~mE%LL-y@L@>EGOTG8263|Y z160a}v)^w!C+lD^r+4zJ$ChVnxfCvytSGUpm2tt3uo`K*ZWob7+Of(=IZQLehM_=} z;^qgqI07n(1xR)qn{*Ur62J`X|Kn`VBX@e!hca@cC-<>fJ!s++bQ<|kZ^y;#rs3zr zth`$hMPBP+xp98rYS)>>#9e%A;_lPVOgp9DZ%v%ritHJV%;A7j(J~sQRIXcZsY|GD zZnD>5IJ1`22V5O?YIYZKTb6!mhF9`?ix%7HB9xBwp0&cJM;V2C=7+bbRaYa_3?-Yp z9nG9~8T16PS)7A$?9ZD|^+eGDNdcs;dMzSfmls+5I7#X$WU#WUV`67O-GN=r5m&>lewHXDXsH`_Rwk&vNOsQhDUx z3tu>#DR-Hv%UV|K5Q-+auXeNJqe{#g7h+09Z1T`sh3*x1E~`B9rY_`r&=RifsjIk? zvu|gH8Vuzn!Ua#vf|n6#mS3Ff0uAk>lg~Ksw%3Yz+!(F|>n|tQ&Ayex#e(JKNGniU z`O}*?tWy}XnTKvf|B|b>R_a5#6FE&f@-t?n?g~p}=}|C)Kbko!s;)FJuYxIDiFiaCEVw5FrDzX`=z6kRp2A*i|1m?g=_ zo4;}$KwS6KKR8nz0*Egb-7Pa~H)mXB88+w|(U}3&Y*BNUn=hfPjQscJb!&(Jc)Q}zg&BvjeRz1 zzf_w+s-lnvx1ghV?xHGWIaI%VYWr!qrQ^*7^RcR(h_IM$@6C|3Ek6)ZD17V2!CuN! z%py9CRit+Q_mOgI!zVjy6BQzb{k8!?zd*{lpJ(@Y*Pc>7S}99p+gJoUubSpw=Lzz| z*Cn3%2($i6{(EMTXX8!2G{TV84_$rD^fEDcY4LorFOc)aXH-cGTZqD+(Y*<-W15;OW@OyN?)SbZ4z5O`J=%%kU9XzF* zaYa?FM<=i};Iwmc9z4rzzC_9y+$EY@oe7g4EuVE+8?TprvdtC2lMmy4sKkk1#G+ML zj@OIOtXS;0Yc~aYt`xqRavT4B`+z&#e#UX>=H#PJzswOf6l`VxkbjV9z0K(mFeG9D z0T`^WCnX%UF7eUgu{|`Yoow8|13fKfT>E5fw@rLoAm?Vb$Km?!Hk}MXexxc`sk}Pd z&|)H`5;x|Y$-HcRQBq?&-{1Z)OJ&YllR@N-yO9ps;aesCCt z%d9^`q2$;)4+~_5892w-WHQW|5qrOwv^_~xF+Tn=Kj-4&TQLRRL>SG{vvyW#Jn_mLk^JF zd4Ab}dyf#UhZ0T;Pv*1qS(8kw1@kz|!J^Ji8JzH~7(4V>f*fX!?5jS|Q`9cBdFQvL zYm6gxw$6&%ksf4>{8~COJ^Ul`Z3O`K@o=Y??7! zHtWm|>8MGdg#MDz$j{J9QZdGCPwigvefBMFY`Z~qg^Qu`qGzj^6r5y^9qHqUEb?qE z&f!zT6AJ-0<7ogkJ99yz+(8>rVB^6`b@e!(Pj%58b{?I7W-Y<@v)L+AnWeonJ6@6I z;#rggY;%j}lLj>fOdV2H@|zg=3=tK!c`J4V)GKE3#f%ov)h>^9u|4#|B+#i^#4c(;fanx~KPcGBi;HR*oHLe92)&eoyq> zmtALcO5JCUUDW3~OkvZTYaZTSFOH)jl{DJ>xv!2hr>#3jmMN1@*WCIZz_+j8t&bHRi>UN*QUTKDKKACqBh{*2B!@mEpY2K3G$j zMW?5<`^nLAyi7N)g<*ZwzpSlfd%GKjX}H6Fq;IahQ`t>79ft^a3s*eHC3**v80mL(!cj2r^C5Wy;*_V0bPald^olr-)8h+ArT1DwAazSWYx47Ibvue-@oWY6~| zG1FV0-ru~R{neq`Qf90Q>DSBsauAIbUPPAQ7--b!LdXU|dl2Cgs+Gd{5RZ zx-_HFiH}Zct8AehOgW|hNN>N+XJ#mIw<$Hzp9u?kE1hR>nrurGy0l5r}=^z{PP<5(>32)m{NW-waj)&(1{fSGmgy8#+(?`gd}Pp>*>jhwf* zyJE}3fFaL^R$wrrl^MuGnSGjLm*CUIlGKJneqQ&x-&p7#a829`*l*auLdff(U(f=4ExG7aQ;+L@ASvk`lE@LY*YKP`Az&UwEt z6o=7HAF!_l+(~@C%F6x(Zi&%p-Q&6ANk2!bmGZK-Z?n&GtMezf0504;vroP9W^xZcLq)I_j&@F|~`z%W(1A@0luh zC*$9Z;aom-wexG>!qccTC z0{w?!MoHor+qu64wCkd=C2>45sKiX$at7M#qpt=|=V|d8r=*cMz*`YC@E11GS{cWb z{a1@?B&}<@JJ?H<2nq_eyAiU+D;OGy@g2ycB&g~7BT!N49>*(B z2ga!bK$JI=$(d`BP1CQ6x-bn51{>^O+TH=!w+8v-1Syi`Ff%lY&BUjeu;uvKy**-?G#9M zd;#SSYbFLP#B9%D8kHy5yzzZFagcM)Hq<3^Vt8=SMbF z-0r0)U5@g5YUWf0oWE360lYlMLaQ58BrRO)WPA@~NmhyJadhDbTFd?w(~`xA4{x%uP}IKh5LExn(KMGRmbRyiv)2X02wlg z9xJQi1Kwf?f-vUEbBgpk@Z@kxJ zdM3++C4k#6V8|QKR)L|1 z=@x-Te_uhkw^pNKx4l;@VRHMCLroE16SoPj0PDD93ZCB6o6)zB%R#T;0tF;19B7~_ z!>9`6owYiQ-$~XPP~YLu!i8FNYQPOL?EJkNi`HrPM!dxeYUXqN-QA+jc|?L`;brdyz~Nc11A=%B|o;VWI04^yKq}L-AgG0Wti(RzU3!LM79#&%AMPrb?I=o zd{>cboAIF3qERSN2Yn$rui2R%qI>+_olggyy!r^(c4mA+-VxQ>l$eGJ|AiOrxTy2H zzU_ysZTJl}>MWISY!tiy0K@nwIaRxN8F-+ z^}@XSe(%Xj>MDusfNHSKacW7}O;VK}IC zcTTQ+adq;>B@^)QIg5bli5MD^Ezb&@!ouvB9lA;()zIs30=@5gZxDj z_RLT{(LFM02xN0mW0W?TQ=PvCbv0Q&vq2;{M_8o8Mf2LdQv-`J9 z>nU=M@{NP7J~-KwccqvC&7>{WdXg{rz7NAEwchRNwr80x2ZfK-Oe-JTili{~9cC%? z5o3RSbd5@Y!Tjc7dK2XB7X zox4R)@iwy)7`tNi-&AssKj98ZSI%8%aDb&phx9E#^e1w{{hvG9D^9`$O10>=PN~Ht zW1n9`spT@n+ndfcuU=9EV4hplzF;?nDB$m`E=x*$^dVf#|SI19pqVk7ZV)$iE z3Qj;?vTO>hP(zD|$G(hj!-E=4d$pRA#VyO6O@&g=Y>b zeE9HzqaTQ$%9_5J;1XybvlymSKlbbRtae0F z-@?neois8WgbzP29jc+Z``p*gR?1 zv5r)30IGN7JW2IUgx34;yZouowdn=xfwcBu4x4J}2$QK+3{czB1~3t|DC~rof<;Ow z^z6kB`z!X%Iubzhrwp0gC~n7zDw-VV+SOTcNWDM4qwcY0bjf{=XU^=-3Uy0hDe0N6n!FQ+=dVKf+G=i9~y)w}* zltza79MVqNcAk3Bb7#jIbTk3IHZr(JkTT)x?84UdLOu#|t4uwjo=gy5Cj&Z_b);eq z+FNa&A-`_pWl`!p&Ms2m%+lvK{)tV)i9K}B6}WS8BD(2$tG>R-W^`flJhaQRn!J&T%|2Uh*MFk^Kn68?upN?pLu^*CLDR!d3$uD%(zyHhN{u? z)AkFgd*`@xdZ?K5r>|hg2R!N;oVmynj&(DGryZjbCS*E#GDU?+#0Z*TTj2#p`FjY@ z?8}Xldn5C^ckS`|R?Qi<11-2EhAdLY+q+6h+$&>sPEGjgOrIQ$N4Px+1qo`KBfp>2 z{&>4H51%aGXx|(KB2CNj=U|%__Vd8r;(>&hB^i-{J109WC)@iiUH5e#QZPme1e>dp z(?3&T3qHN2 zcMq)(REi&+`Dd7T{8{IW5YZ7%n#{~bXefgpD!&4mh!N}4Ba7X-`%L5&s2pm%P=Tm4 zv3+VSt(;8KM2y~ybLP6Ql47Q~>xD!?R&eRcR!dwV#)2N|WBiK2 z&l4ewJ2?f1gMCrS5^wnWZ662Zbpmyjve050z?cU14-Jis1$3^z8t9#^$nQc%&pzLt z4aKEwA3*%1nfG#a_AtQW7KXMHPN zt$e$$QJ=c~NROCV<6^Jj|40*Qzj&xN&^oZZZR3&Ld0NI9iN&S2lS=2s?g3XwTpu6CRP7X4#NG)1|UgKax5>J%5> z8P#yLZirZs3%gI24b=4zRIJWtL@%4vz1XY>wl+R$E1V%dh5Y@+<*T;rN<7f4yApop zdN~|-jvkK?gM{iK5ORT3k=rx z7%$d0L5Dfd)?SV=I8?MAbXczCMF!d~q>m-UM#X|(}H;& zZUCiM*9;tQ_X@poyGN_S*Rvpe#>w7~^(z50ZQ*$c0PJG7W9$S9BfqIkzmjp(R3czp z)7D1%q{@J_v#05B{9xS5b4~H7)-cu;=x>f%7}}DBQTJp{#+|JxScomII9r{sLNfIs z#wZaiT(_VID_z~lVK1~sdnvWElbw*MgYS9z6WghasC2=j`$(-6MzGHVa#?i4iY>CS zvYbx^4=>P(s`gOXkmuXR4)V~#Mj%js^ZPThBgON`%oNo}+U=-Qxq`(koMkCl zrA(2t{@47O;N3*s4an_UD_ZE8nv9`Q(KUAY2x+ zusDmPJ7K0`I`{SDpvogbx>?d>bguN%PEoph_a@3+tDo`C<%eO5MbGSJuF;Y&(o@J($<;Dk(YIlS5|LhGbZj6^nsg8WsS%J~f=X|pcL)$5 z^hgaMA-N|4io!U~``sV+d+z&(C(q%WT~=RfueJ7zn`hsTyorwJN(HymR7-kAj5Gmf zu2O?<>*z;9GxBZaJw+m%S92@#(RNcJ;0{7AXM_bbxFyis22>9ZFU{w)I3?K%Bp^}p z`uqHCSDsyzWjre%YLU8%=am?fwwrh8ck6G(PL$F-frWa*(b(PrCviA1Llhb1=?{=;Yb-$1 zL0*~?9d=O1w^`w#c|q~aa*(vT`^)+!vq^Dq%qupzD|nE$*ur}@qmb!oqRWTUY=JAe z3$T<3T5~%4LeXhTlV?D;t-q!E%jawd$}|2*nZ7X-^0dXERlZ*HFdv7Hm;%{nR?VsCN6@u~VpX+EUkH0Tk64BV zN+CLH(^n^de{V-9(?6l(PGbePQSq5=?qKt*HDVw+huU^Ze48 zLnnD!Tg{&coeRII)L?hkgFNMci~^%%GU~H_O#8fYsNO|U8)A8QBWeoW9Rh%pMq7rc zm)!B0Pj)B(Xw7m~0&J$9@H(y}nP_1C6sszZ#8G913SR9IQ8K;w(&~=VIwRnj_}Q102gA} zyp%)kClrWk<(?}k_KofXC&gM3ia!)fr1yqTtd?_kqYW&KcV%|`vGq^Z`cFF1V zn7kZw_N!B4Zdbf|YlpAy_bzvT!j!m=mVxAdTfv2*v)`@k`qQWef6=w0<4XC%gKzGo z9%0{FtIlXmrWvKeph-0x3x0iJd6AbdGXAroAq|`(>p08?UFve*64~g^4tAKVaO+QA z7{;jmL9CqRb0nP6g}U`$ElNnv`$APWR?!!9OX`dvq-H{4jcp=nG%g32GT`S#huo%feL%Bpx*_+VX&oYg#>TH6)|) zVu5kGsHslmQirrHk)cCYwzo8YC>T>=%NN63Rbp?W5YB(R17CQ2R*~cGNG%qv^D1Hy zI6`8iVSFcGa7PW35ZeMsz6+95SG!jh=z%b`mlXX&*hIis{wPPCaRXnGOnQp`#p8`` zsFt-9QKG&)GVEgQt&S_8QDtVNJiLfQsl@%x^xa-&ASYiAHoca< z${nvXc-xTXnzh!@_0$EmLo-sRbPZrhQ%mZwR1Uxls+RQcyv|!^dWkQW7*Ko9VA{E! z)1Ss!bMp2)r}r{EA1vGI>%4@didyU1uJ9+$;i2N*_jVd1Qwu&Biv+ExSx2HyCD zCNIxG`uq*MHTeVgKON)lsQwf|iLpX^EDTn+855)J7%EWFcVA8k&c1A*KromYqFDk< z7llESD=XD=cE%b^SZPvCCZw4cPrH1Hj!M1iz3$tl4p@=Y9Ow3E;S zF{|)XMIuS(emhLoiBG?yjIz)u2y-y+sI-K+m?M}Ox8N) zB?>TsGA3HChiYR#g)Cn-cC{-u^X%jb>n?s8ltBDkmsc(np2gCqpO7pXXgga_HBSS$ zlSc2-Yslv9Oe=ShVMRloDCf;t{|Hf-jmo*C=~op%$5oX!#=&ERj@KW26s9(O&AVs# z^HdRm;9jAW-9P4VNOkX+|=$hy)M{7oG%$jBh36oDO zr;`Lb_B|Ly8!a{H8c!ibjSZcM&`EU+ULdKm879Pe&K;3?)8Sz(bV1z7v zvyXYZgG)aaOwA5-@c4s2jZ8W>bi%#dpl%|wfa9BKZF;9mtNg<$eQgMQZQ<1JnM%M< zt$Zkz31nO(ns%>%7i#DVl5B?%$7qn`&=GNkLzfvLtjunll3aae1nnH#8izWg)x+Yf zv-?BQU4=ZJ1VR;Xq}RdF=-bGAwjW~Z=V50zeb0sc92R4GQ=mapvLvn+)15fG(1|!4 z9sFp8l=hIxMdgCXi@ap5suv>SfsZv+Hi=sW>2|ZkXl0B0-snvm$l>dF8@pC|3-k9P zCcRAB|LBMfJ6(Gonk7>Z$3Xg}yoisp>Dio>oJwh;&lfeH70UJk zsY-HWf%}gfZC9sqpSu;Oo_8HfMv>?P^=fTp@BsuokVtV5a&`f=t^i1hO1m>+D5zk-fu}=9XQm|x zNMSs6qW`aGx2x9b39!S!CzSNgHAHdYteD5VK$ers?u>AU$QrUGxC`!PbKx1&8AAlU zcAKWPzT*B>Wu(BqHr6KiRkBfTmD)yUZRXCto-3- z^3M7x2P;uk`XwMh>*pJVGiqH+pKC`U=s?BTVtZ?`oK9D5*>F(FY-!hh%|b^d)2|13 zL^o9yTS7f!%p+mIv`!YNhRxM1YY{%D+kQ@TQ>E-#SffHGXq74(^e44eg!H>1GjdA; zGOC9O{kY*LKoBEB3F?hhz54Q#YH&s~0r>&TKbNUEmp+!EbVA#)ahg+;{;hKqHOr+- z10{)5IRaCE>=G-O5%Wzeiz_|-)U_@9fQ-ELgj^#6l*22|Pvm!d0}aPXb0fnz0@{mT z3bXWZ(Y%vK3!@a%yhK|)DyE?bUMkVymcqNIKov_<;lrR9n-_h(LkPY|7I4%NjWd9> z<_a#m#o1PI>+!qkXXboN5R3ZC7mbH0bdyr>tjw~|T!&cSW;cSEs4OIKQxZsDR^Rf^; zt~+?@B?;s$8HF#zkEZ9*+3%fzHhvm?(z}$G;WB#WK5&8_n)EQ9sR0O9O~nFsm;S(0 zPJiH}JFl`z(B8qQao{LaUxe2Hc3%cXzyr-nAU6*AzlI)Z%n~FOK}!_?1*Lp>0>jSV zQbK0o4e}UHUFitYo#n#>%N)t`>xhJp)ppHML{}-c@#cD zV+14|c|{ys(MP2vfh=jOV?G~!;)hgwNI)q^vB3-7JlX(HT~_rz;aYF+D(mQlQ~iDm zW(u?T325?Ek0Z*QFQukKLnglLwgJtvo>Jj6bq@6J!%brhg2}MG%d_5cYcGfW8w~qd z$76g_h4R<~iE*>Nj?WAS@0(td#PeoX-8ketn|5ZdW>$)zTO^xs=2nqpR*B%b8!jd>@ZQ1<(H*@t|9dc&BFpXUS2?j$** zQedt`kr&$@BWkJY*;77F!_{v2MyoE{=9sLelf!a#A-FG4#&sNOvS8PLEo&(|;CN8; z8GqAD@L*jg$C1w8S$(lg3yX5qZ=C_?dMwI44zv3D!qtx&`vE9zC0}iq}Ao4KJ9>+`7SAByT!;k^tdGYA?@GPa3Tb*Od6i-EpxLTgh?2x&SYP#R&4dQZ!CAUXC2y<9Wf9 zWuVwnxlM6;RR?Xla1RNK$a4^!Wz!I>@nqf&DkAs%Dhox{O7`S z`n9hJW{fjO-+KvjcUN;a)mJMP6(`IEQUx%B7BOllf293EVf*PjJz08L;S81rXe3W= z$a?S3ZySuwA~zXOW+5Uz=6t+Jx|>FuLg>u`!`Pdb7YYP8D`z4KFT6$csUPc;^{l(fOa0$N`i7{o~(%^#VO{ZAxqB2Blq=hU+CfV2H2uKgD(;Y<`4&; z<`-ClKD_Ph=!|f5BG7h#Zz|q$x9xuPNjtIbuUOI!k<~KJU9MNGGb@0z{_j)|2zD=8 z{{Ywt%da zDycxS+HqE%K~_o6dXG#yxT!AXJL4i>%=rk=|8=KiZKiX3H9F)mjeh`fFfwiZ?&R+h z?mI#+b3tmdPgjzxJC!Lj9^L|r#)nhpOX6s>FB;#SnIN7k-Wr_Xu{tbwQxrNDi!rVU zpnEMGCz7l8ekGQA_!Dh4Z0S+-Z9*yYxpzm|I%7)T+bypyi)Y4pIMp*6vdSukAJUe} zRV9!mcq%Sh&&8QY!5=L`#Y!`>Q>@)Yj7EL?Z5K!O1+b=W@8YVW17s2;EU9leBU=%; zfvDSEq z5F_~8P4SF@W(~wH;ZU8g+mBb5q8_^GI?VEqrSjW=aQQD%y2V~|fvt)uNT=*NO9K5Z zHb~sQl_-|*nDp8&#G>1 zw7U6T8Bc;B(A)8_8289umOw$`H!%MABld5g1wiN_wOc+&X#{z78OOKEHjO3)!e|tV0 zsmo9OZxorYFZbthwykxOE`zQE0mvg)Ql9>}P4#y`>rFb>;Y$%eKL6GBH-?mv0gCVJ{%Q$+KIrxe4T*p(d3LG~N-4Q2O0=gIh*vvIp2yQK)tOvdb<1_(wc{d*>q1 zKJkCI`fqUhza6V-Tq?J2Q&UzNz(S!*%Q`GukoP-; zjoll0|I@wzlLn9v$5El9h%4+IO=r};d~5OC^Z=5Qk`nn?T@w%nYQGc)QoZ{WUN1WL zJ%A&53y1P5^$J@ExS2v}miN8%Jl07Y%&o#g7M6w&)q5cKk@F-o_@kV>XIYB6RM_*Z zR|uH{8*0x>I@TN>%?}zV-jgJNS@SktYA+JfLY>&$oYdX@>JDOOQRS(jgiGd8`!~@I zc}gMSdGGFLx{S?cf&0&%cj%e!8h>b5K71-2gJ6pib$E%g5fR@*J*_s_Ed@On49VF}?TvRO+i_tT({>G=7thAb5%n z*7s&CxkM$blZ8y33EpVmFsO3TVZBo*9glxat>N`Qx>pV)YfBjK8{vy7`S6=}9L&>R zo~>RxQ4@|}lD#m?=i8Nc>8ap`QQNc!xSQtw)sxzb2W(FwPa=i)wgIBf(6IbB?NU>| zrf_YnDUuHt<45r|-WYa(_5u&g3U5j)<@s@|R-nc%nX>7!4dDa9G+ z+$HYX?OM4yg)zJzs5ShJ0&+>LrnIQQX6ChvTlPcN|ET0dCpC{cY zl8rjf4A>pqZ{mS2&|PNU+f6MCud=#iDS`(^wCIe!hDA}GO;X1Fbi$Kfo3$`0!YWte zHl1Y61puFjVn*|J=>uEcGO2CpmzA+{?Z9wn2k@p4Orv4G-kx6zmJ%HgM1N*h3_O0L3>v zVE($Zrb@Dgnp!?)Ff&N?#efn!_=Qd6-R%*K52aF;rVXHUTV2C))^F?F{4sh)ul>VEFjnU zI)+|K#@8)E<_}ri(D3YDsWXQ68qom(?yKE9*zh+rV*S6eQFjdF#m}&zJJA$L+Ph}8 z-{%XYrN$0Z%zuSw1yLcK9Ox4xr^od3M}YtOMk+3AoZ(*NjlSKM>o;g_S?`A@QeOdx zpch3R`}!QPtbkD^T^Gk0#hmZslso>saTPE?@)sHQD^WZbtXE&BGUojkgGfXn*!S>4VKC6$vPVIFJE>XdL&nV7 zK{l`seV^v-9P?n`NFZqtJ=aaDpts=S0VkLv*+dT8wd}IpwiAujVA`1Wd z?L3ZE>*u>IRF0DQn39P2g6D3Hb*b}UUt42sj0sY?kq65tWTUrt47ADzps}@Kal4!N z?lvURtP^w(w?8q*{%0{Hb#vdv5YnpO^l%5RZ`t~siYN~l=+-U_UA%T4+zJNH{3C1< z*RwIU4i8)^aPbsL3((=OW&S*J>{)WAS`uGsTct~{6Ab-qc(?H_}t zXU=Cy5rUcT?qEg4`bw2*FIPog%uDrSDsbyQr<3TE`8SHKgY&tIm{M zbo&Z36$^;IQ-4m=wU7$uN7#j483-OLe0PW7Wvp*mZPpAlt+esB(sx$cST?zrMyw-g z-QJE73L6({a9!B-5zm7-1i|wNwXDX1m^x* zickpKXa2)KerNejwPeA^>J0%D>U4K~Q9Sf6CFR~#OU3O1?biTRDI^O#t>{H!3VVj8 z`mnlcgu>+eQU4lHT>Bt5sE3sWl3V zcASEIuG1>ue@IOfyRP6JZc@y5F5UlrJGRD9uO8X`^e{n>Nz;TpU-{s$bOq<0OO5(4pm809n&jAwIfshYN(6Xqz-|R7Gzjv z%+2j4-wvet0{|5d0Z@8y_Me3GHjMu8F<_4zDvzO5O?e?jz(;=AcJ%XaCQRvRVm+}M-krwP)y#9s8 zb{LuVFJQe_7^$`&VE!Aqlg|TPabscvHGVBMcakZw?7(^te6l$7-%;Zq1Gstr69(Bu zMgeq2H#{WscxM>?3Um-W5Yj`T-tJ&0{u_mGk#2^2be?IOkMXbI-8;g`?k_3HnZAiN zmwhB&w$cPx`Nr?E^4|69A^tbmy$Qq}iS_?i!S4S(!PrS8{h*Bh-#fujks$*D8p4`t z|49MwRrdv?Ms2qx&woFnIzhSxgFNE)PBD*PG6DPgg&*e7^q^nK!W{*kmlU8y4qH7s z^Pgp_)cVyMCAq5qSr>4T0a{x6{l3J17o|Th3%IHPxL$3!=f;0^X{2KJ0;+)FKEk7c>F0U$LZ#HdHdOxd6+?%sQH~@ zY{#_oLIdWFWv5bRcj8oKxQB-2m*|EWeb3(`WfGN%lE=}o+t z{P6`Ru@lyzBMzMDN!T`N=J|kFGv(8AT`_xlJ76nApZtbXQrTWg;^z=^D@e6T&8jj; ziBWb#hmSFsP|@Yk>7(%uRQrUvQj*D#P)jj!PFc+HhE*wcFtXne>>;CPKR3T*lhf`x z7t99=%(f2XQ6-Ao<0NCe+|X`k4BV_`?8jB;K0i&Ti|N1nxXTUQz{GlPPUP(A3Ofx?poT?HhN=PiP^iA;Fjp0|8^BiAD>bsl7BR@!w7PX=(>A*N;gS;LW z)KF%B?q?=zw_2cs|Du46V%|}~G{a)xJ01^4hCg#We+EW zCZen`jiPoZuzj{w0(0Qx+XTZHd_wRZkkCb~r7Tl^$3CBl6gWCZF8&H0UA$&6UC?Qvr>D7q1+D63y(H*%ScL4%I$k_U2h2!Z}gaIPg_Q92+XZ* zbS@8uh!I!bU-S5n8s@{LxTyZ&&ZGgBP<=woN<}6vk?r8S*7rWj(QbtFl?vO=F^5h> z?B|E&Ekq)3mY3W zR){aPwRM>lWp=X@-lBKmK!?Evi`8w{{-~f68vl=ejAB;~L`M9gcdVfZBjy9`N8pKj(t1}vGT z93c2qS$Om%5TEmO=9x^41XXW?62*H%kA}w+x=!c;VNdYTow+h%W%(sd)~Hg)Ma=T^ z#wgLm>_xw$MfkWUWA)i89%l9RCB!9kbG&TlYN*C#ba$$3q}XiP^irU5!I?2Q?!22p zlD})=NS6-vVfU$Oed9pIj^x(zU*BRs!w1}fvs13dsT1$P+=GN_4oB@fxip*-fsKNa zpn*5en0}Wzv>d$RBc(O$YSAh0(DFO+d|sFV9J_ufd4h5w?(Z(gh&v8Fvqk9Vm*-a2 zkkfYP=Sb!J(-H*dyJGXzmbPCxrS)J+Yi?%XX!lB0QiN4@LsQos+$c4r$!h)ehNV}M z%3f0$;LFjjlMVHwkHBEeySkR{kw8eNAvisMZj~+Zaa|}N*@y+i(aV$Lb;t^aqy)AT zmuFt;BB!$tCJQ{%G>ACt&A_K<*z1Au86J;cPE(V-J;*dS%4f|=%wPSuh$^R9_8a<4 z*?zY*gj2x$T=js>yu7(g%q7jb=uW;i&)0FD`ZEh?Pq)04HMUs=$v*>3#w6G3b&+j` z-~`7&du&ge!D(3V$n{FXQjMWf=-LkP{_iH5lr8DPB0bz4!JlNk)V}@GIi2Q4ZPn>n z0^r5wGu;nnJ_)1x4=YQqX)L#3Q69!m*a=pq+_#9z;Q1#j4atTL1|q~qF9O8=^heK? zU4xnk5IG^UOMWk$#A#sob}ENQD^3G0pH~}n>^-N_mCM&K%1VBjjUpw;QaMgDfpVwm zHh#x`Q)fMAf>0JFUvOy;d%%d}SuYVF5iu;{6#%xjT$9i7>A!l*uQg(wIXN|Fa4=v{mB_Gc=bd1#LPM3z;7a=Y$n`~0{veQJ%nUJ>^ zmYgR0&NPZjx_lXGa7OxQhb7u#-lCAzApLL&Lr_U+0C_5Bm1FNg?{u|ua)PVOHtr`I z#gK!GOUo-9G}VYAOiBRxAj9NJA4-A-H=V8B=h&+@f%pWi>|+F%F6wp<@vXMLbzW*e zIIZH87{l+=%MV)9> zl$cBJ=k`tsT0eZA%ar3}dnA?BS6 zjRF<-RJbPBe_8VDcVa!Jsqdmb{o(U!W@Dj8OM4!IV6tY$D*~HBz!Pws-4igZPt*h7 zrGE7<&TAa|W|bawShC3tI?v1bTIU`Ory5air0xR$CE`!a=`^bhR4zRn0g|{}&^K09 z4>Uc)Om{-Rbbo;p`j6XIvBKXTbJU`*d3;C$ITK zH>2#<#-wseHup&D7}{v(VV~zb9Ov+B`g5W3elJIMc|Y|PN^11_e2}QtX9xGDx>ePX zCw3UAbc~H!^8D#N2PaFeMns$z3-LTq?tk3FC{JIK)eUW@0VL{N?4RW^97s&`m~8k{ z))NPx3$2??Em)R2gQd~~f99~AhjNyK(QBrE>bOAF09%o3Vyw(M^Dq&YbauPAQd zV(MDFGW@|lk2g;X`f*myf2s4}Kk$b|7PJ+lR z@}vmb3oQ%douH+*-Hhl;-aLu0{dzIsxn0i495rh8GzQVcW6_La`5?zqEWKdYZ7CLy zwrE=d1&wic*5u{o{8VH|1eo5OFq`{2?1G|izbZ(R(WNYe>R_13u;lHw0>B6;QPZAr zB1}KMiyFBTG~yI#GLCQ}W+N+5aEtrCl;AbLIT%q<$qzP}qHhdsiy)JTU_vG*4Lt89 zV(sg%_akTW5PrK4it!zDvCw)Q)oKp{Q2CDkx&QiUXO$$nCiD!bKqT4+Af86ObHk&=?-LAQlxwh2+%BEao7LL6V% zJj~qm8@*%()3QN+x@uRtYXZn$D@RCh(w!wL)koxUdGPKVhRyb{{e?NE--^m1zLxN? zS-w~kJJ3_b5o40BJlkrpYbG0^drT|3{!V(1tIUyNa7!0+OIVx06_i~6>J*gDZ8p<3 zGPw4HVXw{f>)nBqjNn#d+uPiOqQai@NO)ByF%MLzNA$DKJH`Y!9@ouNp=-;JS7&r^ z?j32PQ%V;)z-HMr#zUXN>oH+Mv?mveN0en{?2ffCy0yGp!3ATg+>$9zy%M6wlPs!f z;7$Vrjrp<1c5s4g<0;S4!2_+3Rk_C}rwBvO(66lB@V2-r7Zl>KB%vla)1vv+N;e$p zI|apE$(1-$A5nDvnCp1(VvY&on9F^=#p!mA-qS7uWr-Y0&pQocf<5g%E#9?zLwsn^ zy}J5@;(&w~+TE@5@&wQuO>8{iL&W8|ZmWeCL=nN0M+?UT#)5j};1*f`a zD5xe^^5MMf=yH?xKa9UejYz*Zi*@DTmc^>l;nAUE3pyF1~Y88x=_M zbZl1+hn62TALtpur8m0;SBs7K+e@4bK2Cg09U^)5{>Wj`s>Fy6lN_k{id!~Ac?qWU zb?FDRL`3_(VfY7JGqogJuT2qNky5B{<@!koHpj0B?Q%TiT)L9s>JasE3Qc*8o}NRF zjqR5!mq0GglM~4~MNkz9Oyo7>u(z+)@#m6vFM|d?S>b$HrwEtKk{Y9inV-$RP6w}s z{1#2~gUj_Ux*mM^!T9O)SC=?J=f-=TaxTv@ z;3{)ES!nVG@U538G&$nkFpU$ABrAf&wX33AqTx(h!C1&Ny~J4_d#PIssDFJIfX@0sN#aGLj;=+- z6KNwn&7w$RIoleCF%;MJBs|H>9_`>(NDU4sMNNw9ObPn<_GX*+<9rn;{0u$Xo11fb z=gZdKE=b_4j=7;rw5Q)A^RHKwRh5gzyhxA_k*QK*Wo8xC91Sm7I4}|;;-KM<9JrRHJQSj#k46aQ} zxzLt6HaXf(#Gqe<8iXISLwPb*#oX6l%_gi`R=f+)O}Ib=F>}cLSz~-s@t0Dbbc8hA zOC#{}A?po=+tvQ1$@No+mj_uz$|)EIjsi}P4xQGHzAt zGJAhFUABccrBZ==azGA7LO;uAZt20MYfcK3^PE#2^T|S!XWgF7NCu0?ND|`#3qOqC z`95Mgr*c2#OEFH?k?0TDs#~%N7Xm;Ctp)r3$(*b&PU9*$Ez9Z6vGDLz(`Wt8NC?%Q zIddkf!U>V?OA?DssSO85VsLVU*n6oC4M)pk`s{Mr3oGb#|E%egK%?Ip9{2tD*z(aD zB8oq+``T%0KNH`c(fXVo#2OA$A02%k@0ruH_!*SAzGYLnJXAh4wP-n8lX3$iNfPa_g1qKm6&^}OkYKlyM|SJ>M|}A7sGQ77kL(c>pyPyP zRjV=|ypo8F(W66x@Hb~pQ-zS6b4(xZYOc+i*yCWzgJ~|i%hI$D0BSaTVfuEuo|b95 zP4^{9B3_gq+3(WKM>pNylxcC(M-x$+D%f@sYH2ri7Oo_D`_z!C80Ovx{?RIJ%%aJYfeBSi0Tmr=R@w6!b7;F4pvi}SJ=;!`p#%-`B| zh~ilV#&19X@a`5TTE84KpNv@OPj?Hwe7{X&LRnq2D#}SbqP7iedJ>j8;zN#9+eIK^ z7CgcQK1lp5_qLK)k96#5Q_Z5jf$dpFqa62vh-2e9v(PBXC|>jZvd1zl6B$XG{#7hG znAJQ62YoFBx>=}=R##auORitSvh3c|W?~q#Ht@*3@WYJ=AUb!~wNHK8L2u=msNDb( zhJgj8_won#muSmQo^DNSkaJ?aeBZ|m=su(bL|%*{od~QGaKKk=6z&5PaSw8B`W-sz zLv*vx8!b3we@2K;6j&8_9uEWi-SSfapH9p|nEOtg=>>ARB|Su}v|xJxyQB6fuk&ZA zF#{+}g2NSqHCSEv%(ljB=Yj=PrTeU1%nM7x+}iXKZq|)o7r1Bgdu-!p4pi9>oR!Pp z39aAAsNp&aNl{n1nZdEoz;44Z0+OOjth6Ho_vaHov!QFx-Nyi(YeNK{7^`;IkrK?u zF8Z!jw9i4o;=$rjwd-qDpGP(EoW7DnJ=3E|&rFd0WF+DMy(MK9ObpvU&G_V;9zLna zIQuYXdG$?HGHP zuBV;v8Bl$##Nzo_a4!tP9=4#NOI4$^hN>cPjKNb~3*rzIqtk)Gts>`l7hwDK7 z^E0xQ(2GJN(&fTuNFe+mJFoHLa0GQ@uC~Y0Y%`#U7hR5|!M;59 z%W??&B+Yk<85oCKn;Z6S&2lpMFphNgsI7ONEyy#j4btwO z@>oryH|&}c=w48WyH<5@E{~^_rfA02Rm2WITp@3a_Gt8Cb<~nv?sZyVjNETvP-w4R zygKSKsE-BE7f7xBJ5 z9Q{r$C4A+)fY(mEzQk94GkAXs!nTS^mAX)jhOgwJ_%fS=5{vE1xy&jXX6gAa(?H1| zi*aSU*m-|EsQOn?!q_0-q%O3@CX8pRoFQQ|gN(%GCu1soqnrlLXRP+#%rxVE4U04W zOhsAALG7zZaXN%gXBfBIJr0I(%plPmfh5?kjxO{ zeigfvE0WvmsHNvxlQ-N%x<`V+GtyO{%z8q34F`o0bZje35gA}%UnPoJPFVZMkPi>k zm3=L_{~eeZJ-2kt@p*P5!F;B!ft!d`maXjQ_3?2U2n#$ouKZ|~SwsTYO*QdkH3#_~G|lML@1hs@c%{`iAuEIv zGF&rP%>k`=>4ZwC(r85r;qU6w*3w@PiFh?J-B%>m+foli}+<|w^7&o943}j z-g5_!^$8I$F^1Cfj*tc+Lm?5T+1Dl3nAs@fq$t7Xw#Kp*4uI35U)bSn&U`7(znJ2< zuxc->eqmc*Qs(hjQn*y2t^LdEC8uHu{LWv(ClLJrEqMbRuv!H~_t{9!4iFbqj!H41 z4n$1R_(dPV&1P%oX2c;>I+Z*6(mP7cMBBLkWN8y6U=W5C{0M}AhPG)1k#$+Vgm-WS zx$LcLvwGJ)eW@t@(%;|8+J4p-0IC2Cy-QJIl@=BKhM}O>QZUaoqp|uhsz%q!MTG2; z!Ld!P)5f5cYp=~cwSwaZ8j&X7o>rQhprZV6xlFX6ssvMVsA$$vXVp91$9pC6p|`3Y0#=kmhqj%|$<-U8D4Q>}JgvrSRDOy= zB$qD{VdP)r(A#mA;4D|X((+-vDUQ1&k5zP(;XZ;s+a0w0==JK@wEELEQ+_KTqLow0 z?SgRZsK@e;`h;c9ig>&+yvL@ypjBvccNNSbpo&rO6tbkArrW(|@m_1*(GO#*FE=U> z+xEKS+gieDz9n4)g;e%O`3qx_N53U;$C?6aRd*~2xPbesSrSXixDa94$j65`(qBJz zsO$Dh=Guz4qf>$CXywtL^Jf9v}dR zVv(}Y7Ry&A#ei}rMn$h&G3?hk1fH;tJG#Br=iB^;-dzTgBk1x*=@ou5E!1C?#XXxo z#B9?gSu(P~_gX7Np15F&sn7+Lu(672RODw;hKw@t{xX#iG7psP7#iU2Uix|c5D_vt z4FcdI-Y|4q8R{HvmNiUOGo0j<4?XMCssuY#@)E>SXq*Nk%s->Q;h{gaS&Ohqi{Cc@ zJdtuaV9$*n)!v>1TK3VfUvLk#fdEzJl`x7z(jiPn!Rl+RT&uf(BJTS){5ok>N{*Ci z`NH~w+|Txa)B;6{i2ZZcTtqB(H?0eNCYM!XMBt+M&+q-nbZvCwDwwwQeuO)2y z?6E1FM1^XdT|dL|7xH(LV50#Fb7fch&lxNar7ZUY&WNJE@vrD-=Y2q2f%Q&7E^j*_ z-m<5yx?;;V($4@P@=Fdr8$7BW`L)vPlIFkH2ycbn|0eGIJEY0~Hydkb>fJ((Kw0Gf zNs8ULI=S8X%~+q5G@x(#T2`EUTD-JUrGK|LMal-~y<^w=ZhIBszpkEwRGWQYb@%U1 z^__zteE^d z3#jS%&O3d4mWj$!_7h%U&?u((W1BRE%#$`maI<={Wu9$>?qx8D=RrSDZZ)gIYAT&w zEeL1dGR?-9kPwn^OO7S{YNWj%uCv!vf`@K7C06BsNqLbqpLbntV?SHeB}A2!OS!+u z#P?T&)oKA_NtzQrE$$DD_0-1JIcM|we24hP64`m#{SnmPYG1a@@@)?gN1At0K9U0a zw6Ow5O1I1P+FO7PQ81h4@T=Mapq{y>dqto%I9QTnXnQxMSUpnDhp9##hHuku{{cC{ zV8O)!lY9+zu9&TvrucF zn<;s0-_ap1X24uB%?_sjRUJg^Me_NY${6h$3QeV#04@K+PzOjuW%|(n(mAzXAIc{U ze{>&WI|xQe2g;F-tvXvlx@A*e>5H~NN-b;7JmdrqSmx8FA^V-OqzXu8PH5DJjqC!T zf^3X;<^4Fy;?edA$#ryN&j5sD7w}JnL-MBUlyo+Vd{q|7LI>_EH^ZCBw^Qog4~alk z`J6e>@q6c$36oa#O#j244HZ@^i)a-lXAAQbu$|gc?JDXfoi}eQ< zrS?yYQYS5HvN3Ff7FAkEi&|U`6WhKh8uI;Nz@l{jX;CCumpmKkvbiYUK{h6NSDZrh zcFC#?w0EeCDaiQ;R!ZOkSc%rDA#$CpNX~IaMx&bzA&wu!O|_lYZm7pz0%(`(WL@?3 zmF|8;%uidKr+N;*aUWUo#$1XWEX*pjatOGbH@}^^kxaW!OEks2kRw z#x@CxO9N71hpPPa~ozhv|+%!40 z29r@@yOXS7a!ln8qQXm`eP0Hgv#fNA{uxTIHn1}$e8=KKh${WKN^PK!(}u#A%G`Uh zdj$?0n42k9O~E265^1*YXvZfvGyrm_v5DI3iBWOV-vk*WV6K#%7zFexNoy4Ol}_Ah zPf68~x?UFW3f$RX>Mo#DhmT}7{XY=mj`CN9K+-#4zjXg~YP2x@%K8e5JG1_dTiP20 z1GMNo!kA|xOHb$KI>!g@%<gVL?ZKm1A>~BaqJ*d}6b)9IW&XDjO zc$;wbSk^p)YOB@`w6qg^xs(7Ft0>?z+vuG@TTlj+7w?Y-&}8zT&=gHVlbvDuMlb_F zlO0?c5S$cLOw2D?027`jIJwG+|4z+--(S(w^d-S%EY{{YI^a=;o_ zlYIgGxVS0Vq&d#tA1r$Yfk0oHeoeZ{0TPWZ+0j6^k020qI)6boX z{&h-npl8>(I`I*3i~3GnwfX&r;4(mB_h{rjVB6tEX;NjBMee7+Hdy)rsrduza7zE=L5X`g*e?$`TABx_aB4QfBBzgC8zjkaC6$Lq};%m_L8FyljTMJ zW-a3*@dPIMHj6ebM}cU7ZoXtE+{JR z2buk}8A$jEmAu41%P;@*eEa&gJ(02|Idsg?S#CdPM*r(r5GE2}D#iBi{?Gn8q=y~& zR8Y(mvn{o16DR*jiI-#mV(@XH-SaEIWM>-7xdMD@?OZ#%Q!9pTpxH{h%6dHNUcekecT8EW&ZOot!FF#{@?!H!pZHko$e`e5F(Y1*0Ii!rk1c1$~v z-;R{4rA0A$E^W7v&F_Bj9jx!q1K|Ke#+Y#a|IGenS9yTd$9dTA`R`18faD=RnM*z@ z@M}QtKz3(807{FYN7j6BM_7E{+IB7T|B=nA7*kBPC992gB`U`lm_}^)csmp6);+!x zCtJD)PcKy45zS}C$dH^0FJA;Esf!HC$X|TE>P=iRMEkOc3$9YL95bY5Iz~0w>7Bvj z__BjHByBNV^6i7crT~7E@^OoS4>#@gQrfA7D^A$fzqUmh*S6hlemiu8-(tmyA77N& z{Ql!`=GCMG`WHAmnypLP3hlDK1Nar#V*T1B)*XCF()O|sugp{seWqL`)b2t*FlhB^ z$X8~~=vEE%f(|{KE!95T{q|;p2akp?v*hvF@g*HSJCxd-BO1yrD2wZ8cr$e)YIx+a z({tWVL+g-b;q>c8uV&__ype10)v9w5P*!n1aa$$os8mnlB-Y-&8GPNdKKa>9q#~1r zm}Zq`C${%E$MCYOp|5f&6Yb+?o(!x#In|HQy%nCKHY_tbmr`e&oQKjSY?p&E<YkOzN8`u);uLdG+WtN?oQl4A5`+uDbp;E~3-Nr$ zsu~8y6{hp>&tp>=EDd92j*DG$b1g+NW*DNJ`-6tc!8Y z-+|poWE<>jsQ9cOB7SW+*Cu&r+m0Vzug0O)@u#|8x<+V^7=GzgWxQ%Yz-sbZfwqo8 z$>$+QILMh^6UV+zp5)fnAhgiofRuX>-UPLhLR9G`oRZgy4cjwnNP?HMrGP^VWL6Av zXkbDvbg5a^wz0Sk?42lVY|O72Ql)~Jmxy;#c@0* zigMCL_NG9mmSU~ud)j@9($j?ua$`9gtS%T^zP}@_>%MZzLAz$Xr;ogeLL4PRm^K!X zA;EA&o?Gx=z>vELctiiW^31m|DMb-^ld^fj`c#2%la;6y?;(+n+L$XWmx;HQFp!$} zEXp{W0RD4&GsQXsT6KAbbJgN^{?I0htMDDD#Zc+XrTP7cjprWFk{EWcUDBpwa_!%I z6q~K35%A4D@SwwDhD@Z)q#bQi`iTNbMS8fhFfe=Fhp`&57+srDtrTe12a7+`A7xp& z5C>lXxxH=j1({#0ABYfcx=sq@?&i)PL7_#Zlm&3Y-v z2oAJ?drvmV$=iG+sSlt&l`#IhMa3RrSB|+tGU2^?aH3q#!<_h};D*{j_-@0|9t` zHsG)Mr;!l}16#caYu~5-1LWX++JKcemG#E^<0dd;%-J?ul$<9WCKN#f5v>brr+T+J zd_N&A*Pmw~s=G10kDNORvw9sa;ST#zzl55SlPv6ef;3!st#Qyns2Bxpy;{`*6AsEg z(uCIMJ)LG8lpa499gnkAvD`huY5a)f@i}Qy>)NJBoK>}psQ|Y#ZX_z5;l3#?v>fE{ zF6?N*hg?f;LDSWt(Zl!l#cbNq-XEH1eZYbnI9!IXXkI*#p>#3L-3#L-5IrLex= z)T{@2b`L41@XGJ!{m&nqDjxFCo!2IPC|@&Wk_%fUq(+K;_ZZ~rNX%T9h48Fhnnz4( zcnqeQ9}YJ{<;Kon*)6IvGJD2_K_2((dUCA`(arabsM2yz`DLZj0?PEPM$elk29Zf% zD`B|>q#{LFm9k;nA<#k>T{2g^6GxNY@xyzcEn0hV$f6@VNtLFi=`%V4825d{YEgKO zBLa7TZwh(fh1Ys;2o%3BvZ{<{)<8REzpjc6LmT^GEitqyNU#2RRnbOJ1{+WkPta`Q zn>wjTPjzdjgy?=y#Fn#eAzTq|*mq3=Wc^76|0-I;zHLb*iJU5;rn}5~e z=V=q`DfehxZ#;l(k|E#{2Jp{yng@dlyeNV8*4iM6Gs)+p(5Z%Nj@iBS6ON}APcJt~ z2sbSbt*enhioZAa+@3B}~$!?i2*M_tim|lhHd{__pmJ zu!bwmN{87Y%~sO&={s|CSES4fEnjyUcUqrI^IM!;7vB@7C#G}Q#H%JdVlg|>T-g7F zTP=rP=Tss2tmc`NiXUF`L!C!q)yDm<4E99GydRa_>nzNJt)Ni_t~8$FKirm`XjGap zU#<^>@XO!7;n5zlk=K(G-?vz?Sc_3-yDC_y^2?j3r2piB1=6JN1T)1-SeXn?9QOqs ztJjh`iRaFD6HaGi$}-sYrK#U*8^GhoBzSx7JZ#m6u|IDYHdugLjru_WldcSi?iloelC5qqGIO2^sUlbgz}kvgm*rBtKo(Gt=P7309u z^jh-xI10@=35NZ>j5hblA<1!el5%>uY}D|XP8BC?Db-Lbo$}VvH?z2{WHIIeE^dT4tOEob|_3{Ql!~R)RGsd z=Syg+=y7m%j7jl+jW~y{S*~0k?}5X5*LB~Cm}FnGJukDy@HROH?MH`SRz98l*n7Mf z)bUf%#PK_S-)X0Ez&YV(`Th{~Cui;RKgRBPdQ?HJ6FI~7UFkdehTv*09~o3OP6?k| z<5rV4&Q@QHx?Uk3=NNzCZk3MXfPEY_G%YCCWWcqr6B7v3r%jCGkS*zKKbRE_?_xyt zjAr>E>g7BcjqoXqe?(s-%V)THu$&l2JWQdSjMJqrf51SYAxt`oUx)U?pL?e_d%fu35rx~f@_AE}6ROfZ z#eu)-AYT4*$0~?awu#wcy?4EbUODU_=O$|(s@<*Jowf3dC0NV-;NLYwusFb3fv;u$ z4l@5_R?c4@?@s3MMXM;BR9E9-?>n|(i876YWD_xFv(gH z@3ExSnNaJgc&*^YRONCp zM-03cI9G{6i*A6u8{XiG&!?N$n zG&d#S8lSaWVx`9$F-BaZ-G}8{nEQYW7C~=4m#50Lk}G$2@byBVk)DN?vV2NFUwuu$ zMxn*MZq#!T(2E?J+8iImi}|7wf2YIc$2U*0tvy5HR7cA$S-5q;v@UtsDEA7HSJvmn z`r-*?jJKxMGZ;7S9=6P*SGqF1Si-B7!G}^|uj~wQv7m-pH+L~y3?$RNo7_D51oZ&> zR(%E@aGEhzDD@1)H6e;br&aqb)MAwE51r`N-5GN2Af#J!jxgPO+2@I-wXXtI@nbhr z$%p1|c^pO-d-qi$$>t;9X-*OCEey2ur!D;*9z>+5?>3g&E(!MbWGq$RDt9;V+rO6a zt2(>S*rc|!kpRIpygW&v6eSi3S;=@g;gu?fZTbTFf~C<%`K8eeh)Z36xIKzd*Fe|lKDN;=3J<$qY-R4rTP?fK>2aTqxvD?X=O}2# z+mt@vT_fEt^3wv8neB%j5rRVE)Y;|yP;J1jOYND!N|Z^5E+YI=Qn*(1uqz}Qz4oT% z97DTJiboH3&#YW5@y5+rMW^ynlS1(0%9mTiqSPfyOK^aiM}68994g>OVRm zdTEF5%{(Y{wvX}r=__nTL^z;=U;8^mS1|NQhyn&3vFp?9B#?!WG4@%q5)9)SG_PH0p9gaj6q(^^{%)AcZi?FUqkr_S!twv}| zKbTERCImC{$W+PwNV#XQl_@a~Fz=N#ed3IcZSJo;BuXotX}|FJsGVNC*mkme3|G=p z&7yyoM_!!FgQkRPHS;&DY#+4_a5!gLn0*wB9~J30t)Ou8n*z8hyd~R`*Xe#OgFHa7 z+~!t4o-kXw+MdeWEi0Y15g~2-&UnKLedj96<5YjFcc(ZvhaTs59Oi_kv-w)L(tA1& zL*8E078^u8xXPrJ;kN6~Khtr`n;&wi8Oy(=uqQd8FC`uc-0>jE`NjV*v@xrz{k7E9Jol zDgskmaHUp5+kMo-itXoI-t_do)!d%otLo!F<5%B_bhRtZIUlG#U-frlP2DC62$o_G z#OVHhWWM~cKDV9yV06smZsk^A%qr&L36HrVP6TX>Z1^#=~;2c|*~RPE=>eHXH61wZggE0_Fw zslcW5(uwRRNBgqTmK>Y9RcdaZS6=yI22MV*9#(lV+ttX(ir(^QvJ}rbmoB+7Cd!)l z6;SWe4g=81Ole!>N$D`30QLob1&bd+bzYRj;HAu#&XirZhH5mUQ;)7%`&-xt8Q=hS zKTVGxfH+o(p2L!J9=P3ii0 z_)cuM#X9slcABbb1@KiH^1nPiBG_0u@WF-f%k3fOyKx*uo>e_&qPNi}N>&P~Y>ngO z4XA~$It|*818L!_3*NX_=42FXVeQyIWDuVRMiat1{CG9KN}LDR9MqD?w5Bq)QDQOh z4N?p}AIHaLe5{_6*5tvK85Yc7n3_QZ_v0J@9)u4#0R*CqbrR$zj692&Z1z|a)SG$p zAsW4M(c}Euh%mHfaBUnXFEPVsm}7M9=7v3NeOmG&6LQRp*dMuxe}vwpw}O7ERucrv zM7A2=flJj>$Y8&-0bW7k&O}sac&rh&Qi?0V2hgmr#p=0X1kr?uB7pc^dq1I1hxQE3^ zP)#^EB2=)Pn1f+%s_(wVJwUE}wB((FK;iS={T{Gnu4N8=c;`e8BOQx|=d1V%$uX(p zsdj7A@lSfB>t)q8n90nilcKs&nrSd;*!g!NwJGcZ+yr+hNr}67=J1zC;18norU7tN z240BXKK9$+8!nwX>owndM8>w+>B$-M%Jyv+c=H9$ntY)adBuVOQ23MnahNuVx&-!i z7x1z~nFy)6*#^=(o^8^Rh~nCIY*{Qp*ncUtuI&s#md#7aAx2{ zy2^9o2e8FQD4t|OH4~SRxMj-K;m{z;mXQ5pO}lFnu1rYA>BfyDmGdCi-No>Q8lag5 zPI0b5a7CTnOJ0mdwKH<1A@(fHeE$=`J#my6;SMJs64BW7U`F;N8gl$NM2Yrc{ER=NDMW4DGphp1tDCdw9|`r69p7wYK4h-+0mc70NUKkDd1;_BrG zNef5VxWRl~W$>D^Tdi>xI9(d`Bp@yDq)-qWD6VakzCQqv=uJc5u^5upGR**X0Zizt zq3#Y`2RP8RkMX70-YRm(_<}6o72vRK-eW(Fti5C(o4nD6LZ`nIu~hvv zND3{asM38UUL-Ou?0ji@k0p3Mfm3JYJgs|6nqi8_=*e1OOp=C*PlO1{%P&^yyHqZ< z($98F331+wgsst6MrJ{GeNjY=xaBb6kRx@_AGbibI(b28>ET77a(btA*i_OFId{+k z769pD;=U&3agXY5hWz!Kj%T30;AhVG4=Hr22dt_Y=fHQrDRADx2B1XSwhHGR0qMz^ z<{Pt*x16X#vlf3AY~rpSuJ)LmXclmP3KacfHiPetzwDJ5yKEMTa2=`ast=%PvGTP| z14F+gS%T?5p7kGX?;ADv;0`f+*`xpb=TtoQXKsTH90w=lV|o7)Bwm{$X0lPE5WqJQ zM;a_nfQ$E_I@-r+xABpA`R0YGTv_l`t{@aZs;I0ljL3)xZ~(63D1>L_#lBJ3ncYOA zv^#2YF1=nM6Q=3@i#%D87kDB|X_TH%N&ZQHB|LrwJSQ zObrbDYm_UM2iH%3q>C+ z0`=DNRI{g*DM+_+y7%E+OS?i2vtrG#CX!SxpgCu&TCEKjyzLuF7%qn*ZHhcg%4S&;! zj%agRCX4385f|fDsXaj1x9nw!#o?x!HJ;wpZ``r>s zT-<)YKUOs&SBX9@NV%qf<}d`wSQkRPTwbo6DtTq69~sW^KkmjF>AJPyi7vN3ksbx2 zza2RTK&sS>yVvGabt-E(a|&fR<)w&Ce@3Ysa%))fEB3{va;qmbd1WX~W9KI=){ydj zmO3pr9jcTTL>*$T0o~d@3Y_Z*wOaNrGc*B#E+4 z3y~%&(A{&B#4 zJ#|v#PSGS6#0`djpP=%G)l<(<0^$OFb9XZvT3u503_+MhZ~eme z0Jc<}2nD^;=gYNZ*MXa!fXHuaF9{O@R(slF@t;=_aXLQ`|d$&c@bF zEZK7Kg0-HKYM}+ue8zU{LVU&qIo95Pq2!j#EN8+6Lw2;{D3U7Mc%3y1W^^Q!r!)tG z0Q;#pTMlbB3rH2>15mCc!MyZZ=Ab8WZDpgpl_Eo6DT^2lezX}~|K4NCh{hX@Ti4va zf=(~ux7J!T=g3K1fX5aoT5HWE=8pG=L*6!B^B4n>B#hxme}b(V@a5GWh`=DM;{*WD zB;yQbh7{DIV7Rph2q{%Y&9xD?a*YQ|ACy2-Gr(Lpx%WS23)cEX9$v7LaV@2WWAYn2 z>!g|;u!Xk%D(0~P%gbGUXW2;-UXspku{v5}S<)NaQga%Qif$a8#1xjby|^bsuBX@Uof+;WdW&EI9d}lbgvsr zi*QdvOkOo@q=iu60cSaMqv1*ms%k*5nt2O|?R$^8m=$ElSRmZgp0j{VJo?hSd}3s5 z+_ulKP;gIAub|I1?z~BcUb>nGliU)|dUKAo&~3XO;B*D=WP%^H^Au+%CO zi8xohlKxEs!J0cNAU#l4ZM_io@x!2VvP)>Gq=~0)&!%O!+bAJDJaXQ_B5QoTRo|>0 zR&{3J39_`Ir<*94z?Iwye*nZ^F@kvbOqz)7zW|MP{6715WsU-)sS%4l1ObjoI-o`I zw8FuYvV&P8;q=xHNGu^*jUxgQ;d-!CYhP75Nyu5YN(Wqxj%4|8sq0mV$(ISH_|+e} z3FEOewTPD|Tdq{qbB>5I?=wsklGmUA39+&iZh5l+gV-jb zUMN6QTXV>Ih7Z!CYcA9*ZVbT)-tUc@IOmr9m}_-vg5}p8Q2HS@!=*7s`dXYb&_S!@ z763hoirkT~=F>MykKIJ0d!~X!VbD2-!@#7}lWjgYxyrG773&)#x5-+(Qw$O#O(I3a zd)TE2I7dL#v7&nUmrzQrbLscH7Dvj%1QizfStvmvJv9541)efA3x5ANv^1vu_U$r& zEv2f=xmPte+{R-zJuuS4=L^EnrNwGeUe$`4tC?Knoihg#QXAri9v6>Dt$USsvUN^p zSp(4lYEb#r1&_DcGC)wW&VRM~dvdPJue!TirFAl!qoVCN_YELMS>K=YVd6c8rV>xJ z&BI`WounNXUSiVD7Hf~;i}oyWi7ZlM4Sgsc1qRQ`IpVho+(A1csVR+i zebcS5X6t*b%O0ENxRFk)$2McoIO%R|V)qN^jHUjGcd(X)jjA-*4LOLM=gM0kGIS#S zaoNDNczaN~NPOC*zbAP=Y;Xa{No<_fCySd=x!VF5xCq2^u1nS2QCaIXKrGb~J1_mZ zl?_@Se*{#an**&)WMA9FMd86&p!WD39}lx1ni+AD4AEz!>qRc`{}I0pt~ub#E>e4L z)t9YfT6=vL_e$km>Am(=(}s&W}5a_n8 z&`;^}KBI-sy#-Y!7^yv3Da8R4x+W$rlz9qu^xQd(=;R}?8fvgMJXJ($)Mw~PZ1KiwdnM$?*+srwb|B?!4-$nbrZ(L_I5(9-OD3;mJLh$Q>LT96FD9xxN+Aohga zTh>EjvL6C{Pv~Go-%D7ePnjjRRUo5>X>?aQ2*i44Iq4_>H#LjhDd}TwKg49*xmo#k z9f*{f^r!9K=@`Rh6+|mzQe>`AS{S;N%&d@GtQX^wbFm`;wJzw`gnND|yeBK{k~Th? zqe6UksY@APosG@B^O%k%NyiOkvacyaLfApNHLnIAkYe1MK)N7BZ6B!ba$;4Ppo9hw zLo#_Wtc#drkO@7dT$W{N;>H+}>00D-Jj_5Z_lsfzy%G!9j4NIpW##AJdml}RQD>*S zmO5-kT-&_&oK9H)5^SEDml`oZEGHYQSP|E~tx!Gipia&QQktlh^vH92!268~U_)&a z4PKJu1&V~?9g#xJ`4r+Fqp{EG_z#z3SNn5y+=cn<&w1<_yu0gGS|#j#f~I4^#{5mz zv*o~Wq$|Y!qCHnhUtG3-{npm&awc`dlRd4okW-W82RG2AMxnw;Dh&Y;e|kcC!2NvsV4u0i^T=HC@GVN4n!_!Fc_Rq^&m5 zBQRt&q5BX(=E{OgJC)l%#vi_e#5K!`hAdR|G$VXZUBra+oOi3f0(8H1pLkba^|X1Y zb8EKPqTDlMB8v6ax@D+k;e4C+=$utr9h;j@aW`2BN?5^_r5^33jZ~PPeL!>xVZMla zJ>@x&!EX0@u{%AqTjs?KR>>b*EtBk9(wX1JTd?OM^SyLXy2^5Nj2)2cB39Y9|MiUw z`?6*a{51MW>(A?ZSUy9xi?bgpuf9CeSoXax9JcOm2DwQNF)Q`-Cs8r#_ z$kGNH=oreG%@2TpRhIuf-f}Yqb5^Y@?|x*{G0SsYbJh=9p?>%SnaxuKt%CI`m;O6Z zQSjoPRhQ7v?(y-MwC9(h zsTAI>tXtD~5D)g{4V%yD2EGrni`029lv(-Qw9oixmXpwufBebPg?T;Ssgr8Qx7w z9mb}p$Ib6>RCYJKK?+2B>g4Nj)Rw9yn|YA!`f4uGXC{V`X=&M3Um5HZoWK1_lF_Nm zPgc=ne5-Ka^2O0WN=Fychjiqujk=uMsABDdxq~>QPxLl!m9zZvDHM=}Ub6fdp@0R1 z@A}8kOlvfh+@XNK0u1B>h8+|m`pulDNzU+kZ|ctVd=BXYkg(bIL$}{>g)`V#K_LY2 z3V+(53a1FKj3(E&?W?B;^G$R_qa^#Y`?lz{8;2K)XMgv&motgoc?a&kve?ig%+s?w z1W4?S##JuxnmZIY_tT+VO|6}>kd+tfj1Eo&#PsYHZFBc(GjepL9-4X!h=7H5kw#w9 zcRMhaN^aF{K=F0>Xu$yJLF>u2P% z8(8OOCd@no*x{@mM^87kbe?Fi$XU^?Z4Pgivc+`ni)FnZnu-Mkm?s=znCw8`o?v^G zCsD4;-mRxcfhkj4EJwh%0hi}*R5_{HDMVfhNIGqp1mq1Io-@*#^KmU3G0pri@Tr#X z%lHF;OBJ z=O)W-f05sZNs86xMoNs7s?_h!yU6kfMhpO=q-rg*xKOb4#TKdf z-gJ4+wF-{Yh!Wy+v>YlMG*sBLq4!1%DGa+-$6Rv6Y-E@9ak~3IDvUBL5XEw`xpva3 z8eags;H%~~oK*QIXiM77KFkJcr;bz`;zNlLuH6ayDbPF>x{Uj*X%tiAe- zJb)wEQibm{*-}#IvE{J-IE$)jxj)y^+p*#zGvsC9N?*e|Mhtu;*{%+* zW8TNdbCJP)VAU^U_4$XiBv|Ply-&Ye(_`!n2hwlAmNc`zI1zhm-^R;ypi7rWrXOmU z^XjqR{3)NNB*5_(wY=y2R7gPvT>+@{6W(KWBd;DLFNHL0<+z*_dP;LyfeH@+LYIfwg8;Z) z^MyJ}CxXLf5L%>arhdgx=g%b<*4rLt-`v*zy72f2E4Wsy%3y5R& z0f0=ac2zF6e@E~ASl*-Cwrv^2TyCu6Oudhpd=()TUOoYZm^l|!tklXyb<257G%@Su zMkAzAzAmNjMd){efjzD&ACaV6R?YHilFGcSU_gFD9M=km`Yd(AF}d(Un@mXfdxMkU3R_*+-+6Z>=rHxyQmA{+cmo#d$IBWl=YI5v3QTa*PryN1lOK-*V6dJ0rkoU1C-$fpdmEzSrK*aVe2I^lp0&Po+UhWV5F`Rf>pc z*FV$NDtNuMr_3|w>W>cbQ7Vj$yR{#mV+JyAXFB+3MY`$%wtbH+kgF}OMpU?4IjIwK z^lMoaoX6&76AJgOXju% z9RN*@)yPeUGNG(|@Vt4@TAy8?5%`P{g-%H4qwvTg7fP=O0?Zp33uDW6i?fWfS3^6> z%{WXg{Jx{6-otzQO;Cjvh?3#^vi15S01IY`Xp@}w+RW>%86TkMJD17jf58)fB7t9b zZKZ+Mj5kq_Q_K1rN7iH>7$i>3t1`h2-e)DEPhQ`PbU@0*sw#-j;Ud4ujK(4g|Mcg1zF{kGMV(piLtBpI>PA+!RrzC`%{RT#b z;dQj3y1F{gFZ|F?TikmP2!&KkT}0~qYjsOX_B;Su{VnhUh{9Nsn_uoUr_uD~D`2pD z$U-2@eXP!Jp$w}=m(Y2Edh~rk8!DFU~I`!8wa=k zZlSil8~X9R>O>P4P!ya2t*@Sa!CHx>?s;_N`I!_1KweJAoQ!knK5Kp>bM!nHE!XnE zSCy1_$vu+ug~rzdLgOeV|b(07g3Cw-rD82Y*DF)b}1%Tq{YPtY%e7 zL`ibtbH^zFxj`F(HdfCRHiidDIGCMxK8VFX&~PbfzHhH1_K-tiKcWc!*b}}QVwkI& zsyO)?mr20ug&p3GKAmM*wZI$C`q=Oqh`9_cW(n^51qNP9GM(DBiOfQZ08nFMCs!>qC4FV7%gZVK>?27UAe<5WCuU0dQFl z0BOYHaeNPEI<4T%Bo0(_$Ufd};797PH)|F}4M)5mmbi*EzRo*>pJN%hRC6w1O8=hm z-tg+wO?L!l)hKUZ;rVBV~oTy*|=0OabUjfi;Q$<@x> zxs@c&-~RqQpuXKE-T>*Gf`HN!h9TK6eK#tiwWU)D00FGBZ^V z&UpWKz0_+Jyn^@cv)bwNsphozUND=*h>tAMNtVal2kaSOrZ!|C-A{`O4Di4_dyUEF z$cP~Ewi~HR=erA@bzj&$2Pmkg0E$N6e9C*qtOk4iO)9mhiCVC0s8pxzSJaX3eN>(gIK*42yoA+Ho zF-4f0{_Ye`-ZGz<-xp|aD&F$9&=VCVr5>Zqfy~S? zTUoZ2$!kvDSb+dT@4U#s-x?qGIs|W)rOZo6#-L|nFOS4s*YNM_?=3bebJ1*fs92-o z{@$3WA#nfeqg~dNkIgBch8LPBZeOaWjrjtsalYWfrVpg2LcW5~tM^~CB^Fgl#Thuz za6Zx!96A;zB>^@DhEEKH_syjgnRQq^cfs(0B`dSry#_4#PHH?oUBHkD@#bOAURXdP zjMCf&-*wr$Zu&%ks|itFBa+0@*Kd0NENq&PjNrVxej(+nRRDiz*Ut+dk+qq$x`L<` z`%SGc@7nBN;f?bem~h(Q(NqI8m*VsbgVub75tp*NfLb@Tj22RDZ3Q0O+QNS>+ukcX zqyU&txUo8CP-q4?#V5HaeBDsSB44Bcc9cJG>fLk1m_HG7UAo?IR)3C>buC7`2yRjn z*ivb41g~R2Ol!(Nl$yqL+Xl+mXl2>3TD#Yu#Jp-D6+Z=H^tGike)cxYO?(r zrS>ea3*z(KHAA0<-Is;bYT#~XRVSX2RR7IW`BQ3 zq`jN;aNE8xpj)h0+=iiy%U}sGl*JiX9tHcwHR3>Yl%TSP*%>s9!@fo4u(JfW=-WUa z?bzEIl?;HY1wh8h4coY1^l?61!fQ%L0ajO12!$2nygoOJ0^;d1OKZeTz~cFF%HVaP zY;V>hjGaNwP!?vg4EkuI%_Wo*rlPZp`Knt3~EU>MqZ6AGFUrYI%nekbi|11zTZ+7*Pyx;v?^X#+dyd8+`0CjYP zuxp<{q7C%>6z^dOU7H$0$sMO3IH>^;LikM0=xX)`agU{=pL<`vQ5|!o4Y5i4RAhh0 z25eh1Fk;aXNIU;|8sLN$ssWzD@%srqQLUKW`VV1d!Juh^S1nslvq{`i$QgRrUWW8c`CAo!}T z`f<*WG%eh3b7fx-ZC#u1Ycozvr^7CqRk|FFxAKRuH>>uuACUm6U=$eKK~Co|bGsih zx*v64NCO;!>W%pVyGMKFPrHiG^vp9MJnZsr_60)9A+Zc}{tIIYdZDy!Vlo=kxorb% zY9E_lJG16_Xc=ElKDb#C(R5UEQ3z*jD$jrB7TR}dBVwSf*+^1jvl!UO@z_DWw9%7F z(l`f)Mq14S?qoRf{%F9^H4pX^#+5RWy})F)iB`cYIUIv)*q5iR?Y5c-9&Rd-v=Frl%azBO*)yMtG%H@d#+23lgqZjDyf7 zi!Bv#AD-Jyu=F-CS?>*iID*O!1)Xr8nApB;A)5VK65 zt(E%RaqRC8@sGc8%2uy8^BZvc+?!_k&@M^ThV(0FOBCo$tmVHQ#rq|R>GbPniE4Mx zS>A8dQGcLIlPSQPm0pP+-218YeUE+ypgD}J+yKL3R0;XVXaCE=4<6oZ=t5O-_R;?9 zg8j!^oZlRGzSnoxFQ1X_f4t)N9je&OOJDTsU;3v4^FQA7uQzpixLLQiy#I%<7ij(d z6<_(_6b)QDOew^PeYp#NS&^^*srS3hg7@(gM}C*cZ^R2gJ0hV?N04BO{CY=^e|}RS z?z06j&CU&%&u;&(1q5g#0$hqM^UnRsLj3zzzPW8Pcl}|g&949c(tyoN(;OH7`-a>Z zJAiJO@GabL_W%2*`--q-P&Y4C#SW)_wGYI<6KwUpo4t^>3H^NH-|fR+W$<55sJ?gr zxHKTGLiulS_&?n%n18bu(himFmp|Q^S1?$~Yu?aLwkKB)UaIqzE>r&?mj9Ejf494z z&*=Ztvi0r9>3_!H+Z5hkjX}xmE&wy;wk9X41^LIi@_*}!|DUh7zV%IkE`t998sD^7 zf0eDTn7e<{c>e<$-?UhNH3q>~HU9;j$J&8Oeg!T)-*l7BJ@_Ap{ZBaOU!diGAoiOi z>VL-I>k#*^GWJ)mQ&MRwP*|I{;_$CNixl-fh3~#oym;-(MZ^E9=i>iy&Qfn;S~maL zeZPAU4;!8xIKXvHPDbGzfoirIWI#XFDBy?`X*L4YS#N3n zN+QR9y4UMpfX6*=xcKMpk>B+2;=6XOfFC0MIxOxRgg*ZS@VI-80{(x<>~3Ihar^z_KI<#BBx@W0n1i%|0*Cdxf!2 zkUvFQP|~dYbexo>zLk4Vj%&Hg(EaSRX5M*hk*}J4I*%hUD*lW)FO1$+=o{2uxK6a@ z@Z$njpSo7zq>>b9XfH1f=r^iE8%w@t>t+L-$D_X`5}9yw&9p;hH&*9O11YjtH3by8 zqbFjrkH=c+zLv_$hey+uIB$*#)Bo+{UX6JY+OO)2ZFeu|yrQ+z5wHF^kDk2)F9xI; zY$K1UTbl92K2`zS!md6Q>B0-7O&I-fOzx*Bm6f(gwJRS6N6WCfPl#|qVV_axbxDho zjEmRjPCRn0BJ!}*D)dsI&9CnQ85WNyk%BLTynVgrrxFy&+~oGA+&1nr3w3Qv2w>`Y zlddv}A857V>eBx2h7JG8J$jggF1{v9AH1+KsdPk~bf-O=4>KFlSukj@ds;8`Tpp7$zKw>7 zW)qw5A3=9F?7@QgLW7nvR)Ts-HH_ksw$SWQ0XH;pY$cgZOb37C-aJ(A0SuHvWTxeB zwkKG8_oi5Ms(D@+U5`mGS`m-nla9J|QnRqsQ77%#z3~$W!WgSH-hw?A0F2^pPhd|_ z$m@2|F9v2hQUx@B5I7voUdjVPlh-q=yj!nXN0_^#@)QT`%Zfc#Wm+_W@^8DCD8b2W zkPdwBvR>4P8_R>P!^)m~w805@TF;z6qO=fZTU?wVzc_TnLSO<$EV|%z9nqyBph=nO zm|U#Fi^EydYo;>G&sdXD>3F_+#)8SJ*q`j?ztM;pknP*)$<19-zgc7TSgs{B2`uyR zjdjZw7I&dqDwE}>>%GtjtTVhLtgR)=ZJ}4GsuG{e9rlR(sLAL+7D&yq z*9-GA*Pe;?;j>U2;iNE5L`s0xxZ?!7)-xNQeU>e~l(=6|*;`yXUg%);Tr+XLs;N8s zy4{MfXxxB2uH2Kk8mAnw9|l2`xA=6{lqAqeqUood{)SEeX+z{vfkV<`I{f4}O#1rg zhGOL6fo(hYN|971vC=Kmc#c&j_^4NZRm3xnDgFYwE6oc+&Kz+uAMM1msa3CvC4`ce z)nAN-TW`D=Yk+mEfg*uKkiJy6RUe>^)o$>BCJ!NPBV9D2*6>Cmv&E$J&NaWq55b`= zzbuX@0NP~G6Rvk9S2sCsz!6Q?VAk}H{=4aXe?rbl#u4wB_RPm>QkwOPXxb3zq2lcL<;k}c4IaV(X5tB6&3Lq* zTJO*2Wl1iu9y0Ja6p8I2`h6Lo)eHXey+XTFpMo;Zi4xH6a zR->#6hgVoBuZqq0@tC^}sdgTrr)rFNkJ(q9W);p;CL*Mp+7sb%=GyKvc&CD;0wXW8j|*s{jFd^q@79c^lzNo>{;54^_zeM)$qMYWJ=ccsy(Y_1mbx_2u20hpem861l@VgOnD~GJYc6y`)m= zSc)IDhWx=DYRyz(H}#Mw+Tbk)*c%b>W6E`b5qtQgp2p~@$mi$;R8~(@1(i07+#@FW z(qP4}3vMy#vGEh0q5Hy2WvwOLfo!mCc1=~-{O0V1Z}v?q0Oyb``^iU9Gu(=+bv{@s zk%=pS6NJ-CM86 z%@$Ozdpl!>_4m0+YwHZNpJjiXs$Z+ct{qHvXuzhf#`SFj3>PLU9{xA4q{)Y#DH=gdhePqJI z_@1}bUsv(IF7GtIS7E!%Z>CK7y*lrYZGU^sZUK|*;@68~cb5UXE06wsb~`Hi_?Src z-m(|M>-YQ#s`=hj+_hD-TX*{_IrrL^+S+>7#NK$;$ODXU9-GC`_-G8}wE6k_zT3<6 z(D}CCf2G8j{`>XfO6FxZ;4w7smR{WJeqO?~$mOT*ug}lVuCAT@|7!2IX=3Fs_9ox? z@HiT{lyYtOtI8(}*`?R`0-NUF6dOEwuZ7vX*!}!o(;w|c7DPJAVHvO!Ejxh|66nTvt@SWvi1g)C_Zy5wOEx z{Go@8A;S=$3quV566Zjeb)f90;OsELp8326kwJu%V?9I#p7@Ji#&QlIt|mCl-cfJj zPaBP+u?b5mNa+nJw~i)SXzhrrHXY5IxIzY+ibji|(IN;K0+f`r3C&Np&hM#&HStKP zKpmPI%s;6oWRkp0n2~8Gu=}^O=^2sz4x~s1+Nn^_G%buk$$?bL!m9BJ+Q9ylb_UYf zG{pK<1vuI}>PLK& Load[Load all core resources in single FHIR search request] + Load --> Profile[Profile check on resources] + Profile --> MustHave[Must-have check on resources] + MustHave --> Check{Any must-have condition violated?} + Check -->|yes| Stop[Stop extraction for job] + Check -->|no| Global[At least one resource fulfills must-have condition] + Global --> Complete[Core processing complete] + style Stop fill: #ffcccc + style Complete fill: #ccffcc + style CoreWorkflow fill: #e1f5fe +``` + +## 2. Directly Loaded Patient Attribute Groups + +Patient attribute groups are loaded and processed for each patient. + +All resources from a patient attribute group are loaded and processed in a single fhir search request +and then assigned to their patient. + +- First the consent is checked for each of the loaded resources and only resources that pass the consent check are processed further. + - When **no consent** key is defined, all resources are considered to be consenting by + default. +- A profile and must-have check is done on every resource. + +- If after the group processing a must-have condition is violated, the respective patient is marked for deletion. Once all patients are processed, + all resources (including the patient resource itself) for a patient marked for deletion are deleted. If no resources are left the whole batch is deleted. + +```mermaid +flowchart TD + Start[Start Patient Attribute Processing] --> ForEach[For each patient] + ForEach --> Load[Load patient resources in single FHIR search request] + Load --> Assign[Assign resources to patient] + Assign --> Consent[Consent check on patient resources] + Consent --> ConsentKey{Consent key defined?} + ConsentKey -->|no| AllConsent[All resources considered consenting by default] + ConsentKey -->|yes| OnlyConsent[Process only consenting resources] + AllConsent --> ProfileCheck[Profile and must-have check on every resource] + OnlyConsent --> ProfileCheck + ProfileCheck --> MustHaveViolated{Group processing violated must-have condition?} + MustHaveViolated -->|yes| MarkDelete[Mark patient for deletion] + MustHaveViolated -->|no| PatientComplete[Patient processing complete] + MarkDelete --> MorePatients{More patients to process?} + PatientComplete --> MorePatients + MorePatients -->|yes| ForEach + MorePatients -->|no| DeleteMarked[Delete marked patient resources from batch] + DeleteMarked --> AnyLeft{Any patients left in batch?} + AnyLeft -->|no| DeleteBatch[Delete entire batch] + AnyLeft -->|yes| BatchComplete[Batch processing complete] + style MarkDelete fill: #ffeeaa + style DeleteBatch fill: #ffcccc + style BatchComplete fill: #ccffcc + style PatientWorkflow fill: #f3e5f5 +``` + + diff --git a/docs/implementation/implementation-overview.md b/docs/implementation/implementation-overview.md new file mode 100644 index 00000000..ce4ebc42 --- /dev/null +++ b/docs/implementation/implementation-overview.md @@ -0,0 +1,57 @@ +## Implementation Overview + +#### Pipeline Overview + +The TORCH pipeline consists of several key components that work together to extract and process data from FHIR servers +based on the Clinical Resource Transfer Definition Language (CRTDL). The main components of the pipeline are: + +- **CRTDL Definition**: A JSON-based definition that specifies the cohort and data extraction rules. +- **Cohort Selection**: Uses FHIR Search or CQL to identify the population +- **Data Extraction**: Extracts FHIR resources based on the CRTDL definition. +- **Consent Handling**: Applies consent rules to ensure compliance with privacy regulations. +- **Output Generation**: Produces FHIR-compliant resources in NDJSON format. + +#### Pipeline Steps + +1. **Validate CRTDL Definition**: Ensure the CRTDL definition is correctly formatted and contains valid criteria. +2. **Cohort Evaluation**: Evaluate the cohort via FHIR Search or CQL, unless patient IDs passed directly as parameter. +3. **Preprocessing of directly loaded core Resources + **: Directly loaded core resources are processed first, as to ensure the results can be shared over all patients. +4. **Handling Patient Resources + **: For each patient, the pipeline processes the resources according to the CRTDL definition. +5. **Handling Core Resources**: Patients can load new core resources, which are then postprocessed. +6. **Writing Output**: The final output is written in NDJSON format, with each patient’s data in a separate bundle. + +```mermaid +flowchart TD + A[CRTDL] --> B{valid CRTDL?} + B -->|no| C[Error] + B -->|yes| D{cohort given as parameter?} + D -->|no| E[Execute Cohort Selection CCDL] + D -->|yes| F[Handle directly loaded Core Attribute Groups] + E --> G{Which method?} + G --> H[CQL] + G --> I[Flare] + H --> J[Fetch Patients] + I --> J + J --> F + F --> K[Resolve References] + K --> L[Cascading Delete] + L --> M[Initialize patient batch with preprocessed core data] + M --> N[Fetch and build batch consent] + N --> O[Handle directly loaded Patient Attribute Groups] + O --> P[Resolve References] + P --> Q[Cascading Delete] + Q --> R[Extraction] + R --> S[Update Core Data] + S --> T[Write out Results] + T --> U[NdJson] + S --> V{All Patient Batches handled?} + V -->|yes| W[Resolve References] + V -->|no| T + W --> X[Cascading Delete] + X --> Y[Extraction] + Y --> T + style C fill: #ffcccc + style U fill: #ccffcc +``` diff --git a/docs/implementation/must-have.md b/docs/implementation/must-have.md new file mode 100644 index 00000000..3ebadffb --- /dev/null +++ b/docs/implementation/must-have.md @@ -0,0 +1,36 @@ +## Must Have Checking in TORCH Pipeline + +The must have checking i.e. ensuring required elements are present is a crucial step to ensure +that the extracted data meets the criteria defined in the Clinical Resource Transfer Definition Language (CRTDL). +Required elements are defined in the CRTDL using a must have flag. + +Must Have checking is performed after resources are loaded from the FHIR server and during the reference resolve step. + +Must have conditions can be violated in two ways: +1. A resource is missing a required attribute as defined in the CRTDL. +2. A resource is missing a required reference to another resource as defined in the CRTDL. + +So the must-have checking is done in two steps: + +## 1. **Field Must Have Check** + +Based on fhir path expressions, the must have check verifies that all required attributes specified in the CRTDL are +filled in a resource. +If any required attribute is missing, the extraction for that resource is stopped, and an error is logged. + +## 2. **Reference Resolve** + +The first Must Have Check is done on the resources that are loaded directly from the FHIR server. +References are only checked for existence, not for correctness. + +A reference attribute in the CRTDL can be marked as must have and has a link to other attribute groups, +that define the requirements for the referenced resource. + +During **Reference Resolve**, TORCH will does the basic must have check on the resolved reference with the linked +attribute +groups. +So not only does the reference need to be resolved, but the referenced resource also needs to pass the must have check +for the linked attribute groups. +If any must have condition is violated, the referencing resource is marked for deletion and then cleaned up during +the [cascading delete](cascading-delete.md) step. + diff --git a/docs/implementation/redaction.md b/docs/implementation/redaction.md new file mode 100644 index 00000000..e268464a --- /dev/null +++ b/docs/implementation/redaction.md @@ -0,0 +1,121 @@ +# Redaction + +Torch redacts resources after extracting the specified attributes and resolving references before packaging them into +NDJSON bundles. + +The redaction ensures that not only the requested information is included in the output, but also that any +unnecessary data is removed according to predefined rules. + +During the reference resolve and loading of resources a resource is associated with all profiles that were used to +extract it. + +## 1. Redaction Rules + +- **Strict Structure Definition Adherence**: Resources are redacted to strictly adhere to the structure defined in the + requested profiles. + That means for example if a profile only allows a subset of address fields, all other fields are removed from the + output. +- **Strict Extension Handling**: Only extensions explicitly allowed in the profile are retained. All other extensions + except for Data Absent Reason are removed. + +- **Reference Handling**: References to other resources are preserved if they were part of the reference resolve + process. + References to resources not included in the extraction are removed to prevent dangling references. + +- **Empty Element Removal**: Elements that become empty after redaction are removed from the resource to maintain a + clean structure. + +- **"Half-Open" Slicing**: With the strict structure definition adherence, Torch implements a "half-open" slicing + approach. + This means that if slicing is open in the profile, additional slices not defined in the profile are removed. + Exception is with multiple profiles per resource, where the first known profile is selected greedily. + + +- **Data Absent Reason Setting**: If an element is removed due to redaction or extraction but is required by the + profile, + it is replaced with a Data Absent Reason extension to indicate that the data was intentionally omitted. + +## 2. Redaction Process + +Recursive Walk through Resource: + +1. **Profile Identification**: Determine the profile(s) associated with the resource to understand the structure and + allowed elements. + Associate the resource with the all profiles associated with it during the extraction process. + **multiple profiles per resource are supported** the context for the profiles (i.e. the element id in the structure + definition) is tracked in parallel for all profiles. + +2. **Element Evaluation**: For each element in the resource, evaluate whether it is allowed by the profile. + 1. Handle Slicing + 2. Handle Extensions + 3. (if not primitive) Handle Children + +3. Handling Children + 1. descend into children (update context for profiles) + 2. resolve references (remove references to resources not identified during reference resolve) + 3. if empty set Data Absent Reason if required by any profile + +## 3. Limitations and Considerations + +- **Profile Accuracy**: The effectiveness of redaction relies heavily on the accuracy and completeness of the profiles + used. + Incomplete profiles may lead to unintended data retention or removal. + +- **Value Sets Binding Slices**: Since TORCH does not have its own terminology service, value sets binding slices are + not fully supported. + This means that if a slice is defined based on a value set, TORCH cannot enforce the inclusion or exclusion of + elements based on that value set and + only support the structural definition of the slice with the code system. + +- **No slicing Rules**: Torch does not support slicing rules like "open" or "closed" in the profiles. + It implements a "half-open" approach where additional slices not defined in the profile are removed, except when + multiple profiles per resource are used. + +- **No Slicing Ordering**: Torch does not enforce any specific ordering of slices or elements within the resource. + That means that it does not check if the order of elements in the resource matches the order defined in the profile. + +## 4. Summary + +Torch's redaction process is designed to ensure that extracted resources strictly adhere to the defined profiles, +removing any unnecessary or disallowed data while preserving essential references and structure. + +```mermaid +flowchart TD + A[FHIR Resource + Profiles] --> B[Profile Association] + B --> C[Multiple Profiles per Resource Supported] + C --> D[Recursive Element Walk] + D --> E[Element Evaluation] + E --> F[Handle Slicing] + F --> G["Half-Open Slicing:
Remove undefined slices"] + G --> H[Handle Extensions] + H --> I["Strict Extension Filtering:
Keep only allowed + Data Absent Reason"] + I --> J{Primitive Element?} + J -->|Yes| K[Element Complete] + J -->|No| L[Handle Children] + L --> M[Descend into Children] + M --> N[Update Profile Context] + N --> O[Resolve References] + O --> P{Reference in Extraction?} + P -->|No| Q[Remove Dangling Reference] + P -->|Yes| R[Preserve Reference] + Q --> S{Element Empty?} + R --> S + S -->|Yes & Required| T[Set Data Absent Reason] + S -->|Yes & Optional| U[Remove Empty Element] + S -->|No| V[Keep Element] + K --> W{More Elements?} + T --> W + U --> W + V --> W + W -->|Yes| D + W -->|No| X[Redacted Resource] + X --> Y[Strict Profile Adherence Achieved] + style A fill: #e1f5fe + style B fill: #f3e5f5 + style G fill: #fff3e0 + style I fill: #fff3e0 + style Q fill: #ffcdd2 + style T fill: #fff3e0 + style U fill: #ffcdd2 + style Y fill: #c8e6c9 +``` diff --git a/docs/implementation/reference-resolve.md b/docs/implementation/reference-resolve.md new file mode 100644 index 00000000..3f0f3b1a --- /dev/null +++ b/docs/implementation/reference-resolve.md @@ -0,0 +1,23 @@ +## Reference Resolve + +Torch needs to resolve references in the extracted data to ensure that all resources are correctly extracted and linked. +This is done in the **Reference Resolve** step of the Torch pipeline. + +### Resolving References + +Torch manages for each Attribute Group the Resources that have been assigned to it. +This assignment is called a ResourceGroup (e.g. AttributeGroup_Observation,Observation1). + +To resolve references, Torch uses the following steps for each Patient or the Core Resources: + +1. **Get all valid ResourceGroups**: Torch retrieves all ResourceGroups that are valid for the current extraction. +2. **Extract References**: For each ResourceGroup, Torch extracts the references from the resources. +3. **Load References**: Torch checks if it already loaded the referenced resources in its cache. + - If the resource is not loaded, Torch bundles all references and loads them in a single FHIR search request. +4. **Assign References**: Torch assigns the loaded resources to the ResourceGroup. + - Performs a [must-have check](must-have.md) on the loaded resources. + - For Patient resources, it also checks if the resources are allowed by the patient's [consent](consent.md). + - If any must-have condition is violated, the referencing resource group is marked for deletion. +5. **Update ResourceGroup**: The ResourceGroup is updated with the loaded resources and their references. +6. **Repeat for all ResourceGroups**: Torch repeats the process for all newly added ResourceGroups until all references + are resolved. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..c173abff --- /dev/null +++ b/docs/index.md @@ -0,0 +1,38 @@ +--- +layout: home +title: TORCH +hero: + name: TORCH + text: Transfer Of Resources in Clinical Healthcare + tagline: Structure-guided extraction of clinical data from FHIR servers + actions: + - theme: brand + text: Overview + link: /overview + - theme: brand + text: Get Started + link: /getting-started + - theme: alt + text: API + link: /api/api + - theme: alt + text: Configuration + link: configuration + - theme: alt + text: Documentation + link: documentation + - theme: alt + text: View on GitHub + link: https://github.com/medizininformatik-initiative/torch + +features: + - title: Fast & Privacy-Aware + icon: 🔍 + details: Extract structured data using CRTDL with consent enforcement. + - title: Output Ready + icon: 📦 + details: Generates FHIR-compliant NDJSON bundles per patient ready to upload into a data use specific FHIR server. + - title: License + icon: 📝 + details: Apache 2.0 — see
LICENSE for details. +--- diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 00000000..5ab7f81d --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,83 @@ +# TORCH - Transfer Of Resources in Clinical Healthcare + +## Goal + +**T**ransfer **O**f **R**esources in **C**linical **H**ealthcare or **Torch** is a project that aims to provide +a service that allows the local execution of structured data extraction queries on a FHIR-server. + +The main goal of TORCH is to automate the extraction of structured clinical data from FHIR servers as defined by +a well defined query language the so called [Clinical Resource Transfer Definition Language (CRTDL)](crtdl/crtdl.md) . + +This is vital inside clinical research networks, where data from multiple institutions needs to be aggregated for centralized and decentralized analysis. + +Manual extraction and transformation of data is time-consuming and error-prone, especially in a decentralized scenario. + +TORCH aims to solve this problem by providing a tool that can extract data based on a well-defined +**human-readable** structure and apply consent rules to ensure consent compliance. +This structure can then be used to extract data from multiple institutions in a consistent manner. + +A exemplary use case based on the [German Medical Informatics Initiative (MII)](https://www.medizininformatik-initiative.de/en/), where TORCH is used to extract data from hospital FHIR servers for a centralized analysis based on the +[Clinical Resource Transfer Definition Language (CRTDL)](crtdl/crtdl.md) is shown below: + +```mermaid +flowchart TD + R["Researcher"] + FP["Feasibility Portal"] + AP["Approval Authority"] + DIC["Data Integration Center"] + DMS["Data Management Institution"] + RP[Research Proposal Review] + T["⚙ TORCH"] + PP["⚙ Post-Processing System"] + R -->|Research Idea| FP + FP -->|Research Proposal with CRTDL| RP + RP --> AP + AP -->|Approved| DIC + T --> PP + DIC -->|Execute Data Extraction| T + PP -->|Extracted Data| DIC + DIC -->|Transfer Data| DMS + DMS -->|Centrally Postprocessed Data| R +``` + +## Features + +TORCH provides a range of features to support standardized and consent-aware data extraction: + +- **Required Fields Validation**: + Ensures that mandatory fields defined in the CRTDL are present in the extracted resources. +- **Consent Handling**: Applies consent rules as defined in the CRTDL to guarantee compliance during data extraction. +- **Reference Resolution**: + Resolves references between resources while maintaining referential integrity. +- **Slicing and Extensions**: Supports slicing and FHIR extensions to handle institution-specific resource structures. +- **Profile Adherence**: + Only keeps elements from extracted resources as specified by specific FHIR profiles (see [Redaction](implementation/redaction)). +- **FHIR Bulk Data Access**: + Implements the [FHIR Bulk Data Access](api/api.md) specification for efficient large-scale data extraction. +- **FHIR-to-FHIR Transfer**: + Creates extracted data in a FHIR-compliant format ready for import into another FHIR server or further FHIR based processing - ensuring maximum interoperability. + +## Limitations + +- **Value Sets Binding Slices**: + Since TORCH does not have its own terminology service, it does not support slicing by value set bindings. +- **FHIR Version Support**: TORCH currently supports only + **FHIR R4**. Other versions (e.g., DSTU2, R5) are not supported. +- **On the fly profile support**: TORCH only supports a + **set FHIR of profiles + ** given at program startup via config by mounting all valid Structure Definitions (see [Configuration](configuration.md)). +- **Nested Resources**: TORCH does not handle + **deeply nested resources**; they are currently treated as a single field rather than fully resolved structures. +- **Performance Constraints**: Large-scale extraction is bound by the + **FHIR Bulk Data Access specification** and server capabilities; + performance may vary depending on server implementation. +- **Consent Complexity**: Consent handling is limited to + **rule-based approaches defined in the CRTDL**. Complex or non-standard consent models may require customization. +- **Interoperability**: TORCH ensures FHIR compliance but does not guarantee interoperability with + **all vendor-specific FHIR implementations**. + +## License + +TORCH is licensed under the Apache License, Version 2.0. See the [LICENSE](https://github.com/medizininformatik-initiative/torch/tree/main/LICENSE) file for details. + + diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 00000000..f4e5eea2 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,3689 @@ +{ + "name": "docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "mermaid": "^11.10.0", + "vitepress": "^1.2.3", + "vitepress-plugin-mermaid": "^2.0.17" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dev": true, + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "dev": true + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "dev": true, + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "dev": true, + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "dev": true + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "dev": true + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "dev": true + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.46.tgz", + "integrity": "sha512-MJfKQDhOMQD5Fc8PcTtCdFX0oBf/nKVfp69ScdEKIXW0JXELX5V2Ld45EsjShi8aJ6DNhdDtSDZvKuDnkDiKnw==", + "dev": true, + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "dev": true, + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true + }, + "node_modules/@mermaid-js/mermaid-mindmap": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/mermaid-mindmap/-/mermaid-mindmap-9.3.0.tgz", + "integrity": "sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw==", + "dev": true, + "optional": true, + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.0.0", + "khroma": "^2.0.0", + "non-layered-tidy-tree-layout": "^2.0.2" + } + }, + "node_modules/@mermaid-js/mermaid-mindmap/node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", + "dev": true, + "optional": true + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "dev": true, + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", + "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", + "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", + "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", + "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", + "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", + "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", + "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", + "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", + "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", + "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", + "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", + "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", + "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", + "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", + "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", + "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", + "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", + "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", + "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", + "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "vue": "3.5.18" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "dev": true, + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "dev": true, + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dev": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dev": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dev": true, + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dev": true, + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "dev": true + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dev": true, + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "dev": true + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "dev": true, + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dev": true, + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "dev": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", + "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "dev": true + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", + "dev": true + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "dev": true, + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/marked": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz", + "integrity": "sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mermaid": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.10.0.tgz", + "integrity": "sha512-oQsFzPBy9xlpnGxUqLbVY8pvknLlsNIJ0NWwi8SUJjhbP1IT0E0o1lfhU4iYV3ubpy+xkzkaOyDUQMn06vQElQ==", + "dev": true, + "dependencies": { + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.6.2", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.0.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/minisearch": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", + "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "dev": true, + "optional": true + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "dev": true + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "dev": true + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "dev": true + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "dev": true, + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.27.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.0.tgz", + "integrity": "sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ] + }, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", + "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.46.2", + "@rollup/rollup-android-arm64": "4.46.2", + "@rollup/rollup-darwin-arm64": "4.46.2", + "@rollup/rollup-darwin-x64": "4.46.2", + "@rollup/rollup-freebsd-arm64": "4.46.2", + "@rollup/rollup-freebsd-x64": "4.46.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", + "@rollup/rollup-linux-arm-musleabihf": "4.46.2", + "@rollup/rollup-linux-arm64-gnu": "4.46.2", + "@rollup/rollup-linux-arm64-musl": "4.46.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", + "@rollup/rollup-linux-ppc64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-gnu": "4.46.2", + "@rollup/rollup-linux-riscv64-musl": "4.46.2", + "@rollup/rollup-linux-s390x-gnu": "4.46.2", + "@rollup/rollup-linux-x64-gnu": "4.46.2", + "@rollup/rollup-linux-x64-musl": "4.46.2", + "@rollup/rollup-win32-arm64-msvc": "4.46.2", + "@rollup/rollup-win32-ia32-msvc": "4.46.2", + "@rollup/rollup-win32-x64-msvc": "4.46.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "dev": true, + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "dev": true + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress-plugin-mermaid": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/vitepress-plugin-mermaid/-/vitepress-plugin-mermaid-2.0.17.tgz", + "integrity": "sha512-IUzYpwf61GC6k0XzfmAmNrLvMi9TRrVRMsUyCA8KNXhg/mQ1VqWnO0/tBVPiX5UoKF1mDUwqn5QV4qAJl6JnUg==", + "dev": true, + "optionalDependencies": { + "@mermaid-js/mermaid-mindmap": "^9.3.0" + }, + "peerDependencies": { + "mermaid": "10 || 11", + "vitepress": "^1.0.0 || ^1.0.0-alpha" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..0a196d5b --- /dev/null +++ b/docs/package.json @@ -0,0 +1,13 @@ +{ + "type": "module", + "devDependencies": { + "mermaid": "^11.10.0", + "vitepress": "^1.2.3", + "vitepress-plugin-mermaid": "^2.0.17" + }, + "scripts": { + "docs:dev": "vitepress dev ", + "docs:build": "vitepress build ", + "docs:preview": "vitepress preview " + } +} diff --git a/src/main/java/de/medizininformatikinitiative/torch/consent/ConsentFetcher.java b/src/main/java/de/medizininformatikinitiative/torch/consent/ConsentFetcher.java index ae58f72d..75fa8f0c 100644 --- a/src/main/java/de/medizininformatikinitiative/torch/consent/ConsentFetcher.java +++ b/src/main/java/de/medizininformatikinitiative/torch/consent/ConsentFetcher.java @@ -42,7 +42,7 @@ public class ConsentFetcher { private final ProvisionExtractor provisionExtractor; /** - * Constructs a new {@code ConsentHandler} with the specified dependencies. + * Constructs a new {@code ConsentFetcher} with the specified dependencies. * * @param dataStore The {@link DataStore} service for Server Calls. * @param mapper The {@link ConsentCodeMapper} for mapping consent codes. @@ -55,7 +55,7 @@ public ConsentFetcher(DataStore dataStore, ConsentCodeMapper mapper, ProvisionEx } private static Query getConsentQuery(PatientBatch batch) { - return Query.of("Consent", batch.compartmentSearchParam("Consent").appendParam("_profile:below", stringValue(CDS_CONSENT_PROFILE_URL))); + return Query.of("Consent", (batch.compartmentSearchParam("Consent").appendParam("status", stringValue("active"))).appendParam("_profile:below", stringValue(CDS_CONSENT_PROFILE_URL))); } /** diff --git a/src/main/java/de/medizininformatikinitiative/torch/service/DirectResourceLoader.java b/src/main/java/de/medizininformatikinitiative/torch/service/DirectResourceLoader.java index aeb2cc9b..cfe8c325 100644 --- a/src/main/java/de/medizininformatikinitiative/torch/service/DirectResourceLoader.java +++ b/src/main/java/de/medizininformatikinitiative/torch/service/DirectResourceLoader.java @@ -52,7 +52,6 @@ public DirectResourceLoader(DataStore dataStore, DseMappingTreeBase dseMappingTr this.dseMappingTreeBase = dseMappingTreeBase; this.structureDefinitionsHandler = structureDefinitionHandler; this.profileMustHaveChecker = profileMustHaveChecker; - } /** @@ -179,9 +178,7 @@ private Mono processPatientSingleAttributeGroup(Annotat .doOnNext(tuple -> { PatientResourceBundle bundle = mutableBundles.get(tuple.patientId); if (profileMustHaveChecker.fulfilled(tuple.resource, group)) { - safeGroup.add(tuple.patientId); - System.out.println("Ref" + group.groupReference() + "Type" + group.resourceType() + " ID " + group.id()); bundle.put(tuple.resource, group.id(), true); } else { bundle.put(tuple.resource, group.id(), false);