diff --git a/.cloudbuild/pipeline-docker.cloudbuild.yaml b/.cloudbuild/pipeline-docker.cloudbuild.yaml new file mode 100644 index 0000000000..30b4844b0b --- /dev/null +++ b/.cloudbuild/pipeline-docker.cloudbuild.yaml @@ -0,0 +1,11 @@ +steps: +- name: 'gcr.io/kaniko-project/executor:v1.3.0' + args: + - --destination=gcr.io/seqr-project/seqr-pipeline-runner:${COMMIT_SHA} + - --destination=gcr.io/seqr-project/seqr-pipeline-runner:${_CUSTOM_BRANCH_TAG} + - --dockerfile=loading_pipeline/deploy/Dockerfile + - --cache=true + - --cache-ttl=168h + - --build-arg=PIPELINE_RUNNER_APP_VERSION=${COMMIT_SHA} + +timeout: 1800s \ No newline at end of file diff --git a/.cloudbuild/vep-docker.cloudbuild.yaml b/.cloudbuild/vep-docker.cloudbuild.yaml new file mode 100644 index 0000000000..39fe857889 --- /dev/null +++ b/.cloudbuild/vep-docker.cloudbuild.yaml @@ -0,0 +1,12 @@ +# Run locally with: +# +# gcloud builds submit --quiet --substitutions='_REFERENCE_GENOME=GRCh38' --config .cloudbuild/vep-docker.cloudbuild.yaml loading_pipeline/deploy +steps: +- name: 'gcr.io/kaniko-project/executor:v1.3.0' + args: + - --destination=gcr.io/seqr-project/vep-docker-image:${_REFERENCE_GENOME} + - --dockerfile=Dockerfile.vep_${_REFERENCE_GENOME} + - --cache=true + - --cache-ttl=168h + +timeout: 1800s diff --git a/.codacy.yaml b/.codacy.yaml index a0ae5a67dd..121f658884 100644 --- a/.codacy.yaml +++ b/.codacy.yaml @@ -1,3 +1,4 @@ --- exclude_paths: - - "deploy/postgres/initdb.sql" \ No newline at end of file + - "deploy/postgres/initdb.sql" + - "loading_pipeline/deploy/Dockerfile" \ No newline at end of file diff --git a/.dockerignore b/.dockerignore index e294067478..889b577013 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,6 +6,7 @@ static/* deploy/* !deploy/docker/seqr/* !deploy/docker/vlm/* +loading_pipeline/*test* .git .vscode .idea diff --git a/.github/workflows/pipeline-dev-release.yml b/.github/workflows/pipeline-dev-release.yml new file mode 100644 index 0000000000..5c050a9b52 --- /dev/null +++ b/.github/workflows/pipeline-dev-release.yml @@ -0,0 +1,74 @@ +name: dev release +on: + workflow_run: + workflows: ["Pipeline Unit Tests"] + types: + - completed + branches: + - dev + +permissions: + id-token: write + +jobs: + release: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.event.workflow_run.head_branch }} + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Build package + run: | + cd loading_pipeline + rm -rf dist/ + python -m pip install build + python -m build + + - name: authenticate to google cloud + id: "auth" + uses: google-github-actions/auth@v0 + with: + workload_identity_provider: "${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}" + service_account: "${{ secrets.RUN_SA_EMAIL }}" + + - name: "setup gcloud sdk" + uses: google-github-actions/setup-gcloud@v0 + + - name: Copy files to release directory + run: |- + gcloud storage rm -r gs://seqr-pipeline-runner-builds/dev/latest/ || echo 'No latest release' + gcloud storage cp loading_pipeline/bin/* gs://seqr-pipeline-runner-builds/dev/latest/bin/ + gcloud storage cp cd loading_pipeline/dist/*.whl gs://seqr-pipeline-runner-builds/dev/latest/pyscripts.zip + gcloud storage cp loading_pipeline/bin/* gs://seqr-pipeline-runner-builds/dev/${{ github.event.workflow_run.head_sha }}/bin/ + gcloud storage cp cd loading_pipeline/dist/*.whl gs://seqr-pipeline-runner-builds/dev/${{ github.event.workflow_run.head_sha }}/pyscripts.zip + docker: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.event.workflow_run.head_branch }} + + - name: authenticate to google cloud + id: "auth" + uses: google-github-actions/auth@v3 + with: + workload_identity_provider: "${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}" + service_account: "${{ secrets.RUN_SA_EMAIL }}" + + - name: "setup gcloud sdk" + uses: google-github-actions/setup-gcloud@v2 + + - name: Build and push images + run: |- + gcloud builds submit --quiet --substitutions="COMMIT_SHA=${{ github.event.workflow_run.head_sha }},_CUSTOM_BRANCH_TAG=dev" --config .cloudbuild/pipeline-docker.cloudbuild.yaml --gcs-log-dir=gs://seqr-github-actions-logs/logs . + diff --git a/.github/workflows/pipeline-prod-release.yml b/.github/workflows/pipeline-prod-release.yml new file mode 100644 index 0000000000..02da04e79e --- /dev/null +++ b/.github/workflows/pipeline-prod-release.yml @@ -0,0 +1,121 @@ +name: prod release +on: + workflow_run: + workflows: ["Pipeline Unit Tests"] + types: + - completed + branches: + - master + +permissions: + id-token: write + contents: write + +jobs: + release: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.event.workflow_run.head_branch }} + + - name: set up python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: build package + run: | + cd loading_pipeline + rm -rf dist/ + python -m pip install build + python -m build + + - name: authenticate to google cloud + id: "auth" + uses: google-github-actions/auth@v3 + with: + workload_identity_provider: "${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}" + service_account: "${{ secrets.RUN_SA_EMAIL }}" + + - name: "setup gcloud sdk" + uses: google-github-actions/setup-gcloud@v2 + + - name: Copy files to release directory + shell: bash + run: |- + gcloud storage rm -r gs://seqr-pipeline-runner-builds/prod/latest/ || echo 'No latest release' + gcloud storage cp loading_pipeline/bin/* gs://seqr-pipeline-runner-builds/prod/latest/bin/ + gcloud storage cp loading_pipeline/dist/*.whl gs://seqr-pipeline-runner-builds/prod/latest/pyscripts.zip + gcloud storage cp loading_pipeline/bin/* gs://seqr-pipeline-runner-builds/prod/${{ github.event.workflow_run.head_sha }}/bin/ + gcloud storage cp loading_pipeline/dist/*.whl gs://seqr-pipeline-runner-builds/prod/${{ github.event.workflow_run.head_sha }}/pyscripts.zip + gcloud storage cp -r loading_pipeline/var/vep/* gs://seqr-reference-data/vep/ + + docker: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - name: checkout + uses: actions/checkout@v3 + with: + ref: ${{ github.event.workflow_run.head_branch }} + + - name: authenticate to google cloud + id: "auth" + uses: google-github-actions/auth@v3 + with: + workload_identity_provider: "${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}" + service_account: "${{ secrets.RUN_SA_EMAIL }}" + + - name: "setup gcloud sdk" + uses: google-github-actions/setup-gcloud@v2 + + - name: Build and push images + run: |- + gcloud builds submit --quiet --substitutions="COMMIT_SHA=${{ github.event.workflow_run.head_sha }},_CUSTOM_BRANCH_TAG=latest" --config .cloudbuild/pipeline-docker.cloudbuild.yaml --gcs-log-dir=gs://seqr-github-actions-logs/logs . + + helm_update: + runs-on: ubuntu-latest + needs: docker + steps: + - uses: actions/checkout@v3 + with: + repository: broadinstitute/seqr-helm + ref: main + persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token + fetch-depth: 0 # otherwise, you will failed to push refs to dest repo + + - name: Get latest pipeline-runner version + uses: mikefarah/yq@v4.22.1 + id: current + with: + cmd: > + yq -r '.version' charts/pipeline-runner/Chart.yaml + + - name: Bump version + id: bump + uses: cbrgm/semver-bump-action@main + with: + current-version: ${{ steps.current.outputs.result }} + bump-level: minor + + - name: Update appVersion and version in pipeline-runner Chart file + uses: mikefarah/yq@v4.22.1 + with: + cmd: > + yq -i ' + .appVersion = "${{ github.event.workflow_run.head_sha }}" | + .version = "${{ steps.bump.outputs.new_version }}" + ' charts/pipeline-runner/Chart.yaml + + - name: Commit and Push changes + uses: Andro999b/push@v1.3 + with: + repository: broadinstitute/seqr-helm + branch: main + github_token: ${{ secrets.SEQR_VERSION_UPDATE_TOKEN }} + author_email: ${{ github.actor }}@users.noreply.github.com + author_name: tgg-automation + message: "Update pipeline-runner chart appVersion to ${{ github.event.workflow_run.head_sha }}" diff --git a/.github/workflows/pipeline-unit-tests.yml b/.github/workflows/pipeline-unit-tests.yml new file mode 100644 index 0000000000..1b989e6335 --- /dev/null +++ b/.github/workflows/pipeline-unit-tests.yml @@ -0,0 +1,91 @@ +name: Pipeline Unit Tests + +# Run the test suite on pushes (incl. merges) to master and dev +# Run the test suite when a PR is opened, pushed to, or reopened +on: + push: + branches: + - dev + - master + paths: + - 'loading_pipeline/**' + - '.github/workflows/pipeline-*-release.yaml' + pull_request: + types: [opened, synchronize, reopened] + paths: + - 'loading_pipeline/**' + - '.github/workflows/*pipeline*.yaml' + - 'clickhouse_search/migrations/*.py' + +permissions: + contents: read + +jobs: + unit_tests: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.11'] + + steps: + - uses: actions/checkout@v3 + - name: Create ClickHouse Config + run: | + cat < test_config.xml + + /tmp + + EOF + - name: Start ClickHouse with mounted config + run: | + docker run -d --name clickhouse \ + -v ${{ github.workspace }}/test_config.xml:/etc/clickhouse-server/config.d/config.xml \ + -v /tmp:/tmp \ + -p 9000:9000 \ + -e CLICKHOUSE_USER=default \ + -e CLICKHOUSE_PASSWORD=default_password \ + -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 \ + gcr.io/seqr-project/seqr-clickhouse:26.3.9 + - name: Wait for ClickHouse + run: | + until docker exec clickhouse clickhouse-client --query "SELECT 1"; do + echo "Waiting for ClickHouse to start..." + sleep 2 + done + - name: Set up ClickHouse Settings + run: | + docker exec clickhouse clickhouse-client --query "CREATE SETTINGS PROFILE clickhouse_settings SETTINGS flatten_nested=0, join_use_nulls=1, stop_refreshable_materialized_views_on_startup=1, allow_materialized_view_with_bad_select=1, enable_join_runtime_filters=0 TO default" + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + # Install uv + - name: Install uv + uses: astral-sh/setup-uv@v7 + with: + enable-cache: true + cache-dependency-glob: | + **/uv.lock + **/pyproject.toml + - name: Sync dependencies (prod + dataproc) + run: uv sync --locked --project loading_pipeline + - name: Check Ruff Format + run: | + cd loading_pipeline + uv run ruff format --check . --diff + - name: Check Ruff + run: | + cd loading_pipeline + uv run ruff check --output-format github + - name: Run ShellCheck + uses: ludeeus/action-shellcheck@master + with: + severity: error + scandir: './loading_pipeline/bin' + - name: Unit Tests + run: | + export CLICKHOUSE_OPTIMIZE_TABLE_WAIT_S=1 + export PYSPARK_SUBMIT_ARGS='--driver-memory 8G pyspark-shell' + export CLICKHOUSE_DATABASE=test + uv run --project loading_pipeline pytest --cov=loading_pipeline --cov-report=term-missing loading_pipeline + uv run --project loading_pipeline coverage report --omit '*test*' --fail-under=85 diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index b55ef44185..9d19033073 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -8,11 +8,15 @@ on: - master - dev paths-ignore: + - 'loading_pipeline/**' + - '.github/workflows/*pipeline*.yaml' - 'vlm/**' - '.github/workflows/*vlm*.yaml' pull_request: types: [opened, synchronize, reopened] paths-ignore: + - 'loading_pipeline/**' + - '.github/workflows/*pipeline*.yaml' - 'vlm/**' - '.github/workflows/*vlm*.yaml' diff --git a/.github/workflows/vlm-unit-tests.yaml b/.github/workflows/vlm-unit-tests.yaml index d3a19567b9..85a2100a38 100644 --- a/.github/workflows/vlm-unit-tests.yaml +++ b/.github/workflows/vlm-unit-tests.yaml @@ -113,7 +113,7 @@ jobs: export CLICKHOUSE_WRITER_PASSWORD=clickhouse_test_password export CLICKHOUSE_SERVICE_HOSTNAME=localhost export POSTGRES_SERVICE_HOSTNAME=localhost - python3 -m pytest --setup-only --create-db --reuse-db --ds=settings + python3 -m pytest --setup-only --create-db --reuse-db --ds=settings vlm - name: Set up Clickhouse test user run: | docker exec clickhouse clickhouse-client --query "GRANT SELECT ON test_seqr.\`GRCh37/SNV_INDEL/key_lookup\` TO vlm_test_user" diff --git a/.gitignore b/.gitignore index 3928b0e368..2bcd030622 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,174 @@ pedigree_images/* seqr_settings django_key + +# loading pipeline +temp +*.vcf.gz +download_and_create_reference_datasets/*.txt +download_and_create_reference_datasets/*.gz +*.ht +*.mt +!/loading_pipeline/var/test/**/* + +# Standard python gitignore below +###################################################################### +###################################################################### + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +sdist/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/CLAUDE.md b/CLAUDE.md index dc9f87ef3e..10e1116dbb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,4 +42,6 @@ Single test: `npx jest path/to/File.test.js`. Coverage threshold 40% lines/state ## Development Notes -Never delete a file that is not in source control without confirming first +- Never delete a file that is not in source control without confirming first +- Comments should be kept to a minimum. Only add them where the code is genuinely hard to understand or maintain, and keep them brief. +- Always ask before downloading large amounts of data diff --git a/clickhouse_search/backend/table_models.py b/clickhouse_search/backend/table_models.py index 819ca96972..b6e39a15d5 100644 --- a/clickhouse_search/backend/table_models.py +++ b/clickhouse_search/backend/table_models.py @@ -1,9 +1,11 @@ from clickhouse_backend import models from django.db import connections from django.db.models import Func +import requests from clickhouse_search.backend.fields import NamedTupleField from seqr.utils.logging_utils import SeqrLogger +from settings import DATABASES, PIPELINE_RUNNER_SERVER logger = SeqrLogger(__name__) @@ -14,6 +16,34 @@ DICTIONARY_META_FIELDS = ['layout', 'lifetime_max', 'postgres_query', 'postgres_db', 'clickhouse_query_template'] +def conditionally_refresh_reference_dataset(reference_dataset: str): + def inner(apps, schema_editor): + if DATABASES['default']['NAME'].startswith('test_'): + return + requests.post( # pragma: no cover + f"{PIPELINE_RUNNER_SERVER}/refresh_clickhouse_reference_dataset_enqueue", + json={"reference_dataset": reference_dataset}, + timeout=60, + ) + return inner + + +def conditionally_reload_dictionary(dictionary_name: str): + def inner(apps, schema_editor): + if DATABASES['default']['NAME'].startswith('test_'): + return + schema_editor.execute(f'SYSTEM RELOAD DICTIONARY "{dictionary_name}"') + return inner + + +class Projection(Func): + + def __init__(self, name, select='*', order_by=None): + self.name = name + self.select = select + self.order_by = order_by + + class FixtureLoadableClickhouseModel(models.ClickhouseModel): def _save_table( diff --git a/clickhouse_search/constants.py b/clickhouse_search/constants.py index 0721e16955..9ebf9481b6 100644 --- a/clickhouse_search/constants.py +++ b/clickhouse_search/constants.py @@ -1,4 +1,7 @@ -from seqr.models import Individual +from seqr.utils.constants import AFFECTED_STATUS_AFFECTED, AFFECTED_STATUS_UNAFFECTED + +AFFECTED = AFFECTED_STATUS_AFFECTED +UNAFFECTED = AFFECTED_STATUS_UNAFFECTED MAX_VARIANTS = 10000 @@ -7,11 +10,6 @@ PATHOGENICTY_HGMD_SORT_KEY = 'pathogenicity_hgmd' PRIORITIZED_GENE_SORT = 'prioritized_gene' -AFFECTED = Individual.AFFECTED_STATUS_AFFECTED -UNAFFECTED = Individual.AFFECTED_STATUS_UNAFFECTED -MALE_SEXES = Individual.MALE_SEXES -FEMALE_SEXES = Individual.FEMALE_SEXES - ALT_ALT = 'alt_alt' REF_REF = 'ref_ref' REF_ALT = 'ref_alt' diff --git a/clickhouse_search/managers.py b/clickhouse_search/managers.py index f08bd5ee88..68da15e60a 100644 --- a/clickhouse_search/managers.py +++ b/clickhouse_search/managers.py @@ -12,13 +12,14 @@ GroupArrayIntersect, If, MapLookup, NullIf, Plus, SubqueryJoin, SubqueryTable, Tuple, TupleConcat, Untuple, \ IntDiv, Modulo, SplitByString, ArrayIndex, Multiply, IndexOf from clickhouse_search.models.postgres_dicts import AffectedDict, SexDict, DiscoveryVariantDict -from clickhouse_search.constants import INHERITANCE_FILTERS, ANY_AFFECTED, AFFECTED, UNAFFECTED, MALE_SEXES, \ +from clickhouse_search.constants import INHERITANCE_FILTERS, ANY_AFFECTED, AFFECTED, UNAFFECTED, \ X_LINKED_RECESSIVE, REF_REF, REF_ALT, ALT_ALT, HAS_ALT, HAS_REF, SPLICE_AI_FIELD, SCREEN_KEY, UTR_ANNOTATOR_KEY, \ EXTENDED_SPLICE_KEY, MOTIF_FEATURES_KEY, REGULATORY_FEATURES_KEY, CLINVAR_KEY, HGMD_KEY, NEW_SV_FIELD, \ EXTENDED_SPLICE_REGION_CONSEQUENCE, CLINVAR_PATH_RANGES, CLINVAR_PATH_SIGNIFICANCES, CLINVAR_LIKELY_PATH_FILTER, \ CLINVAR_CONFLICTING_P_LP, CLINVAR_CONFLICTING_NO_P, CLINVAR_CONFLICTING, PATH_FREQ_OVERRIDE_CUTOFF, \ HGMD_CLASS_FILTERS, SV_TYPE_FILTER_FIELD, SV_CONSEQUENCES_FIELD, COMPOUND_HET, COMPOUND_HET_ALLOW_HOM_ALTS, \ - X_LINKED_RECESSIVE_MALE_AFFECTED, FEMALE_SEXES, SV_ANNOTATION_TYPES + X_LINKED_RECESSIVE_MALE_AFFECTED, SV_ANNOTATION_TYPES +from seqr.utils.constants import MALE_SEXES, FEMALE_SEXES from seqr.utils.xpos_utils import get_xpos, parse_variant_id, MIN_POS, MAX_POS, CHROMOSOME_CHOICES diff --git a/clickhouse_search/migrations/0040_gnomadnoncodingconstraintdict.py b/clickhouse_search/migrations/0040_gnomadnoncodingconstraintdict.py index 274fb30bf1..9e31b51325 100644 --- a/clickhouse_search/migrations/0040_gnomadnoncodingconstraintdict.py +++ b/clickhouse_search/migrations/0040_gnomadnoncodingconstraintdict.py @@ -3,13 +3,13 @@ import clickhouse_backend.models import clickhouse_search.backend.engines import clickhouse_search.backend.fields -import clickhouse_search.models.search_models +import clickhouse_search.backend.table_models from django.db import migrations, models import django.db.models.deletion import django.db.models.manager import os -from clickhouse_search.models.reference_data_models import conditionally_refresh_reference_dataset +from clickhouse_search.backend.table_models import conditionally_refresh_reference_dataset from settings import CLICKHOUSE_IN_MEMORY_DIR, CLICKHOUSE_DATA_DIR CLICKHOUSE_AC_EXCLUDED_PROJECT_GUIDS = os.environ.get( @@ -419,7 +419,7 @@ class Migration(migrations.Migration): options={ 'db_table': 'GRCh38/SNV_INDEL/entries', 'engine': clickhouse_search.backend.engines.CollapsingMergeTree('sign', deduplicate_merge_projection_mode='rebuild', index_granularity=8192, order_by=('project_guid', 'family_guid', 'sample_type', 'is_gnomad_gt_5_percent', 'is_annotated_in_any_gene', 'key'), partition_by=['project_guid', 'partition_id']), - 'projection': clickhouse_search.models.search_models.Projection('xpos_projection', order_by='is_gnomad_gt_5_percent, is_annotated_in_any_gene, xpos'), + 'projection': clickhouse_search.backend.table_models.Projection('xpos_projection', order_by='is_gnomad_gt_5_percent, is_annotated_in_any_gene, xpos'), }, managers=[ ('objects', django.db.models.manager.Manager()), @@ -711,7 +711,7 @@ class Migration(migrations.Migration): 'db_table': 'GRCh37/SNV_INDEL/entries', 'abstract': False, 'engine': clickhouse_search.backend.engines.CollapsingMergeTree('sign', deduplicate_merge_projection_mode='rebuild', index_granularity=8192, order_by=('project_guid', 'family_guid', 'sample_type', 'is_gnomad_gt_5_percent', 'is_annotated_in_any_gene', 'key'), partition_by='project_guid'), - 'projection': clickhouse_search.models.search_models.Projection('xpos_projection', order_by='is_gnomad_gt_5_percent, is_annotated_in_any_gene, xpos'), + 'projection': clickhouse_search.backend.table_models.Projection('xpos_projection', order_by='is_gnomad_gt_5_percent, is_annotated_in_any_gene, xpos'), }, managers=[ ('objects', django.db.models.manager.Manager()), @@ -775,7 +775,7 @@ class Migration(migrations.Migration): 'db_table': 'GRCh38/MITO/entries', 'abstract': False, 'engine': clickhouse_search.backend.engines.CollapsingMergeTree('sign', deduplicate_merge_projection_mode='rebuild', index_granularity=8192, order_by=('project_guid', 'family_guid', 'sample_type', 'key'), partition_by='project_guid'), - 'projection': clickhouse_search.models.search_models.Projection('xpos_projection', order_by='xpos'), + 'projection': clickhouse_search.backend.table_models.Projection('xpos_projection', order_by='xpos'), }, managers=[ ('objects', django.db.models.manager.Manager()), @@ -820,7 +820,7 @@ class Migration(migrations.Migration): 'db_table': 'GRCh38/SV/entries', 'abstract': False, 'engine': clickhouse_search.backend.engines.CollapsingMergeTree('sign', deduplicate_merge_projection_mode='rebuild', index_granularity=8192, order_by=('project_guid', 'family_guid', 'key'), partition_by='project_guid'), - 'projection': clickhouse_search.models.search_models.Projection('xpos_projection', order_by='xpos'), + 'projection': clickhouse_search.backend.table_models.Projection('xpos_projection', order_by='xpos'), }, managers=[ ('objects', django.db.models.manager.Manager()), @@ -842,7 +842,7 @@ class Migration(migrations.Migration): 'db_table': 'GRCh38/GCNV/entries', 'abstract': False, 'engine': clickhouse_search.backend.engines.CollapsingMergeTree('sign', deduplicate_merge_projection_mode='rebuild', index_granularity=8192, order_by=('project_guid', 'family_guid', 'key'), partition_by='project_guid'), - 'projection': clickhouse_search.models.search_models.Projection('xpos_projection', order_by='xpos'), + 'projection': clickhouse_search.backend.table_models.Projection('xpos_projection', order_by='xpos'), }, managers=[ ('objects', django.db.models.manager.Manager()), diff --git a/clickhouse_search/migrations/0043_discoveryvariantdict_excludedvariantdict_and_more.py b/clickhouse_search/migrations/0043_discoveryvariantdict_excludedvariantdict_and_more.py index 66f666513a..9d1913855b 100644 --- a/clickhouse_search/migrations/0043_discoveryvariantdict_excludedvariantdict_and_more.py +++ b/clickhouse_search/migrations/0043_discoveryvariantdict_excludedvariantdict_and_more.py @@ -4,6 +4,8 @@ from django.db import migrations import django.db.models.manager +from clickhouse_search.backend.table_models import conditionally_reload_dictionary + class Migration(migrations.Migration): @@ -73,7 +75,7 @@ class Migration(migrations.Migration): ('_overwrite_base_manager', django.db.models.manager.Manager()), ], ), - migrations.RunSQL('SYSTEM RELOAD DICTIONARY "seqrdb_discovery_variant_dict"'), - migrations.RunSQL('SYSTEM RELOAD DICTIONARY "seqrdb_excluded_variant_dict"'), - migrations.RunSQL('SYSTEM RELOAD DICTIONARY "seqrdb_individual_metadata_dict"'), + migrations.RunPython(conditionally_reload_dictionary('seqrdb_discovery_variant_dict')), + migrations.RunPython(conditionally_reload_dictionary('seqrdb_excluded_variant_dict')), + migrations.RunPython(conditionally_reload_dictionary('seqrdb_individual_metadata_dict')), ] diff --git a/clickhouse_search/migrations/0044_omimdict.py b/clickhouse_search/migrations/0044_omimdict.py index e41052a123..b2162e7d08 100644 --- a/clickhouse_search/migrations/0044_omimdict.py +++ b/clickhouse_search/migrations/0044_omimdict.py @@ -4,6 +4,8 @@ from django.db import migrations import django.db.models.manager +from clickhouse_search.backend.table_models import conditionally_reload_dictionary + class Migration(migrations.Migration): @@ -30,5 +32,5 @@ class Migration(migrations.Migration): ('_overwrite_base_manager', django.db.models.manager.Manager()), ], ), - migrations.RunSQL('SYSTEM RELOAD DICTIONARY "seqrdb_omim"'), + migrations.RunPython(conditionally_reload_dictionary('seqrdb_omim')), ] diff --git a/clickhouse_search/models/__init__.py b/clickhouse_search/models/__init__.py index a1c506ef4a..f171b92113 100644 --- a/clickhouse_search/models/__init__.py +++ b/clickhouse_search/models/__init__.py @@ -12,6 +12,10 @@ ) state.DEFAULT_NAMES = options.DEFAULT_NAMES +# Importing here registers model classes with Django's app registry +from clickhouse_search.models import postgres_dicts, reference_data_models, search_models, gt_stats_models # noqa: F401,E402 + + class ClickHouseRouter: # Adapted from https://github.com/jayvynl/django-clickhouse-backend/blob/v1.3.2/README.md#configuration diff --git a/clickhouse_search/models/gt_stats_models.py b/clickhouse_search/models/gt_stats_models.py index 3076b65054..efd071a22d 100644 --- a/clickhouse_search/models/gt_stats_models.py +++ b/clickhouse_search/models/gt_stats_models.py @@ -3,8 +3,8 @@ from clickhouse_search.backend.fields import UInt32FieldDeltaCodecField, DictKeyForeignKey from clickhouse_search.backend.table_models import RefreshableMaterializedView, RefreshableMaterializedViewMeta, \ IncrementalMaterializedView, Dictionary -from reference_data.models import GENOME_VERSION_GRCh38, GENOME_VERSION_GRCh37 -from seqr.models import Dataset +from seqr.utils.constants import GENOME_VERSION_GRCh38, GENOME_VERSION_GRCh37, \ + DATASET_TYPE_VARIANT_CALLS, DATASET_TYPE_SV_CALLS, DATASET_TYPE_MITO_CALLS class BaseProjectGtStats(models.ClickhouseModel): @@ -307,10 +307,10 @@ class Meta(GtStatsDictMeta): layout = 'FLAT(MAX_ARRAY_SIZE 5000000)' PROJECT_GT_STATS_VIEW_CLASS_MAP = { - GENOME_VERSION_GRCh37: {Dataset.DATASET_TYPE_VARIANT_CALLS: ProjectsToGtStatsGRCh37SnvIndel}, + GENOME_VERSION_GRCh37: {DATASET_TYPE_VARIANT_CALLS: ProjectsToGtStatsGRCh37SnvIndel}, GENOME_VERSION_GRCh38: { - Dataset.DATASET_TYPE_VARIANT_CALLS: ProjectsToGtStatsSnvIndel, - Dataset.DATASET_TYPE_MITO_CALLS: ProjectsToGtStatsMito, - Dataset.DATASET_TYPE_SV_CALLS: ProjectsToGtStatsSv, + DATASET_TYPE_VARIANT_CALLS: ProjectsToGtStatsSnvIndel, + DATASET_TYPE_MITO_CALLS: ProjectsToGtStatsMito, + DATASET_TYPE_SV_CALLS: ProjectsToGtStatsSv, }, } diff --git a/clickhouse_search/models/reference_data_models.py b/clickhouse_search/models/reference_data_models.py index 783ff4934e..9f2fe6a4a5 100644 --- a/clickhouse_search/models/reference_data_models.py +++ b/clickhouse_search/models/reference_data_models.py @@ -1,6 +1,5 @@ from clickhouse_backend import models from django.db.models import ForeignKey, PROTECT -import requests from clickhouse_search.backend.engines import Join from clickhouse_search.backend.fields import Enum8Field, NestedField, UInt32FieldDeltaCodecField, DictKeyForeignKey @@ -8,19 +7,6 @@ RefreshableMaterializedView, RefreshableMaterializedViewMeta from clickhouse_search.constants import CLINVAR_ASSERTIONS, CLINVAR_PATHOGENICITIES from seqr.utils.xpos_utils import CHROMOSOME_CHOICES -from settings import DATABASES, PIPELINE_RUNNER_SERVER - - -def conditionally_refresh_reference_dataset(reference_dataset: str): - def inner(apps, schema_editor): - if DATABASES['default']['NAME'].startswith('test_'): - return - requests.post( # pragma: no cover - f"{PIPELINE_RUNNER_SERVER}/refresh_clickhouse_reference_dataset_enqueue", - json={"reference_dataset": reference_dataset}, - timeout=60, - ) - return inner def _all_variants_to_seqr_source_sql(reference_genome, dataset_type): diff --git a/clickhouse_search/models/search_models.py b/clickhouse_search/models/search_models.py index fb2653401c..48516b36f0 100644 --- a/clickhouse_search/models/search_models.py +++ b/clickhouse_search/models/search_models.py @@ -1,28 +1,20 @@ from clickhouse_backend import models -from django.db.models import ForeignKey, OneToOneField, Func, CASCADE +from django.db.models import ForeignKey, OneToOneField, CASCADE from clickhouse_search.backend.engines import CollapsingMergeTree, EmbeddedRocksDB from clickhouse_search.backend.fields import Enum8Field, NestedField, UInt32FieldDeltaCodecField, UInt64FieldDeltaCodecField, NamedTupleField, MaterializedUInt8Field from clickhouse_search.backend.functions import ArrayDistinct, ArrayFlatten, ArrayMin, ArrayMax -from clickhouse_search.backend.table_models import Dictionary, FixtureLoadableClickhouseModel +from clickhouse_search.backend.table_models import Dictionary, FixtureLoadableClickhouseModel, Projection from clickhouse_search.managers import EntriesManager, SvEntriesManager, SvVariantsQuerySet, VariantsQuerySet, \ VariantDetailsQuerySet from clickhouse_search.models.reference_data_models import GnomadNonCodingConstraintDict, BaseSpliceAi, \ ScreenDict -from reference_data.models import GENOME_VERSION_GRCh38, GENOME_VERSION_GRCh37 -from seqr.models import Dataset +from seqr.utils.constants import GENOME_VERSION_GRCh38, GENOME_VERSION_GRCh37, \ + SAMPLE_TYPE_WES, SAMPLE_TYPE_WGS, DATASET_TYPE_VARIANT_CALLS, DATASET_TYPE_SV_CALLS, DATASET_TYPE_MITO_CALLS from seqr.utils.xpos_utils import CHROMOSOME_CHOICES from settings import CLICKHOUSE_IN_MEMORY_DIR, CLICKHOUSE_DATA_DIR -class Projection(Func): - - def __init__(self, name, select='*', order_by=None): - self.name = name - self.select = select - self.order_by = order_by - - class BaseVariants(FixtureLoadableClickhouseModel): CONSEQUENCE_TERMS = [(1, 'transcript_ablation'), (2, 'splice_acceptor_variant'), (3, 'splice_donor_variant'), (4, 'stop_gained'), (5, 'frameshift_variant'), (6, 'stop_lost'), (7, 'start_lost'), (8, 'inframe_insertion'), (9, 'inframe_deletion'), (10, 'missense_variant'), (11, 'protein_altering_variant'), (12, 'splice_donor_5th_base_variant'), (13, 'splice_region_variant'), (14, 'splice_donor_region_variant'), (15, 'splice_polypyrimidine_tract_variant'), (16, 'incomplete_terminal_codon_variant'), (17, 'start_retained_variant'), (18, 'stop_retained_variant'), (19, 'synonymous_variant'), (20, 'coding_sequence_variant'), (21, 'mature_miRNA_variant'), (22, '5_prime_UTR_variant'), (23, '3_prime_UTR_variant'), (24, 'non_coding_transcript_exon_variant'), (25, 'intron_variant'), (26, 'NMD_transcript_variant'), (27, 'non_coding_transcript_variant'), (28, 'coding_transcript_variant'), (29, 'upstream_gene_variant'), (30, 'downstream_gene_variant'), (31, 'intergenic_variant'), (32, 'sequence_variant')] ANNOTATION_CONSTANTS = { @@ -414,7 +406,7 @@ class Meta(BaseEntries.Meta): ) class EntriesSv(BaseEntries): - SAMPLE_TYPE = Dataset.SAMPLE_TYPE_WGS + SAMPLE_TYPE = SAMPLE_TYPE_WGS CALL_FIELDS = [ ('sampleId', models.StringField()), ('gt', models.Enum8Field(null=True, blank=True, choices=[(0, 'REF'), (1, 'HET'), (2, 'HOM')])), @@ -436,7 +428,7 @@ class Meta(BaseEntries.Meta): db_table = 'GRCh38/SV/entries' class EntriesGcnv(BaseEntries): - SAMPLE_TYPE = Dataset.SAMPLE_TYPE_WES + SAMPLE_TYPE = SAMPLE_TYPE_WES CALL_FIELDS = [ ('sampleId', models.StringField()), ('gt', models.Enum8Field(null=True, blank=True, choices=[(0, 'REF'), (1, 'HET'), (2, 'HOM')])), @@ -461,7 +453,7 @@ class EntriesGcnv(BaseEntries): class Meta(BaseEntries.Meta): db_table = 'GRCh38/GCNV/entries' -class VariantDetailsGRCh37SnvIndel(models.ClickhouseModel): +class VariantDetailsGRCh37SnvIndel(FixtureLoadableClickhouseModel): ANNOTATION_CONSTANTS = VariantsGRCh37SnvIndel.ANNOTATION_CONSTANTS key = OneToOneField('VariantsGRCh37SnvIndel', db_column='key', primary_key=True, on_delete=CASCADE) @@ -478,7 +470,7 @@ class Meta: db_table = 'GRCh37/SNV_INDEL/variants/details' engine = EmbeddedRocksDB(0, f'{CLICKHOUSE_DATA_DIR}/GRCh37/SNV_INDEL/variants_details', primary_key='key', flatten_nested=0) -class VariantDetailsSnvIndel(models.ClickhouseModel): +class VariantDetailsSnvIndel(FixtureLoadableClickhouseModel): TRANSCRIPTS_FIELDS = sorted([ ('alphamissense', NamedTupleField([ ('pathogenicity', models.DecimalField(null=True, blank=True, max_digits=9, decimal_places=5)), @@ -621,21 +613,21 @@ class Meta: ENTRY_CLASS_MAP = { - GENOME_VERSION_GRCh37: {Dataset.DATASET_TYPE_VARIANT_CALLS: EntriesGRCh37SnvIndel}, + GENOME_VERSION_GRCh37: {DATASET_TYPE_VARIANT_CALLS: EntriesGRCh37SnvIndel}, GENOME_VERSION_GRCh38: { - Dataset.DATASET_TYPE_VARIANT_CALLS: EntriesSnvIndel, - Dataset.DATASET_TYPE_MITO_CALLS: EntriesMito, - f'{Dataset.DATASET_TYPE_SV_CALLS}_{Dataset.SAMPLE_TYPE_WGS}': EntriesSv, - f'{Dataset.DATASET_TYPE_SV_CALLS}_{Dataset.SAMPLE_TYPE_WES}': EntriesGcnv, + DATASET_TYPE_VARIANT_CALLS: EntriesSnvIndel, + DATASET_TYPE_MITO_CALLS: EntriesMito, + f'{DATASET_TYPE_SV_CALLS}_{SAMPLE_TYPE_WGS}': EntriesSv, + f'{DATASET_TYPE_SV_CALLS}_{SAMPLE_TYPE_WES}': EntriesGcnv, }, } VARIANTS_CLASS_MAP = { - GENOME_VERSION_GRCh37: {Dataset.DATASET_TYPE_VARIANT_CALLS: VariantsGRCh37SnvIndel}, + GENOME_VERSION_GRCh37: {DATASET_TYPE_VARIANT_CALLS: VariantsGRCh37SnvIndel}, GENOME_VERSION_GRCh38: { - Dataset.DATASET_TYPE_VARIANT_CALLS: VariantsSnvIndel, - Dataset.DATASET_TYPE_MITO_CALLS: VariantsMito, - f'{Dataset.DATASET_TYPE_SV_CALLS}_{Dataset.SAMPLE_TYPE_WGS}': VariantsSv, - f'{Dataset.DATASET_TYPE_SV_CALLS}_{Dataset.SAMPLE_TYPE_WES}': VariantsGcnv, + DATASET_TYPE_VARIANT_CALLS: VariantsSnvIndel, + DATASET_TYPE_MITO_CALLS: VariantsMito, + f'{DATASET_TYPE_SV_CALLS}_{SAMPLE_TYPE_WGS}': VariantsSv, + f'{DATASET_TYPE_SV_CALLS}_{SAMPLE_TYPE_WES}': VariantsGcnv, }, } VARIANT_DETAILS_CLASS_MAP = { diff --git a/clickhouse_search/search.py b/clickhouse_search/search.py index 3e57074425..33c86b0ef4 100644 --- a/clickhouse_search/search.py +++ b/clickhouse_search/search.py @@ -23,8 +23,9 @@ from seqr.utils.gene_utils import parse_locus_list_items from seqr.utils.logging_utils import SeqrLogger from clickhouse_search.constants import MAX_VARIANTS, XPOS_SORT_KEY, PATHOGENICTY_SORT_KEY, PATHOGENICTY_HGMD_SORT_KEY, \ - PRIORITIZED_GENE_SORT, COMPOUND_HET, COMPOUND_HET_ALLOW_HOM_ALTS, RECESSIVE, AFFECTED, MALE_SEXES, \ + PRIORITIZED_GENE_SORT, COMPOUND_HET, COMPOUND_HET_ALLOW_HOM_ALTS, RECESSIVE, AFFECTED, \ X_LINKED_RECESSIVE, X_LINKED_RECESSIVE_MALE_AFFECTED +from seqr.utils.constants import MALE_SEXES from seqr.views.utils.json_utils import DjangoJSONEncoderWithSets logger = SeqrLogger(__name__) diff --git a/loading_pipeline/CLAUDE.md b/loading_pipeline/CLAUDE.md new file mode 100644 index 0000000000..be7fe50300 --- /dev/null +++ b/loading_pipeline/CLAUDE.md @@ -0,0 +1,82 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this folder. + +## Quick Commands + +**Python environment setup:** +```bash +pyenv shell 3.11 +uv sync --group dev --locked +``` + +**Run all tests:** +```bash +pyenv shell 3.11 +uv run pytest +``` + +**Run a single test file:** +```bash +pyenv shell 3.11 +uv run pytest loading_pipeline/lib/misc/math_test.py +``` + +**Formatting and linting:** +```bash +pyenv shell 3.11 +uv run ruff format . +uv run ruff check . +``` + +## Project Architecture + +This is a genomic data loading pipeline that ingests variant data from VCF files into ClickHouse via Hail and Luigi. The overall flow: + +``` +VCF Input → Hail Matrix Table → Parquet Files → ClickHouse Staging → Production +``` + +### Core Components + +**`loading_pipeline/lib/tasks/`** — Luigi-based pipeline tasks +- Tasks are defined by their `requires()` method (reverse dependency declaration) +- `RunPipelineTask` is the main entry point that chains together: + - `WriteMetadataForRunTask` (metadata generation) + - `UpdateVariantAnnotationsTableWithNewVariantsTask` (annotation updates) + - `WriteNewEntriesParquetTask` (variant entries → parquet) + - `WriteNewVariantsParquetTask` (variants → parquet) + - `WriteNewVariantDetailsParquetTask` (details → parquet) + - `WriteClickhouseLoadSuccessFileTask` (final atomicity marker) +- Base tasks in `base/` provide shared parameters and utilities + +**`loading_pipeline/lib/annotations/`** — Hail-based variant annotation logic +- Standardizes and reformats VEP, gnomAD, and other annotation fields +- VEP schema defined in `vep*.json` files, parsed in `vep.py` + +**`loading_pipeline/lib/misc/clickhouse/`** — ClickHouse ingestion +- Manages staging table creation and atomic partition movement to production +- Follows the ["Making a Large Data Load Resilient"](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3) pattern + +**`loading_pipeline/api/`** — REST interface +- `model.py` defines Pydantic schemas for incoming requests +- `app.py` runs an aiohttp server handling load requests + +**`loading_pipeline/bin/pipeline_worker.py`** — Job runner +- Manages asynchronous pipeline jobs requested via the REST API + +### Schema Definitions + +Expected field schemas are defined in `core/dataset_type.py`: +- `col_fields` — variant fields (position, annotation, etc.) +- `entry_fields` — per-sample genotype fields +- `row_fields` — additional row-level metadata + +Test files in `lib/tasks/exports/*_test.py` contain examples of the expected parquet export schemas. + +## Development Notes + +- **Python 3.11 required** — Always activate with `pyenv shell 3.11` before running commands +- **Ruff configuration** — Follows single quotes, 88 char line limit. Test files allow asserts, private access, and high-arity functions +- **ClickHouse tests** — Run locally against a test ClickHouse instance (see README for setup) +- **Tests use pytest** — Not unittest; use `pytest` command directly diff --git a/loading_pipeline/README.md b/loading_pipeline/README.md new file mode 100644 index 0000000000..a12f08cad0 --- /dev/null +++ b/loading_pipeline/README.md @@ -0,0 +1,89 @@ +# Seqr Loading Pipeline + +[![Code Build](https://github.com/broadinstitute/seqr-loading-pipelines/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/broadinstitute/seqr-loading-pipelines/actions/workflows/unit-tests.yml) +[![Docker Build](https://github.com/broadinstitute/seqr-loading-pipelines/actions/workflows/prod-release.yml/badge.svg?branch=main)](https://github.com/broadinstitute/seqr-loading-pipelines/actions/workflows/prod-release.yml) + +*This folder contains pipelines and infrastructure for loading genomic data from VCF -> ClickHouse to support queries by the _seqr_ application* + +--- + +## 📁 Project Structure + +### `loading_pipeline/api/` +Contains the interface layer to the _seqr_ application. +- `api/model.py` defines pydantic models for the REST interface. +- `api/app.py` specifies an `aiohttp` webserver that handles load data requests. + +### `loading_pipeline/bin/` +Scripts or command-line utilities used for setup or task execution. +- `bin/pipeline_worker.py` — manages asynchronous jobs requested by _seqr_. + +### `loading_pipeline/deploy/` +Dockerfiles for the loading pipeline itself & any annotation utilities. +Kubernetes manifests are managed separately in [seqr-helm](https://github.com/broadinstitute/seqr-helm/tree/main/charts/pipeline-runner) + +### `loading_pipeline/lib/` +Core logic and shared libraries. +- `annotations` defines hail logic to re-format and standardize fields. +- `methods` wraps hail-defined genomics methods for QC. +- `misc` contains single modules with defined utilities. + - `misc/clickhouse` hosts the logic that manages the parquet ingestion into ClickHouse itself. +- `core` defines key constants/enums/config. +- `reference_datasets` manages parsing of raw reference sources into hail tables. +- `tasks` specifies the Luigi defined pipeline. Note that Luigi pipelines are defined by their requirements, so +the pipeline is defined, effectively, in reverse. + - `WriteClickhouseLoadSuccessFileTask` is the last task, defining a `requires()` method that runs the pipeline either locally or on scalable compute. + - `WriteImportedCallset` is the first task, importing a VCF into a Hail Matrix table, an "imported callset". +- `test` holds a few utilities used by the tests, which are dispersed throughout the rest of the repository. +- `paths.py` defines paths for all intermediate and output files of the pipeline. + +### `loading_pipeline/ops/` +Manual operations scripts. + +### `loading_pipeline/var/` +Static configuration and test files. + +--- + +## ⚙️ Setup for Local Development +The production pipeline runs with python `3.11`. + +### Clone the repo and install python requirements +```bash +git clone https://github.com/broadinstitute/seqr.git +cd seqr/loading_pipeline +RUN uv sync --group dev --locked +``` + +### [Install](https://clickhouse.com/docs/getting-started/quick-start/oss) & start ClickHouse with provided test configuration: +> **Note:** We are running ClickHouse `26.3.9-lts` in production. +```bash +curl https://clickhouse.com/ | sh +./clickhouse server --config-file=./seqr/loading_pipeline/var/clickhouse_config/test-clickhouse.xml +``` + +### [Run the Tests](https://github.com/broadinstitute/seqr-loading-pipelines/blob/main/.github/workflows/unit-tests.yml#L66-L73) + +### Run an Individual Test +```bash +uv run pytest loading_pipeline/lib/misc/math_test.py +``` + +### Formatting and Linting +```bash +uv run ruff format . +uv run ruff check . +``` + +## 🚪 Schema Entrypoints +- The expected fields and types are defined in `dataset_type.py` as the `col_fields`, `entry_fields`, and `row_fields` properties. Examples +of the SNV_INDEL/MITO/SV/GCNV callset schemas may be found in the tests. +- The VEP schema is defined in JSON within the vep*.json config files, then parsed into hail in `lib/annotations/vep.py`. +- Examples of exported parquets may be found in `lib/tasks/exports/*_parquet_test.py` + + +## 🚶‍♂️ ClickHouse Load Walkthrough +- The Clickhouse Load follows the pattern established in the [Making a Large Data Load Resilient](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part3) blog + - Rows are first loaded into a `staging` database that copies the production `TABLE`s and `MATERIALIZED VIEW`s. + - After all `entries` are inserted, we validate the inserted row count and finalize the per-project allele frequency aggregation. + - Partitions are atomically moved from the `staging` environment to production. diff --git a/loading_pipeline/__init__.py b/loading_pipeline/__init__.py new file mode 100644 index 0000000000..17b3aa3ed3 --- /dev/null +++ b/loading_pipeline/__init__.py @@ -0,0 +1,7 @@ +import datetime + +MAJOR_VERSION = 3 + +__version__ = ( + f'{MAJOR_VERSION}.{datetime.datetime.now(datetime.UTC).strftime("%Y%m%d.%H%M%S")}' +) diff --git a/loading_pipeline/api/__init__.py b/loading_pipeline/api/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/api/__main__.py b/loading_pipeline/api/__main__.py new file mode 100644 index 0000000000..5d5926f7cb --- /dev/null +++ b/loading_pipeline/api/__main__.py @@ -0,0 +1,18 @@ +from aiohttp import web + +from loading_pipeline.api.app import init_web_app +from loading_pipeline.lib.logger import get_logger + + +def run(): + app = init_web_app() + logger = get_logger(__name__) + web.run_app( + app, + host='0.0.0.0', # noqa: S104 # nosec B104 + port=6000, + access_log=logger, + ) + + +run() diff --git a/loading_pipeline/api/app.py b/loading_pipeline/api/app.py new file mode 100644 index 0000000000..90bac06745 --- /dev/null +++ b/loading_pipeline/api/app.py @@ -0,0 +1,119 @@ +import traceback + +import aiofiles +import aiofiles.os +from aiohttp import web, web_exceptions + +from loading_pipeline.api.model import ( + DeleteFamiliesRequest, + LoadingPipelineRequest, + PipelineRunnerRequest, + RebuildGtStatsRequest, + RefreshClickhouseReferenceDataRequest, +) +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.runs import is_queue_full, new_run_id +from loading_pipeline.lib.paths import ( + loading_pipeline_queue_dir, + loading_pipeline_queue_path, +) + +logger = get_logger(__name__) + + +@web.middleware +async def error_middleware(request, handler): + try: + return await handler(request) + except web.HTTPError: + logger.exception('HTTPError') + raise + except Exception as e: + logger.exception('Unhandled Exception') + error_reason = f'{e}: {traceback.format_exc()}' + raise web.HTTPInternalServerError(reason=error_reason) from e + + +async def _enqueue_request( + request: web.Request, + model_cls: type[PipelineRunnerRequest], +) -> web.Response: + """Generic helper to enqueue a pipeline request of any type.""" + if not request.body_exists: + raise web.HTTPUnprocessableEntity + + if is_queue_full(): + return web.json_response( + f'Pipeline queue is full. Please try again later. (limit={Env.LOADING_QUEUE_LIMIT})', + status=web_exceptions.HTTPConflict.status_code, + ) + + try: + model_instance = model_cls.model_validate(await request.json()) + except ValueError as e: + raise web.HTTPBadRequest from e + + queue_path = loading_pipeline_queue_path(new_run_id()) + async with aiofiles.open(queue_path, 'w') as f: + await f.write(model_instance.model_dump_json()) + + return web.json_response( + {'Successfully queued': model_instance.model_dump()}, + status=web_exceptions.HTTPAccepted.status_code, + ) + + +async def loading_pipeline_enqueue(request: web.Request) -> web.Response: + return await _enqueue_request( + request, + LoadingPipelineRequest, + ) + + +async def delete_families_enqueue(request: web.Request) -> web.Response: + return await _enqueue_request( + request, + DeleteFamiliesRequest, + ) + + +async def rebuild_gt_stats_enqueue(request: web.Request) -> web.Response: + return await _enqueue_request( + request, + RebuildGtStatsRequest, + ) + + +async def refresh_clickhouse_reference_dataset_enqueue( + request: web.Request, +) -> web.Response: + return await _enqueue_request( + request, + RefreshClickhouseReferenceDataRequest, + ) + + +async def status(_: web.Request) -> web.Response: + return web.json_response({'success': True}) + + +async def init_web_app(): + await aiofiles.os.makedirs( + loading_pipeline_queue_dir(), + exist_ok=True, + ) + app = web.Application(middlewares=[error_middleware]) + app.add_routes( + [ + web.get('/status', status), + web.post('/loading_pipeline_enqueue', loading_pipeline_enqueue), + web.post('/delete_families_enqueue', delete_families_enqueue), + web.post('/rebuild_gt_stats_enqueue', rebuild_gt_stats_enqueue), + web.post( + '/refresh_clickhouse_reference_dataset_enqueue', + refresh_clickhouse_reference_dataset_enqueue, + ), + ], + ) + return app diff --git a/loading_pipeline/api/app_test.py b/loading_pipeline/api/app_test.py new file mode 100644 index 0000000000..f5945c1c41 --- /dev/null +++ b/loading_pipeline/api/app_test.py @@ -0,0 +1,140 @@ +from pathlib import Path + +from aiohttp import web_exceptions +from aiohttp.test_utils import AioHTTPTestCase + +from loading_pipeline.api.app import init_web_app +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +CALLSET_PATH = str( + Path('loading_pipeline/var/test/callsets/1kg_30variants.vcf').resolve(), +) + + +class AppTest(AioHTTPTestCase, MockedDatarootTestCase): + async def get_application(self): + return await init_web_app() + + async def test_status(self): + async with self.client.request('GET', '/status') as resp: + self.assertEqual(resp.status, 200) + resp_json = await resp.json() + self.assertDictEqual(resp_json, {'success': True}) + + async def test_missing_route(self): + with self.assertLogs(level='ERROR') as _: + async with self.client.request('GET', '/loading_pip') as resp: + self.assertEqual(resp.status, web_exceptions.HTTPNotFound.status_code) + + async def test_loading_pipeline_invalid_requests(self): + with self.assertLogs(level='ERROR') as log: + async with self.client.request('GET', '/loading_pipeline_enqueue') as resp: + self.assertEqual( + resp.status, + web_exceptions.HTTPMethodNotAllowed.status_code, + ) + self.assertTrue( + 'HTTPMethodNotAllowed' in log.output[0], + ) + + with self.assertLogs(level='ERROR') as log: + async with self.client.request('POST', '/loading_pipeline_enqueue') as resp: + self.assertEqual( + resp.status, + web_exceptions.HTTPUnprocessableEntity.status_code, + ) + self.assertTrue( + 'HTTPUnprocessableEntity' in log.output[0], + ) + + body = { + 'callset_path': 'missing.vcf', + 'project_guids': ['project_a'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + } + with self.assertLogs(level='ERROR') as log: + async with self.client.request( + 'POST', + '/loading_pipeline_enqueue', + json=body, + ) as resp: + self.assertEqual( + resp.status, + web_exceptions.HTTPBadRequest.status_code, + ) + self.assertTrue( + 'callset_path must point to a file that exists' in log.output[0], + ) + + body = { + 'callset_path': CALLSET_PATH, + 'project_guids': ['project_a'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + 'validations_to_skip': ['bad_validation'], + } + with self.assertLogs(level='ERROR') as log: + async with self.client.request( + 'POST', + '/loading_pipeline_enqueue', + json=body, + ) as resp: + self.assertEqual( + resp.status, + web_exceptions.HTTPBadRequest.status_code, + ) + self.assertTrue( + "input_value='bad_validation" in log.output[0], + ) + + async def test_loading_pipeline_enqueue(self): + body = { + 'callset_path': CALLSET_PATH, + 'project_guids': ['project_a'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + } + async with self.client.request( + 'POST', + '/loading_pipeline_enqueue', + json=body, + ) as resp: + self.assertEqual( + resp.status, + web_exceptions.HTTPAccepted.status_code, + ) + resp_json = await resp.json() + self.assertDictEqual( + resp_json, + { + 'Successfully queued': { + 'request_type': 'LoadingPipelineRequest', + 'callset_path': CALLSET_PATH, + 'dataset_type': 'SNV_INDEL', + 'project_guids': ['project_a'], + 'reference_genome': 'GRCh38', + 'sample_type': 'WGS', + 'skip_check_sex_and_relatedness': False, + 'skip_expect_tdr_metrics': False, + 'attempt_id': 0, + 'validations_to_skip': [], + }, + }, + ) + + # Second request + body['project_guids'] = ['project_b', 'project_c'] + async with self.client.request( + 'POST', + '/loading_pipeline_enqueue', + json=body, + ) as resp: + self.assertEqual( + resp.status, + web_exceptions.HTTPAccepted.status_code, + ) diff --git a/loading_pipeline/api/model.py b/loading_pipeline/api/model.py new file mode 100644 index 0000000000..4c02078cf6 --- /dev/null +++ b/loading_pipeline/api/model.py @@ -0,0 +1,105 @@ +from typing import Literal + +import hailtop.fs as hfs +from pydantic import ( + AliasChoices, + BaseModel, + Field, + conint, + field_validator, + root_validator, +) + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.misc.clickhouse import ClickhouseReferenceDataset +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS, SKIPPABLE_VALIDATIONS + +MAX_LOADING_PIPELINE_ATTEMPTS = 5 +STRINGIFIED_SKIPPABLE_VALIDATIONS = [f.__name__ for f in SKIPPABLE_VALIDATIONS] +VALID_FILE_TYPES = ['vcf', 'vcf.gz', 'vcf.bgz', 'mt'] + + +class PipelineRunnerRequest(BaseModel): + request_type: str + + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + cls.model_fields['request_type'].default = cls.__name__ + + +class LoadingPipelineRequest(PipelineRunnerRequest): + attempt_id: conint(ge=0, le=MAX_LOADING_PIPELINE_ATTEMPTS - 1) = 0 + callset_path: str + project_guids: list[str] = Field( + min_length=1, + frozen=True, + validation_alias=AliasChoices('project_guids', 'projects_to_run'), + ) + sample_type: SampleType + reference_genome: ReferenceGenome + dataset_type: DatasetType + skip_check_sex_and_relatedness: bool = False + skip_expect_tdr_metrics: bool = False + validations_to_skip: list[Literal[*STRINGIFIED_SKIPPABLE_VALIDATIONS]] = [] + + def incr_attempt(self): + if self.attempt_id == (MAX_LOADING_PIPELINE_ATTEMPTS - 1): + return False + self.attempt_id += 1 + return True + + @field_validator('validations_to_skip') + @classmethod + def must_be_known_validation(cls, validations_to_skip): + for v in validations_to_skip: + if v not in set(STRINGIFIED_SKIPPABLE_VALIDATIONS): + msg = f'{v} is not a valid validator' + raise ValueError(msg) + return validations_to_skip + + @root_validator( + pre=True, + ) # the root validator runs before Pydantic parses or coerces field values. + @classmethod + def override_all_validations(cls, values): + if values.get('validations_to_skip') == [ + ALL_VALIDATIONS, + ]: + values['validations_to_skip'] = STRINGIFIED_SKIPPABLE_VALIDATIONS + return values + + @field_validator('callset_path') + @classmethod + def check_valid_callset_path(cls, callset_path: str) -> str: + if not any(callset_path.endswith(file_type) for file_type in VALID_FILE_TYPES): + msg = 'callset_path must be a VCF or a Hail Matrix Table' + raise ValueError(msg) + if '*' in callset_path and not hfs.ls( + callset_path, + ): # note that hfs.ls throws an exception if it cannot find a non-wildcard path + msg = 'callset_path must point to a shard pattern that exists' + raise ValueError(msg) + if '*' not in callset_path and not hfs.exists(callset_path): + msg = 'callset_path must point to a file that exists' + raise ValueError(msg) + return callset_path + + +class DeleteFamiliesRequest(PipelineRunnerRequest): + project_guid: str + family_guids: list[str] = Field( + min_length=1, + frozen=True, + ) + dataset_types: list[DatasetType] = Field(default_factory=lambda: list(DatasetType)) + + +class RebuildGtStatsRequest(PipelineRunnerRequest): + project_guids: list[str] = Field( + min_length=1, + frozen=True, + ) + + +class RefreshClickhouseReferenceDataRequest(PipelineRunnerRequest): + reference_dataset: ClickhouseReferenceDataset diff --git a/loading_pipeline/api/model_test.py b/loading_pipeline/api/model_test.py new file mode 100644 index 0000000000..03bc42ae1a --- /dev/null +++ b/loading_pipeline/api/model_test.py @@ -0,0 +1,87 @@ +import unittest +from pathlib import Path + +from loading_pipeline.api.model import DeleteFamiliesRequest, LoadingPipelineRequest +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType + +CALLSET_PATH = str( + Path('loading_pipeline/var/test/callsets/1kg_30variants.vcf').resolve(), +) + + +class ModelTest(unittest.TestCase): + def test_valid_loading_pipeline_requests(self) -> None: + raw_request = { + 'callset_path': CALLSET_PATH, + 'projects_to_run': ['project_a'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + } + lpr = LoadingPipelineRequest.model_validate(raw_request) + self.assertEqual(lpr.reference_genome, ReferenceGenome.GRCh38) + self.assertEqual(lpr.project_guids, ['project_a']) + self.assertEqual(lpr.request_type, 'LoadingPipelineRequest') + self.assertEqual(lpr.attempt_id, 0) + + # Test wildcard VCF + raw_request['callset_path'] = CALLSET_PATH.replace( + '1kg_30variants.vcf', + '1kg_30*.vcf', + ) + lpr = LoadingPipelineRequest.model_validate(raw_request) + + def test_invalid_loading_pipeline_requests(self) -> None: + raw_request = { + 'callset_path': 'a.txt', + 'project_guids': [], + 'sample_type': 'BLENDED', + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + 'attempt_id': 5, + } + with self.assertRaises(ValueError) as cm: + LoadingPipelineRequest.model_validate(raw_request) + self.assertTrue( + str(cm.exception).startswith( + '4 validation errors for LoadingPipelineRequest', + ), + ) + + def test_validations_to_skip(self) -> None: + shared_params = { + 'callset_path': CALLSET_PATH, + 'projects_to_run': ['project_a'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + } + raw_request = { + **shared_params, + 'validations_to_skip': ['all'], + } + lpr = LoadingPipelineRequest.model_validate(raw_request) + self.assertGreater(len(lpr.validations_to_skip), 2) + + raw_request = { + **shared_params, + 'validations_to_skip': ['validate_sample_type'], + } + lpr = LoadingPipelineRequest.model_validate(raw_request) + self.assertEqual(len(lpr.validations_to_skip), 1) + + raw_request = { + **shared_params, + 'validations_to_skip': ['validate_blended_exome'], + } + with self.assertRaises(ValueError): + LoadingPipelineRequest.model_validate(raw_request) + + def test_delete_families_request(self) -> None: + raw_request = {'project_guid': 'project_a', 'family_guids': []} + with self.assertRaises(ValueError): + DeleteFamiliesRequest.model_validate(raw_request) + raw_request['family_guids'] = ['family_a1'] + dfr = DeleteFamiliesRequest.model_validate(raw_request) + self.assertEqual(dfr.project_guid, 'project_a') + self.assertEqual(dfr.request_type, 'DeleteFamiliesRequest') diff --git a/loading_pipeline/api/request_handlers.py b/loading_pipeline/api/request_handlers.py new file mode 100644 index 0000000000..120b1f3696 --- /dev/null +++ b/loading_pipeline/api/request_handlers.py @@ -0,0 +1,107 @@ +from collections.abc import Callable +from typing import Any + +import luigi +import luigi.execution_summary + +from loading_pipeline.api.model import ( + DeleteFamiliesRequest, + LoadingPipelineRequest, + PipelineRunnerRequest, + RebuildGtStatsRequest, + RefreshClickhouseReferenceDataRequest, +) +from loading_pipeline.lib.core import DatasetType +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.clickhouse import ( + ClickhouseReferenceDataset, + delete_family_guids, + rebuild_gt_stats, + refresh_clickhouse_reference_data, +) +from loading_pipeline.lib.tasks.load_clickhouse_entries import ( + LoadClickhouseEntries, +) + +logger = get_logger(__name__) + + +def run_loading_pipeline( + lpr: LoadingPipelineRequest, + run_id: str, + local_scheduler: bool, + *_: Any, +): + luigi_task_result = luigi.build( + [ + LoadClickhouseEntries( + run_id=run_id, + **lpr.model_dump(exclude='request_type'), + ), + ], + detailed_summary=True, + local_scheduler=local_scheduler, + ) + if luigi_task_result.status in { + luigi.execution_summary.LuigiStatusCode.SUCCESS, + luigi.execution_summary.LuigiStatusCode.SUCCESS_WITH_RETRY, + }: + return + raise RuntimeError(luigi_task_result.status.value[1]) + + +def run_delete_families(dpr: DeleteFamiliesRequest, run_id: str, *_: Any): + for dataset_type in dpr.dataset_types: + for reference_genome in dataset_type.reference_genomes: + delete_family_guids( + reference_genome, + dataset_type, + run_id, + **dpr.model_dump(exclude={'request_type', 'dataset_types'}), + ) + + +def run_rebuild_gt_stats(rgsr: RebuildGtStatsRequest, run_id: str, *_: Any): + for dataset_type in DatasetType: + for reference_genome in dataset_type.reference_genomes: + rebuild_gt_stats( + reference_genome, + dataset_type, + run_id, + **rgsr.model_dump(exclude='request_type'), + ) + + +def run_refresh_clickhouse_reference_data( + rcrdr: RefreshClickhouseReferenceDataRequest, + run_id: str, + *_: Any, +): + for dataset_type in DatasetType: + for reference_genome in dataset_type.reference_genomes: + reference_dataset = rcrdr.reference_dataset + if ( + reference_dataset + not in ClickhouseReferenceDataset.for_reference_genome_dataset_type( + reference_genome, + dataset_type, + ) + ): + continue + refresh_clickhouse_reference_data( + reference_genome, + dataset_type, + run_id, + **rcrdr.model_dump(exclude='request_type'), + ) + + +REQUEST_HANDLER_MAP: dict[ + type[PipelineRunnerRequest], + Callable[[PipelineRunnerRequest, str, ...], None], +] = { + LoadingPipelineRequest: run_loading_pipeline, + DeleteFamiliesRequest: run_delete_families, + RebuildGtStatsRequest: run_rebuild_gt_stats, + RefreshClickhouseReferenceDataRequest: run_refresh_clickhouse_reference_data, +} diff --git a/loading_pipeline/bin/__init__.py b/loading_pipeline/bin/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/bin/clickhouse_loader.py b/loading_pipeline/bin/clickhouse_loader.py new file mode 100644 index 0000000000..acb9f615c2 --- /dev/null +++ b/loading_pipeline/bin/clickhouse_loader.py @@ -0,0 +1,13 @@ +# This is a shim loader intended to keep previously deployed seqr-platform +# charts that pull a new docker image running. + +import time + + +def main(): + while True: + time.sleep(5) + + +if __name__ == '__main__': + main() diff --git a/loading_pipeline/bin/dataproc_vep_init.bash b/loading_pipeline/bin/dataproc_vep_init.bash new file mode 100755 index 0000000000..257df7d8d3 --- /dev/null +++ b/loading_pipeline/bin/dataproc_vep_init.bash @@ -0,0 +1,63 @@ +#!/bin/bash + +# +# VEP init action for dataproc +# +# adapted/copied from +# https://github.com/broadinstitute/gnomad_methods/blob/main/init_scripts/vep105-init.sh +# and gs://hail-common/hailctl/dataproc/0.2.128/vep-GRCh38.sh +# +# NB: This is code used for initializing a dataproc cluster and runs as an intialization +# action when the rest of our code is unavailable. +# + +set -x + +export PROJECT="$(gcloud config get-value project)" +export DEPLOYMENT_TYPE="$(/usr/share/google/get_metadata_value attributes/DEPLOYMENT_TYPE)" +export REFERENCE_GENOME="$(/usr/share/google/get_metadata_value attributes/REFERENCE_GENOME)" +export PIPELINE_RUNNER_APP_VERSION="$(/usr/share/google/get_metadata_value attributes/PIPELINE_RUNNER_APP_VERSION)" +export REFERENCE_DATASETS_DIR="$(/usr/share/google/get_metadata_value attributes/REFERENCE_DATASETS_DIR)" + +# Install docker +apt-get update +apt-get -y install \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg2 \ + software-properties-common \ + tabix +curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" +sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" +apt-get update +apt-get install -y --allow-unauthenticated docker-ce + +# https://github.com/hail-is/hail/issues/12936 +sleep 60 +sudo service docker restart + +cat >/vep.c < +#include + +int +main(int argc, char *const argv[]) { + if (setuid(geteuid())) + perror( "setuid" ); + + execv("/vep.bash", argv); + return 0; +} +EOF +gcc -Wall -Werror -O2 /vep.c -o /vep +chmod u+s /vep + +gcloud storage cp "gs://seqr-pipeline-runner-builds/$DEPLOYMENT_TYPE/$PIPELINE_RUNNER_APP_VERSION/bin/download_vep_reference_data.bash" /download_vep_reference_data.bash +chmod +x /download_vep_reference_data.bash +./download_vep_reference_data.bash "$REFERENCE_GENOME" + +gcloud storage cp "gs://seqr-pipeline-runner-builds/$DEPLOYMENT_TYPE/$PIPELINE_RUNNER_APP_VERSION/bin/vep" /vep.bash +chmod +x /vep.bash + diff --git a/loading_pipeline/bin/download_vep_reference_data.bash b/loading_pipeline/bin/download_vep_reference_data.bash new file mode 100755 index 0000000000..653dd459c0 --- /dev/null +++ b/loading_pipeline/bin/download_vep_reference_data.bash @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -eux + +REFERENCE_GENOME="$1" +VEP_REFERENCE_DATASETS_DIR=${VEP_REFERENCE_DATASETS_DIR:-/var/seqr/vep-reference-data} +DEFAULT_REFERENCE_DATASETS_DIR="gs://seqr-reference-data" +if [[ -n "${REFERENCE_DATASETS_DIR:-}" && "$REFERENCE_DATASETS_DIR" == gs://* ]]; then + echo "Using overridden GCS path: $REFERENCE_DATASETS_DIR" +else + REFERENCE_DATASETS_DIR="$DEFAULT_REFERENCE_DATASETS_DIR" + echo "Using default GCS path: $REFERENCE_DATASETS_DIR" +fi + +case "$REFERENCE_GENOME" in + GRCh38) + VEP_REFERENCE_DATA_FILES=( + "$REFERENCE_DATASETS_DIR/vep_data/loftee-beta/GRCh38.tar.gz" + + # Raw data files copied from the bucket (https://console.cloud.google.com/storage/browser/dm_alphamissense;tab=objects?prefix=&forceOnObjectsSortingFiltering=false) + # tabix -s 1 -b 2 -e 2 -f -S 1 AlphaMissense_hg38.tsv.gz + "$REFERENCE_DATASETS_DIR/vep/GRCh38/AlphaMissense_hg38.tsv.*" + + # Generated with: + # curl -O ftp://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz > Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz + # gzip -d Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz + # bgzip Homo_sapiens.GRCh38.dna.primary_assembly.fa + # samtools faidx Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz + "$REFERENCE_DATASETS_DIR/vep/GRCh38/Homo_sapiens.GRCh38.dna.primary_assembly.fa.*" + + # Copied from ftp://ftp.ensembl.org/pub/release-110/variation/indexed_vep_cache/homo_sapiens_vep_110_GRCh38.tar.gz + "$REFERENCE_DATASETS_DIR/vep/GRCh38/homo_sapiens_vep_110_GRCh38.tar.gz" + + # Copied from the UTRAnnotator repo (https://github.com/ImperialCardioGenetics/UTRannotator/tree/master) + "$REFERENCE_DATASETS_DIR/vep/GRCh38/uORF_5UTR_GRCh38_PUBLIC.txt" + + "$REFERENCE_DATASETS_DIR/vep/GRCh38/vep-GRCh38.json" + ) + ;; + GRCh37) + VEP_REFERENCE_DATA_FILES=( + "$REFERENCE_DATASETS_DIR/vep_data/loftee-beta/GRCh37.tar.gz" + "$REFERENCE_DATASETS_DIR/vep/GRCh37/homo_sapiens_vep_110_GRCh37.tar.gz" + "$REFERENCE_DATASETS_DIR/vep/GRCh37/Homo_sapiens.GRCh37.dna.primary_assembly.fa.*" + "$REFERENCE_DATASETS_DIR/vep/GRCh37/vep-GRCh37.json" + ) + ;; + *) + echo "Invalid reference genome $REFERENCE_GENOME, should be GRCh37 or GRCh38" + exit 1 +esac + +if [ -f "$VEP_REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/_SUCCESS ]; then + echo "Skipping download because already successful" + exit 0; +fi + +mkdir -p "$VEP_REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"; +rm -rf "${VEP_REFERENCE_DATASETS_DIR:?}"/"${REFERENCE_GENOME:?}"/*; + +for vep_reference_data_file in "${VEP_REFERENCE_DATA_FILES[@]}"; do + if [[ $vep_reference_data_file == *.tar.gz ]]; then + echo "Downloading and extracting" "$vep_reference_data_file"; + gsutil cat "$vep_reference_data_file" | tar -xzf - -C "$VEP_REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/ & + else + echo "Downloading" "$vep_reference_data_file"; + gsutil cp "$vep_reference_data_file" "$VEP_REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/ & + fi +done; +wait +touch "$VEP_REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/_SUCCESS diff --git a/loading_pipeline/bin/pipeline_worker.py b/loading_pipeline/bin/pipeline_worker.py new file mode 100755 index 0000000000..4760cc37b3 --- /dev/null +++ b/loading_pipeline/bin/pipeline_worker.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +import json +import os +import re +import signal +import sys +import time + +from loading_pipeline.api.model import ( + PipelineRunnerRequest, +) +from loading_pipeline.api.request_handlers import REQUEST_HANDLER_MAP +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.clickhouse import ( + drop_staging_db, +) +from loading_pipeline.lib.misc.runs import get_oldest_queue_path +from loading_pipeline.lib.misc.slack import ( + safe_post_to_slack_failure, + safe_post_to_slack_success, +) +from loading_pipeline.lib.paths import ( + loading_pipeline_deadletter_queue_dir, + loading_pipeline_deadletter_queue_path, + loading_pipeline_queue_path, +) + +logger = get_logger(__name__) + + +def signal_handler(*_): + drop_staging_db() + sys.exit(0) + + +signal.signal(signal.SIGINT, signal_handler) +signal.signal(signal.SIGTERM, signal_handler) + + +def parse_run_id(latest_queue_path: str) -> str: + m = re.search( + r'request_(\d{8}-\d{6}-\d{6})\.json', + os.path.basename(latest_queue_path), + ) + if not m: + msg = f'Invalid queue filename: {latest_queue_path}' + raise ValueError(msg) + return m.group(1) + + +def parse_latest_queue_path( + latest_queue_path: str, +) -> PipelineRunnerRequest: + with open(latest_queue_path) as f: + raw_json = json.load(f) + request_type_name = raw_json['request_type'] + request_cls = next( + (cls for cls in REQUEST_HANDLER_MAP if cls.__name__ == request_type_name), + None, + ) + if not request_cls: + msg = f'Unknown request_type: {request_type_name}' + raise ValueError(msg) + return request_cls.model_validate(raw_json) + + +def process_queue(local_scheduler=False): + run_id, prr = None, None + try: + latest_queue_path = get_oldest_queue_path() + if latest_queue_path is None: + return + run_id = parse_run_id(latest_queue_path) + if not run_id: + return + prr = parse_latest_queue_path(latest_queue_path) + REQUEST_HANDLER_MAP[type(prr)](prr, run_id, local_scheduler) + os.remove(latest_queue_path) + safe_post_to_slack_success( + run_id, + prr, + ) + except Exception as e: + logger.exception('Unhandled Exception') + if run_id is None: + return + if hasattr(prr, 'attempt_id') and prr.incr_attempt(): + with open(loading_pipeline_queue_path(run_id), 'w') as f: + f.write(prr.model_dump_json()) + return + safe_post_to_slack_failure( + run_id, + prr, + e, + ) + os.makedirs(loading_pipeline_deadletter_queue_dir(), exist_ok=True) + with open(loading_pipeline_deadletter_queue_path(run_id), 'w') as f: + f.write(prr.model_dump_json()) + os.remove(latest_queue_path) + + +def main(): + while True: + process_queue() + logger.info('Looking for more work') + time.sleep(1) + + +if __name__ == '__main__': + main() diff --git a/loading_pipeline/bin/pipeline_worker_test.py b/loading_pipeline/bin/pipeline_worker_test.py new file mode 100644 index 0000000000..9efc409cba --- /dev/null +++ b/loading_pipeline/bin/pipeline_worker_test.py @@ -0,0 +1,183 @@ +import json +import os +from unittest.mock import Mock, patch + +import hail as hl +import hailtop.fs as hfs +import luigi +import luigi.worker +from django.db import connections + +from loading_pipeline.bin.pipeline_worker import process_queue +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.misc.clickhouse import ClickhouseReferenceDataset +from loading_pipeline.lib.paths import ( + clickhouse_load_success_file_path, + loading_pipeline_deadletter_queue_dir, + loading_pipeline_queue_dir, +) +from loading_pipeline.lib.test.clickhouse_schema_testcase import ( + ClickhouseSchemaTestCase, +) +from loading_pipeline.lib.test.misc import copy_project_pedigree_to_mocked_dir +from loading_pipeline.lib.test.mocked_dataroot_testcase import ( + MockedDatarootTestCase, +) +from loading_pipeline.var.test.vep.mock_vep_data import MOCK_38_VEP_DATA + +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' + + +class MyFailingTask(luigi.Task): + def run(self): + msg = 'This task is designed to fail!' + raise ValueError(msg) + + def output(self): + return luigi.LocalTarget('output.txt') + + +class PipelineWorkerTest(MockedDatarootTestCase, ClickhouseSchemaTestCase): + @patch.object( + ClickhouseReferenceDataset, + 'for_reference_genome_dataset_type', + return_value=[ClickhouseReferenceDataset.CLINVAR], + ) + @patch( + 'loading_pipeline.lib.tasks.write_new_variants_table.load_gencode_ensembl_to_refseq_id', + ) + @patch('loading_pipeline.lib.misc.vep.hl.vep') + @patch('loading_pipeline.lib.misc.slack._safe_post_to_slack') + @patch('loading_pipeline.bin.pipeline_worker.logger') + def test_process_queue_integration_test( + self, + mock_logger, + mock_safe_post_to_slack, + mock_vep: Mock, + mock_load_gencode_ensembl_to_refseq_id: Mock, + mock_for_reference_genome_dataset_type: Mock, + ): + mock_load_gencode_ensembl_to_refseq_id.return_value = hl.dict( + {'ENST00000327044': 'NM_015658.4'}, + ) + mock_vep.side_effect = lambda ht, **_: ht.annotate(vep=MOCK_38_VEP_DATA) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + raw_request = { + 'request_type': 'LoadingPipelineRequest', + 'callset_path': TEST_VCF, + 'projects_to_run': ['R0113_test_project'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + 'validations_to_skip': ['all'], + } + os.makedirs( + loading_pipeline_queue_dir(), + exist_ok=True, + ) + with open( + os.path.join( + loading_pipeline_queue_dir(), + 'request_20250916-200704-123456.json', + ), + 'w', + ) as f: + json.dump(raw_request, f) + process_queue(local_scheduler=True) + mock_safe_post_to_slack.assert_called_once_with( + ':white_check_mark: Pipeline Runner Request Success! :white_check_mark:\nRun ID: 20250916-200704-123456\n```{\n "attempt_id": 0,\n "callset_path": "loading_pipeline/var/test/callsets/1kg_30variants.vcf",\n "dataset_type": "SNV_INDEL",\n "project_guids": [\n "R0113_test_project"\n ],\n "reference_genome": "GRCh38",\n "request_type": "LoadingPipelineRequest",\n "sample_type": "WGS",\n "skip_check_sex_and_relatedness": false,\n "skip_expect_tdr_metrics": false,\n "validations_to_skip": [\n "validate_allele_depth_length",\n "validate_allele_type",\n "validate_expected_contig_frequency",\n "validate_no_duplicate_variants",\n "validate_sample_type"\n ]\n}```', + ) + with hfs.open( + clickhouse_load_success_file_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + '20250916-200704-123456', + ), + ) as f: + self.assertEqual(f.read(), '') + + cursor = connections['clickhouse_write'].cursor() + cursor.execute( + f""" + SELECT COUNT(*) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/variants_memory` + """, # nosec B608 + ) + annotations_count = cursor.fetchone()[0] + self.assertEqual(annotations_count, 30) + cursor.execute( + f""" + SELECT COUNT(*) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries` + """, # nosec B608 + ) + entries_count = cursor.fetchone()[0] + self.assertEqual(entries_count, 16) + cursor.execute( + f""" + SELECT sum(ac_wgs) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats_dict` + """, # nosec B608 + ) + ac_wgs = cursor.fetchone()[0] + self.assertEqual(ac_wgs, 69) + + @patch('loading_pipeline.lib.misc.slack._safe_post_to_slack') + @patch('loading_pipeline.api.request_handlers.LoadClickhouseEntries') + @patch('loading_pipeline.bin.pipeline_worker.logger') + def test_process_failure( + self, + mock_logger, + mock_load_clickhouse_entries_task, + mock_safe_post_to_slack, + ): + raw_request = { + 'request_type': 'LoadingPipelineRequest', + 'callset_path': TEST_VCF, + 'projects_to_run': ['project_a'], + 'sample_type': SampleType.WGS.value, + 'reference_genome': ReferenceGenome.GRCh38.value, + 'dataset_type': DatasetType.SNV_INDEL.value, + } + mock_load_clickhouse_entries_task.return_value = MyFailingTask() + os.makedirs( + loading_pipeline_queue_dir(), + exist_ok=True, + ) + with open( + os.path.join( + loading_pipeline_queue_dir(), + 'request_20250918-200704-123456.json', + ), + 'w', + ) as f: + json.dump(raw_request, f) + process_queue(local_scheduler=True) + process_queue(local_scheduler=True) + process_queue(local_scheduler=True) + process_queue(local_scheduler=True) + process_queue(local_scheduler=True) + mock_safe_post_to_slack.assert_called_once_with( + ':failed: Pipeline Runner Request Failed :failed:\nRun ID: 20250918-200704-123456\n```{\n "attempt_id": 4,\n "callset_path": "loading_pipeline/var/test/callsets/1kg_30variants.vcf",\n "dataset_type": "SNV_INDEL",\n "project_guids": [\n "project_a"\n ],\n "reference_genome": "GRCh38",\n "request_type": "LoadingPipelineRequest",\n "sample_type": "WGS",\n "skip_check_sex_and_relatedness": false,\n "skip_expect_tdr_metrics": false,\n "validations_to_skip": []\n}```\nReason: there were failed tasks', + ) + self.assertEqual(len(os.listdir(loading_pipeline_queue_dir())), 0) + with open( + os.path.join( + loading_pipeline_deadletter_queue_dir(), + 'request_20250918-200704-123456.json', + ), + ) as f: + r = json.load(f) + self.assertEqual(r['request_type'], 'LoadingPipelineRequest') + self.assertEqual(r['attempt_id'], 4) diff --git a/loading_pipeline/bin/rsync_reference_data.bash b/loading_pipeline/bin/rsync_reference_data.bash new file mode 100755 index 0000000000..6577392745 --- /dev/null +++ b/loading_pipeline/bin/rsync_reference_data.bash @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +set -eux + +REFERENCE_GENOME="$1" +REFERENCE_DATASETS_DIR=${REFERENCE_DATASETS_DIR:-/var/seqr/seqr-reference-data} + + +case "$REFERENCE_GENOME" in + GRCh38) + ;; + GRCh37) + ;; + *) + echo "Invalid reference genome $REFERENCE_GENOME, should be GRCh37 or GRCh38" + exit 1 +esac + +case "$REFERENCE_DATASETS_DIR" in + "gs://seqr-reference-data") + echo "Cannot rsync to the authoritative source" + exit 1 + ;; + *) + ;; +esac + +if ! [[ "$REFERENCE_DATASETS_DIR" =~ gs://* ]]; then + mkdir -p "$REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"; + if [ -f "$REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/_SUCCESS ]; then + echo "Skipping rsync because already successful" + exit 0; + fi +else + result=$(gsutil -q stat "$REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/_SUCCESS || echo 1) + if [[ "$result" != 1 ]]; then + echo "Skipping rsync because already successful" + exit 0; + fi +fi + +gsutil -m rsync -rd -x '.*\.parquet.*' "gs://seqr-reference-data/v3.2/$REFERENCE_GENOME" "$REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME" +if ! [[ "$REFERENCE_DATASETS_DIR" =~ gs://* ]]; then + touch "$REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/_SUCCESS +else + # If a different reference datasets dir is provided, sync vep data to the provided bucket. + gsutil cp "gs://seqr-reference-data/vep_data/loftee-beta/$REFERENCE_GENOME.tar.gz" "$REFERENCE_DATASETS_DIR"/vep_data/loftee-beta/"$REFERENCE_GENOME".tar.gz + gsutil -m rsync -rd "gs://seqr-reference-data/vep/$REFERENCE_GENOME" "$REFERENCE_DATASETS_DIR"/vep/"$REFERENCE_GENOME" + touch _SUCCESS + gsutil cp _SUCCESS "$REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME"/_SUCCESS + rm -rf _SUCCESS +fi diff --git a/loading_pipeline/bin/run_task.py b/loading_pipeline/bin/run_task.py new file mode 100755 index 0000000000..18dc77e839 --- /dev/null +++ b/loading_pipeline/bin/run_task.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 +import sys + +import luigi + +from loading_pipeline.lib.tasks import * # noqa: F403 # nosec F403 + +if __name__ == '__main__': + # If run does not succeed, exit with 1 status code. + luigi.run() or sys.exit(1) # pylint: disable=W0106 diff --git a/loading_pipeline/bin/updated_reference_dataset_parquet.py b/loading_pipeline/bin/updated_reference_dataset_parquet.py new file mode 100755 index 0000000000..48547dde77 --- /dev/null +++ b/loading_pipeline/bin/updated_reference_dataset_parquet.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +import argparse + +import luigi + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.reference_data.updated_reference_dataset_parquet import ( + UpdatedReferenceDatasetParquetOnDataprocTask, +) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--reference-genome', required=True, type=ReferenceGenome) + parser.add_argument('--dataset-type', required=True, type=DatasetType) + parser.add_argument( + '--reference-dataset', + required=True, + type=ReferenceDataset, + ) + args = parser.parse_args() + luigi.build( + [ + UpdatedReferenceDatasetParquetOnDataprocTask( + reference_genome=args.reference_genome, + dataset_type=args.dataset_type, + reference_dataset=args.reference_dataset, + run_id=f'{args.reference_dataset.value.replace("_", "-").lower()}-run', + attempt_id=0, + ), + ], + ) + + +if __name__ == '__main__': + main() diff --git a/loading_pipeline/bin/vep b/loading_pipeline/bin/vep new file mode 100755 index 0000000000..437ffcfe17 --- /dev/null +++ b/loading_pipeline/bin/vep @@ -0,0 +1,21 @@ +#!/bin/bash + +set -eux + +REFERENCE_GENOME=$1 +VEP_REFERENCE_DATASETS_DIR=${VEP_REFERENCE_DATASETS_DIR:-/var/seqr/vep-reference-data} +VEP_DOCKER_IMAGE="gcr.io/seqr-project/vep-docker-image" + +case $REFERENCE_GENOME in + GRCh38) + ;; + GRCh37) + ;; + *) + echo "Invalid reference genome $REFERENCE_GENOME, should be GRCh37 or GRCh38" + exit 1 +esac + +shift # Remove the REFERENCE_GENOME arg. +docker run --platform linux/amd64 -i -v "$VEP_REFERENCE_DATASETS_DIR"/"$REFERENCE_GENOME":/opt/vep/.vep/:ro $VEP_DOCKER_IMAGE:"$REFERENCE_GENOME" \ + /opt/vep/src/ensembl-vep/vep "$@" diff --git a/loading_pipeline/deploy/Dockerfile b/loading_pipeline/deploy/Dockerfile new file mode 100644 index 0000000000..96c3467f4f --- /dev/null +++ b/loading_pipeline/deploy/Dockerfile @@ -0,0 +1,40 @@ +FROM --platform=linux/amd64 docker:dind as BUILD +FROM --platform=linux/amd64 ghcr.io/astral-sh/uv:python3.11-alpine AS UV_BUILD +FROM --platform=linux/amd64 hailgenetics/hail:0.2.138-py3.11 +COPY --from=BUILD /usr/local/bin/docker /usr/local/bin/docker +COPY --from=UV_BUILD /usr/local/bin/uv /usr/local/bin/uv +LABEL maintainer="Broad TGG" + +RUN curl -sSL https://sdk.cloud.google.com | bash +ENV PATH $PATH:/root/google-cloud-sdk/bin + +ARG PIPELINE_RUNNER_APP_VERSION +ENV PIPELINE_RUNNER_APP_VERSION=${PIPELINE_RUNNER_APP_VERSION} + +ENV VIRTUAL_ENV="/.venv" + +# Add build utilities for "annoy" package +# Note that these are getting added into the final runtime image and not the build... +# I (BPB) ran into challenges getting the uv virtual environment synced properly due +# to mismatches between the uv:python3.11-alpine and hail docker python environments. +RUN apt-get update && apt-get install -y build-essential && rm -rf /var/lib/apt/lists/* + +COPY loading_pipeline/pyproject.toml loading_pipeline/uv.lock . +RUN uv sync --group prod --no-group dev --locked + +# Application Code +WORKDIR /loading_pipeline +COPY loading_pipeline/api api +COPY loading_pipeline/bin bin +COPY loading_pipeline/lib lib +COPY loading_pipeline/ops ops +COPY loading_pipeline/var/liftover var/liftover + +# Special paths +COPY loading_pipeline/var/spark_config/spark-defaults.conf /usr/local/lib/python3.10/dist-packages/pyspark/conf/spark-defaults.conf +COPY loading_pipeline/bin/vep /vep + + +WORKDIR / +EXPOSE 6000 8082 +CMD ["uv", "run", "python3", "-m", "loading_pipeline.api"] diff --git a/loading_pipeline/deploy/Dockerfile.vep_GRCh37 b/loading_pipeline/deploy/Dockerfile.vep_GRCh37 new file mode 100644 index 0000000000..b585244fb9 --- /dev/null +++ b/loading_pipeline/deploy/Dockerfile.vep_GRCh37 @@ -0,0 +1,12 @@ +FROM ubuntu:18.04 as build + +# NB: This code is a copy of GRCh38 except for the loftee branch. + +RUN apt-get update && apt-get -y install wget libncurses5-dev libncursesw5-dev libbz2-dev liblzma-dev build-essential libz-dev git +RUN wget https://github.com/samtools/samtools/releases/download/1.7/samtools-1.7.tar.bz2 && tar xjvf samtools-1.7.tar.bz2 && cd samtools-1.7 && make && make install +RUN git clone https://github.com/konradjk/loftee.git + +FROM ensemblorg/ensembl-vep:release_110.1 as runtime +RUN cpanm DBD::SQLite +COPY --from=build /usr/local/bin/samtools /usr/local/bin/samtools +COPY --from=build /loftee/ /plugins diff --git a/loading_pipeline/deploy/Dockerfile.vep_GRCh38 b/loading_pipeline/deploy/Dockerfile.vep_GRCh38 new file mode 100644 index 0000000000..f781db8bc8 --- /dev/null +++ b/loading_pipeline/deploy/Dockerfile.vep_GRCh38 @@ -0,0 +1,13 @@ +FROM ubuntu:18.04 as build + +# Adapted from https://hub.docker.com/layers/konradjk/vep95_loftee/latest/images/sha256-d5f1a155293412acb5af4811142ba6907bad1cd708ca4000528f6317b784440e?context=explore +# and https://github.com/broadinstitute/gnomad_methods/blob/main/docker_files/Dockerfile_VEP105 +RUN apt-get update && apt-get -y install wget libncurses5-dev libncursesw5-dev libbz2-dev liblzma-dev build-essential libz-dev git +RUN wget https://github.com/samtools/samtools/releases/download/1.7/samtools-1.7.tar.bz2 && tar xjvf samtools-1.7.tar.bz2 && cd samtools-1.7 && make && make install +RUN git clone -b grch38 https://github.com/konradjk/loftee.git + +FROM ensemblorg/ensembl-vep:release_110.1 as runtime +RUN cpanm DBD::SQLite +COPY --from=build /usr/local/bin/samtools /usr/local/bin/samtools +# semantics of mv vs COPY are different such that we don't need the '*' when moving files. +COPY --from=build /loftee/ /plugins diff --git a/loading_pipeline/docs/Clickhouse_Design_Notes.md b/loading_pipeline/docs/Clickhouse_Design_Notes.md new file mode 100644 index 0000000000..ff050c98dc --- /dev/null +++ b/loading_pipeline/docs/Clickhouse_Design_Notes.md @@ -0,0 +1,202 @@ +# ClickHouse Design Decisions + +## Schema + +### Entries Table +- Grouping by family was most efficient at query-time and was a wash on-disk. +- ORDER BY `project_guid, family_guid, sample_type, is_gnomad_gt_5_percent, is_annotated_in_any_gene, key` + - Support searches on project or family +- PROJECTION on `is_gnomad_gt_5_percent`, `is_annotated_in_any_gene`, `xpos` + - Static view over gnomad constructed at load time. + - Note that an update to gnomad _requires_ rebuilding this!!!! + - I would try to be clever about this, identifying the variants that change when gnomad updates + - From experience, dropping or adding columns NOT in the sorting key is very easy... impossible if it is. + - `is_annotated_in_gene` (lightweight boolean index to support gene search) + - xpos ordering supports sorts on gene/position. +- `geneId_ids` Array(UInt32) + - We _tried_ to make this a bitmap column. However, they are really "partial aggregation state" columns + `AggregateFunction(groupBitmap, UInt64)` and are not cleanly supported in all the right ways downstream. + - We store an array of integers and convert to a bitmap at search time, for a slight performance hit. + - hasAny(`list`, `list`) is trash slow and untenable. + +### Variants Tables +- Searchable fields in `variants_memory`. +- `variants_details` is post-filter and slow (10k per second). Mostly large blobs of strings. +- Live search queries run against `variants_memory` only. At load time, we insert into both tables w/ "on-disk" first. RocksDB inserts are idempotent so can handle retries re-writing the same key multiple times. + +### Reference Data Tables +- One table each per reference data source: `all_variants`, `seqr_variants`, `search`. +- Sourced from raw VCFs/TSVs if possible, `splice_ai` and `dbnsfp` are SLOW and big. +- Dictionaries are mostly [`HASHED_ARRAY`](https://kb.altinity.com/altinity-kb-dictionaries/altinity-kb-sparse_hashed-vs-hashed/) +- Tables with lots of seqr variants ("full rank" in key space) or too small to matter can be "FLAT" arrays. +- `RANGE_HASHED()` for ranges. +- dictGets and JOIN tables are super fast (10M/S) so even N joins is much faster than RocksDB table access. + +### SeqrDB Dicts +- Postgres backed dictionaries. +- Postgres named collection set up in infrastructure. +- These are essential, providing fast access within ClickHouse to Postgres itself. + - Loading references these. + - populating the geneIds field + - Search queries reference them too. +- Performantly refreshable! + +### Incremental vs Refreshable Materialized Views +- Incremental MVs are pointers between two actual tables, when data is inserted into the first it is copied +to the second with a transformation. +- Refreshable MVs are more analagous to other DBs, full data is generated on a schedule or manually. + - All Refreshable MVs in seqr are set to a refresh frequency of every 10 years. +- Incremental MVs cannot be "built". + +### RocksDB +The dependency on RocksDB is the weak point of the ClickHouse backend. The data structure is opaque, hard to reason about and improve, and challenging to query and update. Schema migrations are not supported, backups are manual and failure-prone, and the Engine is not supported in the managed ClickHouse Inc product. It solves a key problem for us, however, supporting fast key-value access over both small and large blobs of strings. + +Only Key/Value access is really supported for the RocksDB tables. Queries such as `SELECT ... WHERE key > 0 and key < 100000` are very slow and should be avoided. + +### Ingestion Architecture & Async Tasks +- Many operations in ClickHouse are asynchrnous and happen in the background. Careful attention must be paid +to ensure things finish reliably and do not leave partial state! +- Load is structured around a `staging` database and [atomic partition movement](https://clickhouse.com/blog/table-cloning). + - All `entries` tables and materialized views are schema-copied into `staging`. + - All data is inserted into `staging`. + - `staging` environment must be 'verified'. + - Dictionaries are rebuilt only in `production` database! +- `entries`/`project_gt_stats`/`gt_stats` cascade was required for reasonable performance +of recomputing allele frequencies. We did try loading without multiple descending views, but re-grouping the whole `entries` table OOMs. + +### History of Nasty Bugs +- Incorrectly named the on-disk tables `/variants/details` instead of `/variants_details` which caused issues because of an existing `/variants` path. +- Missing `affected_status` in materialized view ORDER BY, leading to undefined behavior. +- Mis-typed a gnomad allele frequency, incorrectly rounding down AFs. +- Infinite issues with column ordering, missing fields, and types. + +## Infrastructure + +#### ClickHouse Settings +Essential: +- `max_partition_size_to_drop`/`max_table_size_to_drop` need to be high, we delete the `staging` database +and thus need these to be the size of the largest project. +- `max_bytes_ratio_before_external_group_by`/`max_bytes_ratio_before_external_sort`. These are set to `0.1` and are essential. +During loading and various other operations, large `GROUP BY` can OOM. We have set these to ensure JOINs spill to disk, preferring slowness to crashes! +- `stop_refreshable_materialized_views_on_startup`, prevents all views from starting all at once on server startup. + +Optional: +- `max_query_size`, `max_ast_elements`, `max_expanded_ast_elements`,`max_parser_backtracks`: used internally for large projects with many samples. +- `max_server_memory_usage_to_ram_ratio` instructs ClickHouse to use less of the server's memory. Since we mount `/in-memory-dir` we allocate resources away from ClickHouse without its knowledge. +- `background_pool_size`, `background_merges_mutations_concurrency_ratio`, `number_of_free_entries_in_pool_to_execute_mutation`, `number_of_free_entries_in_pool_to_lower_max_size_of_merge`, `number_of_free_entries_in_pool_to_execute_optimize_entire_partition` allow limiting the number of background threads for background tasks. This has been helpful for protecting search performance at the cost of longer background operations. + +#### Running a Single Host +Clickhouse and the Helm installation support replication and scaling with either a Zookeeper or Clickhouse-Keeper managed cluster. Given our prioritization of Consistency >> Availability, and the complexity of managing a cluster, we've opted for the simplicity of maintaining a single host, accepting the risk of limited downtime both in search and loading. + +#### Backups +We have a cron in the [seqr codebase](https://github.com/broadinstitute/seqr/blob/master/deploy/docker/seqr/clickhouse_backup.py) that manages incremental backups of the the Broad `seqr`'s database. The `rocksdb` tables are backed up with a cloud storage rsync cron. + +#### Project Sub-Partitions +Select `GRCh38/SNV_INDEL` WGS projects are subpartitioned via a static mapping, set up as a one time operation w/ a rough goal of 500m rows per partition. Our largest projects far exceed ClickHouse's recommended maximum partition, and operations on coalesced single partitions are single threaded (slowing down `OPTIMIZE TABLE FINAL` like no other). Supporting sub-partitions lets us parallelize +any `OPTIMIZE TABLE` and in general leads to more manageable chunks of data. + +We did not, however, notice this prior to initial go-live. Thus all non-`GRCh38/SNV_INDEL` tables and early open-source releases do +follow this pattern. We have code and unit-tests to support both partitioning paradigms, and also have an operations script for the manual re-partitioning (`loading_pipeline/ops`). + +## Miscellaneous + +#### Learning About ClickHouse +- PostHog's [Clickhouse explainers](https://posthog.com/blog/clickhouse) +- Andy Pavlo's [DB Course](https://www.youtube.com/watch?v=nhlpwmOBEiE) +- The ClickHouse Documentation. + +#### Debugging Advice +- Logging into the client: +``` +kubectl port-forward services/seqr-clickhouse 9000:9000 + +# In another terminal +./clickhouse client --user seqr_clickhouse_writer --password PASSWORD +``` + +- Reading the query log, for example recent non-insert queries: +``` +select * FROM system.query_log where query_start_time > '2026-05-01' and query not like '%INSERT%'; +``` +Statistics like query time and memory are available here. + +- Manually timing queries. I've generally had a much better experience running a query and inserting into a temp table. For example: +``` +create temporary table t as SELECT transcripts FROM ( + SELECT toUInt32(generate_series) AS key + FROM generate_series(5_000_000, 5_010_000) +) k INNER JOIN `GRCh38/SNV_INDEL/transcripts` t on k.key = t.key; +``` +The alternatives, either returning the full result set to the client or "SELECT COUNT(*)", return biased timings. Either too slow due to networking buffering over the terminal or too fast due to not actually fetching the full result set off of disk. + +- Viewing `Dictionary` usage: +``` +SELECT + name AS dictionary_name, + sum(bytes_allocated) AS bytes_allocated_, + formatReadableSize(sum(bytes_allocated)) AS readable_size +FROM system.dictionaries +GROUP BY dictionary_name +ORDER BY bytes_allocated_ DESC +``` +Broad Seqr's production instance dictionaries consume ~30GB of memory. + +NOTE: I (bpb) believe these numbers are underestimates and don't account for some of the full memory overhead of maintaining these in memory. + +- Viewing `Join` table memory usage: +``` +SELECT + database, + name, + formatReadableSize(total_bytes) +FROM system.tables +WHERE engine IN ('Memory', 'Set', 'Join') +``` +Broad Seqr's production 'Join' tables consume about ~1GB of memory. + +- Viewing disk usage within ClickHouse: +``` +SELECT + disk_name, + database, + `table`, + sum(bytes_on_disk) AS s, + formatReadableSize(sum(bytes_on_disk)) AS size +FROM system.parts +WHERE active = 1 +GROUP BY + disk_name, + database, + `table` +ORDER BY s DESC +``` + +Broad Seqr's production disk usage: +``` + ┌─disk_name─┬─database─┬─table─────────────────────────────────────────────────────────────────────┬─────────────s─┬─size───────┐ +1. │ default │ seqr │ GRCh38/SNV_INDEL/entries │ 2134397010569 │ 1.94 TiB │ +2. │ default │ seqr │ GRCh37/SNV_INDEL/reference_data/splice_ai/all_variants │ 72085843803 │ 67.14 GiB │ +3. │ default │ seqr │ GRCh38/SNV_INDEL/reference_data/splice_ai/all_variants │ 71927088053 │ 66.99 GiB │ +4. │ default │ seqr │ GRCh37/SNV_INDEL/entries │ 39255880565 │ 36.56 GiB │ +5. │ default │ seqr │ GRCh38/SNV_INDEL/project_gt_stats │ 38191863243 │ 35.57 GiB │ +6. │ default │ seqr │ GRCh38/SNV_INDEL/reference_data/gnomad_genomes/all_variants │ 12827564551 │ 11.95 GiB │ + + +SELECT COUNT(*) +FROM `GRCh38/SNV_INDEL/entries` + +Query id: 51d2a78e-de1a-4b75-9131-1e9e1e3a2ecb + + ┌─────COUNT()─┐ +1. │ 68213850227 │ -- 68.21 billion + └─────────────┘ +``` + +- Viewing disk usage outside of ClickHouse: +``` +kubectl exec seqr-clickhouse-shard0-0 -c clickhouse -it -- bash -c 'cd /in-memory-dir; du -h' +``` + +``` +kubectl exec seqr-clickhouse-shard0-0 -c clickhouse -it -- bash -c 'cd /var/seqr/clickhouse-data; du -h' +``` diff --git a/loading_pipeline/docs/Diagrams.md b/loading_pipeline/docs/Diagrams.md new file mode 100644 index 0000000000..95541d3b3a --- /dev/null +++ b/loading_pipeline/docs/Diagrams.md @@ -0,0 +1,142 @@ +# Pipeline flow, as of August 2026 + +``` + WriteImportedCallsetTask + (VCF → Hail Matrix Table) + | + v + WritePostprocessedCallsetTask + (split multi, deduplicate) + | + _______________|_______________ + | | + v v + WriteSexCheckTableTask ValidateCallsetTask + | (validation checks) + | | + | v + | WriteRelatednessCheckTableTask + | | + | v + | WriteRelatednessCheckTsvTask + | | + |_______________________________| + | + v + WriteRemappedAndSubsettedCallsetTask + | + v + WriteMetadataForRunTask WriteExistingVariantsParquetTask + |___________________________________________| + | + v + WriteNewVariantsTableTask + | + ______________________+_______________________ + | | | + v v v + WriteNewEntries... WriteNewVariants... WriteNewVariantDetails... + ParquetTask ParquetTask ParquetTask + | | (optional) + |___________________________|_______________________| + | + v + RunPipelineTask + (all parquets ready) + | + v + WriteSuccessFileTask + | + v + LoadClickhouseVariants + | + v + LoadClickhouseEntries +``` + +ClickHouse LSM-Tree + +``` +┌────────────────────────────────────────────────────────────┐ +│ ClickHouse LSM: MemTable → Parts → Merge │ +└────────────────────────────────────────────────────────────┘ + + WRITE PHASE: + ───────────── + + INSERT statements + │ + ▼ + ┌──────────────┐ + │ MemTable │ (In-memory buffer) + │ ~150 MB │ ◄─── Growing as writes arrive + └──────┬───────┘ + │ + (Threshold exceeded) + │ + ▼ + ┌──────────────┐ + │ Flush │ + │ to Disk │ + └──────┬───────┘ + │ + ▼ + ┌──────────────┐ + │ Part (L0) │ ◄─── New immutable part on disk + └──────────────┘ + + + DISK STATE (Multiple Parts): + ────────────────────────────── + + MemTable Disk Parts (sorted by creation) + ┌─────┐ + │ │ ┌──────────┐ + │ │ │ Part(L0) │ ◄─── Recently flushed (small) + │ │ └──────────┘ + │ │ ┌──────────┐ + │ │ │ Part(L0) │ + │ │ └──────────┘ + │ │ ┌──────────┐ + │ │ │ Part(L0) │ + │ │ └──────────┘ + │ │ ┌──────────┐ + │ │ │ Part(L1) │ ◄─── Older (larger) + │ │ └──────────┘ + │ │ ┌──────────┐ + │ │ │ Part(L2) │ + │ │ └──────────┘ + └─────┘ + + + BACKGROUND MERGE (Compaction): + ─────────────────────────────── + + When L0 has ~10 parts: + + ┌──────────┐ + │Part(L0) │ + └────┬─────┘ + │ + ┌────┴─────┬──────────┐ + │ │ │ + ┌───▼──┐ ┌────▼───┐ ┌───▼──┐ + │L0 #1 │ │ L0 #2 │ │ L0#3 │ ──┐ + └──────┘ └────────┘ └──────┘ │ + │ Read + Sort + ┌──────────────────────────────┐ │ + Compress + │ Compaction Process │◄┘ + │ │ + │ 1. Read all rows from L0s │ + │ 2. Merge by primary key │ + │ 3. Sort & compress │ + │ 4. Write to single Part(L1) │ + └───────────────┬──────────────┘ + │ + ▼ + ┌──────────────┐ + │ Part(L1) │ ◄─── One larger part + │ (merged) │ (old L0 parts deleted) + └──────────────┘ + +``` \ No newline at end of file diff --git a/loading_pipeline/docs/Historial_Context.md b/loading_pipeline/docs/Historial_Context.md new file mode 100644 index 0000000000..a884c3ad54 --- /dev/null +++ b/loading_pipeline/docs/Historial_Context.md @@ -0,0 +1,77 @@ +Notes on Loading Pipeline Orchestration + +## Decision to move off of Airflow (late 2024): + - Manual mapping of luigi tasks to Airflow tasks (w/ strings!) + - Cost ($400 a month) + - Small instance (2 cpu/2 gb ram) for schedular and actual compute + - Unbelieveable scaling issues? + - DAG built dynamically, OOMs. + - Parallelism in task execution. + - Maintainability issues + - Lack of shared code with open source repo. + - Airflow system complexity w/ helm. + - Composer "management" + versions. + - Manual environment variables and secrets, lack of cohesion with kubernetes. + - Composer was its own Kubernetes ecosystem! + - GCP integration. + - Hooks for replacing python API calls... (why????) + - Nasty bugs + https://github.com/broadinstitute/seqr/pull/3995/changes + https://github.com/broadinstitute/seqr/pull/4539/changes + https://github.com/broadinstitute/seqr/pull/4646/changes + - Testing difficulties + - Able to test DAG "compile", but not actual execution. + - System complexity (templating, XCom, retries, 'Context') in the way of lean unit and integration tests. + +## Evaluation of other DAG frameworks: + - Prefect/Dagster/Argo Workflows + - Seem to have similar issues as Airflow; complexity does not align with the straightforward needs of the pipeline execution. + +## Current Implementation +- API listens for requests from `seqr` application for asynchronous work. +- Worker with concurrency=1 polls for work. + - One task at a time; coarse-grained lock: + Hail cannot update variants in parallel. + Clickhouse cannot rebuild entire gt_stats in parallel. + - Retries managed within the worker and persisted on disk. + - Failures moved to deadletter queue after 5 retries. +- Loading pipeline runs "Luigi" via --local-scheduler locally or via Dataproc. + - Luigi manages task flow and nothing else. +- Output looks like (as of 05/26): +``` +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/_CLICKHOUSE_LOAD_SUCCESS +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/_SUCCESS +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/metadata.json +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/new_entries.parquet/ +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/new_variant_details.parquet/ +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/new_variants.ht/ +gs://seqr-hail-search-data/v3.1/GRCh38/SNV_INDEL/runs/20260421-125644-303855/new_variants.parquet/ +``` + +### Residues from previous iterations. +- `complete()` methods are likely overcomplicated. + - Each task verifies completeness by running this method and if it returns `True`, skips execution. + - Necessary for performance, but as the pipeline has started doing less it is less necessary. + - Historically been the source of many bugs. + - For example, re-running pipeline with a different pedigree... we'd cached the subsetted callset, failed to generate a new one etc. +- Globalizing and Deglobalizing Ids. + - We optimized the hail table structure to move sample ids into globals, this complicates the current logic and is likely unnecessary. + +## Thoughts for future: + - Remove Hail for non SNV_INDEL dataset types and callsets < 500 samples. + - Lightweight replacement for Luigi "run()/complete()/output()/requires()" framework. + - Eliminate scheduler in favor of "tasks" table in clickhouse. + - Running arbitrary docker images: + - Airflow was useful for this, w/ Kubernetes elasticity. + - Need to support external computational biology tools. + - Can we just re-write with agentic coding? + - Remove as much business logic from core pipeline as we can. + - For example, the Terra Data Repository sample fetching. + +## VEP (🗑️) Addendum: + - VEP runs only on new variants via a custom wrapper around Hail's command. + - Internally, HAIL exports a table to VCF and shell execs parallelized docker-VEP processes and then re-imports into a VEP schema. + - On Dataproc, one initialization action syncs VEP reference data to HDFS. + - For open source users, sync to local disk. + - VEP itself is a custom docker build, pushed as a one time operation to seqr's gcr repo. + - GRCh38 and GRCh37 use different schemas, though are both using VEP 110. diff --git a/loading_pipeline/lib/__init__.py b/loading_pipeline/lib/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/annotations/__init__.py b/loading_pipeline/lib/annotations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/annotations/enums.py b/loading_pipeline/lib/annotations/enums.py new file mode 100644 index 0000000000..bb24a2bd92 --- /dev/null +++ b/loading_pipeline/lib/annotations/enums.py @@ -0,0 +1,224 @@ +import hail as hl + +BIOTYPES = [ + 'IG_C_gene', + 'IG_D_gene', + 'IG_J_gene', + 'IG_LV_gene', + 'IG_V_gene', + 'TR_C_gene', + 'TR_J_gene', + 'TR_V_gene', + 'TR_D_gene', + 'IG_pseudogene', + 'IG_C_pseudogene', + 'IG_J_pseudogene', + 'IG_V_pseudogene', + 'TR_V_pseudogene', + 'TR_J_pseudogene', + 'Mt_rRNA', + 'Mt_tRNA', + 'miRNA', + 'misc_RNA', + 'rRNA', + 'scRNA', + 'snRNA', + 'snoRNA', + 'ribozyme', + 'sRNA', + 'scaRNA', + 'lncRNA', + 'Mt_tRNA_pseudogene', + 'tRNA_pseudogene', + 'snoRNA_pseudogene', + 'snRNA_pseudogene', + 'scRNA_pseudogene', + 'rRNA_pseudogene', + 'misc_RNA_pseudogene', + 'miRNA_pseudogene', + 'TEC', + 'nonsense_mediated_decay', + 'non_stop_decay', + 'retained_intron', + 'protein_coding', + 'protein_coding_LoF', + 'protein_coding_CDS_not_defined', + 'processed_transcript', + 'non_coding', + 'ambiguous_orf', + 'sense_intronic', + 'sense_overlapping', + 'antisense', + 'known_ncrna', + 'pseudogene', + 'processed_pseudogene', + 'polymorphic_pseudogene', + 'retrotransposed', + 'transcribed_processed_pseudogene', + 'transcribed_unprocessed_pseudogene', + 'transcribed_unitary_pseudogene', + 'translated_processed_pseudogene', + 'translated_unprocessed_pseudogene', + 'unitary_pseudogene', + 'unprocessed_pseudogene', + 'artifact', + 'lincRNA', + 'macro_lncRNA', + '3prime_overlapping_ncRNA', + 'disrupted_domain', + 'vault_RNA', + 'bidirectional_promoter_lncRNA', + '3prime_overlapping_ncrna', +] + +REGULATORY_BIOTYPES = [ + 'enhancer', + 'promoter', + 'CTCF_binding_site', + 'TF_binding_site', + 'open_chromatin_region', +] + +TRANSCRIPT_CONSEQUENCE_TERMS = [ + 'transcript_ablation', + 'splice_acceptor_variant', + 'splice_donor_variant', + 'stop_gained', + 'frameshift_variant', + 'stop_lost', + 'start_lost', + 'inframe_insertion', + 'inframe_deletion', + 'missense_variant', + 'protein_altering_variant', + 'splice_donor_5th_base_variant', + 'splice_region_variant', + 'splice_donor_region_variant', + 'splice_polypyrimidine_tract_variant', + 'incomplete_terminal_codon_variant', + 'start_retained_variant', + 'stop_retained_variant', + 'synonymous_variant', + 'coding_sequence_variant', + 'mature_miRNA_variant', + '5_prime_UTR_variant', + '3_prime_UTR_variant', + 'non_coding_transcript_exon_variant', + 'intron_variant', + 'NMD_transcript_variant', + 'non_coding_transcript_variant', + 'coding_transcript_variant', + 'upstream_gene_variant', + 'downstream_gene_variant', + 'intergenic_variant', + 'sequence_variant', +] + +MOTIF_CONSEQUENCE_TERMS = [ + 'TFBS_ablation', + 'TFBS_amplification', + 'TF_binding_site_variant', + 'TFBS_fusion', + 'TFBS_translocation', +] + +REGULATORY_CONSEQUENCE_TERMS = [ + 'regulatory_region_ablation', + 'regulatory_region_amplification', + 'regulatory_region_variant', + 'regulatory_region_fusion', +] + +FIVEUTR_CONSEQUENCES = [ + '5_prime_UTR_premature_start_codon_gain_variant', # uAUG_gained + '5_prime_UTR_premature_start_codon_loss_variant', # uAUG_lost + '5_prime_UTR_stop_codon_gain_variant', # uSTOP_gained + '5_prime_UTR_stop_codon_loss_variant', # uSTOP_lost + '5_prime_UTR_uORF_frameshift_variant', # uFrameshift +] + +LOF_FILTERS = [ + 'END_TRUNC', + 'INCOMPLETE_CDS', + 'EXON_INTRON_UNDEF', + 'SMALL_INTRON', + 'ANC_ALLELE', + 'NON_DONOR_DISRUPTING', + 'NON_ACCEPTOR_DISRUPTING', + 'RESCUE_DONOR', + 'RESCUE_ACCEPTOR', + 'GC_TO_GT_DONOR', + '5UTR_SPLICE', + '3UTR_SPLICE', +] + +MITOTIP_PATHOGENICITIES = [ + 'likely_pathogenic', + 'possibly_pathogenic', + 'possibly_benign', + 'likely_benign', +] + +SV_TYPES = [ + 'gCNV_DEL', + 'gCNV_DUP', + 'BND', + 'CPX', + 'CTX', + 'DEL', + 'DUP', + 'INS', + 'INV', + 'CNV', +] + +SV_TYPE_DETAILS = [ + 'INS_iDEL', + 'INVdel', + 'INVdup', + 'ME', + 'ME:ALU', + 'ME:LINE1', + 'ME:SVA', + 'dDUP', + 'dDUP_iDEL', + 'delINV', + 'delINVdel', + 'delINVdup', + 'dupINV', + 'dupINVdel', + 'dupINVdup', +] + +SV_CONSEQUENCE_RANKS = [ + 'LOF', + 'INTRAGENIC_EXON_DUP', + 'PARTIAL_EXON_DUP', + 'COPY_GAIN', + 'DUP_PARTIAL', + 'MSV_EXON_OVERLAP', + 'INV_SPAN', + 'UTR', + 'PROMOTER', + 'TSS_DUP', + 'BREAKEND_EXONIC', + 'INTRONIC', + 'NEAREST_TSS', +] + + +def validated_enum_member( + value: hl.StringExpression, + allowed_values: list[str], +) -> hl.StringExpression: + """Validate that a string value is in the allowed enum list. + + Returns the value if valid or missing, raises an error if unrecognized. + """ + allowed_values_set = hl.literal(set(allowed_values)) + return ( + hl.case() + .when(hl.is_missing(value), value) + .when(allowed_values_set.contains(value), value) + .or_error(hl.format('Unexpected enum value: %s', value)) + ) diff --git a/loading_pipeline/lib/annotations/expression_helpers.py b/loading_pipeline/lib/annotations/expression_helpers.py new file mode 100644 index 0000000000..13a6f027e8 --- /dev/null +++ b/loading_pipeline/lib/annotations/expression_helpers.py @@ -0,0 +1,318 @@ +import hail as hl + +from loading_pipeline.lib.annotations.enums import TRANSCRIPT_CONSEQUENCE_TERMS + +TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP = hl.dict( + hl.enumerate(TRANSCRIPT_CONSEQUENCE_TERMS, index_first=False), +) +HGVSC_CONSEQUENCES = hl.set( + ['splice_donor_variant', 'splice_acceptor_variant', 'splice_region_variant'], +) +PROTEIN_LETTERS_1TO3 = hl.dict( + { + 'A': 'Ala', + 'C': 'Cys', + 'D': 'Asp', + 'E': 'Glu', + 'F': 'Phe', + 'G': 'Gly', + 'H': 'His', + 'I': 'Ile', + 'K': 'Lys', + 'L': 'Leu', + 'M': 'Met', + 'N': 'Asn', + 'P': 'Pro', + 'Q': 'Gln', + 'R': 'Arg', + 'S': 'Ser', + 'T': 'Thr', + 'V': 'Val', + 'W': 'Trp', + 'Y': 'Tyr', + 'X': 'Ter', + '*': 'Ter', + 'U': 'Sec', + }, +) + + +def _replace_chr_prefix(contig: str): + return contig.replace('^chr', '') + + +def _get_expr_for_contig(locus: hl.expr.LocusExpression) -> hl.expr.StringExpression: + """Normalized contig name""" + return _replace_chr_prefix(locus.contig) + + +def _get_expr_for_contig_number( + locus: hl.expr.LocusExpression, +) -> hl.expr.Int32Expression: + """Convert contig name to contig number""" + return hl.bind( + lambda contig: ( + hl.case() + .when(contig == 'X', 23) + .when(contig == 'Y', 24) + .when(contig[0] == 'M', 25) + .default(hl.int(contig)) + ), + _get_expr_for_contig(locus), + ) + + +def _get_expr_for_formatted_hgvs(csq): + return hl.cond( + hl.is_missing(csq.hgvsp) | HGVSC_CONSEQUENCES.contains(csq.major_consequence), + csq.hgvsc.split(':')[-1], + hl.cond( + csq.hgvsp.contains('=') | csq.hgvsp.contains('%3D'), + hl.bind( + lambda protein_letters: 'p.' + + protein_letters + + hl.str(csq.protein_start) + + protein_letters, + hl.delimit( + csq.amino_acids.split('').map( + PROTEIN_LETTERS_1TO3.get, + ), + '', + ), + ), + csq.hgvsp.split(':')[-1], + ), + ) + + +def get_expr_for_variant_id(table, max_length=None): + """Expression for computing ---. Assumes alleles were split. + + Args: + max_length: (optional) length at which to truncate the --- string + + Return: + string: "---" + """ + contig = _get_expr_for_contig(table.locus) + variant_id = ( + contig + + '-' + + hl.str(table.locus.position) + + '-' + + table.alleles[0] + + '-' + + table.alleles[1] + ) + if max_length is not None: + return variant_id[0:max_length] + return variant_id + + +def get_expr_for_xpos(locus: hl.expr.LocusExpression) -> hl.expr.Int64Expression: + """Genomic position represented as a single number = contig_number * 10**9 + position. + This represents chrom:pos more compactly and allows for easier sorting. + """ + contig_number = _get_expr_for_contig_number(locus) + return hl.int64(contig_number) * 1_000_000_000 + locus.position + + +def get_expr_for_vep_sorted_transcript_consequences_array( + vep_root, + include_coding_annotations=True, +): + """Sort transcripts by 3 properties: + + 1. coding > non-coding + 2. transcript consequence severity + 3. canonical > non-canonical + + so that the 1st array entry will be for the coding, most-severe, canonical transcript (assuming + one exists). + + Also, for each transcript in the array, computes these additional fields: + domains: converts Array[Struct] to string of comma-separated domain names + hgvs: set to hgvsp is it exists, or else hgvsc. formats hgvsp for synonymous variants. + major_consequence: set to most severe consequence for that transcript ( + VEP sometimes provides multiple consequences for a single transcript) + major_consequence_rank: major_consequence rank based on VEP SO ontology (most severe = 1) + (see http://www.ensembl.org/info/genome/variation/predicted_data.html) + category: set to one of: "lof", "missense", "synonymous", "other" based on the value of major_consequence. + + Args: + vep_root (StructExpression): root path of the VEP struct in the MT + include_coding_annotations (bool): if True, fields relevant to protein-coding variants will be included + """ + + selected_annotations = [ + 'biotype', + 'canonical', + 'cdna_start', + 'cdna_end', + 'codons', + 'exon', + 'gene_id', + 'gene_symbol', + 'hgvsc', + 'hgvsp', + 'intron', + 'transcript_id', + ] + + if include_coding_annotations: + selected_annotations.extend( + [ + 'amino_acids', + 'lof', + 'lof_filter', + 'lof_flags', + 'lof_info', + 'protein_id', + 'protein_start', + ], + ) + + result = hl.sorted( + vep_root.transcript_consequences.map( + lambda c: c.select( + *selected_annotations, + consequence_terms=c.consequence_terms, + domains=c.domains.map(lambda domain: domain.db + ':' + domain.name), + major_consequence=hl.cond( + c.consequence_terms.size() > 0, + hl.sorted( + c.consequence_terms, + key=TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get, + )[0], + hl.null(hl.tstr), + ), + ), + ) + .filter(lambda c: c.consequence_terms.size() > 0) + .map( + lambda c: c.annotate( + category=( + hl.case() + .when( + TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get(c.major_consequence) + <= TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get( + 'frameshift_variant', + ), + 'lof', + ) + .when( + TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get(c.major_consequence) + <= TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get( + 'missense_variant', + ), + 'missense', + ) + .when( + TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get(c.major_consequence) + <= TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get( + 'synonymous_variant', + ), + 'synonymous', + ) + .default('other') + ), + hgvs=_get_expr_for_formatted_hgvs(c), + major_consequence_rank=TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP.get( + c.major_consequence, + ), + ), + ), + lambda c: ( + hl.bind( + lambda is_coding, is_most_severe, is_canonical: ( + hl.cond( + is_coding, + hl.cond( + is_most_severe, + hl.cond(is_canonical, 1, 2), + hl.cond(is_canonical, 3, 4), + ), + hl.cond( + is_most_severe, + hl.cond(is_canonical, 5, 6), + hl.cond(is_canonical, 7, 8), + ), + ) + ), + hl.or_else(c.biotype, '') == 'protein_coding', + hl.set(c.consequence_terms).contains(vep_root.most_severe_consequence), + hl.or_else(c.canonical, 0) == 1, + ) + ), + ) + + if not include_coding_annotations: + # for non-coding variants, drop fields here that are hard to exclude in the above code + result = result.map(lambda c: c.drop('domains', 'hgvsp')) + + return hl.zip_with_index(result).map( + lambda csq_with_index: csq_with_index[1].annotate( + transcript_rank=csq_with_index[0], + ), + ) + + +def get_expr_for_worst_transcript_consequence_annotations_struct( + vep_sorted_transcript_consequences_root, + include_coding_annotations=True, +): + """Retrieves the top-ranked transcript annotation based on the ranking computed by + get_expr_for_vep_sorted_transcript_consequences_array(..) + + Args: + vep_sorted_transcript_consequences_root (ArrayExpression): + include_coding_annotations (bool): + """ + + transcript_consequences = { + 'biotype': hl.tstr, + 'canonical': hl.tint, + 'category': hl.tstr, + 'cdna_start': hl.tint, + 'cdna_end': hl.tint, + 'codons': hl.tstr, + 'gene_id': hl.tstr, + 'gene_symbol': hl.tstr, + 'hgvs': hl.tstr, + 'hgvsc': hl.tstr, + 'major_consequence': hl.tstr, + 'major_consequence_rank': hl.tint, + 'transcript_id': hl.tstr, + } + + if include_coding_annotations: + transcript_consequences.update( + { + 'amino_acids': hl.tstr, + 'domains': hl.tstr, + 'hgvsp': hl.tstr, + 'lof': hl.tstr, + 'lof_flags': hl.tstr, + 'lof_filter': hl.tstr, + 'lof_info': hl.tstr, + 'protein_id': hl.tstr, + }, + ) + + return hl.cond( + vep_sorted_transcript_consequences_root.size() == 0, + hl.struct( + **{ + field: hl.null(field_type) + for field, field_type in transcript_consequences.items() + }, + ), + hl.bind( + lambda worst_transcript_consequence: ( + worst_transcript_consequence.annotate( + domains=hl.delimit(hl.set(worst_transcript_consequence.domains)), + ).select(*transcript_consequences.keys()) + ), + vep_sorted_transcript_consequences_root[0], + ), + ) diff --git a/loading_pipeline/lib/annotations/fields.py b/loading_pipeline/lib/annotations/fields.py new file mode 100644 index 0000000000..b2eab5796a --- /dev/null +++ b/loading_pipeline/lib/annotations/fields.py @@ -0,0 +1,12 @@ +from collections.abc import Callable +from typing import Any + +import hail as hl + + +def get_fields( + t: hl.Table | hl.MatrixTable, + fns: list[Callable[..., hl.Expression]], + **kwargs: Any, +) -> dict[str, hl.Expression]: + return {fn.__name__: fn(t, **kwargs) for fn in fns} diff --git a/loading_pipeline/lib/annotations/fields_test.py b/loading_pipeline/lib/annotations/fields_test.py new file mode 100644 index 0000000000..fc5f179749 --- /dev/null +++ b/loading_pipeline/lib/annotations/fields_test.py @@ -0,0 +1,118 @@ +from unittest.mock import Mock, patch + +import hail as hl + +from loading_pipeline.lib.annotations.fields import get_fields +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, +) +from loading_pipeline.lib.misc.vep import run_vep +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase +from loading_pipeline.var.test.vep.mock_vep_data import ( + MOCK_37_VEP_DATA, + MOCK_38_VEP_DATA, +) + + +class FieldsTest(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + + @patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_get_formatting_fields(self, mock_vep: Mock) -> None: + for reference_genome, ht, expected_fields in [ + ( + ReferenceGenome.GRCh38, + hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + 'alleles': ['A', 'C'], + 'rsid': 'abcd', + }, + ], + hl.tstruct( + locus=hl.tlocus('GRCh38'), + alleles=hl.tarray(hl.tstr), + rsid=hl.tstr, + ), + key=['locus', 'alleles'], + ), + [ + 'check_ref', + 'rg37_locus', + 'rsid', + 'sorted_motif_feature_consequences', + 'sorted_regulatory_feature_consequences', + 'sorted_transcript_consequences', + 'variant_id', + 'xpos', + ], + ), + ( + ReferenceGenome.GRCh37, + hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='1', + position=1, + reference_genome='GRCh37', + ), + 'alleles': ['A', 'C'], + 'rsid': 'abcd', + }, + ], + hl.tstruct( + locus=hl.tlocus('GRCh37'), + alleles=hl.tarray(hl.tstr), + rsid=hl.tstr, + ), + key=['locus', 'alleles'], + ), + [ + 'rg38_locus', + 'rsid', + 'sorted_transcript_consequences', + 'variant_id', + 'xpos', + ], + ), + ]: + mock_vep.return_value = ht.annotate( + vep=MOCK_37_VEP_DATA + if reference_genome == ReferenceGenome.GRCh37 + else MOCK_38_VEP_DATA, + ) + ht = run_vep( # noqa: PLW2901 + ht, + DatasetType.SNV_INDEL, + reference_genome, + ) + self.assertCountEqual( + list( + get_fields( + ht, + DatasetType.SNV_INDEL.formatting_annotation_fns( + reference_genome, + ), + **( + { + 'gencode_ensembl_to_refseq_id_mapping': hl.dict( + {'a': 'b'}, + ), + } + if reference_genome == ReferenceGenome.GRCh38 + else {} + ), + dataset_type=DatasetType.SNV_INDEL, + reference_genome=reference_genome, + ).keys(), + ), + expected_fields, + ) diff --git a/loading_pipeline/lib/annotations/gcnv.py b/loading_pipeline/lib/annotations/gcnv.py new file mode 100644 index 0000000000..d9e2a8a603 --- /dev/null +++ b/loading_pipeline/lib/annotations/gcnv.py @@ -0,0 +1,170 @@ +from typing import Any + +import hail as hl + +from loading_pipeline.lib.annotations import expression_helpers, liftover +from loading_pipeline.lib.annotations.enums import ( + SV_TYPES, + validated_enum_member, +) +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.misc.gcnv import parse_gcnv_genes + + +def _start_and_end_equal(mt: hl.MatrixTable) -> hl.BooleanExpression: + return (mt.sample_start == mt.start) & (mt.sample_end == mt.end) + + +def CN(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + return mt.CN + + +def concordance( + mt: hl.MatrixTable, + is_new_gcnv_joint_call: bool, + **_: Any, +) -> hl.Expression: + if is_new_gcnv_joint_call: + return hl.or_missing( + hl.is_defined(mt.GT), + hl.struct( + new_call=mt.no_ovl, + prev_call=hl.len(mt.identical_ovl) > 0, + prev_overlap=hl.len(mt.any_ovl) > 0, + ), + ) + return hl.or_missing( + hl.is_defined(mt.GT), + hl.struct( + new_call=False, + prev_call=~mt.is_latest, + prev_overlap=False, + ), + ) + + +def defragged(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return mt.defragmented + + +def end_locus( + ht: hl.Table, + reference_genome: ReferenceGenome, + **_: Any, +) -> hl.LocusExpression: + return hl.locus(ht.chr, ht.end, reference_genome.value) + + +def gt_stats(ht: hl.Table, callset_ht: hl.Table, **_: Any) -> hl.Expression: + return hl.struct( + AF=hl.float32(callset_ht[ht.variant_id].sf), + AC=callset_ht[ht.variant_id].sc, + AN=hl.int32(callset_ht[ht.variant_id].sc / callset_ht[ht.variant_id].sf), + Hom=hl.missing(hl.tint32), + Het=hl.missing(hl.tint32), + ) + + +def GT(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + return hl.if_else( + (mt.CN == 0) | (mt.CN > 3), # noqa: PLR2004 + hl.Call([1, 1], phased=False), + hl.Call([0, 1], phased=False), + ) + + +def num_exon(ht: hl.Table, **_: Any) -> hl.Expression: + return ht.num_exon + + +def QS(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + return mt.QS + + +def rg37_locus( + ht: hl.Table, + **_: Any, +) -> hl.Expression | None: + liftover.add_rg38_liftover() + return hl.liftover( + start_locus(ht, ReferenceGenome.GRCh38), + ReferenceGenome.GRCh37.value, + ) + + +def rg37_locus_end( + ht: hl.Table, + **_: Any, +) -> hl.Expression | None: + liftover.add_rg38_liftover() + return hl.liftover( + end_locus(ht, ReferenceGenome.GRCh38), + ReferenceGenome.GRCh37.value, + ) + + +def sample_end(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return hl.or_missing( + ~_start_and_end_equal(mt), + mt.sample_end, + ) + + +def sample_gene_ids(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + parsed_genes = parse_gcnv_genes(mt.genes_any_overlap_Ensemble_ID) + return hl.or_missing(parsed_genes != mt.gene_ids, parsed_genes) + + +def sample_start(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return hl.or_missing( + ~_start_and_end_equal(mt), + mt.sample_start, + ) + + +def sample_num_exon(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return hl.or_missing( + mt.genes_any_overlap_totalExons != mt.num_exon, + mt.genes_any_overlap_totalExons, + ) + + +def sorted_gene_consequences( + ht: hl.Table, + **_: Any, +) -> hl.Expression: + return hl.array( + ht.gene_ids.map( + lambda gene: hl.Struct( + gene_id=gene, + major_consequence=hl.if_else( + ht.cg_genes.contains(gene), + 'COPY_GAIN', + hl.or_missing( + ht.lof_genes.contains(gene), + 'LOF', + ), + ), + ), + ), + ) + + +def start_locus( + ht: hl.Table, + reference_genome: ReferenceGenome, + **_: Any, +) -> hl.LocusExpression: + return hl.locus(ht.chr, ht.start, reference_genome.value) + + +def strvctvre(ht: hl.Table, **_: Any) -> hl.Expression: + return hl.struct(score=hl.parse_float32(ht.strvctvre_score)) + + +def sv_type(ht: hl.Table, **_: Any) -> hl.Expression: + return validated_enum_member(ht.svtype, SV_TYPES) + + +def xpos(ht: hl.Table, reference_genome: ReferenceGenome, **_: Any) -> hl.Expression: + return expression_helpers.get_expr_for_xpos(start_locus(ht, reference_genome)) diff --git a/loading_pipeline/lib/annotations/liftover.py b/loading_pipeline/lib/annotations/liftover.py new file mode 100644 index 0000000000..41a1085055 --- /dev/null +++ b/loading_pipeline/lib/annotations/liftover.py @@ -0,0 +1,30 @@ +import hail as hl + +from loading_pipeline.lib.core.constants import ( + GRCH37_TO_GRCH38_LIFTOVER_REF_PATH, + GRCH38_TO_GRCH37_LIFTOVER_REF_PATH, +) +from loading_pipeline.lib.core.definitions import ReferenceGenome + + +def add_rg38_liftover() -> None: + rg37 = hl.get_reference(ReferenceGenome.GRCh37.value) + rg38 = hl.get_reference(ReferenceGenome.GRCh38.value) + if not rg38.has_liftover(rg37): + rg38.add_liftover(GRCH38_TO_GRCH37_LIFTOVER_REF_PATH, rg37) + + +def add_rg37_liftover() -> None: + rg37 = hl.get_reference(ReferenceGenome.GRCh37.value) + rg38 = hl.get_reference(ReferenceGenome.GRCh38.value) + if not rg37.has_liftover(rg38): + rg37.add_liftover(GRCH37_TO_GRCH38_LIFTOVER_REF_PATH, rg38) + + +def remove_liftover(): + rg37 = hl.get_reference(ReferenceGenome.GRCh37.value) + rg38 = hl.get_reference(ReferenceGenome.GRCh38.value) + if rg37.has_liftover(rg38): + rg37.remove_liftover(rg38) + if rg38.has_liftover(rg37): + rg38.remove_liftover(rg37) diff --git a/loading_pipeline/lib/annotations/mito.py b/loading_pipeline/lib/annotations/mito.py new file mode 100644 index 0000000000..a4928f2101 --- /dev/null +++ b/loading_pipeline/lib/annotations/mito.py @@ -0,0 +1,58 @@ +from typing import Any + +import hail as hl + +from loading_pipeline.lib.annotations.enums import ( + MITOTIP_PATHOGENICITIES, + validated_enum_member, +) + + +def common_low_heteroplasmy(ht: hl.Table, **_: Any) -> hl.Expression: + return hl.bool(ht.common_low_heteroplasmy) + + +def contamination(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return ( + hl.parse_float64(mt.contamination) + if mt.contamination.dtype == hl.tstr + else mt.contamination + ) + + +def DP(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + is_called = hl.is_defined(mt.GT) + return hl.cond(is_called, hl.int32(hl.min(mt.DP, 32000)), hl.missing(hl.tint32)) + + +def GQ(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + is_called = hl.is_defined(mt.GT) + return hl.if_else(is_called, hl.int32(mt.MQ), 0) + + +def haplogroup(ht: hl.Table, **_: Any) -> hl.Expression: + return hl.Struct( + is_defining=ht.hap_defining_variant, + ) + + +def HL(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + is_called = hl.is_defined(mt.GT) + return hl.if_else(is_called, mt.HL, 0) + + +def mito_cn(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return hl.int32(mt.mito_cn) + + +def mitotip(ht: hl.Table, **_: Any) -> hl.Expression: + return hl.Struct( + trna_prediction=validated_enum_member( + ht.mitotip_trna_prediction, + MITOTIP_PATHOGENICITIES, + ), + ) + + +def rsid(ht: hl.Table, **_: Any) -> hl.Expression: + return ht.rsid.find(hl.is_defined) diff --git a/loading_pipeline/lib/annotations/shared.py b/loading_pipeline/lib/annotations/shared.py new file mode 100644 index 0000000000..e6cc6fe376 --- /dev/null +++ b/loading_pipeline/lib/annotations/shared.py @@ -0,0 +1,51 @@ +from typing import Any + +import hail as hl + +from loading_pipeline.lib.annotations import expression_helpers, liftover +from loading_pipeline.lib.annotations.vep import ( + transcript_consequences_sort, + vep_85_transcript_consequences_select, +) +from loading_pipeline.lib.core.definitions import ReferenceGenome + + +def GT(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + return mt.GT + + +def GQ(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + is_called = hl.is_defined(mt.GT) + return hl.if_else(is_called, mt.GQ, 0) + + +def rsid(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + return mt.rsid + + +def rg37_locus( + ht: hl.Table, + **_: Any, +) -> hl.Expression | None: + liftover.add_rg38_liftover() + return hl.liftover(ht.locus, ReferenceGenome.GRCh37.value) + + +def xpos(ht: hl.Table, **_: Any) -> hl.Expression: + return expression_helpers.get_expr_for_xpos(ht.locus) + + +def variant_id(ht: hl.Table, **_: Any) -> hl.Expression: + return expression_helpers.get_expr_for_variant_id(ht) + + +def sorted_transcript_consequences( + ht: hl.Table, + **_: Any, +) -> hl.Expression: + return hl.sorted( + ht.vep.transcript_consequences.map( + vep_85_transcript_consequences_select, + ).filter(lambda c: c.consequence_terms.size() > 0), + transcript_consequences_sort(ht), + ) diff --git a/loading_pipeline/lib/annotations/snv_indel.py b/loading_pipeline/lib/annotations/snv_indel.py new file mode 100644 index 0000000000..cb162ce79a --- /dev/null +++ b/loading_pipeline/lib/annotations/snv_indel.py @@ -0,0 +1,125 @@ +# ruff: noqa: N806 +from typing import Any + +import hail as hl + +from loading_pipeline.lib.annotations import liftover +from loading_pipeline.lib.annotations.enums import ( + MOTIF_CONSEQUENCE_TERMS, + REGULATORY_BIOTYPES, + REGULATORY_CONSEQUENCE_TERMS, + validated_enum_member, +) +from loading_pipeline.lib.annotations.vep import ( + transcript_consequences_sort, + vep_110_transcript_consequences_select, +) +from loading_pipeline.lib.core.definitions import ReferenceGenome + +MOTIF_CONSEQUENCE_TERMS_LOOKUP = hl.dict( + hl.enumerate(MOTIF_CONSEQUENCE_TERMS, index_first=False), +) +REGULATORY_CONSEQUENCE_TERMS_LOOKUP = hl.dict( + hl.enumerate(REGULATORY_CONSEQUENCE_TERMS, index_first=False), +) + + +def AB(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + is_called = hl.is_defined(mt.GT) + return hl.bind( + lambda total: hl.if_else( + (is_called) & (total != 0) & (hl.len(mt.AD) > 1), + hl.float32(mt.AD[1] / total), + hl.missing(hl.tfloat32), + ), + hl.sum(mt.AD), + ) + + +def DP(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + is_called = hl.is_defined(mt.GT) + return hl.if_else( + is_called & hl.is_defined(mt.AD), + hl.int32(hl.min(hl.sum(mt.AD), 32000)), + hl.missing(hl.tint32), + ) + + +def rg38_locus( + ht: hl.Table, + **_: Any, +) -> hl.Expression | None: + liftover.add_rg37_liftover() + return hl.liftover(ht.locus, ReferenceGenome.GRCh38.value) + + +def check_ref(ht: hl.Table, **_: Any) -> hl.BooleanExpression: + return hl.is_defined(ht.vep.check_ref) + + +def sorted_motif_feature_consequences( + ht: hl.Table, + **_: Any, +) -> hl.Expression: + # NB: hl.min() doesn't work correctly in the "sorted" key expression, so we have an additional + # is_defined check, even though the expression should work on missing on its own. + # hail bug report incoming. + return hl.or_missing( + hl.is_defined(ht.vep.motif_feature_consequences), + hl.sorted( + ht.vep.motif_feature_consequences.map( + lambda c: c.select( + consequence_terms=c.consequence_terms.map( + lambda t: validated_enum_member(t, MOTIF_CONSEQUENCE_TERMS), + ), + motif_feature_id=c.motif_feature_id, + ), + ).filter(lambda c: c.consequence_terms.size() > 0), + lambda c: hl.min( + c.consequence_terms.map(lambda t: MOTIF_CONSEQUENCE_TERMS_LOOKUP[t]), + ), + ), + ) + + +def sorted_regulatory_feature_consequences( + ht: hl.Table, + **_: Any, +) -> hl.Expression: + return hl.or_missing( + hl.is_defined(ht.vep.regulatory_feature_consequences), + hl.sorted( + ht.vep.regulatory_feature_consequences.map( + lambda c: c.select( + biotype=validated_enum_member(c.biotype, REGULATORY_BIOTYPES), + consequence_terms=c.consequence_terms.map( + lambda t: validated_enum_member( + t, + REGULATORY_CONSEQUENCE_TERMS, + ), + ), + regulatory_feature_id=c.regulatory_feature_id, + ), + ).filter(lambda c: c.consequence_terms.size() > 0), + lambda c: hl.min( + c.consequence_terms.map( + lambda t: REGULATORY_CONSEQUENCE_TERMS_LOOKUP[t], + ), + ), + ), + ) + + +def sorted_transcript_consequences( + ht: hl.Table, + gencode_ensembl_to_refseq_id_mapping: hl.tdict(hl.tstr, hl.tstr), + **_: Any, +) -> hl.Expression: + return hl.sorted( + ht.vep.transcript_consequences.map( + vep_110_transcript_consequences_select( + gencode_ensembl_to_refseq_id_mapping, + ), + ).filter(lambda c: c.consequence_terms.size() > 0), + transcript_consequences_sort(ht), + ) diff --git a/loading_pipeline/lib/annotations/snv_indel_test.py b/loading_pipeline/lib/annotations/snv_indel_test.py new file mode 100644 index 0000000000..50b9e5db4d --- /dev/null +++ b/loading_pipeline/lib/annotations/snv_indel_test.py @@ -0,0 +1,316 @@ +import unittest +from unittest.mock import Mock, patch + +import hail as hl + +from loading_pipeline.lib.annotations import shared, snv_indel +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.misc.vep import run_vep +from loading_pipeline.var.test.vep.mock_vep_data import ( + MOCK_37_VEP_DATA, + MOCK_38_VEP_DATA, +) + + +class SNVTest(unittest.TestCase): + @patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_sorted_transcript_consequences_37( + self, + mock_vep: Mock, + ) -> None: + ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='1', + position=871269, + reference_genome=ReferenceGenome.GRCh37.value, + ), + 'alleles': ['A', 'C'], + }, + ], + hl.tstruct( + locus=hl.tlocus(ReferenceGenome.GRCh37.value), + alleles=hl.tarray(hl.tstr), + ), + key=['locus', 'alleles'], + ) + mock_vep.return_value = ht.annotate(vep=MOCK_37_VEP_DATA) + ht = run_vep( + ht, + DatasetType.SNV_INDEL, + ReferenceGenome.GRCh37, + ) + ht = ht.select( + sorted_transcript_consequences=shared.sorted_transcript_consequences( + ht, + ), + ) + self.assertCountEqual( + ht.sorted_transcript_consequences.collect(), + [ + [ + hl.Struct( + amino_acids='S/L', + canonical=1, + codons='tCg/tTg', + gene_id='ENSG00000188976', + hgvsc='ENST00000327044.6:c.1667C>T', + hgvsp='ENSP00000317992.6:p.Ser556Leu', + transcript_id='ENST00000327044', + biotype='protein_coding', + consequence_terms=['missense_variant'], + is_lof_nagnag=None, + lof_filters=['END_TRUNC', 'INCOMPLETE_CDS'], + ), + hl.Struct( + amino_acids=None, + canonical=None, + codons=None, + gene_id='ENSG00000188976', + hgvsc='ENST00000477976.1:n.3114C>T', + hgvsp=None, + transcript_id='ENST00000477976', + biotype='retained_intron', + consequence_terms=[ + 'non_coding_transcript_exon_variant', + 'non_coding_transcript_variant', + ], + is_lof_nagnag=None, + lof_filters=None, + ), + hl.Struct( + amino_acids=None, + canonical=None, + codons=None, + gene_id='ENSG00000188976', + hgvsc='ENST00000483767.1:n.523C>T', + hgvsp=None, + transcript_id='ENST00000483767', + biotype='retained_intron', + consequence_terms=[ + 'non_coding_transcript_exon_variant', + 'non_coding_transcript_variant', + ], + is_lof_nagnag=None, + lof_filters=None, + ), + ], + ], + ) + + @patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_sorted_transcript_consequences_38( + self, + mock_vep: Mock, + ) -> None: + ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=871269, + reference_genome=ReferenceGenome.GRCh38.value, + ), + 'alleles': ['A', 'C'], + }, + ], + hl.tstruct( + locus=hl.tlocus(ReferenceGenome.GRCh38.value), + alleles=hl.tarray(hl.tstr), + ), + key=['locus', 'alleles'], + ) + mock_vep.return_value = ht.annotate(vep=MOCK_38_VEP_DATA) + ht = run_vep( + ht, + DatasetType.SNV_INDEL, + ReferenceGenome.GRCh38, + ) + ht = ht.select( + sorted_transcript_consequences=snv_indel.sorted_transcript_consequences( + ht, + hl.dict( + {'ENST00000327044': 'NM_015658.4', 'ENST00000477976': 'refseq1'}, + ), + ), + ) + self.assertCountEqual( + ht.sorted_transcript_consequences.collect()[0], + [ + hl.Struct( + amino_acids='S/L', + canonical=1, + codons='tCg/tTg', + gene_id='ENSG00000188976', + hgvsc='ENST00000327044.6:c.1667C>T', + hgvsp='ENSP00000317992.6:p.Ser556Leu', + transcript_id='ENST00000327044', + refseq_transcript_id='NM_015658.4', + mane_select='NM_015658.4', + mane_plus_clinical=None, + biotype='protein_coding', + consequence_terms=['missense_variant'], + exon=hl.Struct(index=15, total=19), + intron=None, + alphamissense=hl.Struct(pathogenicity=0.10000000149011612), + loftee=hl.Struct( + is_lof_nagnag=None, + lof_filters=['END_TRUNC', 'INCOMPLETE_CDS'], + ), + spliceregion=hl.Struct( + extended_intronic_splice_region_variant=False, + ), + utrannotator=hl.Struct( + existing_inframe_oorfs=None, + existing_outofframe_oorfs=None, + existing_uorfs=None, + fiveutr_consequence=None, + fiveutr_annotation=None, + ), + ), + hl.Struct( + amino_acids=None, + canonical=None, + codons=None, + gene_id='ENSG00000188976', + hgvsc='ENST00000477976.1:n.3114C>T', + hgvsp=None, + transcript_id='ENST00000477976', + refseq_transcript_id='refseq1', + mane_select=None, + mane_plus_clinical=None, + biotype='retained_intron', + consequence_terms=[ + 'non_coding_transcript_exon_variant', + 'non_coding_transcript_variant', + ], + exon=hl.Struct(index=13, total=17), + intron=None, + alphamissense=hl.Struct(pathogenicity=0.9700000286102295), + loftee=hl.Struct( + is_lof_nagnag=None, + lof_filters=None, + ), + spliceregion=hl.Struct( + extended_intronic_splice_region_variant=False, + ), + utrannotator=hl.Struct( + existing_inframe_oorfs=None, + existing_outofframe_oorfs=None, + existing_uorfs=None, + fiveutr_consequence=None, + fiveutr_annotation=None, + ), + ), + hl.Struct( + amino_acids=None, + canonical=None, + codons=None, + gene_id='ENSG00000188976', + hgvsc='ENST00000483767.1:n.523C>T', + hgvsp=None, + transcript_id='ENST00000483767', + refseq_transcript_id=None, + mane_select=None, + mane_plus_clinical=None, + biotype='retained_intron', + consequence_terms=[ + 'non_coding_transcript_exon_variant', + 'splice_donor_region_variant', + 'non_coding_transcript_variant', + ], + exon=hl.Struct(index=1, total=5), + intron=None, + alphamissense=hl.Struct(pathogenicity=None), + loftee=hl.Struct( + is_lof_nagnag=None, + lof_filters=None, + ), + spliceregion=hl.Struct( + extended_intronic_splice_region_variant=True, + ), + utrannotator=hl.Struct( + existing_inframe_oorfs=0, + existing_outofframe_oorfs=1, + existing_uorfs=0, + fiveutr_consequence='5_prime_UTR_premature_start_codon_loss_variant', + fiveutr_annotation=hl.Struct( + type='OutOfFrame_oORF', + KozakContext='TTTATGC', + KozakStrength='Weak', + DistanceToCDS=40, + CapDistanceToStart=20, + DistanceToStop=75, + Evidence=False, + AltStop=None, + AltStopDistanceToCDS=None, + FrameWithCDS=None, + StartDistanceToCDS=None, + newSTOPDistanceToCDS=None, + alt_type=None, + alt_type_length=None, + ref_StartDistanceToCDS=None, + ref_type=None, + ref_type_length=None, + ), + ), + ), + ], + ) + + @patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_sorted_other_feature_consequences( + self, + mock_vep: Mock, + ) -> None: + ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=871269, + reference_genome=ReferenceGenome.GRCh38.value, + ), + 'alleles': ['A', 'C'], + }, + ], + hl.tstruct( + locus=hl.tlocus(ReferenceGenome.GRCh38.value), + alleles=hl.tarray(hl.tstr), + ), + key=['locus', 'alleles'], + ) + mock_vep.return_value = ht.annotate(vep=MOCK_38_VEP_DATA) + ht = run_vep( + ht, + DatasetType.SNV_INDEL, + ReferenceGenome.GRCh38, + ) + ht = ht.select( + sorted_motif_feature_consequences=snv_indel.sorted_motif_feature_consequences( + ht, + ), + sorted_regulatory_feature_consequences=snv_indel.sorted_regulatory_feature_consequences( + ht, + ), + ) + self.assertCountEqual( + ht.sorted_motif_feature_consequences.collect(), + [None], + ) + self.assertCountEqual( + ht.sorted_regulatory_feature_consequences.collect()[0], + [ + hl.Struct( + biotype='enhancer', + consequence_terms=['regulatory_region_ablation'], + regulatory_feature_id='regulatory_2', + ), + hl.Struct( + biotype='enhancer', + consequence_terms=['regulatory_region_variant'], + regulatory_feature_id='regulatory_1', + ), + ], + ) diff --git a/loading_pipeline/lib/annotations/sv.py b/loading_pipeline/lib/annotations/sv.py new file mode 100644 index 0000000000..fd13c44314 --- /dev/null +++ b/loading_pipeline/lib/annotations/sv.py @@ -0,0 +1,246 @@ +# ruff: noqa: N806 +from typing import Any + +import hail as hl + +from loading_pipeline.lib.annotations import liftover +from loading_pipeline.lib.annotations.enums import ( + SV_CONSEQUENCE_RANKS, + SV_TYPE_DETAILS, + SV_TYPES, + validated_enum_member, +) +from loading_pipeline.lib.core.definitions import ReferenceGenome + +CONSEQ_PREDICTED_PREFIX = 'info.PREDICTED_' +CONSEQ_PREDICTED_GENE_COLS = { + 'info.PREDICTED_BREAKEND_EXONIC': hl.tarray(hl.tstr), + 'info.PREDICTED_COPY_GAIN': hl.tarray(hl.tstr), + 'info.PREDICTED_DUP_PARTIAL': hl.tarray(hl.tstr), + 'info.PREDICTED_INTRAGENIC_EXON_DUP': hl.tarray(hl.tstr), + 'info.PREDICTED_INTRONIC': hl.tarray(hl.tstr), + 'info.PREDICTED_INV_SPAN': hl.tarray(hl.tstr), + 'info.PREDICTED_LOF': hl.tarray(hl.tstr), + 'info.PREDICTED_MSV_EXON_OVERLAP': hl.tarray(hl.tstr), + 'info.PREDICTED_NEAREST_TSS': hl.tarray(hl.tstr), + 'info.PREDICTED_PARTIAL_EXON_DUP': hl.tarray(hl.tstr), + 'info.PREDICTED_PROMOTER': hl.tarray(hl.tstr), + 'info.PREDICTED_TSS_DUP': hl.tarray(hl.tstr), + 'info.PREDICTED_UTR': hl.tarray(hl.tstr), +} + +PREVIOUS_GENOTYPE_N_ALT_ALLELES = hl.dict( + { + # Map of concordance string -> previous n_alt_alleles() + # Concordant + frozenset(['TN']): 0, # 0/0 -> 0/0 + frozenset(['TP']): 2, # 1/1 -> 1/1 + frozenset(['TN', 'TP']): 1, # 0/1 -> 0/1 + # Novel + frozenset(['FP']): 0, # 0/0 -> 1/1 + frozenset(['TN', 'FP']): 0, # 0/0 -> 0/1 + # Absent + frozenset(['FN']): 2, # 1/1 -> 0/0 + frozenset(['TN', 'FN']): 1, # 0/1 -> 0/0 + # Discordant + frozenset(['FP', 'TP']): 1, # 0/1 -> 1/1 + frozenset(['FN', 'TP']): 2, # 1/1 -> 0/1 + }, +) + + +def _get_cpx_interval( + x: hl.StringExpression, + reference_genome: ReferenceGenome, +) -> hl.StructExpression: + # an example format of CPX_INTERVALS is "DUP_chr1:1499897-1499974" + type_contig = x.split('_') + contig_pos = type_contig[1].split(':') + pos = contig_pos[1].split('-') + return hl.struct( + type=validated_enum_member(type_contig[0], SV_TYPES), + start=hl.locus( + contig_pos[0], + hl.int32(pos[0]), + reference_genome.value, + ), + end=hl.locus( + contig_pos[0], + hl.int32(pos[1]), + reference_genome.value, + ), + ) + + +def _sv_types(ht: hl.Table) -> hl.ArrayExpression: + return ht.alleles[1].replace('[<>]', '').split(':', 2) + + +def alleles(ht: hl.Table, **_: Any) -> hl.ArrayExpression: + return hl.array( + [ + 'N', + hl.if_else( + (hl.is_defined(ht.sv_type_detail) & (ht.sv_type != 'CPX')), + hl.format( + '<%s:%s>', + ht.sv_type, + ht.sv_type_detail, + ), + hl.format('<%s>', ht.sv_type), + ), + ], + ) + + +def info(ht: hl.Table, **_: Any) -> hl.StructExpression: + return hl.Struct( + ALGORITHMS=ht.algorithms, + END=ht.start_locus.position, + CHR2=ht.end_locus.contig, + END2=ht.end_locus.position, + SVTYPE=ht.sv_type, + SVLEN=ht.sv_len, + ) + + +def locus(ht: hl.Table, **_: Any) -> hl.LocusExpression: + return ht.start_locus + + +def algorithms(ht: hl.Table, **_: Any) -> hl.Expression: + return hl.str(',').join(ht['info.ALGORITHMS']) + + +def bothsides_support(ht: hl.Table, **_: Any) -> hl.Expression: + return ht['info.BOTHSIDES_SUPPORT'] + + +def CN(mt: hl.MatrixTable, **_: Any) -> hl.Expression: # noqa: N802 + return mt.RD_CN + + +def concordance(mt: hl.MatrixTable, **_: Any) -> hl.Expression: + is_called = hl.is_defined(mt.GT) + was_previously_called = hl.is_defined(mt.CONC_ST) & ~mt.CONC_ST.contains( + 'EMPTY', + ) + num_alt = hl.if_else(is_called, mt.GT.n_alt_alleles(), -1) + prev_num_alt = hl.if_else( + was_previously_called, + PREVIOUS_GENOTYPE_N_ALT_ALLELES[hl.set(mt.CONC_ST)], + -1, + ) + concordant_genotype = num_alt == prev_num_alt + discordant_genotype = (num_alt != prev_num_alt) & (prev_num_alt > 0) + novel_genotype = (num_alt != prev_num_alt) & (prev_num_alt == 0) + return hl.struct( + prev_num_alt=hl.or_missing(discordant_genotype, prev_num_alt), + prev_call=hl.or_missing(is_called, was_previously_called & concordant_genotype), + new_call=hl.or_missing(is_called, ~was_previously_called | novel_genotype), + ) + + +def cpx_intervals( + ht: hl.Table, + reference_genome: ReferenceGenome, + **_: Any, +) -> hl.Expression: + return hl.or_missing( + hl.is_defined(ht['info.CPX_INTERVALS']), + ht['info.CPX_INTERVALS'].map(lambda x: _get_cpx_interval(x, reference_genome)), + ) + + +def end_locus(ht: hl.Table, **_: Any) -> hl.StructExpression: + rg38_lengths = hl.literal(hl.get_reference(ReferenceGenome.GRCh38.value).lengths) + return hl.if_else( + ( + hl.is_defined(ht['info.END2']) + & (rg38_lengths[ht['info.CHR2']] >= ht['info.END2']) + ), + hl.locus(ht['info.CHR2'], ht['info.END2'], ReferenceGenome.GRCh38.value), + hl.or_missing( + (rg38_lengths[ht.locus.contig] >= ht['info.END']), + hl.locus(ht.locus.contig, ht['info.END'], ReferenceGenome.GRCh38.value), + ), + ) + + +def gnomad_svs( + ht: hl.Table, + gnomad_svs_ht: hl.Table, + **_: Any, +) -> hl.Expression: + gnomad_svs_ht = gnomad_svs_ht.drop('locus', 'alleles') + return gnomad_svs_ht.annotate( + ID=gnomad_svs_ht.KEY, + )[ht['info.GNOMAD_V4.1_TRUTH_VID']] + + +def rg37_locus_end( + ht: hl.Table, + **_: Any, +) -> hl.Expression | None: + liftover.add_rg38_liftover() + end = end_locus(ht) + return hl.or_missing( + hl.is_defined(end), + hl.liftover( + hl.locus( + end.contig, + end.position, + reference_genome=ReferenceGenome.GRCh38.value, + ), + ReferenceGenome.GRCh37.value, + ), + ) + + +def start_locus(ht: hl.Table, **_: Any): + return ht.locus + + +def sorted_gene_consequences( + ht: hl.Table, + gencode_gene_symbol_to_gene_id_mapping: hl.tdict(hl.tstr, hl.tstr), + **_: Any, +) -> hl.Expression: + # In lieu of sorted_transcript_consequences seen on SNV/MITO. + mapped_genes = [ + ht[gene_col].map( + lambda gene: hl.struct( + gene_id=gencode_gene_symbol_to_gene_id_mapping.get(gene), + major_consequence=validated_enum_member( + gene_col.replace(CONSEQ_PREDICTED_PREFIX, '', 1), # noqa: B023 + SV_CONSEQUENCE_RANKS, + ), + ), + ) + for gene_col in CONSEQ_PREDICTED_GENE_COLS + ] + return hl.filter(hl.is_defined, mapped_genes).flatmap(lambda x: x) + + +def strvctvre(ht: hl.Table, **_: Any) -> hl.Expression: + return hl.struct(score=hl.parse_float32(ht['info.StrVCTVRE'])) + + +def sv_len(ht: hl.Table, **_: Any) -> hl.Expression: + return ht['info.SVLEN'] + + +def sv_type(ht: hl.Table, **_: Any) -> hl.Expression: + return validated_enum_member(_sv_types(ht)[0], SV_TYPES) + + +def sv_type_detail(ht: hl.Table, **_: Any) -> hl.Expression: + sv_types = _sv_types(ht) + return hl.if_else( + sv_types[0] == 'CPX', + validated_enum_member(ht['info.CPX_TYPE'], SV_TYPE_DETAILS), + hl.or_missing( + (sv_types[0] == 'INS') & (hl.len(sv_types) > 1), + validated_enum_member(sv_types[1], SV_TYPE_DETAILS), + ), + ) diff --git a/loading_pipeline/lib/annotations/sv_test.py b/loading_pipeline/lib/annotations/sv_test.py new file mode 100644 index 0000000000..26ebb082d3 --- /dev/null +++ b/loading_pipeline/lib/annotations/sv_test.py @@ -0,0 +1,171 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.annotations.fields import get_fields +from loading_pipeline.lib.core import DatasetType + + +class SVTest(unittest.TestCase): + def test_sv_export_annotations(self) -> None: + ht = hl.Table.parallelize( + [ + hl.Struct( + id=0, + algorithms='manta', + end_locus=hl.Locus( + contig='chr5', + position=20404, + reference_genome='GRCh38', + ), + start_locus=hl.Locus( + contig='chr1', + position=180928, + reference_genome='GRCh38', + ), + sv_len=123, + sv_type='BND', + sv_type_detail=None, + ), + hl.Struct( + id=1, + algorithms='manta', + end_locus=hl.Locus( + contig='chr1', + position=789481, + reference_genome='GRCh38', + ), + start_locus=hl.Locus( + contig='chr1', + position=789481, + reference_genome='GRCh38', + ), + sv_len=245, + sv_type='BND', + sv_type_detail=None, + ), + hl.Struct( + id=2, + algorithms='manta', + end_locus=hl.Locus( + contig='chr1', + position=6559723, + reference_genome='GRCh38', + ), + start_locus=hl.Locus( + contig='chr1', + position=6558902, + reference_genome='GRCh38', + ), + sv_len=245, + sv_type='CPX', + sv_type_detail='ME', + ), + hl.Struct( + id=3, + algorithms='manta', + end_locus=hl.Locus( + contig='chr1', + position=6559723, + reference_genome='GRCh38', + ), + start_locus=hl.Locus( + contig='chr1', + position=6558902, + reference_genome='GRCh38', + ), + sv_len=245, + sv_type='INS', + sv_type_detail='ME:SVA', + ), + ], + hl.tstruct( + id=hl.tint32, + algorithms=hl.tstr, + end_locus=hl.tlocus('GRCh38'), + start_locus=hl.tlocus('GRCh38'), + sv_len=hl.tint32, + sv_type=hl.tstr, + sv_type_detail=hl.tstr, + ), + key='id', + ) + ht = ht.select( + **get_fields( + ht, + DatasetType.SV.export_vcf_annotation_fns, + ), + ) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + id=0, + locus=hl.Locus( + contig='chr1', + position=180928, + reference_genome='GRCh38', + ), + alleles=['N', ''], + info=hl.Struct( + ALGORITHMS='manta', + END=180928, + CHR2='chr5', + END2=20404, + SVTYPE='BND', + SVLEN=123, + ), + ), + hl.Struct( + id=1, + locus=hl.Locus( + contig='chr1', + position=789481, + reference_genome='GRCh38', + ), + alleles=['N', ''], + info=hl.Struct( + ALGORITHMS='manta', + END=789481, + CHR2='chr1', + END2=789481, + SVTYPE='BND', + SVLEN=245, + ), + ), + hl.Struct( + id=2, + locus=hl.Locus( + contig='chr1', + position=6558902, + reference_genome='GRCh38', + ), + alleles=['N', ''], + info=hl.Struct( + ALGORITHMS='manta', + END=6558902, + CHR2='chr1', + END2=6559723, + SVTYPE='CPX', + SVLEN=245, + ), + ), + hl.Struct( + id=3, + locus=hl.Locus( + contig='chr1', + position=6558902, + reference_genome='GRCh38', + ), + alleles=['N', ''], + info=hl.Struct( + ALGORITHMS='manta', + END=6558902, + CHR2='chr1', + END2=6559723, + SVTYPE='INS', + SVLEN=245, + ), + ), + ], + ) diff --git a/loading_pipeline/lib/annotations/vep.py b/loading_pipeline/lib/annotations/vep.py new file mode 100644 index 0000000000..8e1d41a84f --- /dev/null +++ b/loading_pipeline/lib/annotations/vep.py @@ -0,0 +1,174 @@ +from collections.abc import Callable + +import hail as hl + +from loading_pipeline.lib.annotations.enums import ( + BIOTYPES, + FIVEUTR_CONSEQUENCES, + LOF_FILTERS, + TRANSCRIPT_CONSEQUENCE_TERMS, + validated_enum_member, +) + +EXTENDED_INTRONIC_SPLICE_REGION_VARIANT = 'extended_intronic_splice_region_variant' +MANE_SELECT_ANNOTATIONS = [ + 'mane_select', + 'mane_plus_clinical', +] +NAGNAG_SITE = 'NAGNAG_SITE' +OMIT_TRANSCRIPT_CONSEQUENCE_TERMS = hl.set( + [ + 'upstream_gene_variant', + 'downstream_gene_variant', + ], +) +PROTEIN_CODING_BIOTYPE = 'protein_coding' +SELECTED_ANNOTATIONS = [ + 'amino_acids', + 'canonical', + 'codons', + 'gene_id', + 'hgvsc', + 'hgvsp', + 'transcript_id', +] + + +def _lof_filters(c: hl.StructExpression) -> hl.ArrayExpression: + return hl.or_missing( + (c.lof == 'LC') & hl.is_defined(c.lof_filter), + c.lof_filter.split('&|,').map(lambda f: validated_enum_member(f, LOF_FILTERS)), + ) + + +def _consequence_terms(c: hl.StructExpression) -> hl.ArrayExpression: + return c.consequence_terms.filter( + lambda t: ~OMIT_TRANSCRIPT_CONSEQUENCE_TERMS.contains(t), + ).map(lambda t: validated_enum_member(t, TRANSCRIPT_CONSEQUENCE_TERMS)) + + +def vep_110_transcript_consequences_select( + gencode_ensembl_to_refseq_id_mapping: hl.tdict(hl.tstr, hl.tstr), +) -> hl.StructExpression: + return lambda c: c.select( + *SELECTED_ANNOTATIONS, + *MANE_SELECT_ANNOTATIONS, + biotype=validated_enum_member(c.biotype, BIOTYPES), + consequence_terms=_consequence_terms(c), + exon=hl.bind( + lambda split: hl.or_missing( + hl.is_defined(split), + hl.Struct(index=split[0], total=split[1]), + ), + c.exon.split('/').map(hl.parse_int32), + ), + intron=hl.bind( + lambda split: hl.or_missing( + hl.is_defined(split), + hl.Struct(index=split[0], total=split[1]), + ), + c.intron.split('/').map(hl.parse_int32), + ), + refseq_transcript_id=gencode_ensembl_to_refseq_id_mapping.get(c.transcript_id), + alphamissense=hl.struct( + pathogenicity=c.am_pathogenicity, + ), + loftee=hl.struct( + is_lof_nagnag=c.lof_flags == NAGNAG_SITE, + lof_filters=_lof_filters(c), + ), + spliceregion=hl.struct( + extended_intronic_splice_region_variant=( + hl.is_defined(c.spliceregion) + & c.spliceregion.contains( + EXTENDED_INTRONIC_SPLICE_REGION_VARIANT, + ) + ), + ), + utrannotator=hl.struct( + existing_inframe_oorfs=c.existing_inframe_oorfs, + existing_outofframe_oorfs=c.existing_outofframe_oorfs, + existing_uorfs=c.existing_uorfs, + fiveutr_consequence=validated_enum_member( + c.fiveutr_consequence, + FIVEUTR_CONSEQUENCES, + ), + # Annotation documentation here: + # https://github.com/ImperialCardioGenetics/UTRannotator?tab=readme-ov-file#the-detailed-annotation-for-each-consequence + # NB: + fiveutr_annotation=c.fiveutr_annotation['1'].annotate( + AltStopDistanceToCDS=hl.parse_int32( + c.fiveutr_annotation['1'].AltStopDistanceToCDS, + ), + CapDistanceToStart=hl.parse_int32( + c.fiveutr_annotation['1'].CapDistanceToStart, + ), + DistanceToCDS=hl.parse_int32( + c.fiveutr_annotation['1'].DistanceToCDS, + ), + DistanceToStop=hl.parse_int32( + c.fiveutr_annotation['1'].DistanceToStop, + ), + Evidence=hl.or_missing( + # Just in case a weird value ("NA" or anything else) propagates + ( + (c.fiveutr_annotation['1'].Evidence == 'True') + | (c.fiveutr_annotation['1'].Evidence == 'False') + ), + hl.bool(c.fiveutr_annotation['1'].Evidence), + ), + StartDistanceToCDS=hl.parse_int32( + c.fiveutr_annotation['1'].StartDistanceToCDS, + ), + newSTOPDistanceToCDS=hl.parse_int32( + c.fiveutr_annotation['1'].newSTOPDistanceToCDS, + ), + alt_type_length=hl.parse_int32( + c.fiveutr_annotation['1'].alt_type_length, + ), + ref_StartDistanceToCDS=hl.parse_int32( + c.fiveutr_annotation['1'].ref_StartDistanceToCDS, + ), + ref_type_length=hl.parse_int32( + c.fiveutr_annotation['1'].ref_type_length, + ), + ), + ), + ) + + +def vep_85_transcript_consequences_select( + c: hl.StructExpression, +) -> hl.StructExpression: + return c.select( + *SELECTED_ANNOTATIONS, + biotype=validated_enum_member(c.biotype, BIOTYPES), + consequence_terms=_consequence_terms(c), + is_lof_nagnag=c.lof_flags == NAGNAG_SITE, + lof_filters=_lof_filters(c), + ) + + +def transcript_consequences_sort( + ht: hl.Table, +) -> Callable[[hl.StructExpression], hl.StructExpression]: + return lambda c: hl.bind( + lambda is_coding, is_most_severe, is_canonical: ( + hl.cond( + is_coding, + hl.cond( + is_most_severe, + hl.cond(is_canonical, 1, 2), + hl.cond(is_canonical, 3, 4), + ), + hl.cond( + is_most_severe, + hl.cond(is_canonical, 5, 6), + hl.cond(is_canonical, 7, 8), + ), + ) + ), + c.biotype == PROTEIN_CODING_BIOTYPE, + hl.set(c.consequence_terms).contains(ht.vep.most_severe_consequence), + hl.or_else(c.canonical, 0) == 1, + ) diff --git a/loading_pipeline/lib/core/__init__.py b/loading_pipeline/lib/core/__init__.py new file mode 100644 index 0000000000..44e5aaab40 --- /dev/null +++ b/loading_pipeline/lib/core/__init__.py @@ -0,0 +1,17 @@ +from loading_pipeline.lib.core.dataset_type import DatasetType +from loading_pipeline.lib.core.definitions import ( + ReferenceGenome, + SampleType, + Sex, +) +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.core.feature_flag import FeatureFlag + +__all__ = [ + 'DatasetType', + 'Env', + 'FeatureFlag', + 'ReferenceGenome', + 'SampleType', + 'Sex', +] diff --git a/loading_pipeline/lib/core/constants.py b/loading_pipeline/lib/core/constants.py new file mode 100644 index 0000000000..a6dfe4f6b0 --- /dev/null +++ b/loading_pipeline/lib/core/constants.py @@ -0,0 +1,12 @@ +import os + +GRCH37_TO_GRCH38_LIFTOVER_REF_PATH = ( + 'gs://hail-common/references/grch37_to_grch38.over.chain.gz' + if os.environ.get('HAIL_DATAPROC') == '1' + else 'loading_pipeline/var/liftover/grch37_to_grch38.over.chain.gz' +) +GRCH38_TO_GRCH37_LIFTOVER_REF_PATH = ( + 'gs://hail-common/references/grch38_to_grch37.over.chain.gz' + if os.environ.get('HAIL_DATAPROC') == '1' + else 'loading_pipeline/var/liftover/grch38_to_grch37.over.chain.gz' +) diff --git a/loading_pipeline/lib/core/dataset_type.py b/loading_pipeline/lib/core/dataset_type.py new file mode 100644 index 0000000000..e9bccc99f6 --- /dev/null +++ b/loading_pipeline/lib/core/dataset_type.py @@ -0,0 +1,378 @@ +from collections.abc import Callable +from enum import StrEnum + +import hail as hl + +from loading_pipeline.lib.annotations import gcnv, mito, shared, snv_indel, sv +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.core.environment import Env + + +class DatasetType(StrEnum): + GCNV = 'GCNV' + MITO = 'MITO' + SNV_INDEL = 'SNV_INDEL' + SV = 'SV' + + @property + def reference_genomes(self) -> list[ReferenceGenome]: + return { + DatasetType.SNV_INDEL: [ReferenceGenome.GRCh37, ReferenceGenome.GRCh38], + DatasetType.MITO: [ReferenceGenome.GRCh38], + DatasetType.GCNV: [ReferenceGenome.GRCh38], + DatasetType.SV: [ReferenceGenome.GRCh38], + }[self] + + def table_key_type( + self, + reference_genome: ReferenceGenome, + ) -> hl.tstruct: + default_key = hl.tstruct( + locus=hl.tlocus(reference_genome.value), + alleles=hl.tarray(hl.tstr), + ) + return { + DatasetType.GCNV: hl.tstruct(variant_id=hl.tstr), + DatasetType.SV: hl.tstruct(variant_id=hl.tstr), + }.get(self, default_key) + + def table_key_format_fn( + self, + reference_genome: ReferenceGenome, + ) -> Callable[[hl.StructExpression], str]: + if self in {DatasetType.GCNV, DatasetType.SV}: + return lambda s: s.variant_id + return ( + lambda s: f'{s.locus.contig if reference_genome == ReferenceGenome.GRCh37 else s.locus.contig.replace("chr", "")}-{s.locus.position}-{"-".join(s.alleles)}' + ) + + @property + def col_fields( + self, + ) -> list[str]: + return { + DatasetType.SNV_INDEL: {}, + DatasetType.MITO: { + 'contamination': {hl.tstr, hl.tfloat64}, + 'mito_cn': hl.tfloat64, + }, + DatasetType.SV: {}, + DatasetType.GCNV: {}, + }[self] + + @property + def entries_fields( + self, + ) -> list[str]: + return { + DatasetType.SNV_INDEL: { + 'GT': hl.tcall, + 'AD': hl.tarray(hl.tint32), + 'GQ': hl.tint32, + }, + DatasetType.MITO: { + 'GT': hl.tcall, + 'DP': hl.tint32, + 'MQ': {hl.tfloat64, hl.tint32}, + 'HL': hl.tfloat64, + }, + DatasetType.SV: { + 'GT': hl.tcall, + 'CONC_ST': hl.tarray(hl.tstr), + 'GQ': hl.tint32, + 'RD_CN': hl.tint32, + }, + DatasetType.GCNV: { + 'any_ovl': hl.tstr, + 'defragmented': hl.tbool, + 'genes_any_overlap_Ensemble_ID': hl.tstr, + 'genes_any_overlap_totalExons': hl.tint32, + 'identical_ovl': hl.tstr, + 'is_latest': hl.tbool, + 'no_ovl': hl.tbool, + 'sample_start': hl.tint32, + 'sample_end': hl.tint32, + 'CN': hl.tint32, + 'GT': hl.tstr, + 'QS': hl.tint32, + }, + }[self] + + @property + def row_fields( + self, + ) -> list[str]: + return { + DatasetType.SNV_INDEL: { + 'rsid': hl.tstr, + 'filters': hl.tset(hl.tstr), + }, + DatasetType.MITO: { + 'rsid': hl.tset(hl.tstr), + 'filters': hl.tset(hl.tstr), + 'common_low_heteroplasmy': hl.tbool, + 'hap_defining_variant': hl.tbool, + 'mitotip_trna_prediction': hl.tstr, + 'vep': hl.tstruct, + }, + DatasetType.SV: { + 'locus': hl.tlocus(ReferenceGenome.GRCh38.value), + 'alleles': hl.tarray(hl.tstr), + 'filters': hl.tset(hl.tstr), + 'info.AC': hl.tarray(hl.tint32), + 'info.AF': hl.tarray(hl.tfloat64), + 'info.ALGORITHMS': hl.tarray(hl.tstr), + 'info.BOTHSIDES_SUPPORT': hl.tbool, + 'info.AN': hl.tint32, + 'info.CHR2': hl.tstr, + 'info.CPX_INTERVALS': hl.tarray(hl.tstr), + 'info.CPX_TYPE': hl.tstr, + 'info.END': hl.tint32, + 'info.END2': hl.tint32, + 'info.N_HET': hl.tint32, + 'info.N_HOMALT': hl.tint32, + 'info.GNOMAD_V4.1_TRUTH_VID': hl.tstr, + 'info.StrVCTVRE': hl.tstr, + 'info.SVLEN': hl.tint32, + **sv.CONSEQ_PREDICTED_GENE_COLS, + }, + DatasetType.GCNV: { + 'cg_genes': hl.tset(hl.tstr), + 'chr': hl.tstr, + 'end': hl.tint32, + 'filters': hl.tset(hl.tstr), + 'gene_ids': hl.tset(hl.tstr), + 'lof_genes': hl.tset(hl.tstr), + 'num_exon': hl.tint32, + 'sc': hl.tint32, + 'sf': hl.tfloat64, + 'start': hl.tint32, + 'strvctvre_score': hl.tstr, + 'svtype': hl.tstr, + }, + }[self] + + @property + def excluded_filters(self) -> hl.SetExpression: + return { + DatasetType.SNV_INDEL: hl.empty_set(hl.tstr), + DatasetType.MITO: hl.set(['PASS']), + DatasetType.SV: hl.set(['PASS', 'BOTHSIDES_SUPPORT']), + DatasetType.GCNV: hl.empty_set(hl.tstr), + }[self] + + @property + def invalid_allele_types(self) -> hl.SetExpression: + return { + DatasetType.SV: hl.set([hl.genetics.allele_type.AlleleType.UNKNOWN]), + }.get( + self, + hl.set( + [ + hl.genetics.allele_type.AlleleType.UNKNOWN, + hl.genetics.allele_type.AlleleType.SYMBOLIC, + ], + ), + ) + + def has_gencode_ensembl_to_refseq_id_mapping( + self, + reference_genome: ReferenceGenome, + ) -> bool: + return ( + self == DatasetType.SNV_INDEL and reference_genome == ReferenceGenome.GRCh38 + ) + + def expect_tdr_metrics( + self, + reference_genome: ReferenceGenome, + ) -> bool: + return ( + self == DatasetType.SNV_INDEL and reference_genome == ReferenceGenome.GRCh38 + ) + + @property + def has_gencode_gene_symbol_to_gene_id_mapping(self) -> bool: + return self == DatasetType.SV + + @property + def has_multi_allelic_variants(self) -> bool: + return self == DatasetType.SNV_INDEL + + @property + def family_entries_filter_fn(self) -> Callable[[hl.StructExpression], bool]: + return { + DatasetType.GCNV: lambda e: hl.is_defined(e.GT), + }.get(self, lambda e: e.GT.is_non_ref()) + + @property + def can_run_validation(self) -> bool: + return self == DatasetType.SNV_INDEL + + @property + def check_sex_and_relatedness(self) -> bool: + return self == DatasetType.SNV_INDEL + + @property + def veppable(self) -> bool: + return self == DatasetType.SNV_INDEL + + def formatting_annotation_fns( + self, + reference_genome: ReferenceGenome, + ) -> list[Callable[..., hl.Expression]]: + GRCh37_fns = { # noqa: N806 + DatasetType.SNV_INDEL: [ + shared.rsid, + shared.variant_id, + shared.xpos, + shared.sorted_transcript_consequences, + snv_indel.rg38_locus, + ], + DatasetType.MITO: [ + mito.common_low_heteroplasmy, + mito.haplogroup, + mito.mitotip, + mito.rsid, + shared.variant_id, + shared.xpos, + shared.sorted_transcript_consequences, + ], + DatasetType.SV: [ + sv.algorithms, + sv.bothsides_support, + sv.cpx_intervals, + sv.end_locus, + sv.gnomad_svs, + sv.sorted_gene_consequences, + sv.start_locus, + sv.strvctvre, + sv.sv_type, + sv.sv_type_detail, + sv.sv_len, + shared.xpos, + ], + DatasetType.GCNV: [ + gcnv.end_locus, + gcnv.num_exon, + gcnv.sorted_gene_consequences, + gcnv.start_locus, + gcnv.strvctvre, + gcnv.sv_type, + gcnv.xpos, + ], + } + if reference_genome == ReferenceGenome.GRCh37: + return GRCh37_fns[self] + return { + DatasetType.SNV_INDEL: [ + shared.rsid, + shared.variant_id, + shared.xpos, + shared.rg37_locus, + snv_indel.check_ref, + snv_indel.sorted_transcript_consequences, + snv_indel.sorted_regulatory_feature_consequences, + snv_indel.sorted_motif_feature_consequences, + ], + DatasetType.MITO: [ + *GRCh37_fns[DatasetType.MITO], + shared.rg37_locus, + ], + DatasetType.SV: [ + *GRCh37_fns[DatasetType.SV], + shared.rg37_locus, + sv.rg37_locus_end, + ], + DatasetType.GCNV: [ + *GRCh37_fns[DatasetType.GCNV], + gcnv.rg37_locus, + gcnv.rg37_locus_end, + ], + }[self] + + @property + def genotype_entry_annotation_fns(self) -> list[Callable[..., hl.Expression]]: + return { + DatasetType.SNV_INDEL: [ + shared.GQ, + snv_indel.AB, + snv_indel.DP, + shared.GT, + ], + DatasetType.MITO: [ + mito.contamination, + mito.DP, + mito.HL, + mito.mito_cn, + mito.GQ, + shared.GT, + ], + DatasetType.SV: [ + sv.CN, + sv.concordance, + shared.GQ, + shared.GT, + ], + DatasetType.GCNV: [ + gcnv.concordance, + gcnv.defragged, + gcnv.sample_end, + gcnv.sample_gene_ids, + gcnv.sample_num_exon, + gcnv.sample_start, + gcnv.CN, + gcnv.GT, + gcnv.QS, + ], + }[self] + + @property + def variant_frequency_annotation_fns(self) -> list[Callable[..., hl.Expression]]: + return { + DatasetType.GCNV: [ + gcnv.gt_stats, + ], + }.get(self, []) + + @property + def filter_invalid_sites(self): + return self == DatasetType.SNV_INDEL + + @property + def should_export_to_vcf(self): + return self == DatasetType.SV + + @property + def export_vcf_annotation_fns(self) -> list[Callable[..., hl.Expression]]: + return { + DatasetType.SV: [ + sv.locus, + sv.alleles, + sv.info, + ], + }[self] + + @property + def should_write_new_variant_details(self): + return self == DatasetType.SNV_INDEL + + @property + def overwrite_male_non_par_calls(self) -> None: + return self == DatasetType.SV + + @property + def re_key_by_seqr_internal_truth_vid(self) -> None: + return self == DatasetType.SV + + @property + def dataproc_primary_workers(self) -> int: + if self == DatasetType.SNV_INDEL: + return Env.GCLOUD_DATAPROC_PRIMARY_WORKERS + return 1 + + @property + def dataproc_preemptibles(self) -> int | None: + if self == DatasetType.SNV_INDEL: + return Env.GCLOUD_DATAPROC_SECONDARY_WORKERS + return 1 diff --git a/loading_pipeline/lib/core/definitions.py b/loading_pipeline/lib/core/definitions.py new file mode 100644 index 0000000000..6ccce95e43 --- /dev/null +++ b/loading_pipeline/lib/core/definitions.py @@ -0,0 +1,86 @@ +from enum import StrEnum + +import hail as hl + + +class Sex(StrEnum): + FEMALE = 'F' + MALE = 'M' + UNKNOWN = 'U' + XXX = 'XXX' + X0 = 'X0' + XXY = 'XXY' + XYY = 'XYY' + + @property + def imputed_sex_values(self) -> list[str]: + return { + Sex.MALE: ['Male'], + Sex.FEMALE: ['Female'], + Sex.UNKNOWN: ['', 'Unknown'], + }.get(self, [self.name]) + + +class ReferenceGenome(StrEnum): + GRCh37 = 'GRCh37' + GRCh38 = 'GRCh38' + + @property + def v02_value(self) -> str: + return self.value[-2:] + + @property + def hl_reference(self) -> hl.ReferenceGenome: + return hl.get_reference(self.value) + + @property + def standard_contigs(self) -> set[str]: + return { + *self.hl_reference.contigs[:25], + } + + @property + def optional_contigs(self) -> set[str]: + return { + ReferenceGenome.GRCh37: { + 'Y', + 'MT', + }, + ReferenceGenome.GRCh38: { + 'chrY', + 'chrM', + }, + }[self] + + @property + def mito_contig(self) -> str: + return { + ReferenceGenome.GRCh37: 'MT', + ReferenceGenome.GRCh38: 'chrM', + }[self] + + @property + def x_contig(self) -> str: + return 'X' if self == ReferenceGenome.GRCh37 else 'chrX' + + def contig_recoding(self, include_mt: bool = False) -> dict[str, str]: + recode = { + ReferenceGenome.GRCh37: { + f'chr{i}': f'{i}' for i in ([*list(range(1, 23)), 'X', 'Y']) + }, + ReferenceGenome.GRCh38: { + f'{i}': f'chr{i}' for i in ([*list(range(1, 23)), 'X', 'Y']) + }, + }[self] + + if include_mt and self == ReferenceGenome.GRCh38: + recode.update({'MT': 'chrM'}) + if include_mt and self == ReferenceGenome.GRCh37: + recode.update({'chrM': 'MT'}) + + return recode + + +class SampleType(StrEnum): + WES = 'WES' + WGS = 'WGS' diff --git a/loading_pipeline/lib/core/definitions_test.py b/loading_pipeline/lib/core/definitions_test.py new file mode 100644 index 0000000000..b53d88cd18 --- /dev/null +++ b/loading_pipeline/lib/core/definitions_test.py @@ -0,0 +1,144 @@ +import unittest + +from loading_pipeline.lib.core.definitions import ReferenceGenome + + +class TestReferenceGenomeProperties(unittest.TestCase): + def test_v02_value(self): + self.assertEqual(ReferenceGenome.GRCh37.v02_value, '37') + self.assertEqual(ReferenceGenome.GRCh38.v02_value, '38') + + def test_hl_reference(self): + hl_37_reference = ReferenceGenome.GRCh37.hl_reference + self.assertEqual(hl_37_reference.name, 'GRCh37') + + hl_38_reference = ReferenceGenome.GRCh38.hl_reference + self.assertEqual(hl_38_reference.name, 'GRCh38') + + def test_standard_contigs(self): + expected_37_contigs = { + '3', + '12', + '21', + '2', + '1', + '7', + '13', + '8', + '11', + '22', + 'MT', + '14', + 'Y', + '18', + '19', + '20', + '17', + 'X', + '10', + '15', + '16', + '4', + '5', + '9', + '6', + } + self.assertEqual(ReferenceGenome.GRCh37.standard_contigs, expected_37_contigs) + + expected_38_contigs = { + 'chr10', + 'chr11', + 'chr17', + 'chr18', + 'chr9', + 'chr22', + 'chr3', + 'chrY', + 'chr7', + 'chr6', + 'chr13', + 'chr19', + 'chr16', + 'chrX', + 'chr12', + 'chr2', + 'chr21', + 'chr20', + 'chr8', + 'chrM', + 'chr5', + 'chr4', + 'chr14', + 'chr1', + 'chr15', + } + self.assertEqual(ReferenceGenome.GRCh38.standard_contigs, expected_38_contigs) + + def test_optional_contigs(self): + self.assertEqual(ReferenceGenome.GRCh37.optional_contigs, {'Y', 'MT'}) + self.assertEqual(ReferenceGenome.GRCh38.optional_contigs, {'chrY', 'chrM'}) + + def test_contig_recoding(self): + expected_37_recode = { + 'chr1': '1', + 'chr2': '2', + 'chr3': '3', + 'chr4': '4', + 'chr5': '5', + 'chr6': '6', + 'chr7': '7', + 'chr8': '8', + 'chr9': '9', + 'chr10': '10', + 'chr11': '11', + 'chr12': '12', + 'chr13': '13', + 'chr14': '14', + 'chr15': '15', + 'chr16': '16', + 'chr17': '17', + 'chr18': '18', + 'chr19': '19', + 'chr20': '20', + 'chr21': '21', + 'chr22': '22', + 'chrX': 'X', + 'chrY': 'Y', + 'chrM': 'MT', + } + self.assertDictEqual( + ReferenceGenome.GRCh37.contig_recoding(include_mt=True), + expected_37_recode, + ) + + expected_38_recode = { + '1': 'chr1', + '2': 'chr2', + '3': 'chr3', + '4': 'chr4', + '5': 'chr5', + '6': 'chr6', + '7': 'chr7', + '8': 'chr8', + '9': 'chr9', + '10': 'chr10', + '11': 'chr11', + '12': 'chr12', + '13': 'chr13', + '14': 'chr14', + '15': 'chr15', + '16': 'chr16', + '17': 'chr17', + '18': 'chr18', + '19': 'chr19', + '20': 'chr20', + '21': 'chr21', + '22': 'chr22', + 'X': 'chrX', + 'Y': 'chrY', + 'MT': 'chrM', + } + self.assertDictEqual( + ReferenceGenome.GRCh38.contig_recoding(include_mt=True), + expected_38_recode, + ) diff --git a/loading_pipeline/lib/core/environment.py b/loading_pipeline/lib/core/environment.py new file mode 100644 index 0000000000..5a7d9611b1 --- /dev/null +++ b/loading_pipeline/lib/core/environment.py @@ -0,0 +1,83 @@ +import os +from dataclasses import dataclass +from typing import Literal + +# NB: using os.environ.get inside the dataclass defaults gives a lint error. +LOCAL_DISK_MOUNT_DIR = os.environ.get('LOCAL_DISK_MOUNT_DIR', '/var/seqr') +HAIL_TMP_DIR = os.environ.get('HAIL_TMP_DIR', '/tmp') # noqa: S108 # nosec B108 +PIPELINE_DATA_DIR = os.environ.get( + 'PIPELINE_DATA_DIR', + '/var/seqr/pipeline-data', +) +LOADING_DATASETS_DIR = os.environ.get( + 'LOADING_DATASETS_DIR', + '/var/seqr/seqr-loading-temp', +) +REFERENCE_DATASETS_DIR = os.environ.get( + 'REFERENCE_DATASETS_DIR', + '/var/seqr/seqr-reference-data', +) +VEP_REFERENCE_DATASETS_DIR = os.environ.get( + 'VEP_REFERENCE_DATASETS_DIR', + '/var/seqr/vep-reference-data', +) +CLICKHOUSE_DATABASE = os.environ.get('CLICKHOUSE_DATABASE', 'seqr') +CLICKHOUSE_SERVICE_HOSTNAME = os.environ.get( + 'CLICKHOUSE_SERVICE_HOSTNAME', + 'localhost', +) +CLICKHOUSE_SERVICE_PORT = int(os.environ.get('CLICKHOUSE_SERVICE_PORT', '9000')) +CLICKHOUSE_WRITER_PASSWORD = os.environ.get( + 'CLICKHOUSE_WRITER_PASSWORD', + 'default_password', +) +CLICKHOUSE_WRITER_USER = os.environ.get('CLICKHOUSE_WRITER_USER', 'default') +DEPLOYMENT_TYPE = os.environ.get('DEPLOYMENT_TYPE', 'prod') +GCLOUD_DATAPROC_PRIMARY_WORKERS = int( + os.environ.get('GCLOUD_DATAPROC_PRIMARY_WORKERS', '1'), +) +GCLOUD_DATAPROC_SECONDARY_WORKERS = int( + os.environ.get('GCLOUD_DATAPROC_SECONDARY_WORKERS', '5'), +) +GCLOUD_PROJECT = os.environ.get('GCLOUD_PROJECT') +GCLOUD_REGION = os.environ.get('GCLOUD_REGION') +PIPELINE_RUNNER_APP_VERSION = os.environ.get('PIPELINE_RUNNER_APP_VERSION', 'latest') +SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS = tuple( + x + for x in os.environ.get('SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS', '').split(',') + if x +) +LOADING_QUEUE_LIMIT = int(os.environ.get('LOADING_QUEUE_LIMIT', '10')) +CLICKHOUSE_OPTIMIZE_TABLE_WAIT_S = int( + os.environ.get('CLICKHOUSE_OPTIMIZE_TABLE_WAIT_S', '150'), +) +SLACK_NOTIFICATION_CHANNEL = os.environ.get('SLACK_NOTIFICATION_CHANNEL', '') +SLACK_TOKEN = os.environ.get('SLACK_TOKEN', '') + + +@dataclass +class Env: + CLICKHOUSE_DATABASE: str = CLICKHOUSE_DATABASE + CLICKHOUSE_OPTIMIZE_TABLE_WAIT_S: str = CLICKHOUSE_OPTIMIZE_TABLE_WAIT_S + CLICKHOUSE_SERVICE_HOSTNAME: str = CLICKHOUSE_SERVICE_HOSTNAME + CLICKHOUSE_SERVICE_PORT: int = CLICKHOUSE_SERVICE_PORT + CLICKHOUSE_WRITER_PASSWORD: str = CLICKHOUSE_WRITER_PASSWORD + CLICKHOUSE_WRITER_USER: str = CLICKHOUSE_WRITER_USER + DEPLOYMENT_TYPE: Literal['dev', 'prod'] = DEPLOYMENT_TYPE + GCLOUD_DATAPROC_PRIMARY_WORKERS: int = GCLOUD_DATAPROC_PRIMARY_WORKERS + GCLOUD_DATAPROC_SECONDARY_WORKERS: int = GCLOUD_DATAPROC_SECONDARY_WORKERS + GCLOUD_PROJECT: str | None = GCLOUD_PROJECT + GCLOUD_REGION: str | None = GCLOUD_REGION + HAIL_TMP_DIR: str = HAIL_TMP_DIR + LOCAL_DISK_MOUNT_DIR: str = LOCAL_DISK_MOUNT_DIR + PIPELINE_DATA_DIR: str = PIPELINE_DATA_DIR + LOADING_DATASETS_DIR: str = LOADING_DATASETS_DIR + LOADING_QUEUE_LIMIT: int = LOADING_QUEUE_LIMIT + PIPELINE_RUNNER_APP_VERSION: str = PIPELINE_RUNNER_APP_VERSION + REFERENCE_DATASETS_DIR: str = REFERENCE_DATASETS_DIR + SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS: tuple[str] = ( + SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS + ) + SLACK_NOTIFICATION_CHANNEL: str = SLACK_NOTIFICATION_CHANNEL + SLACK_TOKEN: str = SLACK_TOKEN + VEP_REFERENCE_DATASETS_DIR: str = VEP_REFERENCE_DATASETS_DIR diff --git a/loading_pipeline/lib/core/feature_flag.py b/loading_pipeline/lib/core/feature_flag.py new file mode 100644 index 0000000000..a7c9ea19d5 --- /dev/null +++ b/loading_pipeline/lib/core/feature_flag.py @@ -0,0 +1,14 @@ +import os +from dataclasses import dataclass + +# Feature Flags +CHECK_SEX_AND_RELATEDNESS = os.environ.get('CHECK_SEX_AND_RELATEDNESS') == '1' +EXPECT_TDR_METRICS = os.environ.get('EXPECT_TDR_METRICS') == '1' +RUN_PIPELINE_ON_DATAPROC = os.environ.get('RUN_PIPELINE_ON_DATAPROC') == '1' + + +@dataclass +class FeatureFlag: + CHECK_SEX_AND_RELATEDNESS: bool = CHECK_SEX_AND_RELATEDNESS + EXPECT_TDR_METRICS: bool = EXPECT_TDR_METRICS + RUN_PIPELINE_ON_DATAPROC: bool = RUN_PIPELINE_ON_DATAPROC diff --git a/loading_pipeline/lib/logger.py b/loading_pipeline/lib/logger.py new file mode 100644 index 0000000000..1cb5b94d52 --- /dev/null +++ b/loading_pipeline/lib/logger.py @@ -0,0 +1,46 @@ +import logging.config + +LOG_CONFIG = { + 'version': 1, + 'disable_existing_loggers': False, + 'propagate': True, + 'formatters': { + 'default': { + 'format': '%(asctime)s - %(module)s - %(levelname)s - %(message)s', + 'datefmt': '%Y-%m-%d %H:%M:%S', + }, + }, + 'handlers': { + 'default': { + 'formatter': 'default', + 'class': 'logging.StreamHandler', + }, + }, + 'loggers': { + '': { + 'level': 'INFO', + 'handlers': ['default'], + 'propagate': False, + }, + 'py4j': { + 'level': 'CRITICAL', + }, + 'urllib3': { + 'level': 'CRITICAL', + }, + 'asyncio': { + 'level': 'CRITICAL', + }, + 'clickhouse_driver': {'level': 'CRITICAL'}, + }, +} + +_CONFIGURED = False + + +def get_logger(name: str): + global _CONFIGURED # noqa: PLW0603 + if not _CONFIGURED: + logging.config.dictConfig(LOG_CONFIG) + _CONFIGURED = True + return logging.getLogger(name) diff --git a/loading_pipeline/lib/methods/__init__.py b/loading_pipeline/lib/methods/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/methods/relatedness.py b/loading_pipeline/lib/methods/relatedness.py new file mode 100644 index 0000000000..bb1a1e80fe --- /dev/null +++ b/loading_pipeline/lib/methods/relatedness.py @@ -0,0 +1,40 @@ +import hail as hl +from gnomad.sample_qc.pipeline import filter_rows_for_qc + + +def filter_and_ld_prune( + mt: hl.MatrixTable, + gnomad_qc_ht: hl.Table | None, +) -> hl.MatrixTable: + mt = filter_rows_for_qc( + mt, + min_af=0.001, + min_callrate=0.99, + apply_hard_filters=False, + ) + if not gnomad_qc_ht: + mm_pruned = hl.ld_prune(mt.GT, r2=0.1) + return mt.filter_rows(hl.is_defined(mm_pruned[mt.row_key])) + return mt.filter_rows( + hl.is_defined(gnomad_qc_ht[mt.row_key]), + ) + + +def call_relatedness( + mt: hl.MatrixTable, # NB: we've been remapped and subsetted upstream + gnomad_qc_ht: hl.Table | None, +) -> hl.Table: + mt = filter_and_ld_prune(mt, gnomad_qc_ht) + # NB: ibd did not work by default with my pip install of `hail` on an M1 MacOSX. + # I had to build hail by source with the following: + # - brew install lz4 + # - CXXFLAGS='-I/opt/homebrew/include/' HAIL_COMPILE_NATIVES=1 make -C hail install + # Hail issue here: https://discuss.hail.is/t/noclassdeffounderror-could-not-initialize-class-is-hail-methods-ibsffi/2453 + kin_ht = hl.identity_by_descent(mt, maf=mt['info.AF'][0], min=0.10, max=1.0) + kin_ht = kin_ht.key_by('i', 'j') + return kin_ht.select( + ibd0=kin_ht.ibd.Z0, + ibd1=kin_ht.ibd.Z1, + ibd2=kin_ht.ibd.Z2, + pi_hat=kin_ht.ibd.PI_HAT, + ) diff --git a/loading_pipeline/lib/methods/relatedness_test.py b/loading_pipeline/lib/methods/relatedness_test.py new file mode 100644 index 0000000000..e3afb159e2 --- /dev/null +++ b/loading_pipeline/lib/methods/relatedness_test.py @@ -0,0 +1,39 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.methods.relatedness import call_relatedness + +TEST_SEX_AND_RELATEDNESS_CALLSET_MT = ( + 'loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt' +) + + +class RelatednessTest(unittest.TestCase): + def test_call_relatedness(self): + mt = hl.read_matrix_table(TEST_SEX_AND_RELATEDNESS_CALLSET_MT) + ht = call_relatedness( + mt, + None, + ) + self.assertCountEqual( + ht.collect(), + [ + hl.Struct( + i='ROS_006_18Y03226_D1', + j='ROS_007_19Y05939_D1', + ibd0=0.0, + ibd1=1.0, + ibd2=0.0, + pi_hat=0.5, + ), + hl.Struct( + i='ROS_007_19Y05939_D1', + j='ROS_007_19Y05987_D1', + ibd0=0.0, + ibd1=1.0, + ibd2=0.0, + pi_hat=0.5, + ), + ], + ) diff --git a/loading_pipeline/lib/methods/sample_qc.py b/loading_pipeline/lib/methods/sample_qc.py new file mode 100644 index 0000000000..727f3dcfc9 --- /dev/null +++ b/loading_pipeline/lib/methods/sample_qc.py @@ -0,0 +1,154 @@ +import hail as hl +import onnx +from gnomad.sample_qc.ancestry import ( + apply_onnx_classification_model, + assign_population_pcs, + pc_project, +) +from gnomad.sample_qc.filtering import compute_stratified_metrics_filter +from gnomad.sample_qc.pipeline import filter_rows_for_qc +from gnomad.utils.filtering import filter_to_autosomes +from gnomad_qc.v4.sample_qc.assign_ancestry import assign_pop_with_per_pop_probs + +from loading_pipeline.lib.core import SampleType + +GNOMAD_FILTER_MIN_AF = 0.001 +GNOMAD_FILTER_MIN_CALLRATE = 0.99 + +CALLRATE_LOW_THRESHOLD = 0.85 +CONTAMINATION_UPPER_THRESHOLD = 0.05 +WES_COVERAGE_LOW_THRESHOLD = 85 +WGS_CALLRATE_LOW_THRESHOLD = 30 + +NUM_PCS = 20 +GNOMAD_POP_PROBABILITY_CUTOFFS = { + 'afr': 0.93, + 'ami': 0.98, + 'amr': 0.89, + 'asj': 0.94, + 'eas': 0.95, + 'fin': 0.92, + 'mid': 0.55, + 'nfe': 0.75, + 'sas': 0.92, +} +POPULATION_MISSING_LABEL = 'oth' +HAIL_QC_METRICS = [ + 'n_snp', + 'r_ti_tv', + 'r_insertion_deletion', + 'n_insertion', + 'n_deletion', + 'r_het_hom_var', +] + + +def call_sample_qc( + mt: hl.MatrixTable, + tdr_metrics_ht: hl.Table, + pop_pca_loadings_ht: hl.Table, + ancestry_rf_model: onnx.ModelProto, + sample_type: SampleType, +): + mt = mt.annotate_entries( + GT=hl.case() + .when(mt.GT.is_diploid(), hl.call(mt.GT[0], mt.GT[1], phased=False)) + .when(mt.GT.is_haploid(), hl.call(mt.GT[0], phased=False)) + .default(hl.missing(hl.tcall)), + ) + mt = annotate_filtered_callrate(mt) + # Annotates contamination_rate, percent_bases_at_20x, and mean_coverage + mt = mt.annotate_cols(**tdr_metrics_ht[mt.col_key]) + mt = annotate_filter_flags(mt, sample_type) + mt = annotate_qc_gen_anc(mt, pop_pca_loadings_ht, ancestry_rf_model) + return run_hail_sample_qc(mt, sample_type) + + +def annotate_filtered_callrate(mt: hl.MatrixTable) -> hl.MatrixTable: + filtered_mt = filter_rows_for_qc( + mt, + min_af=GNOMAD_FILTER_MIN_AF, + min_callrate=GNOMAD_FILTER_MIN_CALLRATE, + bi_allelic_only=True, + snv_only=True, + apply_hard_filters=False, + min_inbreeding_coeff_threshold=None, + min_hardy_weinberg_threshold=None, + ) + callrate_ht = filtered_mt.select_cols( + filtered_callrate=hl.agg.fraction(hl.is_defined(filtered_mt.GT)), + ).cols() + return mt.annotate_cols(**callrate_ht[mt.col_key]) + + +def annotate_filter_flags( + mt: hl.MatrixTable, + sample_type: SampleType, +) -> hl.MatrixTable: + flags = { + 'callrate': mt.filtered_callrate < CALLRATE_LOW_THRESHOLD, + 'contamination': mt.contamination_rate > CONTAMINATION_UPPER_THRESHOLD, + 'coverage': ( + mt.percent_bases_at_20x < WES_COVERAGE_LOW_THRESHOLD + if sample_type == SampleType.WES + else mt.mean_coverage < WGS_CALLRATE_LOW_THRESHOLD + ), + } + return mt.annotate_cols( + filter_flags=hl.array( + [hl.or_missing(filter_cond, name) for name, filter_cond in flags.items()], + ).filter(hl.is_defined), + ) + + +def annotate_qc_gen_anc( + mt: hl.MatrixTable, + pop_pca_loadings_ht: hl.Table, + ancestry_rf_model: onnx.ModelProto, +) -> hl.MatrixTable: + mt = mt.select_entries('GT') + scores = pc_project(mt, pop_pca_loadings_ht) + scores = scores.annotate(scores=scores.scores[:NUM_PCS], known_pop='Unknown') + pop_pca_ht, _ = assign_population_pcs( + scores, + pc_cols=scores.scores, + output_col='qc_pop', + fit=ancestry_rf_model, + apply_model_func=apply_onnx_classification_model, + ) + pop_pca_ht = pop_pca_ht.key_by('s') + scores = scores.annotate( + **{f'pop_PC{i + 1}': scores.scores[i] for i in range(NUM_PCS)}, + ).drop('scores', 'known_pop') + pop_pca_ht = pop_pca_ht.annotate(**scores[pop_pca_ht.key]) + pop_pca_ht = assign_pop_with_per_pop_probs( + pop_pca_ht, + min_prob_cutoffs=GNOMAD_POP_PROBABILITY_CUTOFFS, + missing_label=POPULATION_MISSING_LABEL, + ) + pop_pca_ht = pop_pca_ht.transmute(qc_gen_anc=pop_pca_ht.pop).drop('qc_pop') + return mt.annotate_cols(**pop_pca_ht[mt.col_key]) + + +def run_hail_sample_qc(mt: hl.MatrixTable, sample_type: SampleType) -> hl.MatrixTable: + mt = filter_to_autosomes(mt) + mt = hl.sample_qc(mt) + mt = mt.annotate_cols( + sample_qc=mt.sample_qc.annotate( + f_inbreeding=hl.agg.inbreeding(mt.GT, mt['info.AF'][0]), + ), + ) + sample_qc_metrics = HAIL_QC_METRICS + if sample_type == SampleType.WGS: + sample_qc_metrics = [*sample_qc_metrics, 'call_rate'] + + strat_ht = mt.cols() + qc_metrics = {metric: strat_ht.sample_qc[metric] for metric in sample_qc_metrics} + strata = {'qc_gen_anc': strat_ht.qc_gen_anc} + + metric_ht = compute_stratified_metrics_filter(strat_ht, qc_metrics, strata) + metric_ht = metric_ht.annotate( + sample_qc=mt.cols()[metric_ht.key].sample_qc, + qc_metrics_filters=hl.array(metric_ht.qc_metrics_filters), + ) + return mt.annotate_cols(**metric_ht[mt.col_key]) diff --git a/loading_pipeline/lib/methods/sex_check.py b/loading_pipeline/lib/methods/sex_check.py new file mode 100644 index 0000000000..1350ba7d85 --- /dev/null +++ b/loading_pipeline/lib/methods/sex_check.py @@ -0,0 +1,50 @@ +import hail as hl + +from loading_pipeline.lib.core import Sex + +AMBIGUOUS_THRESHOLD_PERC: float = 0.01 # Fraction of samples identified as "ambiguous_sex" above which an error will be thrown. +AAF_THRESHOLD: float = 0.05 # Alternate allele frequency threshold for `hl.impute_sex`. +BIALLELIC: int = 2 +XX_FSTAT_THRESHOLD: float = ( + 0.5 # F-stat threshold below which a sample will be called XX +) +XY_FSTAT_THRESHOLD: float = ( + 0.75 # F-stat threshold above which a sample will be called XY. +) + + +def compute_sex_check_ht(mt: hl.MatrixTable) -> hl.Table: + # Filter to SNVs and biallelics + # NB: We should already have filtered biallelics, but just in case. + mt = mt.filter_rows( + (hl.len(mt.alleles) == BIALLELIC) & hl.is_snp(mt.alleles[0], mt.alleles[1]), + ) + mt = mt.filter_cols(hl.agg.all(mt.GT.is_diploid() | hl.is_missing(mt.GT))) + + # Filter to PASS variants only (variants with empty or missing filter set) + mt = mt.filter_rows( + hl.is_missing(mt.filters) | (mt.filters.length() == 0), + keep=True, + ) + impute_sex_ht = hl.impute_sex( + mt.GT, + male_threshold=XY_FSTAT_THRESHOLD, + female_threshold=XX_FSTAT_THRESHOLD, + aaf_threshold=AAF_THRESHOLD, + ) + ht = mt.annotate_cols(**impute_sex_ht[mt.col_key]).cols() + ht = ht.select( + predicted_sex=( + hl.case() + .when(hl.is_missing(ht.is_female), Sex.UNKNOWN.value) + .when(ht.is_female, Sex.FEMALE.value) + .default(Sex.MALE.value) + ), + ) + ambiguous_perc = ht.aggregate( + hl.agg.fraction(ht.predicted_sex == Sex.UNKNOWN.value), + ) + if ambiguous_perc > AMBIGUOUS_THRESHOLD_PERC: + msg = f'{ambiguous_perc:.2%} of samples identified as ambiguous. Please contact the methods team to investigate the callset.' + raise ValueError(msg) + return ht diff --git a/loading_pipeline/lib/methods/sex_check_test.py b/loading_pipeline/lib/methods/sex_check_test.py new file mode 100644 index 0000000000..ed390e86f3 --- /dev/null +++ b/loading_pipeline/lib/methods/sex_check_test.py @@ -0,0 +1,54 @@ +import unittest +from unittest.mock import patch + +import hail as hl + +from loading_pipeline.lib.methods.sex_check import compute_sex_check_ht + +TEST_SEX_AND_RELATEDNESS_CALLSET_MT = ( + 'loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt' +) + + +class SexCheckTest(unittest.TestCase): + def test_compute_sex_check_ht(self): + mt = hl.read_matrix_table(TEST_SEX_AND_RELATEDNESS_CALLSET_MT) + ht = compute_sex_check_ht(mt) + self.assertCountEqual( + ht.collect(), + [ + hl.Struct( + s='ROS_006_18Y03226_D1', + predicted_sex='M', + ), + hl.Struct( + s='ROS_006_18Y03227_D1', + predicted_sex='M', + ), + hl.Struct( + s='ROS_006_18Y03228_D1', + predicted_sex='M', + ), + hl.Struct( + s='ROS_007_19Y05919_D1', + predicted_sex='M', + ), + hl.Struct( + s='ROS_007_19Y05939_D1', + predicted_sex='F', + ), + hl.Struct( + s='ROS_007_19Y05987_D1', + predicted_sex='M', + ), + ], + ) + + def test_compute_sex_check_ht_ambiguous(self): + mt = hl.read_matrix_table(TEST_SEX_AND_RELATEDNESS_CALLSET_MT) + with patch('loading_pipeline.lib.methods.sex_check.XY_FSTAT_THRESHOLD', 0.95): + self.assertRaises( + ValueError, + compute_sex_check_ht, + mt, + ) diff --git a/loading_pipeline/lib/misc/__init__.py b/loading_pipeline/lib/misc/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/misc/callsets.py b/loading_pipeline/lib/misc/callsets.py new file mode 100644 index 0000000000..a0cf771a4a --- /dev/null +++ b/loading_pipeline/lib/misc/callsets.py @@ -0,0 +1,31 @@ +import hail as hl + +from loading_pipeline.lib.core import DatasetType + + +def get_additional_row_fields( + mt: hl.MatrixTable, + dataset_type: DatasetType, + skip_check_sex_and_relatedness: bool, +): + return { + **( + {'info.AF': hl.tarray(hl.tfloat64)} + if not skip_check_sex_and_relatedness + and dataset_type.check_sex_and_relatedness + else {} + ), + # this field is never required, the pipeline + # will run smoothly even in its absence, but + # will trigger special handling if it is present. + **( + {'info.CALIBRATION_SENSITIVITY': hl.tarray(hl.tstr)} + if hasattr(mt, 'info') and hasattr(mt.info, 'CALIBRATION_SENSITIVITY') + else {} + ), + **( + {'info.SEQR_INTERNAL_TRUTH_VID': hl.tstr} + if dataset_type.re_key_by_seqr_internal_truth_vid + else {} + ), + } diff --git a/loading_pipeline/lib/misc/clickhouse.py b/loading_pipeline/lib/misc/clickhouse.py new file mode 100644 index 0000000000..480356abbc --- /dev/null +++ b/loading_pipeline/lib/misc/clickhouse.py @@ -0,0 +1,1329 @@ +import ast +import functools +import hashlib +import math +import os +import time +from collections.abc import Callable +from dataclasses import dataclass +from enum import StrEnum +from string import Template + +from clickhouse_driver import Client + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.retry import retry +from loading_pipeline.lib.paths import ( + existing_variants_parquet_path, + new_entries_parquet_path, + new_variant_details_parquet_path, + new_variants_parquet_path, +) + +logger = get_logger(__name__) + +GCS_NAMED_COLLECTION = 'pipeline_data_access' +GOOGLE_XML_API_PATH = 'https://storage.googleapis.com/' +OPTIMIZE_TABLE_TIMEOUT_S = 99999 +WAIT_VIEW_TIMEOUT_S = 900 +REDACTED = 'REDACTED' +STAGING_CLICKHOUSE_DATABASE = 'staging' + + +class ClickHouseTable(StrEnum): + KEY_LOOKUP = 'key_lookup' + VARIANT_DETAILS = 'variants/details' + VARIANTS_DISK = 'variants_disk' + VARIANTS_MEMORY = 'variants_memory' + ENTRIES = 'entries' + PROJECT_GT_STATS = 'project_gt_stats' + GT_STATS = 'gt_stats' + EXISTING_VARIANTS = 'existing_variants' + + @property + def src_path_fn(self) -> Callable: + return { + ClickHouseTable.VARIANTS_DISK: new_variants_parquet_path, + ClickHouseTable.VARIANTS_MEMORY: new_variants_parquet_path, + ClickHouseTable.KEY_LOOKUP: ( + lambda *args: new_variant_details_parquet_path(*args) + if args[1].should_write_new_variant_details + else new_variants_parquet_path(*args) + ), + ClickHouseTable.VARIANT_DETAILS: new_variant_details_parquet_path, + ClickHouseTable.ENTRIES: new_entries_parquet_path, + ClickHouseTable.EXISTING_VARIANTS: existing_variants_parquet_path, + }[self] + + @property + def key_field(self): + return 'variantId' if self == ClickHouseTable.KEY_LOOKUP else 'key' + + @property + def join_condition(self): + return ( + 'assumeNotNull(src.variantId) = dst.variantId' + if self == ClickHouseTable.KEY_LOOKUP + else 'assumeNotNull(toUInt32(src.key)) = dst.key' + ) + + @property + def select_fields(self) -> str: + return { + ClickHouseTable.KEY_LOOKUP: 'variantId, key', + }.get(self, '*') + + @property + def insert(self) -> Callable: + return { + # Note that VARIANTS_DETAILS is not included here because + # of the special logic to ensure writes are made to both tables. + ClickHouseTable.VARIANTS_MEMORY: direct_insert_annotations, + ClickHouseTable.KEY_LOOKUP: functools.partial( + direct_insert_all_keys, + clickhouse_table=self, + ), + ClickHouseTable.VARIANT_DETAILS: functools.partial( + direct_insert_all_keys, + clickhouse_table=self, + ), + }[self] + + @classmethod + def for_dataset_type(cls, dataset_type: DatasetType) -> list['ClickHouseTable']: + tables = [ + ClickHouseTable.VARIANTS_MEMORY, + ClickHouseTable.KEY_LOOKUP, + ] + if dataset_type.should_write_new_variant_details: + tables = [ + *tables, + ClickHouseTable.VARIANT_DETAILS, + ] + return tables + + @classmethod + def for_dataset_type_disk_backed_variants_tables( + cls, + _dataset_type: DatasetType, + ) -> list['ClickHouseTable']: + return [ + ClickHouseTable.VARIANTS_DISK, + ] + + @classmethod + def for_dataset_type_atomic_entries_update( + cls, + dataset_type: DatasetType, + ) -> list['ClickHouseTable']: + return [ + *cls.for_dataset_type_atomic_entries_update_project_partitioned( + dataset_type, + ), + *cls.for_dataset_type_atomic_entries_update_unpartitioned(dataset_type), + ] + + @classmethod + def for_dataset_type_atomic_entries_update_project_partitioned( + cls, + dataset_type: DatasetType, + ) -> list['ClickHouseTable']: + if dataset_type == DatasetType.GCNV: + return [ClickHouseTable.ENTRIES] + return [ + ClickHouseTable.ENTRIES, + ClickHouseTable.PROJECT_GT_STATS, + ] + + @classmethod + def for_dataset_type_atomic_entries_update_unpartitioned( + cls, + dataset_type: DatasetType, + ) -> list['ClickHouseTable']: + if dataset_type == DatasetType.GCNV: + return [] + return [ClickHouseTable.GT_STATS] + + +class ClickHouseDictionary(StrEnum): + GT_STATS_DICT = 'gt_stats_dict' + + @classmethod + def for_dataset_type( + cls, + dataset_type: DatasetType, + ) -> list['ClickHouseDictionary']: + if dataset_type == DatasetType.GCNV: + return [] + return list(cls) + + +class ClickHouseMaterializedView(StrEnum): + ENTRIES_TO_PROJECT_GT_STATS_MV = 'entries_to_project_gt_stats_mv' + PROJECT_GT_STATS_TO_GT_STATS_MV = 'project_gt_stats_to_gt_stats_mv' + + @classmethod + def for_dataset_type_atomic_entries_update( + cls, + dataset_type: DatasetType, + ) -> list['ClickHouseMaterializedView']: + if dataset_type == DatasetType.GCNV: + return [] + return [ + ClickHouseMaterializedView.ENTRIES_TO_PROJECT_GT_STATS_MV, + ClickHouseMaterializedView.PROJECT_GT_STATS_TO_GT_STATS_MV, + ] + + @classmethod + def for_dataset_type_atomic_entries_update_refreshable( + cls, + dataset_type: DatasetType, + ) -> list['ClickHouseMaterializedView']: + if dataset_type == DatasetType.GCNV: + return [] + return [ClickHouseMaterializedView.PROJECT_GT_STATS_TO_GT_STATS_MV] + + +ClickHouseEntity = ClickHouseDictionary | ClickHouseTable | ClickHouseMaterializedView + + +@dataclass +class TableNameBuilder: + reference_genome: ReferenceGenome + dataset_type: DatasetType + run_id: str + + @property + def run_id_hash(self): + # Note: encountered length issues with the default + # run ids generated by the pipeline. ClickHouse performed + # well with staging Tables with the long run ids, but failed + # to recognized staging Dictionaries. + sha256 = hashlib.sha256() + sha256.update(self.run_id.encode()) + return sha256.hexdigest()[:8] + + @property + def dst_prefix(self): + return f'{Env.CLICKHOUSE_DATABASE}.`{self.reference_genome.value}/{self.dataset_type.value}' + + def dst_table(self, clickhouse_entity: ClickHouseEntity): + return f'{self.dst_prefix}/{clickhouse_entity.value}`' + + @property + def staging_dst_prefix(self): + return f'{STAGING_CLICKHOUSE_DATABASE}.`{self.run_id_hash}/{self.reference_genome.value}/{self.dataset_type.value}' + + def staging_dst_table(self, clickhouse_table: ClickHouseTable): + return f'{self.staging_dst_prefix}/{clickhouse_table.value}`' + + def src_table(self, clickhouse_table: ClickHouseTable): + path = os.path.join( + clickhouse_table.src_path_fn( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + '*.parquet', + ) + if path.startswith('gs://'): + return f"gcs({GCS_NAMED_COLLECTION}, url='{path.replace('gs://', GOOGLE_XML_API_PATH)}')" + return f"file('{path}', 'Parquet')" + + +class ClickhouseReferenceDataset(StrEnum): + ABSPLICE2 = 'absplice2' + CLINVAR = 'clinvar' + DBNSFP = 'dbnsfp' + EIGEN = 'eigen' + GNOMAD_EXOMES = 'gnomad_exomes' + GNOMAD_GENOMES = 'gnomad_genomes' + GNOMAD_MITO = 'gnomad_mito' + GNOMAD_MITO_HETEROPLASMY = 'gnomad_mito_heteroplasmy' + GNOMAD_NON_CODING_CONSTRAINT = 'gnomad_non_coding_constraint' + HELIX_MITO = 'helix_mito' + HELIX_MITO_HETEROPLASMY = 'helix_mito_heteroplasmy' + HGMD = 'hgmd' + HMTVAR = 'hmtvar' + LOCAL_CONSTRAINT_MITO = 'local_constraint_mito' + MITIMPACT = 'mitimpact' + MITOMAP = 'mitomap' + PEXT = 'pext' + PROMOTER_AI = 'promoterAI' + SCREEN = 'screen' + SPLICE_AI = 'splice_ai' + TOPMED = 'topmed' + + @property + def all_variants_mv_timeout(self): + return { + ClickhouseReferenceDataset.DBNSFP: WAIT_VIEW_TIMEOUT_S * 3, + ClickhouseReferenceDataset.SPLICE_AI: WAIT_VIEW_TIMEOUT_S * 10, + }.get(self, WAIT_VIEW_TIMEOUT_S) + + @property + def fully_refreshable(self): + return self != ClickhouseReferenceDataset.CLINVAR + + @property + def has_seqr_variants(self): + return self not in { + ClickhouseReferenceDataset.GNOMAD_NON_CODING_CONSTRAINT, + ClickhouseReferenceDataset.SCREEN, + } + + @classmethod + def for_reference_genome_dataset_type( + cls, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + ): + if dataset_type in {DatasetType.SV, DatasetType.GCNV}: + return [] + return { + (ReferenceGenome.GRCh38, DatasetType.MITO): [ + ClickhouseReferenceDataset.CLINVAR, + ClickhouseReferenceDataset.DBNSFP, + ClickhouseReferenceDataset.GNOMAD_MITO, + ClickhouseReferenceDataset.GNOMAD_MITO_HETEROPLASMY, + ClickhouseReferenceDataset.HELIX_MITO, + ClickhouseReferenceDataset.HELIX_MITO_HETEROPLASMY, + ClickhouseReferenceDataset.HMTVAR, + ClickhouseReferenceDataset.LOCAL_CONSTRAINT_MITO, + ClickhouseReferenceDataset.MITIMPACT, + ClickhouseReferenceDataset.MITOMAP, + ClickhouseReferenceDataset.PEXT, + ], + (ReferenceGenome.GRCh37, DatasetType.SNV_INDEL): [ + ClickhouseReferenceDataset.CLINVAR, + ClickhouseReferenceDataset.DBNSFP, + ClickhouseReferenceDataset.EIGEN, + ClickhouseReferenceDataset.GNOMAD_EXOMES, + ClickhouseReferenceDataset.GNOMAD_GENOMES, + ClickhouseReferenceDataset.HGMD, + ClickhouseReferenceDataset.SPLICE_AI, + ClickhouseReferenceDataset.TOPMED, + ], + (ReferenceGenome.GRCh38, DatasetType.SNV_INDEL): [ + ClickhouseReferenceDataset.ABSPLICE2, + ClickhouseReferenceDataset.CLINVAR, + ClickhouseReferenceDataset.DBNSFP, + ClickhouseReferenceDataset.EIGEN, + ClickhouseReferenceDataset.GNOMAD_EXOMES, + ClickhouseReferenceDataset.GNOMAD_GENOMES, + ClickhouseReferenceDataset.GNOMAD_NON_CODING_CONSTRAINT, + ClickhouseReferenceDataset.HGMD, + ClickhouseReferenceDataset.PEXT, + ClickhouseReferenceDataset.PROMOTER_AI, + ClickhouseReferenceDataset.SCREEN, + ClickhouseReferenceDataset.SPLICE_AI, + ClickhouseReferenceDataset.TOPMED, + ], + }[(reference_genome, dataset_type)] + + @property + def search_is_join_table(self): + return self in { + ClickhouseReferenceDataset.CLINVAR, + ClickhouseReferenceDataset.HGMD, + } + + def all_variants_path(self, table_name_builder: TableNameBuilder) -> str: + return ( + f'{table_name_builder.dst_prefix}/reference_data/{self.value}/all_variants`' + ) + + def seqr_variants_path(self, table_name_builder: TableNameBuilder) -> str: + return f'{table_name_builder.dst_prefix}/reference_data/{self.value}/seqr_variants`' + + def search_path(self, table_name_builder: TableNameBuilder) -> str: + return f'{table_name_builder.dst_prefix}/reference_data/{self.value}`' + + def all_variants_mv( + self, + table_name_builder: TableNameBuilder, + ) -> str: + return f'{table_name_builder.dst_prefix}/reference_data/{self.value}/all_variants_mv`' + + def all_variants_to_seqr_variants_mv( + self, + table_name_builder: TableNameBuilder, + ) -> str: + return f'{table_name_builder.dst_prefix}/reference_data/{self.value}/all_variants_to_seqr_variants_mv`' + + def seqr_variants_to_search_mv_path( + self, + table_name_builder: TableNameBuilder, + ) -> str: + return f'{table_name_builder.dst_prefix}/reference_data/{self.value}/seqr_variants_to_search_mv`' + + def refresh_search( + self, + table_name_builder: TableNameBuilder, + ) -> str: + if self.search_is_join_table: + logged_query( + f""" + SYSTEM START VIEW {self.seqr_variants_to_search_mv_path(table_name_builder)} + """, + ) + logged_query( + f""" + SYSTEM REFRESH VIEW {self.seqr_variants_to_search_mv_path(table_name_builder)} + """, + ) + logged_query( + f""" + SYSTEM WAIT VIEW {self.seqr_variants_to_search_mv_path(table_name_builder)} + """, + timeout=WAIT_VIEW_TIMEOUT_S, + ) + else: + logged_query( + f""" + SYSTEM RELOAD DICTIONARY {self.search_path(table_name_builder)} + """, + ) + + def insert_into_seqr_variants_and_refresh_search( + self, + table_name_builder: TableNameBuilder, + ): + if not self.has_seqr_variants: + return + exists_seqr_variants = logged_query( + f'EXISTS TABLE {self.seqr_variants_path(table_name_builder)}', + )[0][0] + if not exists_seqr_variants: + return + drop_staging_db() + logged_query( + f""" + CREATE DATABASE {STAGING_CLICKHOUSE_DATABASE} + """, + ) + logged_query( + f""" + CREATE TABLE {table_name_builder.staging_dst_prefix}/_tmp_loadable_variantIds` ENGINE = Set AS ( + SELECT {ClickHouseTable.KEY_LOOKUP.key_field} + FROM {table_name_builder.src_table(ClickHouseTable.KEY_LOOKUP)} + ) + """, # nosec B608 + ) + logged_query( + f""" + INSERT INTO {self.seqr_variants_path(table_name_builder)} + SELECT + DISTINCT ON (key) + dst.key, + COLUMNS('.*') EXCEPT(version, variantId, key) + FROM {self.all_variants_path(table_name_builder)} src + INNER JOIN {table_name_builder.dst_table(ClickHouseTable.KEY_LOOKUP)} dst + ON {ClickHouseTable.KEY_LOOKUP.join_condition} + WHERE src.variantId IN {table_name_builder.staging_dst_prefix}/_tmp_loadable_variantIds` + """, # nosec B608 + ) + self.refresh_search(table_name_builder) + + def download_and_fully_refresh( + self, + table_name_builder: TableNameBuilder, + ): + logged_query( + f""" + SYSTEM START VIEW {self.all_variants_mv(table_name_builder)} + """, + ) + logged_query( + f""" + SYSTEM REFRESH VIEW {self.all_variants_mv(table_name_builder)} + """, + ) + logged_query( + f""" + SYSTEM WAIT VIEW {self.all_variants_mv(table_name_builder)} + """, + timeout=self.all_variants_mv_timeout, + ) + if self.has_seqr_variants: + logged_query( + f""" + SYSTEM START VIEW {self.all_variants_to_seqr_variants_mv(table_name_builder)} + """, + ) + logged_query( + f""" + SYSTEM REFRESH VIEW {self.all_variants_to_seqr_variants_mv(table_name_builder)} + """, + ) + logged_query( + f""" + SYSTEM WAIT VIEW {self.all_variants_to_seqr_variants_mv(table_name_builder)} + """, + timeout=self.all_variants_mv_timeout, + ) + self.refresh_search(table_name_builder) + + +def logged_query(query, params=None, timeout: int | None = None): + client = get_clickhouse_client(timeout) + sanitized_query = query + if Env.CLICKHOUSE_WRITER_PASSWORD: + sanitized_query = sanitized_query.replace( + Env.CLICKHOUSE_WRITER_PASSWORD, + REDACTED, + ) + logger.info(f'Executing query: {sanitized_query} | Params: {params}') + return client.execute(query, params) + + +def drop_staging_db(): + logged_query(f'DROP DATABASE IF EXISTS {STAGING_CLICKHOUSE_DATABASE};') + + +def create_staging_tables( + table_name_builder: TableNameBuilder, + clickhouse_tables: list[ClickHouseTable], +) -> None: + logged_query( + f""" + CREATE DATABASE {STAGING_CLICKHOUSE_DATABASE} + """, + ) + for clickhouse_table in clickhouse_tables: + logged_query( + f""" + CREATE + TABLE {table_name_builder.staging_dst_table(clickhouse_table)} + AS {table_name_builder.dst_table(clickhouse_table)} + """, + ) + + +def get_create_mv_statements( + table_name_builder: TableNameBuilder, + clickhouse_mv: ClickHouseMaterializedView, +) -> tuple[str, str]: + return logged_query( + """ + SELECT create_table_query, as_select FROM system.tables + WHERE + engine = 'MaterializedView' + AND database = %(database)s + AND name = %(name)s + """, + { + 'database': Env.CLICKHOUSE_DATABASE, + 'name': table_name_builder.dst_table(clickhouse_mv) + .split('.')[1] + .replace('`', ''), + }, + )[0] + + +def normalize_partition(partition: str) -> tuple: + """ + Ensure a ClickHouse partition expression is always returned as a tuple. + 'project_d' -> ('project_d',) + "('project_d', 0)" -> ('project_d', 0) + """ + if not isinstance(partition, str): + msg = f'Unsupported partition type: {type(partition)}' + raise TypeError(msg) + partition = partition.strip() + if partition.startswith('(') and partition.endswith(')'): + return ast.literal_eval(partition) + return (partition,) + + +def get_partitions_for_projects( + table_name_builder: TableNameBuilder, + clickhouse_table: ClickHouseTable, + project_guids: list[str], + staging=False, +): + rows = logged_query( + """ + SELECT DISTINCT partition + FROM system.parts + WHERE + database = %(database)s + AND table = %(table)s + AND multiSearchAny(partition, %(project_guids)s) + """, + { + 'database': STAGING_CLICKHOUSE_DATABASE + if staging + else Env.CLICKHOUSE_DATABASE, + 'table': ( + table_name_builder.staging_dst_table(clickhouse_table) + if staging + else table_name_builder.dst_table(clickhouse_table) + ) + .split('.')[1] + .replace('`', ''), + 'project_guids': project_guids, + }, + ) + return [normalize_partition(row[0]) for row in rows] + + +def create_staging_materialized_views( + table_name_builder: TableNameBuilder, + clickhouse_mvs: list[ClickHouseMaterializedView], + mv_overrides: dict[ClickHouseMaterializedView, list[list[str]]] | None = None, +): + for clickhouse_mv in clickhouse_mvs: + create_table_statement = get_create_mv_statements( + table_name_builder, + clickhouse_mv, + )[0] + create_table_statement = create_table_statement.replace( + table_name_builder.dst_prefix, + table_name_builder.staging_dst_prefix, + ) + for override in (mv_overrides or {}).get(clickhouse_mv, []): + create_table_statement = create_table_statement.replace(*override) + logged_query(create_table_statement) + + +# Note that this function is NOT idemptotent. Clickhouse permits +# attaching the same partition to a table multiple times. +def stage_existing_project_partitions( + table_name_builder: TableNameBuilder, + project_guids: list[str], + clickhouse_tables: list[ClickHouseTable], +): + for clickhouse_table in clickhouse_tables: + # Very important piece here: + # ALL projects in the project_gt_stats table are staged, allowing us to rebuild + # a production-quality gt_stats materialized view in the staging environment. + if clickhouse_table == ClickHouseTable.PROJECT_GT_STATS: + logged_query( + f""" + ALTER TABLE {table_name_builder.staging_dst_table(clickhouse_table)} + ATTACH PARTITION ALL FROM {table_name_builder.dst_table(clickhouse_table)} + """, + ) + continue + for partition in get_partitions_for_projects( + table_name_builder, + clickhouse_table, + project_guids, + ): + # Note that ClickHouse successfully handles the case where the project + # does not already exist in the dst table. We simply attach an empty partition! + logged_query( + f""" + ALTER TABLE {table_name_builder.staging_dst_table(clickhouse_table)} + ATTACH PARTITION %(partition)s FROM {table_name_builder.dst_table(clickhouse_table)} + """, + {'partition': partition}, + ) + + +def delete_existing_families_from_staging_entries( + table_name_builder: TableNameBuilder, + family_guids: list[str], +) -> None: + logged_query( + f""" + INSERT INTO {table_name_builder.staging_dst_table(ClickHouseTable.ENTRIES)} + SELECT COLUMNS('.*') EXCEPT(sign, n_partitions, partition_id), -1 as sign + FROM {table_name_builder.staging_dst_table(ClickHouseTable.ENTRIES)} + WHERE family_guid in %(family_guids)s + """, # nosec B608 + {'family_guids': family_guids}, + ) + + +def insert_new_entries( + table_name_builder: TableNameBuilder, +) -> None: + dst_cols = [ + r[0] + for r in logged_query( + f'DESCRIBE TABLE {table_name_builder.staging_dst_table(ClickHouseTable.ENTRIES)}', + ) + ] + src_cols = [ + r[0] + for r in logged_query( + f'DESCRIBE TABLE {table_name_builder.src_table(ClickHouseTable.ENTRIES)}', + ) + ] + common, overrides = [c for c in dst_cols if c in src_cols], {} + if 'geneId_ids' in dst_cols and 'geneIds' in src_cols: + common = [c for c in common if c not in ('geneId_ids', 'geneIds')] + common.append('geneId_ids') + overrides['geneId_ids'] = f""" + arrayFilter( + x -> x IS NOT NULL, + arrayMap( + g -> dictGetOrNull( + {Env.CLICKHOUSE_DATABASE}.`seqrdb_gene_ids`, + 'seqrdb_id', + g + ), + geneIds + ) + ) + """ + + if ( + 'is_gnomad_gt_5_percent' in dst_cols + and 'is_gnomad_gt_5_percent' not in src_cols + ): + common.append('is_gnomad_gt_5_percent') + overrides['is_gnomad_gt_5_percent'] = f""" + dictGetOrDefault({ClickhouseReferenceDataset.GNOMAD_GENOMES.search_path(table_name_builder)}, 'filter_af', key, 0) > 0.05 + """ + + dst_list = ', '.join(common) + src_list = ', '.join([overrides.get(c, c) for c in common]) + logged_query( + f""" + INSERT INTO {table_name_builder.staging_dst_table(ClickHouseTable.ENTRIES)} ({dst_list}) + SELECT {src_list} + FROM {table_name_builder.src_table(ClickHouseTable.ENTRIES)} + """, # nosec B608 + ) + + +@retry(tries=2) +def optimize_entries( + table_name_builder: TableNameBuilder, + project_guids: list[str], +) -> None: + max_attempts = 10 + for attempt in range(max_attempts): + decrs_exist = logged_query( + f""" + SELECT EXISTS ( + SELECT 1 + FROM {table_name_builder.staging_dst_table(ClickHouseTable.ENTRIES)} + WHERE sign = -1 + ); + """, # nosec B608 + )[0][0] + + merges_running = logged_query( + """ + SELECT EXISTS ( + SELECT 1 + FROM system.merges + WHERE database = %(database)s + AND table = %(table)s + ); + """, + { + 'database': STAGING_CLICKHOUSE_DATABASE, + 'table': table_name_builder.staging_dst_table(ClickHouseTable.ENTRIES) + .split('.')[1] + .replace('`', ''), + }, + )[0][0] + + if not decrs_exist: + return + + if merges_running: + logger.info( + 'Decrs exist and merges are running, so waiting (attempt %d/%d)', + attempt + 1, + max_attempts, + ) + else: + logger.info( + 'Decrs exist and no merges are running, so optimizing (attempt %d/%d)', + attempt + 1, + max_attempts, + ) + + partitions = get_partitions_for_projects( + table_name_builder, + ClickHouseTable.ENTRIES, + project_guids, + staging=True, + ) + table_name = table_name_builder.staging_dst_table( + ClickHouseTable.ENTRIES, + ) + optimize_statements = [ + f'OPTIMIZE TABLE {table_name} PARTITION {partition} FINAL' + for partition in partitions + ] + parallel_optimize_sql = '\nPARALLEL WITH\n'.join(optimize_statements) + + logged_query( + parallel_optimize_sql, + timeout=OPTIMIZE_TABLE_TIMEOUT_S, + ) + + time.sleep(Env.CLICKHOUSE_OPTIMIZE_TABLE_WAIT_S) + msg = f'Entries table still contains decrement rows after {max_attempts} attempts.' + raise TimeoutError(msg) + + +@retry(tries=2) +def refresh_materialized_views( + table_name_builder, + materialized_views: list[ClickHouseMaterializedView], + staging=False, +): + for materialized_view in materialized_views: + logged_query( + f""" + SYSTEM START VIEW {table_name_builder.staging_dst_table(materialized_view) if staging else table_name_builder.dst_table(materialized_view)} + """, + ) + logged_query( + f""" + SYSTEM REFRESH VIEW {table_name_builder.staging_dst_table(materialized_view) if staging else table_name_builder.dst_table(materialized_view)} + """, + ) + logged_query( + f""" + SYSTEM WAIT VIEW {table_name_builder.staging_dst_table(materialized_view) if staging else table_name_builder.dst_table(materialized_view)} + """, + timeout=WAIT_VIEW_TIMEOUT_S, + ) + + +def validate_family_guid_counts( + table_name_builder: TableNameBuilder, + project_guids: list[str], + family_guids: list[str], +) -> None: + query = Template( + """ + SELECT family_guid, COUNT(*) + FROM $table_name + WHERE project_guid in %(project_guids)s + AND family_guid in %(family_guids)s + GROUP BY 1 + """, + ) + src_family_counts = dict( + logged_query( + query.substitute( + table_name=table_name_builder.src_table( + ClickHouseTable.ENTRIES, + ), + ), + {'family_guids': family_guids, 'project_guids': project_guids}, + ), + ) + dst_family_counts = dict( + logged_query( + query.substitute( + table_name=table_name_builder.staging_dst_table( + ClickHouseTable.ENTRIES, + ), + ), + {'family_guids': family_guids, 'project_guids': project_guids}, + ), + ) + if src_family_counts != dst_family_counts: + msg = 'Loaded Row counts are different than expected.' + raise ValueError(msg) + + +@retry(tries=2) +def reload_dictionaries( + table_name_builder: TableNameBuilder, + dictionaries: list[ClickHouseDictionary], +): + for dictionary in dictionaries: + logged_query( + f""" + SYSTEM RELOAD DICTIONARY {table_name_builder.dst_table(dictionary)} + """, # nosec B608 + ) + + +def replace_project_partitions( + table_name_builder: TableNameBuilder, + clickhouse_tables: list[ClickHouseTable], + project_guids: list[str], +) -> None: + for clickhouse_table in clickhouse_tables: + for partition in get_partitions_for_projects( + table_name_builder, + clickhouse_table, + project_guids, + staging=True, + ): + logged_query( + f""" + ALTER TABLE {table_name_builder.dst_table(clickhouse_table)} + REPLACE PARTITION %(partition)s FROM {table_name_builder.staging_dst_table(clickhouse_table)} + """, # nosec B608 + {'partition': partition}, + ) + + +# Note this is NOT idempotent, as running the swap twice will +# result in the tables not being swapped. +def exchange_tables( + table_name_builder, + clickhouse_tables: list[ClickHouseTable], +) -> None: + for clickhouse_table in clickhouse_tables: + logged_query( + f""" + EXCHANGE TABLES {table_name_builder.staging_dst_table(clickhouse_table)} AND {table_name_builder.dst_table(clickhouse_table)} + """, # nosec B608 + ) + + +def direct_insert_annotations( + table_name_builder: TableNameBuilder, + **_, +) -> None: + dst_table = table_name_builder.dst_table(ClickHouseTable.VARIANTS_MEMORY) + src_table = table_name_builder.src_table(ClickHouseTable.VARIANTS_MEMORY) + drop_staging_db() + logged_query( + f""" + CREATE DATABASE {STAGING_CLICKHOUSE_DATABASE} + """, # nosec B608 + ) + # NB: Unfortunately there's a bug(?) or inaccuracy if this is attempted without an intermediate + # temporary table, likely due to writing to a table and joining against it at the same time. + logged_query( + f""" + CREATE TABLE {table_name_builder.staging_dst_prefix}/_tmp_loadable_keys` ENGINE = Set AS ( + SELECT {ClickHouseTable.VARIANTS_MEMORY.key_field} + FROM {src_table} src + LEFT ANTI JOIN {dst_table} dst + ON {ClickHouseTable.VARIANTS_MEMORY.join_condition} + ) + """, # nosec B608 + ) + for ( + clickhouse_table + ) in ClickHouseTable.for_dataset_type_disk_backed_variants_tables( + table_name_builder.dataset_type, + ): + disk_backed_dst_table = table_name_builder.dst_table(clickhouse_table) + disk_backed_src_table = table_name_builder.src_table(clickhouse_table) + logged_query( + f""" + INSERT INTO {disk_backed_dst_table} + SELECT {clickhouse_table.select_fields} + FROM {disk_backed_src_table} WHERE {clickhouse_table.key_field} IN {table_name_builder.staging_dst_prefix}/_tmp_loadable_keys` + """, # nosec B608 + ) + logged_query( + f""" + INSERT INTO {dst_table} + SELECT {ClickHouseTable.VARIANTS_MEMORY.select_fields} + FROM {src_table} WHERE {ClickHouseTable.VARIANTS_MEMORY.key_field} IN {table_name_builder.staging_dst_prefix}/_tmp_loadable_keys` + """, # nosec B608 + ) + drop_staging_db() + + +def direct_insert_all_keys( + clickhouse_table: ClickHouseTable, + table_name_builder: TableNameBuilder, + **_, +) -> None: + dst_table = table_name_builder.dst_table(clickhouse_table) + src_table = table_name_builder.src_table(clickhouse_table) + settings = '' + # Large variant details inserts may OOM + if clickhouse_table == ClickHouseTable.VARIANT_DETAILS: + settings = 'SETTINGS max_insert_threads = 2' + logged_query( + f""" + INSERT INTO {dst_table} + SELECT {clickhouse_table.select_fields} + FROM {src_table} + {settings} + """, # nosec B608 + ) + + +def export_existing_variants_to_parquet( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, + export_select_fields: str, +) -> None: + table_name_builder = TableNameBuilder( + reference_genome, + dataset_type, + run_id, + ) + variants_table = table_name_builder.dst_table( + ClickHouseTable.VARIANT_DETAILS + if dataset_type.should_write_new_variant_details + else ClickHouseTable.VARIANTS_MEMORY, + ) + export_table = table_name_builder.src_table( + ClickHouseTable.EXISTING_VARIANTS, + ).replace( + '/*.parquet', + '', + ) + logged_query( + f""" + INSERT INTO FUNCTION {export_table} + SELECT {export_select_fields} + FROM {variants_table} + """, # nosec B608 + ) + + +# This is a smattering of shared operations that lacks a better name :/ +def finalize_refresh_flow( + table_name_builder: TableNameBuilder, + project_guids: list[str], +): + dataset_type = table_name_builder.dataset_type + refresh_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update_refreshable( + dataset_type, + ), + staging=True, + ) + replace_project_partitions( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update_project_partitioned( + dataset_type, + ), + project_guids, + ) + exchange_tables( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update_unpartitioned( + dataset_type, + ), + ) + drop_staging_db() + reload_dictionaries( + table_name_builder, + ClickHouseDictionary.for_dataset_type(dataset_type), + ) + + +def atomic_insert_entries( + table_name_builder: TableNameBuilder, + project_guids: list[str], + family_guids: list[str], + **_, +) -> None: + dataset_type = table_name_builder.dataset_type + drop_staging_db() + create_staging_tables( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update(dataset_type), + ) + + mv_overrides = None + ordered_mv_table = None + if dataset_type == DatasetType.SNV_INDEL: + # Create a copy of the PROJECT_GT_STATS table ordered by key for the GT_STATS materialized view source + # This allows clickhouse to utilize a memory optimized group by only available for sorted tables + table_suffix = 'key_ordered' + base_table = table_name_builder.staging_dst_table( + ClickHouseTable.PROJECT_GT_STATS, + ) + ordered_mv_table = f'{base_table[:-1]}/{table_suffix}`' + logged_query(f'CREATE TABLE {ordered_mv_table} AS {base_table} ORDER BY key') + mv_overrides = { + ClickHouseMaterializedView.PROJECT_GT_STATS_TO_GT_STATS_MV: [ + [base_table, ordered_mv_table], + [ + 'GROUP BY key', + 'GROUP BY key SETTINGS max_memory_usage=10000000000, max_bytes_before_external_group_by=5000000000, optimize_aggregation_in_order=1', + ], + ], + } + + create_staging_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update( + dataset_type, + ), + mv_overrides=mv_overrides, + ) + stage_existing_project_partitions( + table_name_builder, + project_guids, + ClickHouseTable.for_dataset_type_atomic_entries_update_project_partitioned( + dataset_type, + ), + ) + delete_existing_families_from_staging_entries( + table_name_builder, + family_guids, + ) + insert_new_entries( + table_name_builder, + ) + optimize_entries( + table_name_builder, + project_guids, + ) + validate_family_guid_counts( + table_name_builder, + project_guids, + family_guids, + ) + if ordered_mv_table: + logged_query( + f""" + INSERT INTO {ordered_mv_table} + SELECT * + FROM {table_name_builder.staging_dst_table(ClickHouseTable.PROJECT_GT_STATS)} + """, # nosec B608 + ) + finalize_refresh_flow(table_name_builder, project_guids) + + +@retry() +def load_run_variants( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +): + msg = f'Attempting load of variants for run: {reference_genome.value}/{dataset_type.value}/{run_id}' + logger.info(msg) + table_name_builder = TableNameBuilder( + reference_genome, + dataset_type, + run_id, + ) + for clickhouse_table in ClickHouseTable.for_dataset_type(dataset_type): + clickhouse_table.insert( + table_name_builder=table_name_builder, + ) + for ( + clickhouse_reference_data + ) in ClickhouseReferenceDataset.for_reference_genome_dataset_type( + reference_genome, + dataset_type, + ): + clickhouse_reference_data.insert_into_seqr_variants_and_refresh_search( + table_name_builder=table_name_builder, + ) + + +@retry() +def load_run_entries( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, + project_guids: list[str], + family_guids: list[str], +): + msg = f'Attempting load of entries for run: {reference_genome.value}/{dataset_type.value}/{run_id}' + logger.info(msg) + table_name_builder = TableNameBuilder( + reference_genome, + dataset_type, + run_id, + ) + atomic_insert_entries( + table_name_builder=table_name_builder, + project_guids=project_guids, + family_guids=family_guids, + ) + + +@retry() +def delete_family_guids( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, + project_guid: str, + family_guids: list[str], +): + msg = f'Attempting delete families for {reference_genome.value}/{dataset_type.value} {project_guid}: {family_guids}' + logger.info(msg) + table_name_builder = TableNameBuilder( + reference_genome, + dataset_type, + run_id, + ) + entries_exist = logged_query( + f""" + SELECT EXISTS ( + SELECT 1 + FROM {table_name_builder.dst_table(ClickHouseTable.ENTRIES)} + WHERE project_guid = %(project_guid)s + AND has(%(family_guids)s, family_guid) + ); + """, # nosec B608 + {'family_guids': family_guids, 'project_guid': project_guid}, + )[0][0] + if not entries_exist: + msg = f'No data exists for {reference_genome.value} & {dataset_type.value} so skipping' + logger.info(msg) + return + project_guids = [project_guid] + drop_staging_db() + create_staging_tables( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update(dataset_type), + ) + create_staging_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update( + dataset_type, + ), + ) + stage_existing_project_partitions( + table_name_builder, + project_guids, + ClickHouseTable.for_dataset_type_atomic_entries_update_project_partitioned( + dataset_type, + ), + ) + delete_existing_families_from_staging_entries( + table_name_builder, + family_guids, + ) + optimize_entries( + table_name_builder, + project_guids, + ) + finalize_refresh_flow(table_name_builder, project_guids) + + +@retry() +def rebuild_gt_stats( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, + project_guids: list[str], +) -> None: + if ClickHouseDictionary.GT_STATS_DICT not in ClickHouseDictionary.for_dataset_type( + dataset_type, + ): + msg = f'Skipping gt stats rebuild for {reference_genome.value}/{dataset_type.value} {project_guids[:10]}...' + logger.info(msg) + return + table_name_builder = TableNameBuilder( + reference_genome, + dataset_type, + run_id, + ) + max_key = logged_query( + f""" + SELECT max(key) FROM {table_name_builder.dst_table(ClickHouseTable.GT_STATS)} + """, # nosec B608 + )[0][0] + if not max_key: + msg = f'Skipping gt stats rebuild for empty dataset {reference_genome.value}/{dataset_type.value} {project_guids[:10]}...' + logger.info(msg) + return + msg = f'Attempting rebuild gt stats for {reference_genome.value}/{dataset_type.value} {project_guids[:10]}...' + logger.info(msg) + drop_staging_db() + create_staging_tables( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update(dataset_type), + ) + create_staging_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update( + dataset_type, + ), + ) + stage_existing_project_partitions( + table_name_builder, + project_guids, + ClickHouseTable.for_dataset_type_atomic_entries_update_project_partitioned( + dataset_type, + ), + ) + for partition in get_partitions_for_projects( + table_name_builder, + ClickHouseTable.PROJECT_GT_STATS, + project_guids, + staging=True, + ): + logged_query( + f""" + ALTER TABLE {table_name_builder.staging_dst_table(ClickHouseTable.PROJECT_GT_STATS)} + DROP PARTITION %(partition)s + """, # nosec B608 + {'partition': partition}, + ) + select_statement = get_create_mv_statements( + table_name_builder, + ClickHouseMaterializedView.ENTRIES_TO_PROJECT_GT_STATS_MV, + )[1] + select_statement = select_statement.replace( + table_name_builder.dst_prefix, + table_name_builder.staging_dst_prefix, + ) + # NB: encountered OOMs with large projects, necessitating sharding the insertion query. + step = math.ceil(max_key / 5) + for range_start in range(0, max_key, step): + range_end = min(range_start + step, max_key + 1) + logged_query( + f""" + INSERT INTO { + table_name_builder.staging_dst_table(ClickHouseTable.PROJECT_GT_STATS) + } + { + select_statement.replace( + 'GROUP BY project_guid', + 'WHERE key >= %(range_start)s AND key < %(range_end)s GROUP BY project_guid', + ) + } + """, + {'range_start': range_start, 'range_end': range_end}, + ) + finalize_refresh_flow(table_name_builder, project_guids) + + +@retry() +def refresh_clickhouse_reference_data( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, + reference_dataset: ClickhouseReferenceDataset, +): + if not reference_dataset.fully_refreshable: + msg = f'Skipping reference dataset refresh for {reference_dataset.value} for {reference_genome.value}/{dataset_type.value}..' + logger.info(msg) + return + msg = f'Attempting refresh reference dataset {reference_dataset.value} for {reference_genome.value}/{dataset_type.value} ... ' + logger.info(msg) + table_name_builder = TableNameBuilder( + reference_genome, + dataset_type, + run_id, + ) + reference_dataset.download_and_fully_refresh(table_name_builder) + + +def get_clickhouse_client( + timeout: int | None = None, + database: str | None = None, +) -> Client: + return Client( + host=Env.CLICKHOUSE_SERVICE_HOSTNAME, + port=Env.CLICKHOUSE_SERVICE_PORT, + user=Env.CLICKHOUSE_WRITER_USER, + password=Env.CLICKHOUSE_WRITER_PASSWORD, + **{'database': database} if database else {}, + **{'send_receive_timeout': timeout} if timeout else {}, + **{ + 'settings': { + 'send_timeout': timeout, + 'receive_timeout': timeout, + }, + } + if timeout + else {}, + ) diff --git a/loading_pipeline/lib/misc/clickhouse_test.py b/loading_pipeline/lib/misc/clickhouse_test.py new file mode 100644 index 0000000000..1126671b17 --- /dev/null +++ b/loading_pipeline/lib/misc/clickhouse_test.py @@ -0,0 +1,1228 @@ +import os +from typing import ClassVar +from unittest.mock import patch + +import pandas as pd +import pyarrow as pa +import pyarrow.parquet as pq +from django.db import connections + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.misc.clickhouse import ( + STAGING_CLICKHOUSE_DATABASE, + ClickHouseDictionary, + ClickHouseMaterializedView, + ClickhouseReferenceDataset, + ClickHouseTable, + TableNameBuilder, + create_staging_materialized_views, + create_staging_tables, + delete_existing_families_from_staging_entries, + delete_family_guids, + direct_insert_all_keys, + exchange_tables, + get_clickhouse_client, + insert_new_entries, + load_run_entries, + load_run_variants, + logged_query, + normalize_partition, + optimize_entries, + rebuild_gt_stats, + refresh_materialized_views, + reload_dictionaries, + replace_project_partitions, + stage_existing_project_partitions, +) +from loading_pipeline.lib.paths import ( + new_entries_parquet_path, + new_variant_details_parquet_path, + new_variants_parquet_path, + runs_path, +) +from loading_pipeline.lib.test.clickhouse_schema_testcase import ( + ClickhouseSchemaTestCase, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_RUN_ID = 'manual__2025-05-07T17-20-59.702114+00-00' + +_FIVEUTR_ANNOTATION_TYPE = pa.struct( + [ + ('AltStop', pa.string()), + ('AltStopDistanceToCDS', pa.int32()), + ('CapDistanceToStart', pa.int32()), + ('DistanceToCDS', pa.int32()), + ('DistanceToStop', pa.int32()), + ('Evidence', pa.bool_()), + ('FrameWithCDS', pa.string()), + ('KozakContext', pa.string()), + ('KozakStrength', pa.string()), + ('StartDistanceToCDS', pa.int32()), + ('alt_type', pa.string()), + ('alt_type_length', pa.int32()), + ('newSTOPDistanceToCDS', pa.int32()), + ('ref_StartDistanceToCDS', pa.int32()), + ('ref_type', pa.string()), + ('ref_type_length', pa.int32()), + ('type', pa.string()), + ], +) +_UTRANNOTATOR_TYPE = pa.struct( + [ + ('existingInframeOorfs', pa.int32()), + ('existingOutofframeOorfs', pa.int32()), + ('existingUorfs', pa.int32()), + ('fiveutrAnnotation', _FIVEUTR_ANNOTATION_TYPE), + ('fiveutrConsequence', pa.string()), + ], +) +_TRANSCRIPT_TYPE = pa.struct( + [ + ('alphamissense', pa.struct([('pathogenicity', pa.float64())])), + ('aminoAcids', pa.string()), + ('biotype', pa.string()), + ('canonical', pa.int32()), + ('codons', pa.string()), + ('consequenceTerms', pa.list_(pa.string())), + ('exon', pa.struct([('index', pa.int32()), ('total', pa.int32())])), + ('geneId', pa.string()), + ('hgvsc', pa.string()), + ('hgvsp', pa.string()), + ('intron', pa.struct([('index', pa.int32()), ('total', pa.int32())])), + ( + 'loftee', + pa.struct( + [('isLofNagnag', pa.bool_()), ('lofFilters', pa.list_(pa.string()))], + ), + ), + ('majorConsequence', pa.string()), + ('manePlusClinical', pa.string()), + ('maneSelect', pa.string()), + ('refseqTranscriptId', pa.string()), + ( + 'spliceregion', + pa.struct([('extended_intronic_splice_region_variant', pa.bool_())]), + ), + ('transcriptId', pa.string()), + ('transcriptRank', pa.int32()), + ('utrannotator', _UTRANNOTATOR_TYPE), + ], +) +_MOTIF_CONSEQUENCE_TYPE = pa.struct( + [ + ('consequenceTerms', pa.list_(pa.string())), + ('motifFeatureId', pa.string()), + ], +) +_REGULATORY_CONSEQUENCE_TYPE = pa.struct( + [ + ('biotype', pa.string()), + ('consequenceTerms', pa.list_(pa.string())), + ('regulatoryFeatureId', pa.string()), + ], +) +VARIANT_DETAILS_SCHEMA = pa.schema( + [ + ('key', pa.int64()), + ('variantId', pa.string()), + ('liftedOverChrom', pa.string()), + ('liftedOverPos', pa.int64()), + ('rsid', pa.string()), + ('CAID', pa.string()), + ('transcripts', pa.list_(_TRANSCRIPT_TYPE)), + ('sortedMotifFeatureConsequences', pa.list_(_MOTIF_CONSEQUENCE_TYPE)), + ('sortedRegulatoryFeatureConsequences', pa.list_(_REGULATORY_CONSEQUENCE_TYPE)), + ], +) +_FULL_TRANSCRIPT = { + 'alphamissense': {'pathogenicity': 0.5}, + 'aminoAcids': 'S/L', + 'biotype': 'protein_coding', + 'canonical': 1, + 'codons': 'tCg/tTg', + 'consequenceTerms': ['missense_variant'], + 'exon': {'index': 6, 'total': 14}, + 'geneId': 'ENSG00000187634', + 'hgvsc': 'ENST00000616016.5:c.1049C>T', + 'hgvsp': 'ENSP00000478421.2:p.Ser350Leu', + 'intron': None, + 'loftee': {'isLofNagnag': False, 'lofFilters': []}, + 'majorConsequence': 'missense_variant', + 'manePlusClinical': None, + 'maneSelect': 'NM_001385641.1', + 'refseqTranscriptId': 'NM_001385641.1', + 'spliceregion': {'extended_intronic_splice_region_variant': False}, + 'transcriptId': 'ENST00000616016', + 'transcriptRank': 0, + 'utrannotator': { + 'existingInframeOorfs': None, + 'existingOutofframeOorfs': None, + 'existingUorfs': None, + 'fiveutrAnnotation': { + 'AltStop': None, + 'AltStopDistanceToCDS': None, + 'CapDistanceToStart': None, + 'DistanceToCDS': 41, + 'DistanceToStop': None, + 'Evidence': None, + 'FrameWithCDS': None, + 'KozakContext': 'CGCATGC', + 'KozakStrength': 'Weak', + 'StartDistanceToCDS': None, + 'alt_type': None, + 'alt_type_length': None, + 'newSTOPDistanceToCDS': None, + 'ref_StartDistanceToCDS': None, + 'ref_type': None, + 'ref_type_length': None, + 'type': 'OutOfFrame_oORF', + }, + 'fiveutrConsequence': None, + }, +} +_FULL_MOTIF_CONSEQUENCE = { + 'consequenceTerms': ['TFBS_ablation'], + 'motifFeatureId': 'ENSM00000123', +} +_FULL_REGULATORY_CONSEQUENCE = { + 'biotype': 'enhancer', + 'consequenceTerms': ['regulatory_region_ablation'], + 'regulatoryFeatureId': 'ENSR00000123', +} + + +class ClickhouseTest(MockedDatarootTestCase, ClickhouseSchemaTestCase): + fixtures: ClassVar = ['clickhouse_test'] + + @classmethod + def setUpClass(cls): + super().setUpClass() + # Postgres dicts are not managed by django in this test suite and therefore cannot be loaded from fixtures + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + f'INSERT INTO {Env.CLICKHOUSE_DATABASE}.`seqrdb_gene_ids_src` VALUES', + [('GENE1', 123), ('GENE2', 12), ('GENE3', 1)], + ) + cursor.execute( + f'SYSTEM RELOAD DICTIONARY {Env.CLICKHOUSE_DATABASE}.`seqrdb_gene_ids`', + ) + + def setUp(self): + super().setUp() + base_path = runs_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + ) + os.makedirs(os.path.join(base_path, TEST_RUN_ID), exist_ok=True) + + def write_test_parquet(df: pd.DataFrame, parquet_path: str, schema=None): + if schema: + table = pa.Table.from_pandas(df, schema=schema) + else: + table = pa.Table.from_pandas(df) + os.makedirs(parquet_path) + pq.write_table( + table, + os.path.join( + parquet_path, + 'test.parquet', + ), + ) + + # Variant Details Parquet + df = pd.DataFrame( + { + 'key': [1, 2, 3, 4], + 'variantId': [ + '1-13-A-C', + '2-14-A-T', + 'Y-19-A-C', + 'M-12-C-G', + ], + 'transcripts': [[_FULL_TRANSCRIPT], [], [], []], + 'liftedOverChrom': ['1', None, None, None], + 'liftedOverPos': [13, None, None, None], + 'rsid': ['rs123', None, None, None], + 'CAID': ['CA123456', None, None, None], + 'sortedMotifFeatureConsequences': [ + [_FULL_MOTIF_CONSEQUENCE], + [], + [], + [], + ], + 'sortedRegulatoryFeatureConsequences': [ + [_FULL_REGULATORY_CONSEQUENCE], + [], + [], + [], + ], + }, + ) + write_test_parquet( + df, + new_variant_details_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + VARIANT_DETAILS_SCHEMA, + ) + + # New Variants parquet. + df = pd.DataFrame( + { + 'key': [10, 11, 12, 13], + 'variantId': [ + '1-3-A-C', + '2-4-A-T', + 'Y-9-A-C', + 'M-2-C-G', + ], + }, + ) + write_test_parquet( + df, + new_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + write_test_parquet( + df, + new_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ), + ) + + # New Entries Parquet + df = pd.DataFrame( + { + 'key': [10, 3, 4], + 'project_guid': [ + 'project_d', + 'project_d', + 'project_d', + ], + 'family_guid': [ + 'family_d1', + 'family_d2', + 'family_d3', + ], + 'xpos': [ + 123456789, + 123456789, + 123456789, + ], + 'sample_type': [ + 'WES', + 'WES', + 'WES', + ], + 'geneIds': [ + [], + ['GENE1', 'GENE2'], + ['GENE3'], + ], + 'calls': [ + [('sample_d1', 0), ('sample_d11', 2)], + [('sample_d2', 0)], + [('sample_d3', 1)], + ], + 'sign': [ + 1, + 1, + 1, + ], + }, + ) + schema = pa.schema( + [ + ('key', pa.int64()), + ('project_guid', pa.string()), + ('family_guid', pa.string()), + ('xpos', pa.int64()), + ('sample_type', pa.string()), + ('geneIds', pa.list_(pa.string())), + ( + 'calls', + pa.list_( + pa.struct([('sampleId', pa.string()), ('gt', pa.int64())]), + ), + ), + ('sign', pa.int64()), + ], + ) + write_test_parquet( + df, + new_entries_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + schema, + ) + write_test_parquet( + df.drop('geneIds', axis=1), + new_entries_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ), + schema.remove(5).remove(5), + ) + + def test_get_clickhouse_client(self): + client = get_clickhouse_client() + result = client.execute('SELECT 1') + self.assertEqual(result[0][0], 1) + + def test_normalize_partition(self): + self.assertEqual(normalize_partition('project_d'), ('project_d',)) + self.assertEqual( + normalize_partition("('project_d', 0)"), + ('project_d', 0), + ) + + def test_table_name_builder(self): + table_name_builder = TableNameBuilder( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ) + self.assertEqual( + table_name_builder.dst_table( + ClickHouseTable.ENTRIES, + ), + f'{Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries`', + ) + self.assertEqual( + table_name_builder.src_table( + ClickHouseTable.ENTRIES, + ), + f"file('{runs_path(ReferenceGenome.GRCh38, DatasetType.SNV_INDEL)}/manual__2025-05-07T17-20-59.702114+00-00/new_entries.parquet/*.parquet', 'Parquet')", + ) + with patch('loading_pipeline.lib.paths.Env') as mock_env: + mock_env.PIPELINE_DATA_DIR = 'gs://mock_bucket/v3.1' + self.assertEqual( + table_name_builder.src_table( + ClickHouseTable.ENTRIES, + ), + "gcs(pipeline_data_access, url='https://storage.googleapis.com/mock_bucket/v3.1/GRCh38/SNV_INDEL/runs/manual__2025-05-07T17-20-59.702114+00-00/new_entries.parquet/*.parquet')", + ) + + def test_direct_insert_all_keys(self): + cursor = connections['clickhouse_write'].cursor() + direct_insert_all_keys( + ClickHouseTable.VARIANT_DETAILS, + TableNameBuilder( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + cursor.execute( + f'SELECT key, variantId FROM {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/variants/details`', # nosec B608 + ) + ret = cursor.fetchall() + self.assertEqual( + ret, + [ + (1, '1-13-A-C'), + (2, '2-14-A-T'), + (3, 'Y-19-A-C'), + (4, 'M-12-C-G'), + (7, '7-1234567-AGT-A'), + (10, '10-987654-G-A'), + ], + ) + + # ensure multiple calls are idempotent + direct_insert_all_keys( + ClickHouseTable.VARIANT_DETAILS, + TableNameBuilder( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + cursor.execute( + f'SELECT COUNT(*) FROM {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/variants/details`', # nosec B608 + ) + ret = cursor.fetchone() + self.assertEqual(ret[0], 6) + + @patch.object( + ClickhouseReferenceDataset, + 'for_reference_genome_dataset_type', + return_value=[ClickhouseReferenceDataset.CLINVAR], + ) + def test_entries_insert_flow(self, mock_for_reference_genome_dataset_type): + # Tests individual components of the atomic_insert_entries + # to validate the state after each step. + cursor = connections['clickhouse_write'].cursor() + table_name_builder = TableNameBuilder( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ) + create_staging_tables( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update( + DatasetType.SNV_INDEL, + ), + ) + create_staging_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update( + DatasetType.SNV_INDEL, + ), + ) + stage_existing_project_partitions( + table_name_builder, + [ + 'project_a', + 'project_b', + 'project_d', # Partition does not exist already. + ], + ClickHouseTable.for_dataset_type_atomic_entries_update_project_partitioned( + DatasetType.SNV_INDEL, + ), + ) + cursor.execute( + f""" + SELECT DISTINCT project_guid FROM {STAGING_CLICKHOUSE_DATABASE}.`{table_name_builder.run_id_hash}/GRCh38/SNV_INDEL/entries` + """, # nosec B608 + ) + staged_projects = cursor.fetchall() + self.assertCountEqual( + [p[0] for p in staged_projects], + ['project_a', 'project_b'], + ) + cursor.execute( + f""" + SELECT project_guid, key, sample_type, sum(het_samples), sum(hom_samples) + FROM + {STAGING_CLICKHOUSE_DATABASE}.`{table_name_builder.run_id_hash}/GRCh38/SNV_INDEL/project_gt_stats` + FINAL + GROUP BY project_guid, key, sample_type + """, # nosec B608 + ) + staged_project_gt_stats = cursor.fetchall() + self.assertCountEqual( + staged_project_gt_stats, + [ + ('project_a', 10, 'WES', 0, 1), + ('project_a', 1, 'WGS', 1, 0), + ('project_a', 2, 'WGS', 0, 1), + ('project_a', 3, 'WES', 0, 0), + ('project_a', 4, 'WES', 1, 0), + ('project_a', 4, 'WGS', 0, 1), + ('project_b', 10, 'WES', 0, 0), + ('project_b', 1, 'WES', 1, 0), + ('project_b', 2, 'WES', 0, 0), + ('project_b', 3, 'WES', 0, 1), + ('project_b', 4, 'WES', 0, 1), + # project_gt_stats stages all projects, not just + # those requested for loading. + ('project_c', 0, 'WES', 0, 0), + ('project_c', 3, 'WES', 0, 0), + ('project_c', 4, 'WES', 0, 1), + ('project_c', 5, 'WES', 0, 1), + ], + ) + delete_existing_families_from_staging_entries( + table_name_builder, + ['family_a1', 'family_a5', 'family_a6'], + ) + cursor.execute( + f""" + SELECT project_guid, key, sample_type, sum(het_samples), sum(hom_samples) + FROM + {STAGING_CLICKHOUSE_DATABASE}.`{table_name_builder.run_id_hash}/GRCh38/SNV_INDEL/project_gt_stats` + FINAL + GROUP BY project_guid, key, sample_type + """, # nosec B608 + ) + staged_project_gt_stats = cursor.fetchall() + self.assertCountEqual( + staged_project_gt_stats, + [ + ('project_a', 1, 'WGS', 1, 0), + ('project_a', 2, 'WGS', 0, 1), + ('project_b', 10, 'WES', 0, 0), + ('project_b', 1, 'WES', 1, 0), + ('project_b', 2, 'WES', 0, 0), + ('project_b', 3, 'WES', 0, 1), + ('project_b', 4, 'WES', 0, 1), + ('project_c', 0, 'WES', 0, 0), + ('project_c', 3, 'WES', 0, 0), + ('project_c', 4, 'WES', 0, 1), + ('project_c', 5, 'WES', 0, 1), + ], + ) + insert_new_entries(table_name_builder) + optimize_entries( + table_name_builder, + ['project_a', 'project_b', 'project_c'], + ) + cursor.execute( + f""" + SELECT project_guid, key, sample_type, sum(het_samples), sum(hom_samples) + FROM + {STAGING_CLICKHOUSE_DATABASE}.`{table_name_builder.run_id_hash}/GRCh38/SNV_INDEL/project_gt_stats` + FINAL + GROUP BY project_guid, key, sample_type + """, # nosec B608 + ) + staged_project_gt_stats = cursor.fetchall() + self.assertCountEqual( + staged_project_gt_stats, + [ + ('project_a', 1, 'WGS', 1, 0), + ('project_a', 2, 'WGS', 0, 1), + ('project_b', 10, 'WES', 0, 0), + ('project_b', 1, 'WES', 1, 0), + ('project_b', 2, 'WES', 0, 0), + ('project_b', 3, 'WES', 0, 1), + ('project_b', 4, 'WES', 0, 1), + ('project_c', 0, 'WES', 0, 0), + ('project_c', 3, 'WES', 0, 0), + ('project_c', 4, 'WES', 0, 1), + ('project_c', 5, 'WES', 0, 1), + ('project_d', 10, 'WES', 0, 1), + ('project_d', 3, 'WES', 0, 0), + ('project_d', 4, 'WES', 1, 0), + ], + ) + refresh_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update_refreshable( + DatasetType.SNV_INDEL, + ), + staging=True, + ) + replace_project_partitions( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update_project_partitioned( + DatasetType.SNV_INDEL, + ), + ['project_a', 'project_d'], + ) + cursor.execute( + f""" + SELECT COLUMNS('.*') EXCEPT(is_annotated_in_any_gene, is_gnomad_gt_5_percent) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries` + """, # nosec B608 + ) + new_entries = cursor.fetchall() + self.assertCountEqual( + new_entries, + [ + ( + 10, + 'project_b', + 'family_b1', + 'WES', + 123456789, + [], + [], + [('sample_b4', 'REF', None, None, None)], + 1, + 1, + 0, + ), + ( + 1, + 'project_b', + 'family_b2', + 'WES', + 123456789, + [], + [], + [('sample_b5', 'HET', None, None, None)], + 1, + 1, + 0, + ), + ( + 2, + 'project_b', + 'family_b2', + 'WES', + 123456789, + [], + [], + [('sample_b5', 'REF', None, None, None)], + 1, + 1, + 0, + ), + ( + 3, + 'project_b', + 'family_b3', + 'WES', + 133456789, + [], + [], + [('sample_b6', 'HOM', None, None, None)], + 1, + 1, + 0, + ), + ( + 4, + 'project_b', + 'family_b3', + 'WES', + 133456789, + [], + [], + [('sample_b6', 'HOM', None, None, None)], + 1, + 1, + 0, + ), + ( + 1, + 'project_a', + 'family_a2', + 'WGS', + 123456789, + [], + [], + [('sample_a2', 'HET', None, None, None)], + 1, + 1, + 0, + ), + ( + 2, + 'project_a', + 'family_a3', + 'WGS', + 133456789, + [], + [], + [('sample_a3', 'HOM', None, None, None)], + 1, + 1, + 0, + ), + ( + 3, + 'project_a', + 'family_a4', + 'WES', + 133456789, + [], + [], + [('sample_a4', 'REF', None, None, None)], + 1, + 1, + 0, + ), + ( + 10, + 'project_d', + 'family_d1', + 'WES', + 123456789, + [], + [], + [ + ('sample_d1', 'REF', None, None, None), + ('sample_d11', 'HOM', None, None, None), + ], + 1, + 1, + 0, + ), + ( + 3, + 'project_d', + 'family_d2', + 'WES', + 123456789, + [123, 12], + [], + [('sample_d2', 'REF', None, None, None)], + 1, + 1, + 0, + ), + ( + 4, + 'project_d', + 'family_d3', + 'WES', + 123456789, + [1], + [], + [('sample_d3', 'HET', None, None, None)], + 1, + 1, + 0, + ), + ( + 0, + 'project_c', + 'family_c1', + 'WES', + 123456789, + [1], + [], + [('sample_c7', 'REF', None, None, None)], + 1, + 1, + 0, + ), + ( + 3, + 'project_c', + 'family_c2', + 'WES', + 123456789, + [1], + [], + [('sample_c8', 'REF', None, None, None)], + 1, + 1, + 0, + ), + ( + 4, + 'project_c', + 'family_c3', + 'WES', + 133456789, + [1], + [], + [('sample_c9', 'HOM', None, None, None)], + 1, + 1, + 0, + ), + ( + 5, + 'project_c', + 'family_c4', + 'WES', + 133456789, + [1], + [], + [('sample_c9', 'HOM', None, None, None)], + 1, + 1, + 0, + ), + ], + ) + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats_dict` + """, # nosec B608 + ) + existing_gt_stats = cursor.fetchall() + self.assertCountEqual( + existing_gt_stats, + [ + (1, 1, 0, 0, 0, 0, 0), + (2, 0, 2, 0, 0, 1, 0), + (3, 2, 0, 0, 1, 0, 0), + (4, 5, 2, 0, 2, 1, 0), + (5, 2, 0, 0, 1, 0, 0), + ], + ) + exchange_tables( + table_name_builder, + ClickHouseTable.for_dataset_type_atomic_entries_update_unpartitioned( + DatasetType.SNV_INDEL, + ), + ) + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats_dict` + """, # nosec B608 + ) + new_gt_stats = cursor.fetchall() + self.assertCountEqual( + new_gt_stats, + [ + (1, 1, 0, 0, 0, 0, 0), + (2, 0, 2, 0, 0, 1, 0), + (3, 2, 0, 0, 1, 0, 0), + (4, 5, 2, 0, 2, 1, 0), + (5, 2, 0, 0, 1, 0, 0), + ], + ) + reload_dictionaries( + table_name_builder, + ClickHouseDictionary.for_dataset_type(DatasetType.SNV_INDEL), + ) + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats_dict` + """, # nosec B608 + ) + new_gt_stats_post_reload = cursor.fetchall() + self.assertEqual( + new_gt_stats_post_reload, + [ + (1, 1, 1, 0, 0, 0, 0), + (2, 0, 2, 0, 0, 1, 0), + (3, 2, 0, 0, 1, 0, 0), + (4, 5, 0, 0, 2, 0, 0), + (5, 2, 0, 0, 1, 0, 0), + (10, 2, 0, 0, 1, 0, 0), + ], + ) + + def test_load_run_entries_snv_indel(self): + load_run_entries( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ['project_d'], + ['family_d1', 'family_d2'], + ) + cursor = connections['clickhouse_write'].cursor() + cursor.execute( + f""" + SELECT project_guid, key, sample_type, sum(het_samples), sum(hom_samples) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/project_gt_stats` + WHERE project_guid = 'project_d' + GROUP BY project_guid, key, sample_type + """, # nosec B608 + ) + project_gt_stats = cursor.fetchall() + self.assertCountEqual( + project_gt_stats, + [ + ('project_d', 10, 'WES', 0, 1), + ('project_d', 4, 'WES', 1, 0), + ('project_d', 3, 'WES', 0, 0), + ], + ) + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats` + """, # nosec B608 + ) + gt_stats = cursor.fetchall() + self.assertCountEqual( + gt_stats, + [ + (1, 1, 1, 0, 0, 0, 0), + (2, 0, 2, 0, 0, 1, 0), + (3, 2, 0, 0, 1, 0, 0), + (4, 6, 2, 0, 2, 1, 0), + (5, 2, 0, 0, 1, 0, 0), + (10, 4, 0, 0, 2, 0, 0), + ], + ) + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats_dict` + """, # nosec B608 + ) + gt_stats_dict = cursor.fetchall() + self.assertCountEqual( + gt_stats_dict, + [ + (1, 1, 1, 0, 0, 0, 0), + (2, 0, 2, 0, 0, 1, 0), + (3, 2, 0, 0, 1, 0, 0), + (4, 6, 2, 0, 2, 1, 0), + (5, 2, 0, 0, 1, 0, 0), + (10, 4, 0, 0, 2, 0, 0), + ], + ) + + @patch.object( + ClickhouseReferenceDataset, + 'for_reference_genome_dataset_type', + return_value=[ClickhouseReferenceDataset.CLINVAR], + ) + def test_load_run_variants_snv_indel(self, mock_for_reference_genome_dataset_type): + load_run_variants( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ) + cursor = connections['clickhouse_write'].cursor() + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/variants_memory` + """, # nosec B608 + ) + variants_memory = cursor.fetchall() + self.assertCountEqual( + variants_memory, + [ + (10, [], [], []), + (11, [], [], []), + (12, [], [], []), + (13, [], [], []), + ], + ) + cursor.execute( + f""" + SELECT * + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/variants_disk` + """, # nosec B608 + ) + variants_disk = cursor.fetchall() + self.assertCountEqual( + variants_disk, + [ + (10, [], [], []), + (11, [], [], []), + (12, [], [], []), + (13, [], [], []), + ], + ) + cursor.execute( + f""" + SELECT key, variantId + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/variants/details` + """, # nosec B608 + ) + variants_details = cursor.fetchall() + self.assertCountEqual( + variants_details, + [ + (1, '1-13-A-C'), + (2, '2-14-A-T'), + (3, 'Y-19-A-C'), + (4, 'M-12-C-G'), + (7, '7-1234567-AGT-A'), + (10, '10-987654-G-A'), + ], + ) + + def test_load_run_variants_gcnv(self): + load_run_variants( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ) + cursor = connections['clickhouse_write'].cursor() + cursor.execute( + f""" + SELECT COUNT(*) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/GCNV/variants_memory` + """, # nosec B608 + ) + variants_disk_count = cursor.fetchone()[0] + self.assertEqual(variants_disk_count, 4) + cursor.execute( + f""" + SELECT COUNT(*) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/GCNV/variants_disk` + """, # nosec B608 + ) + variants_disk_count = cursor.fetchone()[0] + self.assertEqual(variants_disk_count, 4) + cursor.execute( + f""" + SELECT COUNT(*) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/GCNV/key_lookup` + """, # nosec B608 + ) + key_lookup_count = cursor.fetchone()[0] + self.assertEqual(key_lookup_count, 4) + + def test_load_run_entries_gcnv(self): + load_run_entries( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ['project_d'], + ['family_d1', 'family_d2'], + ) + cursor = connections['clickhouse_write'].cursor() + cursor.execute( + f""" + SELECT COUNT(*) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/GCNV/entries` + """, # nosec B608 + ) + entries_count = cursor.fetchone()[0] + self.assertEqual(entries_count, 3) + + def test_delete_families(self): + table_name_builder = TableNameBuilder( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ) + cursor = connections['clickhouse_write'].cursor() + cursor.execute( + f""" + SELECT project_guid, sum(het_samples), sum(hom_samples) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/project_gt_stats` + FINAL + GROUP BY project_guid + """, # nosec B608 + ) + project_gt_stats = cursor.fetchall() + self.assertCountEqual( + project_gt_stats, + [('project_a', 2, 3), ('project_c', 0, 2), ('project_b', 1, 2)], + ) + refresh_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update_refreshable( + DatasetType.SNV_INDEL, + ), + staging=False, + ) + cursor.execute( + f""" + SELECT sum(ac_wes) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats` + """, # nosec B608 + ) + gt_stats = cursor.fetchall() + self.assertCountEqual(gt_stats, [(12,)]) + delete_family_guids( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + 'project_a', + ['family_a1', 'family_a2'], + ) + cursor.execute( + f""" + SELECT project_guid, sum(het_samples), sum(hom_samples) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/project_gt_stats` + FINAL + GROUP BY project_guid + """, # nosec B608 + ) + project_gt_stats = cursor.fetchall() + self.assertCountEqual( + project_gt_stats, + [('project_a', 1, 2), ('project_c', 0, 2), ('project_b', 1, 2)], + ) + cursor.execute( + f""" + SELECT sum(ac_wes) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats` + """, # nosec B608 + ) + gt_stats = cursor.fetchall() + self.assertCountEqual(gt_stats, [(10,)]) + cursor.execute( + f""" + SELECT sum(ac_wes) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats_dict` + """, # nosec B608 + ) + gt_stats_dict = cursor.fetchall() + self.assertCountEqual(gt_stats_dict, [(10,)]) + + def test_rebuild_gt_stats(self): + table_name_builder = TableNameBuilder( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ) + cursor = connections['clickhouse_write'].cursor() + logged_query( # DROP the partition from the non-staging entries to as a non-mv-impacting change. + f""" + ALTER TABLE {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries` + DROP PARTITION (%(project_guid)s, %(partition_id)s) + """, # nosec B608 + {'project_guid': 'project_a', 'partition_id': 0}, + ) + cursor.execute( + f""" + SELECT project_guid, sum(het_samples), sum(hom_samples) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/project_gt_stats` + WHERE project_guid IN ('project_a', 'project_b') + GROUP BY project_guid + """, # nosec B608 + ) + project_gt_stats = cursor.fetchall() + self.assertCountEqual( + project_gt_stats, + [('project_a', 2, 3), ('project_b', 1, 2)], + ) + refresh_materialized_views( + table_name_builder, + ClickHouseMaterializedView.for_dataset_type_atomic_entries_update_refreshable( + DatasetType.SNV_INDEL, + ), + staging=False, + ) + cursor.execute( + f""" + SELECT sum(ac_wes), sum(ac_wgs) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats` + """, # nosec B608 + ) + gt_stats = cursor.fetchall() + self.assertCountEqual(gt_stats, [(12, 5)]) + rebuild_gt_stats( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ['project_a', 'project_b'], + ) + cursor.execute( + f""" + SELECT project_guid, sum(het_samples), sum(hom_samples) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/project_gt_stats` + WHERE project_guid IN ('project_a', 'project_b') + GROUP BY project_guid + """, # nosec B608 + ) + project_gt_stats = cursor.fetchall() + self.assertCountEqual( + project_gt_stats, + [('project_b', 1, 2)], + ) + cursor.execute( + f""" + SELECT sum(ac_wes), sum(ac_wgs) + FROM + {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/gt_stats` + """, # nosec B608 + ) + gt_stats = cursor.fetchall() + self.assertCountEqual(gt_stats, [(9, 0)]) diff --git a/loading_pipeline/lib/misc/family_entries.py b/loading_pipeline/lib/misc/family_entries.py new file mode 100644 index 0000000000..8bc71af451 --- /dev/null +++ b/loading_pipeline/lib/misc/family_entries.py @@ -0,0 +1,121 @@ +import hail as hl + +from loading_pipeline.lib.core import DatasetType + + +def compute_callset_family_entries_ht( + dataset_type: DatasetType, + mt: hl.MatrixTable, + entries_fields: dict[str, hl.Expression], +) -> hl.Table: + sample_id_to_family_guid = hl.dict( + { + s: family_guid + for family_guid, sample_ids in hl.eval(mt.family_samples).items() + for s in sample_ids + }, + ) + family_guid_to_project_guid = hl.dict( + { + family_guid: project_guid + for project_guid, family_guids in hl.eval(mt.project_families).items() + for family_guid in family_guids + }, + ) + ht = mt.select_rows( + filters=mt.filters.difference(dataset_type.excluded_filters), + family_entries=( + # NB: we're sorted by both family and sample when this runs. + # However, the sort is not guaranteed once the entries + # table is edited and families are spliced out and re-appended. + hl.sorted( + hl.agg.collect( + hl.Struct( + s=mt.s, + family_guid=sample_id_to_family_guid[mt.s], + project_guid=family_guid_to_project_guid[ + sample_id_to_family_guid[mt.s] + ], + **entries_fields, + ), + ) + .group_by(lambda e: e.family_guid) + .values() + .map( + lambda fe: hl.sorted(fe, key=lambda e: e.s), + ), + lambda fe: fe[0].family_guid, + ) + ), + ).rows() + # NB: globalize before we set families to missing + ht = globalize_ids(ht) + ht = ht.annotate( + family_entries=( + ht.family_entries.map( + lambda fe: hl.or_missing( + fe.any(dataset_type.family_entries_filter_fn), + fe, + ), + ) + ), + ) + # Only keep rows where at least one family is not missing. + return ht.filter(ht.family_entries.any(hl.is_defined)) + + +def globalize_ids(ht: hl.Table) -> hl.Table: + row = ht.take(1)[0] if ht.count() > 0 else None + has_family_entries = row and len(row.family_entries) > 0 + ht = ht.annotate_globals( + project_guids=( + [fe[0].project_guid for fe in row.family_entries] + if has_family_entries + else hl.empty_array(hl.tstr) + ), + family_guids=( + [fe[0].family_guid for fe in row.family_entries] + if has_family_entries + else hl.empty_array(hl.tstr) + ), + family_samples=( + {fe[0].family_guid: [e.s for e in fe] for fe in row.family_entries} + if has_family_entries + else hl.empty_dict(hl.tstr, hl.tarray(hl.tstr)) + ), + ) + return ht.annotate( + family_entries=ht.family_entries.map( + lambda fe: fe.map(lambda se: se.drop('s', 'family_guid', 'project_guid')), + ), + ) + + +def deglobalize_ids(ht: hl.Table) -> hl.Table: + ht = ht.annotate( + family_entries=( + hl.enumerate(ht.family_entries).starmap( + lambda i, fe: hl.enumerate(fe).starmap( + lambda j, e: hl.Struct( + **e, + s=ht.family_samples[ht.family_guids[i]][j], + family_guid=ht.family_guids[i], + project_guid=ht.project_guids[i], + ), + ), + ) + ), + ) + return ht.drop('family_guids', 'family_samples', 'project_guids') + + +def deduplicate_by_most_non_ref_calls(ht: hl.Table) -> hl.Table: + ht = ht.annotate( + non_ref_count=hl.len( + hl.flatten(ht.family_entries).filter(lambda s: s.GT.is_non_ref()), + ), + ) + return ht.group_by(*ht.key).aggregate( + filters=hl.agg.take(ht.filters, 1, ordering=-ht.non_ref_count)[0], + family_entries=hl.agg.take(ht.family_entries, 1, ordering=-ht.non_ref_count)[0], + ) diff --git a/loading_pipeline/lib/misc/family_entries_test.py b/loading_pipeline/lib/misc/family_entries_test.py new file mode 100644 index 0000000000..5e0ec1d6f3 --- /dev/null +++ b/loading_pipeline/lib/misc/family_entries_test.py @@ -0,0 +1,387 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.core import DatasetType +from loading_pipeline.lib.misc.family_entries import ( + compute_callset_family_entries_ht, + deduplicate_by_most_non_ref_calls, + deglobalize_ids, + globalize_ids, +) + + +class FamilyEntriesTest(unittest.TestCase): + def test_compute_callset_family_entries_ht(self) -> None: + mt = hl.MatrixTable.from_parts( + rows={ + 'variants': [1, 2, 3], + 'filters': [ + hl.empty_set(hl.tstr), + {'HIGH_SR_BACKGROUND'}, + hl.empty_set(hl.tstr), + ], + }, + cols={'s': ['a', 'b', 'd', 'c']}, + entries={ + 'GT': [ + [ + hl.Call([0, 0]), + hl.missing(hl.tcall), + hl.Call([0, 0]), + hl.Call([0, 0]), + ], + [ + hl.Call([0, 0]), + hl.Call([0, 0]), + hl.Call([1, 1]), + hl.Call([0, 0]), + ], + [ + hl.Call([0, 1]), + hl.Call([0, 0]), + hl.Call([1, 1]), + hl.Call([0, 0]), + ], + ], + }, + globals={ + 'family_samples': {'2': ['a'], '1': ['b', 'c', 'd']}, + 'project_families': {'p1': ['1'], 'p2': ['2', '3']}, + }, + ) + ht = compute_callset_family_entries_ht(DatasetType.SNV_INDEL, mt, {'GT': mt.GT}) + self.assertCountEqual( + ht.globals.collect(), + [ + hl.Struct( + family_samples={'1': ['b', 'c', 'd'], '2': ['a']}, + project_families={'p1': ['1'], 'p2': ['2', '3']}, + project_guids=['p1', 'p2'], + family_guids=['1', '2'], + ), + ], + ) + self.assertCountEqual( + ht.filters.collect(), + [{'HIGH_SR_BACKGROUND'}, set()], + ) + self.assertCountEqual( + ht.family_entries.collect(), + [ + [ + [ + hl.Struct(GT=hl.Call(alleles=[0, 0], phased=False)), + hl.Struct(GT=hl.Call(alleles=[0, 0], phased=False)), + hl.Struct(GT=hl.Call(alleles=[1, 1], phased=False)), + ], + None, + ], + [ + [ + hl.Struct(GT=hl.Call(alleles=[0, 0], phased=False)), + hl.Struct(GT=hl.Call(alleles=[0, 0], phased=False)), + hl.Struct(GT=hl.Call(alleles=[1, 1], phased=False)), + ], + [hl.Struct(GT=hl.Call(alleles=[0, 1], phased=False))], + ], + ], + ) + + def test_globalize_and_deglobalize(self) -> None: + family_entries_ht = hl.Table.parallelize( + [], + hl.tstruct( + id=hl.tint32, + filters=hl.tset(hl.tstr), + family_entries=hl.tarray( + hl.tarray( + hl.tstruct( + a=hl.tint32, + s=hl.tstr, + family_guid=hl.tstr, + project_guid=hl.tstr, + ), + ), + ), + ), + key='id', + ) + family_entries_ht = globalize_ids(family_entries_ht) + self.assertCountEqual( + family_entries_ht.family_guids.collect(), + [ + [], + ], + ) + self.assertCountEqual( + family_entries_ht.project_guids.collect(), + [ + [], + ], + ) + family_entries_ht = hl.Table.parallelize( + [ + { + 'id': 0, + 'filters': {'HIGH_SR_BACKGROUND', 'UNRESOLVED'}, + 'family_entries': [ + [ + hl.Struct(a=1, s='a', family_guid='123', project_guid='p1'), + hl.Struct(a=2, s='c', family_guid='123', project_guid='p1'), + hl.Struct(a=1, s='e', family_guid='123', project_guid='p1'), + ], + [ + hl.Struct(a=2, s='f', family_guid='234', project_guid='p2'), + ], + ], + }, + { + 'id': 1, + 'filters': {'HIGH_SR_BACKGROUND'}, + 'family_entries': [ + [ + hl.Struct(a=2, s='a', family_guid='123', project_guid='p1'), + hl.Struct(a=3, s='c', family_guid='123', project_guid='p1'), + hl.Struct(a=4, s='e', family_guid='123', project_guid='p1'), + ], + [ + hl.Struct(a=5, s='f', family_guid='234', project_guid='p2'), + ], + ], + }, + ], + hl.tstruct( + id=hl.tint32, + filters=hl.tset(hl.tstr), + family_entries=hl.tarray( + hl.tarray( + hl.tstruct( + a=hl.tint32, + s=hl.tstr, + family_guid=hl.tstr, + project_guid=hl.tstr, + ), + ), + ), + ), + key='id', + ) + family_entries_ht = globalize_ids(family_entries_ht) + self.assertCountEqual( + family_entries_ht.family_guids.collect(), + [ + ['123', '234'], + ], + ) + self.assertCountEqual( + family_entries_ht.project_guids.collect(), + [ + ['p1', 'p2'], + ], + ) + self.assertCountEqual( + family_entries_ht.family_entries.collect(), + [ + [ + [ + hl.Struct(a=1), + hl.Struct(a=2), + hl.Struct(a=1), + ], + [ + hl.Struct(a=2), + ], + ], + [ + [ + hl.Struct(a=2), + hl.Struct(a=3), + hl.Struct(a=4), + ], + [ + hl.Struct(a=5), + ], + ], + ], + ) + family_entries_ht = deglobalize_ids(family_entries_ht) + self.assertCountEqual( + family_entries_ht.family_entries.collect(), + [ + [ + [ + hl.Struct(a=1, s='a', family_guid='123', project_guid='p1'), + hl.Struct(a=2, s='c', family_guid='123', project_guid='p1'), + hl.Struct(a=1, s='e', family_guid='123', project_guid='p1'), + ], + [ + hl.Struct(a=2, s='f', family_guid='234', project_guid='p2'), + ], + ], + [ + [ + hl.Struct(a=2, s='a', family_guid='123', project_guid='p1'), + hl.Struct(a=3, s='c', family_guid='123', project_guid='p1'), + hl.Struct(a=4, s='e', family_guid='123', project_guid='p1'), + ], + [ + hl.Struct(a=5, s='f', family_guid='234', project_guid='p2'), + ], + ], + ], + ) + + def test_deduplicate_by_most_non_ref_calls(self) -> None: + project_ht = hl.Table.parallelize( + [ + { + 'id': 0, + 'filters': {'PASS', 'HIGH_SR_BACKGROUND'}, + 'family_entries': [ + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_a', + s='sample_1', + ), + hl.Struct( + GT=hl.Call(alleles=[0, 0], phased=False), + family_guid='family_a', + s='sample_2', + ), + ], + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_b', + s='sample_3', + ), + None, + ], + None, + ], + }, + { + 'id': 0, + 'filters': {'PASS'}, + 'family_entries': [ + [ + None, + hl.Struct( + GT=hl.Call(alleles=[0, 0], phased=False), + family_guid='family_a', + s='sample_2', + ), + ], + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_b', + s='sample_3', + ), + None, + ], + None, + ], + }, + { + 'id': 2, + 'filters': {'HIGH_SR_BACKGROUND'}, + 'family_entries': [ + None, + None, + ], + }, + { + 'id': 3, + 'filters': {'PASS'}, + 'family_entries': [ + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_a', + s='sample_1', + ), + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_a', + s='sample_2', + ), + ], + None, + ], + }, + ], + hl.tstruct( + id=hl.tint32, + filters=hl.tset(hl.tstr), + family_entries=hl.tarray( + hl.tarray( + hl.tstruct( + GT=hl.tcall, + family_guid=hl.tstr, + s=hl.tstr, + ), + ), + ), + ), + key='id', + ) + ht = deduplicate_by_most_non_ref_calls(project_ht) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + id=0, + filters={'PASS', 'HIGH_SR_BACKGROUND'}, + family_entries=[ + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_a', + s='sample_1', + ), + hl.Struct( + GT=hl.Call(alleles=[0, 0], phased=False), + family_guid='family_a', + s='sample_2', + ), + ], + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_b', + s='sample_3', + ), + None, + ], + None, + ], + ), + hl.Struct( + id=2, + filters={'HIGH_SR_BACKGROUND'}, + family_entries=[None, None], + ), + hl.Struct( + id=3, + filters={'PASS'}, + family_entries=[ + [ + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_a', + s='sample_1', + ), + hl.Struct( + GT=hl.Call(alleles=[0, 1], phased=False), + family_guid='family_a', + s='sample_2', + ), + ], + None, + ], + ), + ], + ) diff --git a/loading_pipeline/lib/misc/family_loading_failures.py b/loading_pipeline/lib/misc/family_loading_failures.py new file mode 100644 index 0000000000..ee9d9bcf25 --- /dev/null +++ b/loading_pipeline/lib/misc/family_loading_failures.py @@ -0,0 +1,215 @@ +from collections import defaultdict + +import hail as hl + +from loading_pipeline.lib.core import Sex +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.pedigree import Family, Relation, Sample + +logger = get_logger(__name__) + + +def passes_relatedness_check( + relatedness_check_lookup: dict[tuple[str, str], list], + sample_id: str, + other_id: str, + expected_relation: Relation, + additional_allowed_relation: Relation | None, +) -> tuple[bool, str | None]: + # No relationship to check, return true + if other_id is None: + return True, None + coefficients = relatedness_check_lookup.get( + (min(sample_id, other_id), max(sample_id, other_id)), + ) + if not coefficients or not any( + relation.coefficients_equal(coefficients) + for relation in ( + [expected_relation, additional_allowed_relation] + if additional_allowed_relation + else [expected_relation] + ) + ): + return ( + False, + f'Sample {sample_id} has expected relation "{expected_relation.value}" to {other_id} but has coefficients {coefficients or []}', + ) + return True, None + + +def all_relatedness_checks( + relatedness_check_lookup: dict[tuple[str, str], list], + family: Family, + sample: Sample, +) -> list[str]: + failure_reasons = [] + for relationship_set, relation, additional_allowed_relation in [ + ([sample.mother, sample.father], Relation.PARENT_CHILD, None), + ( + [ + sample.maternal_grandmother, + sample.maternal_grandfather, + sample.paternal_grandmother, + sample.paternal_grandfather, + ], + Relation.GRANDPARENT_GRANDCHILD, + None, + ), + (sample.siblings, Relation.SIBLING, None), + (sample.half_siblings, Relation.HALF_SIBLING, Relation.SIBLING), + (sample.aunt_nephews, Relation.AUNT_NEPHEW, None), + ]: + for other_id in relationship_set: + # Handle case where relation is identified in the + # pedigree as a "dummy" but is not included in + # the list of samples to load. + if other_id not in family.samples: + continue + success, reason = passes_relatedness_check( + relatedness_check_lookup, + sample.sample_id, + other_id, + relation, + additional_allowed_relation, + ) + if not success: + failure_reasons.append(reason) + return failure_reasons + + +def build_relatedness_check_lookup( + relatedness_check_ht: hl.Table, + remap_lookup: hl.dict, +) -> dict[tuple[str, str], list]: + relatedness_check_ht = relatedness_check_ht.key_by( + i=remap_lookup.get(relatedness_check_ht.i, relatedness_check_ht.i), + j=remap_lookup.get(relatedness_check_ht.j, relatedness_check_ht.j), + ) + return { + # NB: samples are sorted in the original ibd but not necessarily + # sorted after remapping + (min(r.i, r.j), max(r.i, r.j)): list(r.drop('i', 'j').values()) + for r in relatedness_check_ht.collect() + } + + +def build_sex_check_lookup( + sex_check_ht: hl.Table, + remap_lookup: hl.dict, +) -> dict[str, Sex]: + sex_check_ht = sex_check_ht.key_by( + s=remap_lookup.get(sex_check_ht.s, sex_check_ht.s), + ) + sex_check_ht = sex_check_ht.select('predicted_sex') + return {r.s: Sex(r.predicted_sex) for r in sex_check_ht.collect()} + + +def get_families_failed_missing_samples( + mt: hl.MatrixTable, + families: set[Family], +) -> dict[Family, list[str]]: + callset_samples = set(mt.cols().s.collect()) + failed_families = {} + for family in families: + missing_samples = family.samples.keys() - callset_samples + if len(missing_samples) > 0: + # NB: This is an array of a single element for consistency with + # the other checks. + failed_families[family] = [f'Missing samples: {missing_samples}'] + return failed_families + + +def get_families_failed_relatedness_check( + families: set[Family], + relatedness_check_ht: hl.Table, + remap_lookup: hl.dict, +) -> dict[Family, list[str]]: + relatedness_check_lookup = build_relatedness_check_lookup( + relatedness_check_ht, + remap_lookup, + ) + failed_families = defaultdict(list) + for family in families: + for sample in family.samples.values(): + failure_reasons = all_relatedness_checks( + relatedness_check_lookup, + family, + sample, + ) + if failure_reasons: + failed_families[family].extend(failure_reasons) + return dict(failed_families) + + +def get_families_failed_sex_check( + families: set[Family], + sex_check_ht: hl.Table, + remap_lookup: hl.dict, +) -> dict[Family, list[str]]: + sex_check_lookup = build_sex_check_lookup(sex_check_ht, remap_lookup) + failed_families = defaultdict(list) + for family in families: + for sample_id in family.samples: + if sample_id not in sex_check_lookup: + failed_families[family].append( + f'Sample {sample_id} has pedigree sex {family.samples[sample_id].sex.value} but is missing from the sex check source', + ) + continue + # NB: Both Unknown samples in pedigree and Unknown + # samples in the predicted_sex are precluded from + # failing the sex check. + if ( + sex_check_lookup[sample_id] == Sex.UNKNOWN + or family.samples[sample_id].sex == Sex.UNKNOWN + ): + logger.info( + f'Encountered sample with Unknown sex excluded from sex check: {sample_id}', + ) + continue + + if family.samples[sample_id].sex != sex_check_lookup[sample_id]: + failed_families[family].append( + f'Sample {sample_id} has pedigree sex {family.samples[sample_id].sex.value} but imputed sex {sex_check_lookup[sample_id].value}', + ) + return dict(failed_families) + + +def get_families_failed_imputed_sex_ploidy( + families: set[Family], + mt: hl.MatrixTable, + sex_check_ht: hl.Table, +) -> dict[Family, str]: + mt = mt.select_cols( + discrepant=( + ( + # All calls are diploid or missing but the sex is Male + hl.agg.all(mt.GT.is_diploid() | hl.is_missing(mt.GT)) + & (sex_check_ht[mt.s].predicted_sex == Sex.MALE.value) + ) + | ( + # At least one call is haploid but the sex is Female, X0, XXY, XYY, or XXX + hl.agg.any(~mt.GT.is_diploid()) + & hl.literal( + { + Sex.FEMALE.value, + Sex.X0.value, + Sex.XYY.value, + Sex.XXY.value, + Sex.XXX.value, + }, + ).contains(sex_check_ht[mt.s].predicted_sex) + ) + ), + ) + discrepant_samples = mt.aggregate_cols( + hl.agg.filter(mt.discrepant, hl.agg.collect_as_set(mt.s)), + ) + failed_families = defaultdict(list) + for family in families: + discrepant_loadable_samples = set(family.samples.keys()) & discrepant_samples + if discrepant_loadable_samples: + sorted_discrepant_samples = sorted(discrepant_loadable_samples) + failed_families[family].append( + f'Found samples with misaligned ploidy with their provided imputed sex: {sorted_discrepant_samples}', + ) + return failed_families diff --git a/loading_pipeline/lib/misc/family_loading_failures_test.py b/loading_pipeline/lib/misc/family_loading_failures_test.py new file mode 100644 index 0000000000..fb1d0905d1 --- /dev/null +++ b/loading_pipeline/lib/misc/family_loading_failures_test.py @@ -0,0 +1,448 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.core import Sex +from loading_pipeline.lib.misc.family_loading_failures import ( + all_relatedness_checks, + build_relatedness_check_lookup, + build_sex_check_lookup, + get_families_failed_imputed_sex_ploidy, + get_families_failed_sex_check, +) +from loading_pipeline.lib.misc.io import import_pedigree +from loading_pipeline.lib.misc.pedigree import ( + Family, + Sample, + parse_pedigree_ht_to_families, +) + +TEST_SEX_CHECK_1 = 'loading_pipeline/var/test/sex_check/test_sex_check_1.ht' +TEST_PEDIGREE_6 = 'loading_pipeline/var/test/pedigrees/test_pedigree_6.tsv' + + +class FamilyLoadingFailuresTest(unittest.TestCase): + def test_build_relatedness_check_lookup(self): + ht = hl.Table.parallelize( + [ + { + 'i': 'ROS_006_18Y03226_D1', + 'j': 'ROS_007_19Y05939_D1', + 'ibd0': 0.0, + 'ibd1': 1.0, + 'ibd2': 0.0, + 'pi_hat': 0.5, + }, + ], + hl.tstruct( + i=hl.tstr, + j=hl.tstr, + ibd0=hl.tfloat, + ibd1=hl.tfloat, + ibd2=hl.tfloat, + pi_hat=hl.tfloat, + ), + key=['i', 'j'], + ) + self.assertEqual( + build_relatedness_check_lookup( + ht, + hl.dict({'ROS_006_18Y03226_D1': 'remapped_id'}), + ), + { + ('ROS_007_19Y05939_D1', 'remapped_id'): [ + 0.0, + 1.0, + 0.0, + 0.5, + ], + }, + ) + + def test_build_sex_check_lookup(self): + ht = hl.Table.parallelize( + [ + {'s': 'ROS_006_18Y03226_D1', 'predicted_sex': 'F'}, + {'s': 'ROS_006_18Y03227_D1', 'predicted_sex': 'F'}, + {'s': 'ROS_006_18Y03228_D1', 'predicted_sex': 'F'}, + {'s': 'ROS_007_19Y05919_D1', 'predicted_sex': 'F'}, + {'s': 'ROS_007_19Y05939_D1', 'predicted_sex': 'M'}, + {'s': 'ROS_007_19Y05987_D1', 'predicted_sex': 'U'}, + {'s': 'ROS_007_19Y05989_D1', 'predicted_sex': 'X0'}, + ], + hl.tstruct( + s=hl.tstr, + predicted_sex=hl.tstr, + ), + key='s', + ) + self.assertEqual( + build_sex_check_lookup(ht, hl.dict({'ROS_006_18Y03226_D1': 'remapped_id'})), + { + 'remapped_id': Sex.FEMALE, + 'ROS_006_18Y03227_D1': Sex.FEMALE, + 'ROS_006_18Y03228_D1': Sex.FEMALE, + 'ROS_007_19Y05919_D1': Sex.FEMALE, + 'ROS_007_19Y05939_D1': Sex.MALE, + 'ROS_007_19Y05987_D1': Sex.UNKNOWN, + 'ROS_007_19Y05989_D1': Sex.X0, + }, + ) + + def test_all_relatedness_checks(self): + relatedness_check_lookup = { + # Parent + ('sample_1', 'sample_2'): [ + 0.0, + 0.98, + 0.0, + 0.52, + ], + # GrandParent + ('sample_1', 'sample_3'): [0.48, 0.52, 0, 0.24], + # Half Sibling (but actually a hidden Sibling) + ('sample_1', 'sample_4'): [0.25, 0.5, 0.25, 0.5], + } + sample = Sample( + sex=Sex.FEMALE, + sample_id='sample_1', + mother='sample_2', + paternal_grandfather='sample_3', + half_siblings=['sample_4'], + ) + family = Family( + family_guid='family_1a', + samples={ + 'sample_1': sample, + 'sample_2': Sample(sex=Sex.MALE, sample_id='sample_2'), + 'sample_3': Sample(sex=Sex.MALE, sample_id='sample_3'), + 'sample_4': Sample(sex=Sex.MALE, sample_id='sample_4'), + 'sample_5': Sample(sex=Sex.MALE, sample_id='sample_5'), + }, + ) + failure_reasons = all_relatedness_checks( + relatedness_check_lookup, + family, + sample, + ) + self.assertListEqual(failure_reasons, []) + + # Defined grandparent missing in relatedness table + sample = Sample( + sex=Sex.FEMALE, + sample_id='sample_1', + mother='sample_2', + paternal_grandfather='sample_3', + paternal_grandmother='sample_5', + ) + failure_reasons = all_relatedness_checks( + relatedness_check_lookup, + family, + sample, + ) + self.assertListEqual( + failure_reasons, + [ + 'Sample sample_1 has expected relation "grandparent_grandchild" to sample_5 but has coefficients []', + ], + ) + + # Sibling is actually a half sibling. + relatedness_check_lookup = { + **relatedness_check_lookup, + ('sample_1', 'sample_4'): [0.5, 0.5, 0, 0.25], + } + sample = Sample( + sex=Sex.FEMALE, + sample_id='sample_1', + mother='sample_2', + paternal_grandfather='sample_3', + siblings=['sample_4'], + ) + failure_reasons = all_relatedness_checks( + relatedness_check_lookup, + family, + sample, + ) + self.assertListEqual( + failure_reasons, + [ + 'Sample sample_1 has expected relation "sibling" to sample_4 but has coefficients [0.5, 0.5, 0, 0.25]', + ], + ) + + relatedness_check_lookup = { + **relatedness_check_lookup, + ('sample_1', 'sample_2'): [ + 0.5, + 0.5, + 0.5, + 0.5, + ], + } + sample = Sample( + sex=Sex.FEMALE, + sample_id='sample_1', + mother='sample_2', + paternal_grandfather='sample_3', + siblings=['sample_4'], + ) + failure_reasons = all_relatedness_checks( + relatedness_check_lookup, + family, + sample, + ) + self.assertListEqual( + failure_reasons, + [ + 'Sample sample_1 has expected relation "parent_child" to sample_2 but has coefficients [0.5, 0.5, 0.5, 0.5]', + 'Sample sample_1 has expected relation "sibling" to sample_4 but has coefficients [0.5, 0.5, 0, 0.25]', + ], + ) + + # Some samples will include relationships with + # samples that are not expected to be included + # in the callset. These should not trigger relatedness + # failures. + sample = Sample( + sex=Sex.FEMALE, + sample_id='sample_1', + mother='sample_2', + ) + family = Family( + family_guid='family_1a', + samples={ + 'sample_1': sample, + }, + ) + failure_reasons = all_relatedness_checks( + {}, + family, + sample, + ) + self.assertListEqual( + failure_reasons, + [], + ) + + def test_get_families_failed_sex_check(self): + sex_check_ht = hl.Table.parallelize( + [ + {'s': 'ROS_006_18Y03226_D1', 'predicted_sex': 'F'}, + {'s': 'ROS_006_18Y03227_D1', 'predicted_sex': 'F'}, # Pedigree Sex U + {'s': 'ROS_006_18Y03228_D1', 'predicted_sex': 'F'}, + {'s': 'ROS_007_19Y05939_D1', 'predicted_sex': 'M'}, + {'s': 'ROS_007_19Y05987_D1', 'predicted_sex': 'U'}, # Pedigree Sex F + {'s': 'ROS_007_19Y05989_D1', 'predicted_sex': 'XXX'}, + ], + hl.tstruct( + s=hl.tstr, + predicted_sex=hl.tstr, + ), + key='s', + ) + pedigree_ht = import_pedigree(TEST_PEDIGREE_6) + failed_families = get_families_failed_sex_check( + parse_pedigree_ht_to_families(pedigree_ht), + sex_check_ht, + {}, + ) + self.assertCountEqual( + failed_families.values(), + [ + [ + 'Sample ROS_007_19Y05919_D1 has pedigree sex F but is missing from the sex check source', + 'Sample ROS_007_19Y05939_D1 has pedigree sex F but imputed sex M', + ], + ], + ) + + def test_get_families_failed_imputed_sex_ploidy(self) -> None: + female_sample = 'HG00731_1' + male_sample_1 = 'HG00732_1' + male_sample_2 = 'HG00732_1' + x0_sample = 'NA20899_1' + xxy_sample = 'NA20889_1' + xyy_sample = 'NA20891_1' + xxx_sample = 'NA20892_1' + + sex_check_ht = hl.read_table(TEST_SEX_CHECK_1) + families = { + Family( + family_guid='', + samples={ + female_sample: Sample(female_sample, Sex.FEMALE), + male_sample_1: Sample(male_sample_1, Sex.MALE), + male_sample_2: Sample(male_sample_2, Sex.MALE), + x0_sample: Sample(x0_sample, Sex.X0), + xxy_sample: Sample(xxy_sample, Sex.XXY), + xyy_sample: Sample(xyy_sample, Sex.XYY), + xxx_sample: Sample(xxx_sample, Sex.XXX), + }, + ), + } + + # All calls on X chromosome are valid + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chrX', + position=1, + reference_genome='GRCh38', + ), + ], + }, + cols={ + 's': [ + female_sample, + male_sample_1, + x0_sample, + xxy_sample, + xyy_sample, + xxx_sample, + ], + }, + entries={ + 'GT': [ + [ + hl.Call(alleles=[0, 0], phased=False), + hl.Call(alleles=[0], phased=False), + hl.Call(alleles=[0, 0], phased=False), # X0 + hl.Call(alleles=[0, 0], phased=False), # XXY + hl.Call(alleles=[0, 0], phased=False), # XYY + hl.Call(alleles=[0, 0], phased=False), # XXX + ], + ], + }, + ) + .key_rows_by('locus') + .key_cols_by('s') + ) + failed_families = get_families_failed_imputed_sex_ploidy( + families, + mt, + sex_check_ht, + ) + self.assertDictEqual(failed_families, {}) + + # All calls on Y chromosome are valid + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chrY', + position=1, + reference_genome='GRCh38', + ), + ], + }, + cols={ + 's': [ + female_sample, + male_sample_1, + x0_sample, + xxy_sample, + xyy_sample, + xxx_sample, + ], + }, + entries={ + 'GT': [ + [ + hl.missing(hl.tcall), + hl.Call(alleles=[0], phased=False), + hl.missing(hl.tcall), # X0 + hl.Call(alleles=[0, 0], phased=False), # XXY + hl.Call(alleles=[0, 0], phased=False), # XYY + hl.missing(hl.tcall), # XXX + ], + ], + }, + ) + .key_rows_by('locus') + .key_cols_by('s') + ) + failed_families = get_families_failed_imputed_sex_ploidy( + families, + mt, + sex_check_ht, + ) + self.assertDictEqual(failed_families, {}) + + # Invalid X chromosome case + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chrX', + position=1, + reference_genome='GRCh38', + ), + ], + }, + cols={ + 's': [ + female_sample, + male_sample_1, + male_sample_2, + x0_sample, + xxy_sample, + xyy_sample, + xxx_sample, + ], + }, + entries={ + 'GT': [ + [ + hl.Call(alleles=[0], phased=False), # invalid Female call + hl.Call(alleles=[0], phased=False), # valid Male call + hl.missing(hl.tcall), # invalid Male call + hl.Call(alleles=[0], phased=False), # invalid X0 call + hl.Call(alleles=[0], phased=False), # invalid XXY call + hl.missing(hl.tcall), # valid XYY call + hl.Call(alleles=[0, 0], phased=False), # valid XXX call + ], + ], + }, + ) + .key_rows_by('locus') + .key_cols_by('s') + ) + failed_families = get_families_failed_imputed_sex_ploidy( + families, + mt, + sex_check_ht, + ) + self.assertCountEqual( + failed_families.values(), + [ + [ + "Found samples with misaligned ploidy with their provided imputed sex: ['HG00731_1', 'HG00732_1', 'NA20889_1', 'NA20899_1']", + ], + ], + ) + + # Invalid X chromosome case, but only discrepant family samples are reported + families = { + Family( + family_guid='', + samples={female_sample: Sample(female_sample, Sex.FEMALE)}, + ), + } + failed_families = get_families_failed_imputed_sex_ploidy( + families, + mt, + sex_check_ht, + ) + self.assertCountEqual( + failed_families.values(), + [ + [ + "Found samples with misaligned ploidy with their provided imputed sex: ['HG00731_1']", + ], + ], + ) diff --git a/loading_pipeline/lib/misc/gcnv.py b/loading_pipeline/lib/misc/gcnv.py new file mode 100644 index 0000000000..f1b13fe58e --- /dev/null +++ b/loading_pipeline/lib/misc/gcnv.py @@ -0,0 +1,9 @@ +import hail as hl + + +def parse_gcnv_genes(gene_col: hl.expr.StringExpression) -> hl.expr.SetExpression: + return hl.set( + gene_col.split(',') + .filter(lambda gene: ~hl.set({'None', 'null', 'NA', ''}).contains(gene)) + .map(lambda gene: gene.split(r'\.')[0]), + ) diff --git a/loading_pipeline/lib/misc/gcnv_test.py b/loading_pipeline/lib/misc/gcnv_test.py new file mode 100644 index 0000000000..33a72f3684 --- /dev/null +++ b/loading_pipeline/lib/misc/gcnv_test.py @@ -0,0 +1,54 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.misc.gcnv import parse_gcnv_genes + + +class GCNVGeneParsingTest(unittest.TestCase): + def test_parse_gcnv_genes(self): + t1 = hl.Table.parallelize( + [ + {'genes': 'AC118553.2,SLC35A3'}, + {'genes': 'AC118553.1,None'}, + {'genes': 'None'}, + {'genes': 'SLC35A3.43'}, + {'genes': ''}, + {'genes': 'SLC35A4.43'}, + ], + hl.tstruct(genes=hl.dtype('str')), + key='genes', + ) + t1 = t1.annotate(gene_set=parse_gcnv_genes(t1.genes)) + self.assertCountEqual( + t1.collect(), + [ + hl.Struct( + genes='AC118553.2,SLC35A3', + gene_set={'AC118553', 'SLC35A3'}, + ), + hl.Struct(genes='AC118553.1,None', gene_set={'AC118553'}), + hl.Struct(genes='None', gene_set=set()), + hl.Struct(genes='SLC35A3.43', gene_set={'SLC35A3'}), + hl.Struct(genes='', gene_set=set()), + hl.Struct(genes='SLC35A4.43', gene_set={'SLC35A4'}), + ], + ) + + def test_aggregate_parsed_genes(self): + t1 = hl.Table.parallelize( + [ + {'genes': 'AC118553.2,SLC35A3'}, + {'genes': 'AC118553.1,None'}, + {'genes': 'None'}, + {'genes': 'SLC35A3.43'}, + {'genes': ''}, + {'genes': 'SLC35A4.43'}, + ], + hl.tstruct(genes=hl.dtype('str')), + key='genes', + ) + aggregated_gene_set = t1.aggregate( + hl.flatten(hl.agg.collect_as_set(parse_gcnv_genes(t1.genes))), + ) + self.assertEqual(aggregated_gene_set, {'SLC35A4', 'SLC35A3', 'AC118553'}) diff --git a/loading_pipeline/lib/misc/gcp.py b/loading_pipeline/lib/misc/gcp.py new file mode 100644 index 0000000000..46a6c5ecd3 --- /dev/null +++ b/loading_pipeline/lib/misc/gcp.py @@ -0,0 +1,44 @@ +import datetime + +import google.auth +import google.auth.transport.requests +import google.oauth2.credentials +import pytz + +from loading_pipeline.lib.core import FeatureFlag + +SERVICE_ACCOUNT_CREDENTIALS = None +CLOUD_PLATFORM_SCOPE = [ + 'https://www.googleapis.com/auth/cloud-platform', +] +SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = [ + 'https://www.googleapis.com/auth/userinfo.profile', + 'https://www.googleapis.com/auth/userinfo.email', + 'openid', +] +ONE_MINUTE_S = 60 + + +def get_service_account_credentials() -> google.oauth2.credentials.Credentials: + global SERVICE_ACCOUNT_CREDENTIALS + if not SERVICE_ACCOUNT_CREDENTIALS: + SERVICE_ACCOUNT_CREDENTIALS, _ = google.auth.default( + scopes=[ + *SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE, + *(CLOUD_PLATFORM_SCOPE if FeatureFlag.EXPECT_TDR_METRICS else []), + ], + ) + tz = pytz.UTC + if ( + SERVICE_ACCOUNT_CREDENTIALS.token + and ( + tz.localize(SERVICE_ACCOUNT_CREDENTIALS.expiry) + - datetime.datetime.now(tz=tz) + ).total_seconds() + > ONE_MINUTE_S + ): + return SERVICE_ACCOUNT_CREDENTIALS + SERVICE_ACCOUNT_CREDENTIALS.refresh( + request=google.auth.transport.requests.Request(), + ) + return SERVICE_ACCOUNT_CREDENTIALS diff --git a/loading_pipeline/lib/misc/io.py b/loading_pipeline/lib/misc/io.py new file mode 100644 index 0000000000..87b57949d0 --- /dev/null +++ b/loading_pipeline/lib/misc/io.py @@ -0,0 +1,366 @@ +import hashlib +import math +import os +import re +import uuid +from collections.abc import Callable +from string import Template + +import hail as hl +import hailtop.fs as hfs +from pyspark.sql import SparkSession + +from loading_pipeline.lib.core import DatasetType, Env, ReferenceGenome, Sex +from loading_pipeline.lib.misc.gcnv import parse_gcnv_genes +from loading_pipeline.lib.misc.nested_field import parse_nested_field +from loading_pipeline.lib.misc.validation import SeqrValidationError + +BIALLELIC = 2 +B_PER_MB = 1 << 20 # 1024 * 1024 +MB_PER_PARTITION = 32 +MAX_SAMPLES_SPLIT_MULTI_SHUFFLE = 100 + + +def validated_hl_function( + regex_to_msg: dict[str, str | Template], +) -> Callable[[Callable], Callable]: + def decorator(fn: Callable) -> Callable: + def wrapper(*args, **kwargs) -> hl.Table | hl.MatrixTable: + try: + t, _ = checkpoint(fn(*args, **kwargs)) + except Exception as e: + for regex, msg in regex_to_msg.items(): + match = re.search(regex, str(e)) + if match and isinstance(msg, Template): + msg = msg.substitute(match=match.group(1)) # noqa: PLW2901 + if match: + raise SeqrValidationError(msg) from e + raise + else: + return t + + return wrapper + + return decorator + + +def file_size_bytes(path: str) -> int: + if not path.startswith(('gs://', 's3://')): + path = os.path.abspath(path) + + seen_files = set() + + def traverse(current_path: str) -> int: + try: + entries = hfs.ls(current_path) + except FileNotFoundError: + return 0 + + local_size = 0 + for entry in entries: + if entry.path in seen_files: + continue + seen_files.add(entry.path) + + if entry.typ == hfs.stat_result.FileType.FILE: + if not entry.path.endswith('.crc'): + local_size += entry.size + elif entry.typ == hfs.stat_result.FileType.DIRECTORY: + local_size += traverse(entry.path) + + return local_size + + return traverse(path) + + +def compute_hail_n_partitions(file_size_b: int) -> int: + return math.ceil(file_size_b / B_PER_MB / MB_PER_PARTITION) + + +@validated_hl_function( + { + 'RVD error! Keys found out of order': 'Your callset failed while attempting to split multiallelic sites. This error can occur if the dataset contains both multiallelic variants and duplicated loci.', + 'array index out of bounds': 'Your callset failed while attempting to split multiallelic sites. This error can occur if the provided Allele Depth (AD) field does not match the length of the multiallelic site.', + }, +) +def split_multi_hts( + mt: hl.MatrixTable, + skip_validate_no_duplicate_variants: bool, + max_samples_split_multi_shuffle=MAX_SAMPLES_SPLIT_MULTI_SHUFFLE, +) -> hl.MatrixTable: + bi = mt.filter_rows(hl.len(mt.alleles) == BIALLELIC) + # split_multi_hts filters star alleles by default, but we + # need that behavior for bi-allelic variants in addition to + # multi-allelics + bi = bi.filter_rows(~bi.alleles.contains('*')) + bi = bi.annotate_rows(a_index=1, was_split=False) + multi = mt.filter_rows(hl.len(mt.alleles) > BIALLELIC) + split = hl.split_multi_hts( + multi, + permit_shuffle=mt.count()[1] < max_samples_split_multi_shuffle, + ) + mt = split.union_rows(bi) + # If we've disabled validation (which is expected to throw an exception + # for duplicate variants, we would like to distinc ) + if skip_validate_no_duplicate_variants: + return mt.distinct_by_row() + return mt + + +def import_gcnv_bed_file(callset_path: str) -> hl.MatrixTable: + # Hail falls over itself with OOMs with use_new_shuffle here... no clue why. + hl._set_flags(use_new_shuffle=None, no_whole_stage_codegen='1') # noqa: SLF001 + ht = hl.import_table( + callset_path, + types={ + **DatasetType.GCNV.col_fields, + **DatasetType.GCNV.entries_fields, + **DatasetType.GCNV.row_fields, + }, + force=callset_path.endswith('gz'), + ) + mt = ht.to_matrix_table( + row_key=['variant_name', 'svtype'], + col_key=['sample_fix'], + row_fields=['chr', 'sc', 'sf', 'strvctvre_score'], + ) + mt = mt.rename({'start': 'sample_start', 'end': 'sample_end'}) + mt = mt.key_cols_by(s=mt.sample_fix) + mt = mt.annotate_rows( + variant_id=hl.format('%s_%s', mt.variant_name, mt.svtype), + filters=hl.empty_set(hl.tstr), + start=hl.agg.min(mt.sample_start), + end=hl.agg.max(mt.sample_end), + num_exon=hl.agg.max(mt.genes_any_overlap_totalExons), + gene_ids=hl.flatten( + hl.agg.collect_as_set(parse_gcnv_genes(mt.genes_any_overlap_Ensemble_ID)), + ), + cg_genes=hl.flatten( + hl.agg.collect_as_set(parse_gcnv_genes(mt.genes_CG_Ensemble_ID)), + ), + lof_genes=hl.flatten( + hl.agg.collect_as_set(parse_gcnv_genes(mt.genes_LOF_Ensemble_ID)), + ), + ) + return mt.unfilter_entries() + + +@validated_hl_function( + { + '.*FileNotFoundException|GoogleJsonResponseException: 403 Forbidden|arguments refer to no files.*': 'Unable to access the VCF in cloud storage.', + # NB: ?: is non-capturing group. + '.*(?:InvalidHeader|VCFParseError): (.*)$': Template( + 'VCF failed file format validation: $match', + ), + '.*IOException: Gzip-compressed data is corrupt.*': 'Gzip-compressed data is corrupt.', + }, +) +def import_vcf( + callset_path: str, + reference_genome: ReferenceGenome, +) -> hl.MatrixTable: + args = { + 'reference_genome': reference_genome.value, + 'skip_invalid_loci': True, + 'contig_recoding': reference_genome.contig_recoding(), + 'find_replace': ( + 'nul', + '.', + ), # Required for internal exome callsets (+ some AnVIL requests) + 'array_elements_required': False, + 'call_fields': [], # PGT is unused downstream, but is occasionally present in old VCFs! + } + try: + mt, _ = checkpoint( + hl.import_vcf( + callset_path, + force_bgz=True, + **args, + ), + ) + except Exception as e: + # Handle callsets provided as gz but not bgz + # Note that this is handled separately from other VCF validation + # as it's an exceptional case that we can handle internally. + if 'File does not conform to block gzip format' not in str(e): + raise + mt = hl.import_vcf( + callset_path, + force=True, + **args, + ) + return mt + + +def import_callset( + callset_path: str, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +) -> hl.MatrixTable: + if dataset_type == DatasetType.GCNV: + mt = import_gcnv_bed_file(callset_path) + elif 'vcf' in callset_path: + mt = import_vcf(callset_path, reference_genome) + elif 'mt' in callset_path: + mt = hl.read_matrix_table(callset_path) + if dataset_type == DatasetType.SV: + mt = mt.annotate_rows( + variant_id=mt.rsid, + ) + return mt.key_rows_by(*dataset_type.table_key_type(reference_genome).fields) + + +def import_parquet( + callset_path: str, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +) -> hl.Table: + spark = SparkSession.builder.getOrCreate() + df = spark.read.parquet(callset_path) + ht = hl.Table.from_spark(df) + + key_fields = dataset_type.table_key_type(reference_genome).fields + if 'locus' in key_fields: + raw_contig = ht.variant_id.split('-')[0] + contig = ( + hl.format('chr%s', raw_contig) + if reference_genome == ReferenceGenome.GRCh38 + else raw_contig + ) + ht = ht.transmute( + locus=hl.locus( + contig=contig, + pos=hl.int32(ht.variant_id.split('-')[1]), + reference_genome=reference_genome.value, + ), + alleles=[ht.variant_id.split('-')[2], ht.variant_id.split('-')[3]], + ) + + return ht.key_by(*key_fields) + + +@validated_hl_function( + { + 'instance has no field (.*)': Template( + 'Your callset is missing a required field: $match', + ), + }, +) +def select_relevant_fields( + mt: hl.MatrixTable, + dataset_type: DatasetType, + additional_row_fields: None | dict[str, hl.expr.types.HailType | set] = None, +) -> hl.MatrixTable: + mt = mt.select_globals() + mt = mt.select_rows( + **{field: parse_nested_field(mt, field) for field in dataset_type.row_fields}, + **{ + field: parse_nested_field(mt, field) + for field in (additional_row_fields or []) + }, + ) + mt = mt.select_cols( + **{field: parse_nested_field(mt, field) for field in dataset_type.col_fields}, + ) + return mt.select_entries( + **{ + field: parse_nested_field(mt, field) + for field in dataset_type.entries_fields + }, + ) + + +def import_imputed_sex(imputed_sex_path: str) -> hl.Table: + ht = hl.import_table(imputed_sex_path) + imputed_sex_lookup = hl.dict( + { + imputed_sex_value: s.value + for s in Sex + for imputed_sex_value in s.imputed_sex_values + }, + ) + ht = ht.select( + s=ht.collaborator_sample_id, + predicted_sex=( + hl.case() + .when( + imputed_sex_lookup.contains(ht.predicted_sex), + imputed_sex_lookup[ht.predicted_sex], + ) + .or_error( + hl.format( + 'Found unexpected value %s in imputed sex file', + ht.predicted_sex, + ), + ) + ), + ) + return ht.key_by(ht.s) + + +def import_tdr_qc_metrics(file_path: str) -> hl.Table: + ht = hl.import_table( + file_path, + types={ + 'contamination_rate': hl.tfloat32, + 'percent_bases_at_20x': hl.tfloat32, + 'mean_coverage': hl.tfloat32, + }, + delimiter='\t', + missing=[''], + ) + ht = ht.select( + s=ht.collaborator_sample_id, + contamination_rate=ht.contamination_rate, + percent_bases_at_20x=ht.percent_bases_at_20x, + mean_coverage=ht.mean_coverage, + ) + return ht.key_by(ht.s) + + +def import_pedigree(pedigree_path: str) -> hl.Table: + ht = hl.import_table(pedigree_path, missing='') + optional_selects = {'remap_id': ht.VCF_ID} if 'VCF_ID' in ht.row else {} + return ht.select( + sex=ht.Sex, + family_guid=ht.Family_GUID, + s=ht.Individual_ID, + maternal_s=ht.Maternal_ID, + paternal_s=ht.Paternal_ID, + **optional_selects, + ) + + +def remap_pedigree_hash(pedigree_path: str) -> hl.Int32Expression: + sha256 = hashlib.sha256() + with hfs.open(pedigree_path) as f2: + sha256.update(f2.read().encode('utf8')) + # maximum 4 byte int + return hl.int32(int(sha256.hexdigest()[:8], 16)) + + +def checkpoint( + t: hl.Table | hl.MatrixTable, +) -> tuple[hl.Table | hl.MatrixTable, str]: + suffix = 'mt' if isinstance(t, hl.MatrixTable) else 'ht' + read_fn = hl.read_matrix_table if isinstance(t, hl.MatrixTable) else hl.read_table + checkpoint_path = os.path.join( + Env.HAIL_TMP_DIR, + f'{uuid.uuid4()}.{suffix}', + ) + t.write(checkpoint_path) + return read_fn(checkpoint_path), checkpoint_path + + +def write( + t: hl.Table | hl.MatrixTable, + destination_path: str, + repartition: bool = True, +) -> hl.Table | hl.MatrixTable: + t, path = checkpoint(t) + if repartition: + t = t.repartition( + compute_hail_n_partitions(file_size_bytes(path)), + shuffle=False, + ) + return t.write(destination_path, overwrite=True) diff --git a/loading_pipeline/lib/misc/io_test.py b/loading_pipeline/lib/misc/io_test.py new file mode 100644 index 0000000000..2ca502fc87 --- /dev/null +++ b/loading_pipeline/lib/misc/io_test.py @@ -0,0 +1,211 @@ +import unittest +from unittest import mock + +import hail as hl + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.misc.io import ( + compute_hail_n_partitions, + file_size_bytes, + import_imputed_sex, + import_vcf, + remap_pedigree_hash, + select_relevant_fields, + split_multi_hts, +) +from loading_pipeline.lib.misc.validation import SeqrValidationError + +TEST_IMPUTED_SEX = 'loading_pipeline/var/test/sex_check/test_imputed_sex.tsv' +TEST_IMPUTED_SEX_UNEXPECTED_VALUE = ( + 'loading_pipeline/var/test/sex_check/test_imputed_sex_unexpected_value.tsv' +) +CORRUPTED_VCF = 'loading_pipeline/var/test/callsets/1kg_corrupt.vcf.gz' +TEST_INVALID_VCF = 'loading_pipeline/var/test/callsets/improperly_formatted.vcf' +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_MITO_MT = 'loading_pipeline/var/test/callsets/mito_1.mt' + + +class IOTest(unittest.TestCase): + def test_file_size_mb(self) -> None: + # find loading_pipeline/var/test/callsets/mito_1.mt -type f | grep -v 'crc' | xargs ls -alt {} | awk '{sum += $5; print sum}' + # 154517 + self.assertEqual(file_size_bytes(TEST_MITO_MT), 154517) + + def test_compute_hail_n_partitions(self) -> None: + self.assertEqual(compute_hail_n_partitions(23), 1) + self.assertEqual(compute_hail_n_partitions(191310), 1) + self.assertEqual(compute_hail_n_partitions(1913100000), 58) + + def test_import_imputed_sex(self) -> None: + ht = import_imputed_sex(TEST_IMPUTED_SEX) + self.assertListEqual( + ht.collect(), + [ + hl.Struct(s='abc_1', predicted_sex='M'), + hl.Struct(s='abc_2', predicted_sex='F'), + hl.Struct(s='abc_3', predicted_sex='U'), + hl.Struct(s='abc_4', predicted_sex='XYY'), + hl.Struct(s='abc_5', predicted_sex='U'), + ], + ) + + def test_import_imputed_sex_unexpected_value(self) -> None: + ht = import_imputed_sex(TEST_IMPUTED_SEX_UNEXPECTED_VALUE) + self.assertRaisesRegex( + hl.utils.java.HailUserError, + 'Found unexpected value UNKNOWN in imputed sex file', + ht.collect, + ) + + def test_remap_pedigree_hash(self) -> None: + self.assertEqual( + hl.eval( + remap_pedigree_hash( + TEST_PEDIGREE_3_REMAP, + ), + ), + 573002191, + ) + + def test_import_vcf(self) -> None: + self.assertRaisesRegex( + TypeError, + 'missing 1 required positional argument', + import_vcf, + 'abc', + ) + self.assertRaisesRegex( + SeqrValidationError, + 'Unable to access the VCF in cloud storage', + import_vcf, + 'bad.vcf', + ReferenceGenome.GRCh38, + ) + self.assertRaisesRegex( + SeqrValidationError, + 'Gzip-compressed data is corrupt', + import_vcf, + CORRUPTED_VCF, + ReferenceGenome.GRCh38, + ) + with mock.patch( + 'loading_pipeline.lib.misc.io.hl.read_table', + ) as mock_read_table: + mock_read_table.side_effect = hl.utils.java.FatalError( + 'GoogleJsonResponseException: 403 Forbidden', + ) + self.assertRaisesRegex( + SeqrValidationError, + 'Unable to access the VCF in cloud storage', + import_vcf, + 'abc123/bad.vcf', + ReferenceGenome.GRCh38, + ) + self.assertRaisesRegex( + SeqrValidationError, + 'VCF failed file format validation: Your input file has a malformed header: We never saw the required CHROM header line \\(starting with one #\\) for the input VCF file', + import_vcf, + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + ) + self.assertRaisesRegex( + SeqrValidationError, + "VCF failed file format validation: invalid character 'N' in integer literal", + import_vcf, + TEST_INVALID_VCF, + ReferenceGenome.GRCh38, + ) + + def test_select_missing_field(self) -> None: + self.assertRaisesRegex( + SeqrValidationError, + "Your callset is missing a required field: 'a magic field'", + select_relevant_fields, + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['A', 'C'], + ], + 'rsid': ['rs1233'], + 'filters': [{'PASS'}], + }, + cols={'s': ['sample_1']}, + entries={ + 'GT': [[hl.Call([0, 0])]], + 'AD': [[[0, 20]]], + 'GQ': [[99]], + }, + ).key_rows_by('locus', 'alleles'), + DatasetType.SNV_INDEL, + {'a magic field': hl.tint32}, + ) + + def test_split_multi_failure(self) -> None: + self.assertRaisesRegex( + SeqrValidationError, + 'Your callset failed while attempting to split multiallelic sites. This error can occur if the dataset contains both multiallelic variants and duplicated loci.', + split_multi_hts, + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['A', 'G', 'AC'], + ['A', 'AT', 'C', 'G'], + ], + }, + cols={'s': ['sample_1']}, + entries={ + 'GQ': [[99], [98]], + }, + ) + .key_rows_by('locus', 'alleles') + .repartition(1), + False, + 1, + ) + + def test_split_multi_failure_ad_length(self) -> None: + self.assertRaisesRegex( + SeqrValidationError, + 'Your callset failed while attempting to split multiallelic sites. This error can occur if the provided Allele Depth \\(AD\\) field does not match the length of the multiallelic site.', + split_multi_hts, + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['GAC', 'G', 'GTTTTTTTTTTTTTTTAC'], + ], + }, + cols={'s': ['sample_1']}, + entries={ + 'GQ': [[99]], + 'AD': [[[0, 1]]], + }, + ).key_rows_by('locus', 'alleles'), + False, + 1, + ) diff --git a/loading_pipeline/lib/misc/math.py b/loading_pipeline/lib/misc/math.py new file mode 100644 index 0000000000..65feedb0a7 --- /dev/null +++ b/loading_pipeline/lib/misc/math.py @@ -0,0 +1,9 @@ +def constrain( + number: int | float, + lower_bound: int | float, + upper_bound: int | float, +) -> int: + if lower_bound > upper_bound: + msg = 'Lower bound should be less than or equal to upper bound' + raise ValueError(msg) + return max(lower_bound, min(number, upper_bound)) diff --git a/loading_pipeline/lib/misc/math_test.py b/loading_pipeline/lib/misc/math_test.py new file mode 100644 index 0000000000..19e12d6bfc --- /dev/null +++ b/loading_pipeline/lib/misc/math_test.py @@ -0,0 +1,12 @@ +import unittest + +from loading_pipeline.lib.misc.math import constrain + + +class TestConstrainFunction(unittest.TestCase): + def test_constrain(self): + self.assertEqual(constrain(5, 0, 10), 5) + self.assertEqual(constrain(-3, 0, 10), 0) + self.assertEqual(constrain(15, 0, 10), 10) + with self.assertRaises(ValueError): + constrain(5, 10, 0) diff --git a/loading_pipeline/lib/misc/nested_field.py b/loading_pipeline/lib/misc/nested_field.py new file mode 100644 index 0000000000..43d39005bb --- /dev/null +++ b/loading_pipeline/lib/misc/nested_field.py @@ -0,0 +1,17 @@ +import hail as hl + + +def parse_nested_field(t: hl.MatrixTable | hl.Table, fields: str): + expression = t + # Behavior here allows only a single nested field. + # Additional nesting is considered to be part of the + # name of the field. e.g. `gnomadv4.1_AF`. + for field in fields.split('.', maxsplit=1): + # Select from multi-allelic list. + if field.endswith('#'): + expression = expression[field[:-1]][ + (t.a_index if hasattr(t, 'a_index') else 1) - 1 + ] + else: + expression = expression[field] + return expression diff --git a/loading_pipeline/lib/misc/nested_field_test.py b/loading_pipeline/lib/misc/nested_field_test.py new file mode 100644 index 0000000000..8d465187a5 --- /dev/null +++ b/loading_pipeline/lib/misc/nested_field_test.py @@ -0,0 +1,81 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.misc.nested_field import parse_nested_field + + +class TestConstrainFunction(unittest.TestCase): + def test_parse_nested_field(self): + ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + 'alleles': ['A', 'C'], + 'a': hl.Struct(d=1), + 'b': hl.Struct(e=[2, 9]), + 'h': hl.Struct(**{'i.j': 1}), + 'a_index': 1, + }, + { + 'locus': hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + 'alleles': ['A', 'C'], + 'a': hl.Struct(d=3), + 'b': hl.Struct(e=[4, 5]), + 'h': hl.Struct(**{'i.j': 2}), + 'a_index': 1, + }, + ], + hl.tstruct( + locus=hl.tlocus('GRCh38'), + alleles=hl.tarray(hl.tstr), + a=hl.tstruct(d=hl.tint32), + b=hl.tstruct(e=hl.tarray(hl.tint32)), + h=hl.tstruct(**{'i.j': hl.tint32}), + a_index=hl.tint32, + ), + key=['locus', 'alleles'], + ) + ht = ht.select( + d=parse_nested_field(ht, 'a.d'), + e=parse_nested_field(ht, 'b.e#'), + f=parse_nested_field(ht, 'a'), + g=parse_nested_field(ht, 'h.i.j'), + ) + self.assertListEqual( + ht.collect(), + [ + hl.Struct( + locus=hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + alleles=['A', 'C'], + d=1, + e=2, + f=hl.Struct(d=1), + g=1, + ), + hl.Struct( + locus=hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + alleles=['A', 'C'], + d=3, + e=4, + f=hl.Struct(d=3), + g=2, + ), + ], + ) diff --git a/loading_pipeline/lib/misc/pedigree.py b/loading_pipeline/lib/misc/pedigree.py new file mode 100644 index 0000000000..5950e6cf09 --- /dev/null +++ b/loading_pipeline/lib/misc/pedigree.py @@ -0,0 +1,199 @@ +import itertools +from dataclasses import dataclass, field +from enum import Enum + +import hail as hl +import numpy as np + +from loading_pipeline.lib.core import Sex + +DEFAULT_RELATEDNESS_TOLERANCE = 0.2 + + +class Relation(Enum): + PARENT_CHILD = 'parent_child' + GRANDPARENT_GRANDCHILD = 'grandparent_grandchild' + SIBLING = 'sibling' + HALF_SIBLING = 'half_sibling' + AUNT_NEPHEW = 'aunt_nephew' + + @property + def coefficients(self): + return { + Relation.PARENT_CHILD: [0, 1, 0, 0.5], + Relation.GRANDPARENT_GRANDCHILD: [0.5, 0.5, 0, 0.25], + Relation.SIBLING: [0.25, 0.5, 0.25, 0.5], + Relation.HALF_SIBLING: [0.5, 0.5, 0, 0.25], + Relation.AUNT_NEPHEW: [0.5, 0.5, 0, 0.25], + }[self] + + def coefficients_equal(self, coefficients: list[float]) -> bool: + if self == Relation.PARENT_CHILD: + return np.allclose( + coefficients[0], + self.coefficients[0], + atol=0.025, + ) and np.allclose( + coefficients[1:], + self.coefficients[1:], + atol=DEFAULT_RELATEDNESS_TOLERANCE, + ) + return np.allclose( + coefficients, + self.coefficients, + atol=DEFAULT_RELATEDNESS_TOLERANCE, + ) + + +@dataclass +class Sample: + sample_id: str + sex: Sex + mother: str = None + father: str = None + maternal_grandmother: str = None + maternal_grandfather: str = None + paternal_grandmother: str = None + paternal_grandfather: str = None + siblings: list[str] = field(default_factory=list) + half_siblings: list[str] = field(default_factory=list) + aunt_nephews: list[str] = field(default_factory=list) + + def is_aunt_nephew(self: 'Sample', other: 'Sample') -> bool: + return ( + # My Maternal Grandparents are your Parents + self.maternal_grandmother + and self.maternal_grandfather + and (self.maternal_grandmother == other.mother) + and (self.maternal_grandfather == other.father) + ) or ( + # My Paternal Grandparents are your Parents + self.paternal_grandmother + and self.paternal_grandfather + and (self.paternal_grandmother == other.mother) + and (self.paternal_grandfather == other.father) + ) + + def is_in_direct_lineage(self: 'Sample', other: 'Sample') -> bool: + return self.sample_id in { + other.mother, + other.father, + other.maternal_grandmother, + other.maternal_grandfather, + other.paternal_grandmother, + other.paternal_grandfather, + } or other.sample_id in { + self.mother, + self.father, + self.maternal_grandmother, + self.maternal_grandfather, + self.paternal_grandmother, + self.paternal_grandfather, + } + + +@dataclass +class Family: + family_guid: str + samples: dict[str, Sample] + + def __hash__(self): + return hash(self.family_guid) + + def __eq__(self, other): + return self.family_guid == other.family_guid + + @staticmethod + def parse_direct_lineage(rows: list[hl.Struct]) -> dict[str, Sample]: + samples = {} + for row in rows: + samples[row.s] = Sample( + sample_id=row.s, + sex=Sex(row.sex), + mother=row.maternal_s, + father=row.paternal_s, + ) + + for row in rows: + # Maternal GrandParents + maternal_s = samples[row.s].mother + if maternal_s and maternal_s in samples: + if samples[maternal_s].mother: + samples[row.s].maternal_grandmother = samples[maternal_s].mother + if samples[maternal_s].father: + samples[row.s].maternal_grandfather = samples[maternal_s].father + + # Paternal GrandParents + paternal_s = samples[row.s].father + if paternal_s and paternal_s in samples: + if samples[paternal_s].mother: + samples[row.s].paternal_grandmother = samples[paternal_s].mother + if samples[paternal_s].father: + samples[row.s].paternal_grandfather = samples[paternal_s].father + return samples + + @staticmethod + def parse_collateral_lineage( + samples: dict[str, Sample], + ) -> dict[str, Sample]: + # NB: relationships are identified unidirectionally here (for better or for worse) + # A sample_i that is siblings with sample_j, will list sample_j as as sibling, but + # sample_j will not list sample_i as a sibling. Relationships only appear in the + # ibd table a single time, so we only need to check the pairing once. + for sample_i, sample_j in itertools.combinations(samples.values(), 2): + # If sample is already related from direct relationships, continue + if sample_i.is_in_direct_lineage(sample_j): + continue + + # If both parents are identified and the same, samples are siblings. + if ( + sample_i.mother + and sample_i.father + and (sample_i.mother == sample_j.mother) + and (sample_i.father == sample_j.father) + ): + sample_i.siblings.append(sample_j.sample_id) + continue + + # If only a single parent is identified and the same, samples are half siblings + if (sample_i.mother and sample_i.mother == sample_j.mother) or ( + sample_i.father and sample_i.father == sample_j.father + ): + sample_i.half_siblings.append(sample_j.sample_id) + continue + + # If either set of one's grandparents is identified and equal to the other's parents, + # they're aunt/uncle related + # NB: because we will only check an i, j pair of samples a single time, (itertools.combinations) + # we need to check both grandparents_i == parents_j and parents_i == grandparents_j. + if sample_i.is_aunt_nephew(sample_j) or sample_j.is_aunt_nephew(sample_i): + sample_i.aunt_nephews.append(sample_j.sample_id) + return samples + + @classmethod + def parse(cls, family_guid: str, rows: list[hl.Struct]) -> 'Family': + samples = cls.parse_direct_lineage(rows) + samples = cls.parse_collateral_lineage(samples) + return cls( + family_guid=family_guid, + samples=samples, + ) + + +def parse_pedigree_ht_to_families( + pedigree_ht: hl.Table, +) -> set[Family]: + families = set() + for family_guid, rows in itertools.groupby( + sorted(pedigree_ht.collect(), key=lambda x: x.family_guid), + lambda x: x.family_guid, + ): + families.add(Family.parse(family_guid, list(rows))) + return families + + +def parse_pedigree_ht_to_remap_ht(pedigree_ht: hl.Table) -> hl.Table: + ht = pedigree_ht.filter(hl.is_defined(pedigree_ht.remap_id)) + ht = ht.annotate(seqr_id=ht.s) + ht = ht.key_by(s=ht.remap_id) + return ht.select('seqr_id') diff --git a/loading_pipeline/lib/misc/pedigree_test.py b/loading_pipeline/lib/misc/pedigree_test.py new file mode 100644 index 0000000000..77432ba138 --- /dev/null +++ b/loading_pipeline/lib/misc/pedigree_test.py @@ -0,0 +1,514 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.core import Sex +from loading_pipeline.lib.misc.io import import_pedigree +from loading_pipeline.lib.misc.pedigree import ( + Family, + Sample, + parse_pedigree_ht_to_families, +) + +TEST_PEDIGREE_1 = 'loading_pipeline/var/test/pedigrees/test_pedigree_1.tsv' +TEST_PEDIGREE_2 = 'loading_pipeline/var/test/pedigrees/test_pedigree_2.tsv' +TEST_PEDIGREE_9 = 'loading_pipeline/var/test/pedigrees/test_pedigree_9.tsv' + + +class PedigreesTest(unittest.TestCase): + def test_empty_pedigree(self) -> None: + with self.assertRaises(Exception): # noqa: B017 + _ = import_pedigree(TEST_PEDIGREE_1) + + def test_parse_lineage(self) -> None: + # + # + # sample_9 sample_10 sample_7 + # \ / \ | + # sample_6 -> sample_8 --------- sample_3 ----- ? | + # \ / \ / | + # sample_4, sample_5 sample_2 | sample_1 + # + # + samples = Family.parse_direct_lineage( + [ + hl.Struct(s='sample_1', maternal_s=None, paternal_s=None, sex='F'), + hl.Struct( + s='sample_2', + maternal_s='sample_3', + paternal_s=None, + sex='M', + ), + hl.Struct( + s='sample_3', + maternal_s=None, + paternal_s='sample_7', + sex='F', + ), + hl.Struct( + s='sample_4', + maternal_s='sample_3', + paternal_s='sample_8', + sex='M', + ), + hl.Struct( + s='sample_5', + maternal_s='sample_3', + paternal_s='sample_8', + sex='M', + ), + hl.Struct( + s='sample_6', + maternal_s='sample_9', + paternal_s='sample_10', + sex='M', + ), + hl.Struct(s='sample_7', maternal_s=None, paternal_s=None, sex='M'), + hl.Struct( + s='sample_8', + maternal_s='sample_9', + paternal_s='sample_10', + sex='F', + ), + hl.Struct(s='sample_9', maternal_s=None, paternal_s=None, sex='F'), + hl.Struct(s='sample_10', maternal_s=None, paternal_s=None, sex='M'), + ], + ) + self.assertEqual( + Family.parse_collateral_lineage(samples), + { + 'sample_1': Sample( + sample_id='sample_1', + sex=Sex.FEMALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_2': Sample( + sample_id='sample_2', + sex=Sex.MALE, + mother='sample_3', + father=None, + maternal_grandmother=None, + maternal_grandfather='sample_7', + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=['sample_4', 'sample_5'], + aunt_nephews=[], + ), + 'sample_3': Sample( + sample_id='sample_3', + sex=Sex.FEMALE, + mother=None, + father='sample_7', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_4': Sample( + sample_id='sample_4', + sex=Sex.MALE, + mother='sample_3', + father='sample_8', + maternal_grandmother=None, + maternal_grandfather='sample_7', + paternal_grandmother='sample_9', + paternal_grandfather='sample_10', + siblings=['sample_5'], + half_siblings=[], + aunt_nephews=['sample_6'], + ), + 'sample_5': Sample( + sample_id='sample_5', + sex=Sex.MALE, + mother='sample_3', + father='sample_8', + maternal_grandmother=None, + maternal_grandfather='sample_7', + paternal_grandmother='sample_9', + paternal_grandfather='sample_10', + siblings=[], + half_siblings=[], + aunt_nephews=['sample_6'], + ), + 'sample_6': Sample( + sample_id='sample_6', + sex=Sex.MALE, + mother='sample_9', + father='sample_10', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=['sample_8'], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_7': Sample( + sample_id='sample_7', + sex=Sex.MALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_8': Sample( + sample_id='sample_8', + sex=Sex.FEMALE, + mother='sample_9', + father='sample_10', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_9': Sample( + sample_id='sample_9', + sex=Sex.FEMALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_10': Sample( + sample_id='sample_10', + sex=Sex.MALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + }, + ) + + def test_parse_parent_not_aunt_uncle(self) -> None: + samples = Family.parse_direct_lineage( + [ + hl.Struct(s='sample_1', maternal_s=None, paternal_s=None, sex='F'), + hl.Struct( + s='sample_2', + maternal_s=None, + paternal_s=None, + sex='M', + ), + hl.Struct( + s='sample_3', + maternal_s='sample_1', + paternal_s='sample_2', + sex='F', + ), + hl.Struct( + s='sample_4', + maternal_s='sample_3', + paternal_s=None, + sex='F', + ), + hl.Struct( + s='sample_5', + maternal_s='sample_3', + paternal_s=None, + sex='F', + ), + ], + ) + self.assertEqual( + Family.parse_collateral_lineage(samples), + { + 'sample_1': Sample( + sample_id='sample_1', + sex=Sex.FEMALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_2': Sample( + sample_id='sample_2', + sex=Sex.MALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_3': Sample( + sample_id='sample_3', + sex=Sex.FEMALE, + mother='sample_1', + father='sample_2', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'sample_4': Sample( + sample_id='sample_4', + sex=Sex.FEMALE, + mother='sample_3', + father=None, + maternal_grandmother='sample_1', + maternal_grandfather='sample_2', + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=['sample_5'], + aunt_nephews=[], + ), + 'sample_5': Sample( + sample_id='sample_5', + sex=Sex.FEMALE, + mother='sample_3', + father=None, + maternal_grandmother='sample_1', + maternal_grandfather='sample_2', + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + }, + ) + + def test_parse_project(self) -> None: + pedigree_ht = import_pedigree(TEST_PEDIGREE_2) + self.assertCountEqual( + list(parse_pedigree_ht_to_families(pedigree_ht)), + [ + Family( + family_guid='BBL_BC1-000345_1', + samples={ + 'BBL_BC1-000345_01_D1': Sample( + sample_id='BBL_BC1-000345_01_D1', + sex=Sex.UNKNOWN, + mother='BBL_BC1-000345_03_D1', + father='BBL_BC1-000345_02_D1', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_BC1-000345_02_D1': Sample( + sample_id='BBL_BC1-000345_02_D1', + sex=Sex.MALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_BC1-000345_03_D1': Sample( + sample_id='BBL_BC1-000345_03_D1', + sex=Sex.FEMALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + }, + ), + Family( + family_guid='BBL_HT-007-5195_1', + samples={ + 'BBL_HT-007-5195_01_D1': Sample( + sample_id='BBL_HT-007-5195_01_D1', + sex=Sex.FEMALE, + mother='BBL_HT-007-5195_03_D1', + father='BBL_HT-007-5195_02_D1', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[ + 'BBL_HT-007-5195_04_D1', + 'BBL_HT-007-5195_05_D1', + 'BBL_HT-007-5195_06_D1', + ], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_HT-007-5195_02_D1': Sample( + sample_id='BBL_HT-007-5195_02_D1', + sex=Sex.MALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_HT-007-5195_03_D1': Sample( + sample_id='BBL_HT-007-5195_03_D1', + sex=Sex.FEMALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_HT-007-5195_04_D1': Sample( + sample_id='BBL_HT-007-5195_04_D1', + sex=Sex.MALE, + mother='BBL_HT-007-5195_03_D1', + father='BBL_HT-007-5195_02_D1', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=['BBL_HT-007-5195_05_D1', 'BBL_HT-007-5195_06_D1'], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_HT-007-5195_05_D1': Sample( + sample_id='BBL_HT-007-5195_05_D1', + sex=Sex.FEMALE, + mother='BBL_HT-007-5195_03_D1', + father='BBL_HT-007-5195_02_D1', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=['BBL_HT-007-5195_06_D1'], + half_siblings=[], + aunt_nephews=[], + ), + 'BBL_HT-007-5195_06_D1': Sample( + sample_id='BBL_HT-007-5195_06_D1', + sex=Sex.MALE, + mother='BBL_HT-007-5195_03_D1', + father='BBL_HT-007-5195_02_D1', + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + }, + ), + Family( + family_guid='BBL_SDS1-000178_1', + samples={ + 'BBL_SDS1-000178_01_D1': Sample( + sample_id='BBL_SDS1-000178_01_D1', + sex=Sex.FEMALE, + mother=None, + father=None, + maternal_grandmother=None, + maternal_grandfather=None, + paternal_grandmother=None, + paternal_grandfather=None, + siblings=[], + half_siblings=[], + aunt_nephews=[], + ), + }, + ), + ], + ) + + def test_subsetted_pedigree_with_removed_parent(self) -> None: + pedigree_ht = import_pedigree(TEST_PEDIGREE_2) + pedigree_ht = pedigree_ht.filter( + pedigree_ht.s != 'BBL_BC1-000345_02_D1', + ) + parsed_pedigree = parse_pedigree_ht_to_families(pedigree_ht) + family = next( + iter( + [ + family + for family in parsed_pedigree + if family.family_guid == 'BBL_BC1-000345_1' + ], + ), + ) + self.assertEqual(len(family.samples), 2) + self.assertFalse( + 'BBL_BC1-000345_02_D1' in family.samples, + ) + self.assertEqual( + family.samples['BBL_BC1-000345_01_D1'].father, + 'BBL_BC1-000345_02_D1', + ) + self.assertEqual( + family.samples['BBL_BC1-000345_01_D1'].mother, + 'BBL_BC1-000345_03_D1', + ) + + def test_pedigree_ungrouped_families(self) -> None: + pedigree_ht = import_pedigree(TEST_PEDIGREE_9) + parsed_pedigree = parse_pedigree_ht_to_families(pedigree_ht) + self.assertEqual(len(parsed_pedigree), 2) + family = next( + iter( + [ + family + for family in parsed_pedigree + if family.family_guid == 'family_2_1' + ], + ), + ) + self.assertTrue( + family.samples.keys() == {'RGP_164_1', 'RGP_164_2', 'RGP_164_4'}, + ) diff --git a/loading_pipeline/lib/misc/requests.py b/loading_pipeline/lib/misc/requests.py new file mode 100644 index 0000000000..e0ee66f366 --- /dev/null +++ b/loading_pipeline/lib/misc/requests.py @@ -0,0 +1,14 @@ +import requests +from requests.adapters import HTTPAdapter, Retry + + +def requests_retry_session(): + s = requests.Session() + retries = Retry( + total=5, + backoff_factor=1, + status_forcelist=[500, 502, 503, 504], + ) + s.mount('http://', HTTPAdapter(max_retries=retries)) + s.mount('https://', HTTPAdapter(max_retries=retries)) + return s diff --git a/loading_pipeline/lib/misc/retry.py b/loading_pipeline/lib/misc/retry.py new file mode 100644 index 0000000000..3a9408b075 --- /dev/null +++ b/loading_pipeline/lib/misc/retry.py @@ -0,0 +1,61 @@ +import functools +import time + +from loading_pipeline.lib.logger import get_logger + +logger = get_logger(__name__) + + +def retry(tries=3, delay=30, backoff=3): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + max_tries = tries + current_delay = delay + total_start_time = time.time() + args_str = ', '.join(str(a) for a in args) + kwargs_str = ', '.join(f'{k}={v!s}' for k, v in kwargs.items()) + + for attempt in range(1, max_tries): + start_time = time.time() + try: + result = func(*args, **kwargs) + duration = time.time() - start_time + logger.info( + f'{func.__name__} args:{args_str} kwargs:{kwargs_str} succeeded on attempt {attempt} in {duration:.2f}s', + ) + except Exception: + duration = time.time() - start_time + logger.exception( + f'{func.__name__} args:{args_str} kwargs:{kwargs_str} failed on attempt {attempt} after {duration:.2f}s, ' + f'retrying in {current_delay} seconds.', + ) + time.sleep(current_delay) + current_delay *= backoff + else: + return result + + # Final attempt + start_time = time.time() + try: + result = func(*args, **kwargs) + duration = time.time() - start_time + total_duration = time.time() - total_start_time + logger.info( + f'{func.__name__} args:{args_str} kwargs:{kwargs_str} succeeded on final attempt {max_tries} in {duration:.2f}s ' + f'(total retry time: {total_duration:.2f}s)', + ) + except Exception: + duration = time.time() - start_time + total_duration = time.time() - total_start_time + logger.exception( + f'{func.__name__} args:{args_str} kwargs:{kwargs} failed on final attempt {max_tries} after {duration:.2f}s ' + f'(total retry time: {total_duration:.2f}s)', + ) + raise + else: + return result + + return wrapper + + return decorator diff --git a/loading_pipeline/lib/misc/retry_test.py b/loading_pipeline/lib/misc/retry_test.py new file mode 100644 index 0000000000..4b756abce1 --- /dev/null +++ b/loading_pipeline/lib/misc/retry_test.py @@ -0,0 +1,69 @@ +import unittest +from unittest.mock import Mock, patch + +from loading_pipeline.lib.core import DatasetType +from loading_pipeline.lib.misc.retry import retry + + +class TestRetryDecorator(unittest.TestCase): + @patch('time.sleep', return_value=None) + def test_retry_success_first_try(self, mock_sleep): + mock_func = Mock(return_value='success') + + @retry(tries=3, delay=1, backoff=2) + def func(d: DatasetType): + return mock_func(d) + + result = func(DatasetType.SNV_INDEL) + self.assertEqual(result, 'success') + self.assertEqual(mock_func.call_count, 1) + mock_sleep.assert_not_called() + + @patch('time.sleep', return_value=None) + @patch('loading_pipeline.lib.misc.retry.logger') + def test_retry_eventual_success(self, mock_logger, mock_sleep): + mock_func = Mock( + side_effect=[Exception('fail'), Exception('fail again'), 'success'], + ) + + @retry(tries=3, delay=1, backoff=2) + def func(): + return mock_func() + + result = func() + self.assertEqual(result, 'success') + self.assertEqual(mock_func.call_count, 3) + self.assertEqual(mock_sleep.call_count, 2) + mock_sleep.assert_any_call(1) + mock_sleep.assert_any_call(2) + + @patch('time.sleep', return_value=None) + @patch('loading_pipeline.lib.misc.retry.logger') + def test_retry_all_failures(self, mock_logger, mock_sleep): + mock_func = Mock(side_effect=Exception('always fails')) + + @retry(tries=3, delay=1, backoff=2) + def func(): + return mock_func() + + with self.assertRaises(Exception) as context: + func() + + self.assertEqual(str(context.exception), 'always fails') + self.assertEqual(mock_func.call_count, 3) + self.assertEqual(mock_sleep.call_count, 2) + + @patch('time.sleep', return_value=None) + @patch('loading_pipeline.lib.misc.retry.logger.exception') + def test_logs_retry_message(self, mock_log, mock_sleep): + mock_func = Mock(side_effect=[Exception('fail'), 'success']) + + @retry(tries=2, delay=1, backoff=2) + def func(d: DatasetType): + return mock_func(d) + + func(d=DatasetType.SNV_INDEL) + self.assertIn( + 'func args: kwargs:d=SNV_INDEL failed on attempt 1 after 0.00s, retrying in 1 seconds.', + mock_log.call_args[0][0], + ) diff --git a/loading_pipeline/lib/misc/runs.py b/loading_pipeline/lib/misc/runs.py new file mode 100644 index 0000000000..2cf4550381 --- /dev/null +++ b/loading_pipeline/lib/misc/runs.py @@ -0,0 +1,35 @@ +import datetime +import os + +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.paths import ( + loading_pipeline_queue_dir, +) + + +def new_run_id(): + return datetime.datetime.now(datetime.UTC).strftime( + '%Y%m%d-%H%M%S-%f', + ) + + +def get_oldest_queue_path() -> str | None: + """ + Returns the path of the oldest loading pipeline request file in the queue directory. + If the directory is empty, returns None. + """ + queue_dir = loading_pipeline_queue_dir() + queue_files = os.listdir(queue_dir) + + if len(queue_files) == 0: + return None + queue_files = [os.path.join(queue_dir, queue_file) for queue_file in queue_files] + return min(queue_files, key=os.path.getctime) + + +def is_queue_full() -> bool: + """ + Checks if the loading pipeline queue directory is full. + Returns True if the number of files exceeds a predefined limit, otherwise False. + """ + return len(os.listdir(loading_pipeline_queue_dir())) >= Env.LOADING_QUEUE_LIMIT diff --git a/loading_pipeline/lib/misc/runs_test.py b/loading_pipeline/lib/misc/runs_test.py new file mode 100644 index 0000000000..48a0e34d3c --- /dev/null +++ b/loading_pipeline/lib/misc/runs_test.py @@ -0,0 +1,44 @@ +import os + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.paths import ( + clickhouse_load_success_file_path, + pipeline_run_success_file_path, + runs_path, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + + +class RunsTest(MockedDatarootTestCase): + def setUp(self): + super().setUp() + run_ids = [ + 'manual__2024-08-05T16-07-58.365146+00-00', + 'manual__2024-08-06T10-15-23.123456+00-00', + 'manual__2024-08-07T12-30-45.654321+00-00', # _SUCCESS + 'manual__2024-08-08T09-45-00.000000+00-00', # _SUCCESS + 'manual__2024-08-09T18-22-13.999999+00-00', # _SUCCESS, _CLICKHOUSE_LOAD_SUCCESS + ] + for reference_genome, dataset_type in [ + (ReferenceGenome.GRCh38, DatasetType.SNV_INDEL), + (ReferenceGenome.GRCh37, DatasetType.SNV_INDEL), + (ReferenceGenome.GRCh38, DatasetType.GCNV), + (ReferenceGenome.GRCh37, DatasetType.GCNV), + ]: + for run_id in run_ids: + base_path = runs_path(reference_genome, dataset_type) + os.makedirs(os.path.join(base_path, run_id), exist_ok=True) + if '09' in run_id or '07T12' in run_id: + success_file = pipeline_run_success_file_path( + reference_genome, + dataset_type, + run_id, + ) + open(success_file, 'w').close() + if '09T18' in run_id: + success_file = clickhouse_load_success_file_path( + reference_genome, + dataset_type, + run_id, + ) + open(success_file, 'w').close() diff --git a/loading_pipeline/lib/misc/sample_ids.py b/loading_pipeline/lib/misc/sample_ids.py new file mode 100644 index 0000000000..f86ef4ef67 --- /dev/null +++ b/loading_pipeline/lib/misc/sample_ids.py @@ -0,0 +1,66 @@ +from collections import Counter + +import hail as hl + +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.validation import SeqrValidationError + +logger = get_logger(__name__) + + +def remap_sample_ids( + mt: hl.MatrixTable, + project_remap_ht: hl.Table, +) -> hl.MatrixTable: + collected_remap = project_remap_ht.collect() + s_dups = [k for k, v in Counter([r.s for r in collected_remap]).items() if v > 1] + seqr_dups = [ + k for k, v in Counter([r.seqr_id for r in collected_remap]).items() if v > 1 + ] + + if len(s_dups) > 0 or len(seqr_dups) > 0: + msg = f'Duplicate s or seqr_id entries in remap file were found. Duplicate s:{s_dups}. Duplicate seqr_id:{seqr_dups}.' + raise SeqrValidationError(msg) + + missing_samples = project_remap_ht.anti_join(mt.cols()).collect() + remap_count = len(collected_remap) + + if len(missing_samples) != 0: + message = ( + f'Only {project_remap_ht.semi_join(mt.cols()).count()} out of {remap_count} ' + 'remap IDs matched IDs in the variant callset.\n' + f"IDs that aren't in the callset: {missing_samples}\n" + ) + raise SeqrValidationError(message) + + mt = mt.annotate_cols(**project_remap_ht[mt.s]) + remap_expr = hl.if_else(hl.is_missing(mt.seqr_id), mt.s, mt.seqr_id) + mt = mt.annotate_cols(seqr_id=remap_expr, vcf_id=mt.s) + mt = mt.key_cols_by(s=mt.seqr_id) + logger.info(f'Remapped {remap_count} sample ids...') + return mt + + +def subset_samples( + mt: hl.MatrixTable, + sample_subset_ht: hl.Table, +) -> hl.MatrixTable: + subset_count = sample_subset_ht.count() + anti_join_ht = sample_subset_ht.anti_join(mt.cols()) + anti_join_ht_count = anti_join_ht.count() + if subset_count == 0: + message = '0 sample ids found the subset HT, something is probably wrong.' + raise SeqrValidationError(message) + + if anti_join_ht_count != 0: + missing_samples = anti_join_ht.s.collect() + message = ( + f'Only {subset_count - anti_join_ht_count} out of {subset_count} ' + f'subsetting-table IDs matched IDs in the variant callset.\n' + f"IDs that aren't in the callset: {missing_samples}\n" + f'All callset sample IDs:{mt.s.collect()}' + ) + raise SeqrValidationError(message) + logger.info(f'Subsetted to {subset_count} sample ids') + mt = mt.semi_join_cols(sample_subset_ht) + return mt.filter_rows(hl.agg.any(hl.is_defined(mt.GT))) diff --git a/loading_pipeline/lib/misc/sample_ids_test.py b/loading_pipeline/lib/misc/sample_ids_test.py new file mode 100644 index 0000000000..6d3fb7efd0 --- /dev/null +++ b/loading_pipeline/lib/misc/sample_ids_test.py @@ -0,0 +1,160 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.misc.sample_ids import ( + remap_sample_ids, + subset_samples, +) +from loading_pipeline.lib.misc.validation import SeqrValidationError + +CALLSET_MT = hl.MatrixTable.from_parts( + rows={'variants': [1, 2]}, + cols={'s': ['HG00731', 'HG00732', 'HG00733']}, + entries={ + 'GT': [ + [hl.Call([0, 1]), hl.missing(hl.tcall), hl.Call([0, 1])], + [hl.Call([0, 1]), hl.Call([0, 1]), hl.Call([1, 1])], + ], + }, +).key_cols_by('s') + + +class SampleLookupTest(unittest.TestCase): + def test_remap_2_sample_ids(self) -> None: + # remap 2 of 3 samples in callset + project_remap_ht = hl.Table.parallelize( + [ + {'s': 'HG00731', 'seqr_id': 'HG00731_1'}, + {'s': 'HG00732', 'seqr_id': 'HG00732_1'}, + ], + hl.tstruct( + s=hl.tstr, + seqr_id=hl.tstr, + ), + key='s', + ) + + remapped_mt = remap_sample_ids( + CALLSET_MT, + project_remap_ht, + ) + + self.assertEqual(remapped_mt.cols().count(), 3) + self.assertEqual( + remapped_mt.cols().collect(), + [ + hl.Struct( + col_idx=0, + s='HG00731_1', + seqr_id='HG00731_1', + vcf_id='HG00731', + ), + hl.Struct( + col_idx=1, + s='HG00732_1', + seqr_id='HG00732_1', + vcf_id='HG00732', + ), + hl.Struct(col_idx=2, s='HG00733', seqr_id='HG00733', vcf_id='HG00733'), + ], + ) + + def test_remap_sample_ids_remap_has_duplicate(self) -> None: + # remap file has 2 rows for HG00732 + project_remap_ht = hl.Table.parallelize( + [ + {'s': 'HG00731', 'seqr_id': 'HG00731_1'}, + {'s': 'HG00732', 'seqr_id': 'HG00732_1'}, + {'s': 'HG00732', 'seqr_id': 'HG00732_1'}, # duplicate + ], + hl.tstruct( + s=hl.tstr, + seqr_id=hl.tstr, + ), + key='s', + ) + + with self.assertRaises(SeqrValidationError): + remap_sample_ids( + CALLSET_MT, + project_remap_ht, + ) + + def test_remap_sample_ids_remap_has_missing_samples(self) -> None: + # remap file has 4 rows, but only 3 samples in callset + project_remap_ht = hl.Table.parallelize( + [ + {'s': 'HG00731', 'seqr_id': 'HG00731_1'}, + {'s': 'HG00732', 'seqr_id': 'HG00732_1'}, + {'s': 'HG00733', 'seqr_id': 'HG00733_1'}, + {'s': 'HG00734', 'seqr_id': 'HG00734_1'}, # missing in callset + ], + hl.tstruct( + s=hl.tstr, + seqr_id=hl.tstr, + ), + key='s', + ) + + with self.assertRaises(SeqrValidationError): + remap_sample_ids( + CALLSET_MT, + project_remap_ht, + ) + + def test_subset_samples_zero_samples(self): + # subset 0 of 3 samples in callset + sample_subset_ht = hl.Table.parallelize( + [], + hl.tstruct(s=hl.tstr), + key='s', + ) + + with self.assertRaises(SeqrValidationError): + subset_samples( + CALLSET_MT, + sample_subset_ht, + ) + + def test_subset_samples_missing_samples(self): + # subset 2 of 3 samples in callset, but 1 is missing + sample_subset_ht = hl.Table.parallelize( + [ + {'s': 'HG00731'}, + {'s': 'HG00732'}, + {'s': 'HG00734'}, # missing in callset + ], + hl.tstruct(s=hl.tstr), + key='s', + ) + + with self.assertRaises(SeqrValidationError): + subset_samples( + CALLSET_MT, + sample_subset_ht, + ) + + def test_subset_no_defined_gt(self): + mt = hl.MatrixTable.from_parts( + rows={'variants': [1, 2]}, + cols={'s': ['HG00731', 'HG00732']}, + entries={ + 'GT': [ + [hl.Call([1, 1]), hl.missing(hl.tcall)], + [hl.Call([1, 1]), hl.Call([1, 1])], + ], + }, + ).key_cols_by('s') + sample_subset_ht = hl.Table.parallelize( + [ + {'s': 'HG00732'}, + ], + hl.tstruct(s=hl.tstr), + key='s', + ) + mt = subset_samples( + mt, + sample_subset_ht, + ) + self.assertEqual(mt.count(), (1, 1)) diff --git a/loading_pipeline/lib/misc/slack.py b/loading_pipeline/lib/misc/slack.py new file mode 100644 index 0000000000..ea17b12c99 --- /dev/null +++ b/loading_pipeline/lib/misc/slack.py @@ -0,0 +1,65 @@ +import json + +from slacker import Slacker + +from loading_pipeline.api.model import PipelineRunnerRequest +from loading_pipeline.lib.core import Env, FeatureFlag +from loading_pipeline.lib.logger import get_logger + +DATAPROC_URL = 'https://console.cloud.google.com/dataproc/jobs?project={gcloud_project}' +SLACK_FAILURE_MESSAGE_PREFIX = ':failed: Pipeline Runner Request Failed :failed:' +SLACK_SUCCESS_MESSAGE_PREFIX = ( + ':white_check_mark: Pipeline Runner Request Success! :white_check_mark:' +) + + +logger = get_logger(__name__) + + +def _safe_post_to_slack(message) -> None: + try: + if not Env.SLACK_TOKEN: + logger.info(message) + return + slack = Slacker(Env.SLACK_TOKEN) + slack.chat.post_message( + Env.SLACK_NOTIFICATION_CHANNEL, + message, + as_user=False, + icon_emoji=':beaker:', + username='Beaker (engineering-minion)', + ) + except Exception: + logger.exception( + f'Slack error: Original message in channel ({Env.SLACK_NOTIFICATION_CHANNEL}) - {message}', + ) + + +def safe_post_to_slack_failure( + run_id: str, + prr: PipelineRunnerRequest, + e: type[Exception], +) -> None: + message = [ + SLACK_FAILURE_MESSAGE_PREFIX, + f'Run ID: {run_id}', + f'```{json.dumps(prr.model_dump(), indent=4, sort_keys=True)}```', + f'Reason: {e!s}', + ] + if FeatureFlag.RUN_PIPELINE_ON_DATAPROC: + message = [ + *message, + f'<{DATAPROC_URL.format(gcloud_project=Env.GCLOUD_PROJECT)}|Dataproc Jobs Page>', + ] + _safe_post_to_slack('\n'.join(message)) + + +def safe_post_to_slack_success(run_id: str, prr: PipelineRunnerRequest) -> None: + message = '\n'.join( + [ + SLACK_SUCCESS_MESSAGE_PREFIX, + f'Run ID: {run_id}', + f'```{json.dumps(prr.model_dump(), indent=4, sort_keys=True)}```', + ], + ) + _safe_post_to_slack(message) diff --git a/loading_pipeline/lib/misc/sv.py b/loading_pipeline/lib/misc/sv.py new file mode 100644 index 0000000000..52305d6f19 --- /dev/null +++ b/loading_pipeline/lib/misc/sv.py @@ -0,0 +1,151 @@ +import itertools +import math + +import hail as hl + +from loading_pipeline.lib.annotations import sv +from loading_pipeline.lib.core import ReferenceGenome, Sex +from loading_pipeline.lib.misc.pedigree import Family + +WRONG_CHROM_PENALTY = 1e9 + + +def _get_grouped_new_callset_variants( + mt: hl.MatrixTable, + duplicate_internal_variant_ids: set[str], +) -> itertools.groupby: + mt = mt.select_rows( + 'info.SEQR_INTERNAL_TRUTH_VID', + end_locus=sv.end_locus(mt), + ) + return itertools.groupby( + sorted( + mt.filter_rows( + duplicate_internal_variant_ids.contains( + mt['info.SEQR_INTERNAL_TRUTH_VID'], + ), + ) + .rows() + .collect(), + key=lambda x: x['info.SEQR_INTERNAL_TRUTH_VID'], + ), + lambda x: x['info.SEQR_INTERNAL_TRUTH_VID'], + ) + + +def deduplicate_merged_sv_concordance_calls( + mt: hl.MatrixTable, + annotations_ht: hl.Table, +) -> hl.MatrixTable: + # First find the seqr internal variant ids that are duplicated in the new callset. + duplicate_internal_variant_ids = hl.set( + { + k + for k, v in mt.aggregate_rows( + hl.agg.counter(mt['info.SEQR_INTERNAL_TRUTH_VID']), + ).items() + if v > 1 + } + or hl.empty_set(hl.tstr), + ) + + # Then, collect into memory the necessary existing variants & the new variants + existing_variants = { + v.variant_id: v + for v in ( + annotations_ht.filter( + duplicate_internal_variant_ids.contains(annotations_ht.variant_id), + ).collect() + ) + } + grouped_new_variants = _get_grouped_new_callset_variants( + mt, + duplicate_internal_variant_ids, + ) + + # Then, iterate over new variants and exclude all but the best match + new_variant_ids_to_exclude = set() + for existing_variant_id, new_variants in grouped_new_variants: + existing_variant = existing_variants[existing_variant_id] + closest_variant_id, min_distance = None, math.inf + + # First pass to find the closest variant + new_variants_it1, new_variants_it2 = itertools.tee(new_variants, 2) + for new_variant in new_variants_it1: + distance = math.fabs( + new_variant.end_locus.position + - existing_variant.end + + ( + WRONG_CHROM_PENALTY + if new_variant.end_locus.contig != existing_variant.endChrom + else 0 + ), + ) + if distance < min_distance: + min_distance = distance + closest_variant_id = new_variant.variant_id + + # Second pass to exclude all but the closest. + for new_variant in new_variants_it2: + if new_variant.variant_id != closest_variant_id: + new_variant_ids_to_exclude.add(new_variant.variant_id) + + # Finally, remove SEQR_INTERNAL_TRUTH_VID from those variants. + return mt.annotate_rows( + **{ + 'info.SEQR_INTERNAL_TRUTH_VID': hl.if_else( + hl.set(new_variant_ids_to_exclude or hl.empty_set(hl.tstr)).contains( + mt.variant_id, + ), + hl.missing(hl.tstr), + mt['info.SEQR_INTERNAL_TRUTH_VID'], + ), + }, + ) + + +def overwrite_male_non_par_calls( + mt: hl.MatrixTable, + families: set[Family], +) -> hl.MatrixTable: + male_sample_ids = { + s.sample_id for f in families for s in f.samples.values() if s.sex == Sex.MALE + } + male_sample_ids = ( + hl.set(male_sample_ids) if male_sample_ids else hl.empty_set(hl.tstr) + ) + par_intervals = hl.array( + [ + i + for i in hl.get_reference(ReferenceGenome.GRCh38).par + if i.start.contig == ReferenceGenome.GRCh38.x_contig + ], + ) + non_par_interval = hl.interval( + par_intervals[0].end, + par_intervals[1].start, + ) + # NB: making use of existing formatting_annotation_fns. + # We choose to annotate & drop here as the sample level + # fields are dropped by the time we format variants. + mt = mt.annotate_rows( + start_locus=sv.start_locus(mt), + end_locus=sv.end_locus(mt), + ) + mt = mt.annotate_entries( + GT=hl.if_else( + ( + male_sample_ids.contains(mt.s) + & non_par_interval.overlaps( + hl.interval( + mt.start_locus, + mt.end_locus, + ), + ) + & mt.GT.is_het() + ), + hl.Call([1], phased=False), + mt.GT, + ), + ) + return mt.drop('start_locus', 'end_locus') diff --git a/loading_pipeline/lib/misc/sv_test.py b/loading_pipeline/lib/misc/sv_test.py new file mode 100644 index 0000000000..44a2f9efc4 --- /dev/null +++ b/loading_pipeline/lib/misc/sv_test.py @@ -0,0 +1,231 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, Sex +from loading_pipeline.lib.misc.io import import_callset, select_relevant_fields +from loading_pipeline.lib.misc.pedigree import Family, Sample +from loading_pipeline.lib.misc.sample_ids import subset_samples +from loading_pipeline.lib.misc.sv import ( + deduplicate_merged_sv_concordance_calls, + overwrite_male_non_par_calls, +) + +TEST_SV_VCF = 'loading_pipeline/var/test/callsets/sv_1.vcf' +ANNOTATIONS_HT = hl.Table.parallelize( + [ + { + 'variant_id': 'BND_chr1_6', + 'end': 20404, + 'endChrom': 'chr5', + }, + { + 'variant_id': 'BND_chr1_9', + 'end': 789481, + 'endChrom': 'chr1', + }, + { + 'variant_id': 'CPX_chr1_22', + 'end': 6559723, + 'endChrom': 'chr1', + }, + ], + hl.tstruct( + variant_id=hl.tstr, + end=hl.tint32, + endChrom=hl.tstr, + ), + key='variant_id', +) + + +class SVTest(unittest.TestCase): + def test_overwrite_male_non_par_calls(self) -> None: + mt = import_callset(TEST_SV_VCF, ReferenceGenome.GRCh38, DatasetType.SV) + mt = select_relevant_fields( + mt, + DatasetType.SV, + ) + mt = subset_samples( + mt, + hl.Table.parallelize( + [{'s': sample_id} for sample_id in ['RGP_164_1', 'RGP_164_2']], + hl.tstruct(s=hl.dtype('str')), + key='s', + ), + ) + mt = overwrite_male_non_par_calls( + mt, + { + Family( + family_guid='family_1', + samples={ + 'RGP_164_1': Sample(sample_id='RGP_164_1', sex=Sex.FEMALE), + 'RGP_164_2': Sample(sample_id='RGP_164_2', sex=Sex.MALE), + }, + ), + }, + ) + mt = mt.filter_rows(mt.locus.contig == 'chrX') + self.assertEqual( + [ + hl.Locus(contig='chrX', position=3, reference_genome='GRCh38'), + hl.Locus(contig='chrX', position=2781700, reference_genome='GRCh38'), + ], + mt.locus.collect(), + ) + self.assertEqual( + [ + hl.Call(alleles=[0, 0], phased=False), + # END of this variant < start of the non-par region. + hl.Call(alleles=[0, 1], phased=False), + hl.Call(alleles=[0, 0], phased=False), + hl.Call(alleles=[1], phased=False), + ], + mt.GT.collect(), + ) + self.assertFalse( + hasattr(mt, 'start_locus'), + ) + + def test_deduplicate_merged_sv_concordance_calls(self) -> None: + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'variant_id': [ + 'new_v1', + 'new_v2', + 'new_v3', + ], + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=3, + reference_genome='GRCh38', + ), + ], + 'info.END': [ + 1, + 2, + 3, + ], + 'info.END2': [ + 1, + 2, + 3, + ], + 'info.CHR2': [ + 'chr1', + 'chr1', + 'chr1', + ], + 'info.SEQR_INTERNAL_TRUTH_VID': [ + 'BND_chr1_6', + 'BND_chr1_9', + 'CPX_chr1_22', + ], + }, + cols={'s': ['sample_1']}, + entries={'GQ': [[99] for _ in range(3)]}, + ) + .key_rows_by('variant_id') + .key_cols_by('s') + ) + mt = deduplicate_merged_sv_concordance_calls( + mt, + ANNOTATIONS_HT, + ) + self.assertEqual( + mt['info.SEQR_INTERNAL_TRUTH_VID'].collect(), + [ + 'BND_chr1_6', + 'BND_chr1_9', + 'CPX_chr1_22', + ], + ) + + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'variant_id': [ + 'new_v1', + 'new_v2', + 'new_v3', + 'new_v4', + ], + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=3, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=4, + reference_genome='GRCh38', + ), + ], + 'info.END': [ + 1, + 2, + 789481, + 789485, + ], + 'info.END2': [ + 1, + 2, + 789481, + 789485, + ], + 'info.CHR2': [ + 'chr1', + 'chr1', + 'chr2', + 'chr1', + ], + 'info.SEQR_INTERNAL_TRUTH_VID': [ + 'BND_chr1_6', + 'BND_chr1_9', + 'BND_chr1_9', + 'BND_chr1_9', + ], + }, + cols={'s': ['sample_1']}, + entries={'GQ': [[99] for _ in range(4)]}, + ) + .key_rows_by('variant_id') + .key_cols_by('s') + ) + mt = deduplicate_merged_sv_concordance_calls( + mt, + ANNOTATIONS_HT, + ) + self.assertEqual( + mt['info.SEQR_INTERNAL_TRUTH_VID'].collect(), + [ + 'BND_chr1_6', + None, + None, + 'BND_chr1_9', + ], + ) diff --git a/loading_pipeline/lib/misc/terra_data_repository.py b/loading_pipeline/lib/misc/terra_data_repository.py new file mode 100644 index 0000000000..b4af9b7341 --- /dev/null +++ b/loading_pipeline/lib/misc/terra_data_repository.py @@ -0,0 +1,79 @@ +import os +import re +from collections.abc import Generator +from concurrent.futures import ThreadPoolExecutor, as_completed + +from google.cloud import bigquery + +from loading_pipeline.lib.misc.gcp import get_service_account_credentials +from loading_pipeline.lib.misc.requests import requests_retry_session + +BIGQUERY_METRICS = [ + 'predicted_sex', + 'contamination_rate', + 'percent_bases_at_20x', + 'collaborator_sample_id', + 'mean_coverage', +] +BIGQUERY_RESOURCE = 'bigquery' +TABLE_NAME_VALIDATION_REGEX = r'datarepo-\w+.datarepo_\w+' +TDR_ROOT_URL = 'https://data.terra.bio/api/repository/v1/' + + +def _tdr_request(resource: str) -> dict: + service_account_token = get_service_account_credentials().token + s = requests_retry_session() + res = s.get( + url=os.path.join(TDR_ROOT_URL, resource), + headers={'Authorization': f'Bearer {service_account_token}'}, + timeout=10, + ) + res.raise_for_status() + return res.json() + + +def _get_dataset_ids() -> list[str]: + res_body = _tdr_request('datasets?limit=50000') # Arbitrary large number :/ + items = res_body['items'] + for item in items: + if not any(x['cloudResource'] == BIGQUERY_RESOURCE for x in item['storage']): + # Hard failure on purpose to prompt manual investigation. + msg = 'Datasets without bigquery sources are unsupported' + raise ValueError(msg) + return [x['id'] for x in items] + + +def gen_bq_table_names() -> Generator[str]: + with ThreadPoolExecutor(max_workers=5) as executor: + futures = [ + executor.submit( + _tdr_request, + f'datasets/{dataset_id}?include=ACCESS_INFORMATION', + ) + for dataset_id in _get_dataset_ids() + ] + for future in as_completed(futures): + result = future.result() + yield f'{result["accessInformation"]["bigQuery"]["projectId"]}.{result["accessInformation"]["bigQuery"]["datasetName"]}' + + +def bq_metrics_query(bq_table_name: str) -> bigquery.table.RowIterator: + if not re.match(TABLE_NAME_VALIDATION_REGEX, bq_table_name): + msg = f'{bq_table_name} does not match expected pattern' + raise ValueError(msg) + client = bigquery.Client() + + # not all columns are guaranteed to be present, coalesce if missing + table_ddl = next( + client.query_and_wait( + f""" + SELECT ddl FROM `{bq_table_name}`.INFORMATION_SCHEMA.TABLES where table_name='sample'; + """, # noqa: S608 # nosec B608 + ), + )[0] + metrics = [(m if m in table_ddl else f'NULL AS {m}') for m in BIGQUERY_METRICS] + return client.query_and_wait( + f""" + SELECT {','.join(metrics)} FROM `{bq_table_name}.sample`; + """, # noqa: S608 # nosec B608 + ) diff --git a/loading_pipeline/lib/misc/terra_data_repository_test.py b/loading_pipeline/lib/misc/terra_data_repository_test.py new file mode 100644 index 0000000000..d798b5bcef --- /dev/null +++ b/loading_pipeline/lib/misc/terra_data_repository_test.py @@ -0,0 +1,321 @@ +import json +import os +import unittest +from types import SimpleNamespace +from unittest.mock import Mock, call, patch + +import responses + +from loading_pipeline.lib.misc.terra_data_repository import ( + TDR_ROOT_URL, + _get_dataset_ids, + bq_metrics_query, + gen_bq_table_names, +) + +TDR_DATASETS = [ + { + 'id': '2dc51ee0-a037-499d-a915-a7c20a0b216d', + 'name': 'RP_3053', + 'description': 'TGG_Ware_DRAGEN_hg38. Dataset automatically created and linked to: RP-3053', + 'defaultProfileId': '0a164b9a-2b8b-45d2-859e-a4e369b9cb4f', + 'createdDate': '2023-10-05T13:15:27.649760Z', + 'storage': [ + { + 'region': 'us-central1', + 'cloudResource': 'bigquery', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-east4', + 'cloudResource': 'firestore', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-central1', + 'cloudResource': 'bucket', + 'cloudPlatform': 'gcp', + }, + ], + 'secureMonitoringEnabled': False, + 'cloudPlatform': 'gcp', + 'dataProject': 'datarepo-7242affb', + 'storageAccount': None, + 'phsId': None, + 'selfHosted': False, + 'predictableFileIds': False, + 'tags': [], + 'resourceLocks': { + 'exclusive': None, + 'shared': [], + }, + }, + { + 'id': 'beef77e8-575b-40e5-9340-a6f10e0bec67', + 'name': 'RP_3056', + 'description': 'RGP_HMB_DRAGEN_hg38. Dataset automatically created and linked to: RP-3056', + 'defaultProfileId': '835dd05d-c603-4b0d-926f-d9143fd24549', + 'createdDate': '2023-10-05T20:15:27.622481Z', + 'storage': [ + { + 'region': 'us-central1', + 'cloudResource': 'bigquery', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-east4', + 'cloudResource': 'firestore', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-central1', + 'cloudResource': 'bucket', + 'cloudPlatform': 'gcp', + }, + ], + 'secureMonitoringEnabled': False, + 'cloudPlatform': 'gcp', + 'dataProject': 'datarepo-5a72e31b', + 'storageAccount': None, + 'phsId': None, + 'selfHosted': False, + 'predictableFileIds': False, + 'tags': [], + 'resourceLocks': { + 'exclusive': None, + 'shared': [], + }, + }, + { + 'id': 'c8d74ac4-9a2e-4d3d-a6b5-1f4b433d949f', + 'name': 'RP_3055', + 'description': 'RGP_GRU_DRAGEN_hg38. Dataset automatically created and linked to: RP-3055', + 'defaultProfileId': '835dd05d-c603-4b0d-926f-d9143fd24549', + 'createdDate': '2023-10-05T20:15:28.255304Z', + 'storage': [ + { + 'region': 'us-central1', + 'cloudResource': 'bigquery', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-east4', + 'cloudResource': 'firestore', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-central1', + 'cloudResource': 'bucket', + 'cloudPlatform': 'gcp', + }, + ], + 'secureMonitoringEnabled': False, + 'cloudPlatform': 'gcp', + 'dataProject': 'datarepo-0f5be351', + 'storageAccount': None, + 'phsId': None, + 'selfHosted': False, + 'predictableFileIds': False, + 'tags': [], + 'resourceLocks': { + 'exclusive': None, + 'shared': [ + 'Gw_KTeYRS1aLhRvapMLYLg', + 'WrP-0w1aROOUbgkI8JS6Ug', + ], + }, + }, +] + + +@patch( + 'loading_pipeline.lib.misc.terra_data_repository.get_service_account_credentials', + return_value=SimpleNamespace( + token='abcdefg', # noqa: S106 # nosec B106 + ), +) +class TerraDataRepositoryTest(unittest.TestCase): + @responses.activate + def test_get_dataset_ids(self, _: Mock) -> None: + responses.get( + os.path.join(TDR_ROOT_URL, 'datasets?limit=50000'), + body=json.dumps( + { + 'total': 3, + 'filteredTotal': 3, + 'items': TDR_DATASETS, + }, + ), + ) + self.assertListEqual( + _get_dataset_ids(), + [ + '2dc51ee0-a037-499d-a915-a7c20a0b216d', + 'beef77e8-575b-40e5-9340-a6f10e0bec67', + 'c8d74ac4-9a2e-4d3d-a6b5-1f4b433d949f', + ], + ) + + @responses.activate + def test_get_dataset_ids_no_bq(self, _: Mock) -> None: + responses.get( + os.path.join(TDR_ROOT_URL, 'datasets'), + body=json.dumps( + { + 'total': 1, + 'filteredTotal': 1, + 'items': [ + { + 'id': '2dc51ee0-a037-499d-a915-a7c20a0b216d', + 'name': 'RP_3053', + 'description': 'TGG_Ware_DRAGEN_hg38. Dataset automatically created and linked to: RP-3053', + 'defaultProfileId': '0a164b9a-2b8b-45d2-859e-a4e369b9cb4f', + 'createdDate': '2023-10-05T13:15:27.649760Z', + 'storage': [ + # NB: bigquery was removed from 'storage' here. + { + 'region': 'us-east4', + 'cloudResource': 'firestore', + 'cloudPlatform': 'gcp', + }, + { + 'region': 'us-central1', + 'cloudResource': 'bucket', + 'cloudPlatform': 'gcp', + }, + ], + 'secureMonitoringEnabled': False, + 'cloudPlatform': 'gcp', + 'dataProject': 'datarepo-7242affb', + 'storageAccount': None, + 'phsId': None, + 'selfHosted': False, + 'predictableFileIds': False, + 'tags': [], + 'resourceLocks': { + 'exclusive': None, + 'shared': [], + }, + }, + ], + }, + ), + ) + self.assertRaises( + ValueError, + _get_dataset_ids, + ) + + @responses.activate + def test_gen_bq_table_names(self, _: Mock) -> None: + responses.get( + os.path.join(TDR_ROOT_URL, 'datasets'), + body=json.dumps( + { + 'total': 3, + 'filteredTotal': 3, + 'items': TDR_DATASETS, + }, + ), + ) + for dataset_id, name, project_name, dataset_name in [ + ( + '2dc51ee0-a037-499d-a915-a7c20a0b216d', + 'RP_3053', + 'datarepo-7242affb', + 'datarepo_RP_3053', + ), + ( + 'beef77e8-575b-40e5-9340-a6f10e0bec67', + 'RP_3056', + 'datarepo-5a72e31b', + 'datarepo_RP_3056', + ), + ( + 'c8d74ac4-9a2e-4d3d-a6b5-1f4b433d949f', + 'RP_3059', + 'datarepo-aada2e3b', + 'datarepo_RP_3059', + ), + ]: + responses.get( + os.path.join( + TDR_ROOT_URL, + f'datasets/{dataset_id}?include=ACCESS_INFORMATION', + ), + body=json.dumps( + { + 'id': dataset_id, + 'name': name, + 'description': 'TGG_Ware_DRAGEN_hg38. Dataset automatically created and linked to: RP-3053', + 'defaultProfileId': None, + 'dataProject': None, + 'defaultSnapshotId': None, + 'schema': None, + 'createdDate': '2023-10-05T13:15:27.649760Z', + 'storage': None, + 'secureMonitoringEnabled': False, + 'phsId': None, + 'accessInformation': { + 'bigQuery': { + 'datasetName': dataset_name, + 'datasetId': f'{project_name}:{dataset_name}', + 'projectId': project_name, + 'link': 'https://console.cloud.google.com/bigquery?project=datarepo-7242affb&ws=!datarepo_RP_3053&d=datarepo_RP_3053&p=datarepo-7242affb&page=dataset', + 'tables': [ + { + 'name': 'jointcallset', + 'id': f'{project_name}.{dataset_name}.jointcallset', + 'qualifiedName': 'datarepo-7242affb.datarepo_RP_3053.jointcallset', + 'link': 'https://console.cloud.google.com/bigquery?project=datarepo-7242affb&ws=!datarepo_RP_3053&d=datarepo_RP_3053&p=datarepo-7242affb&page=table&t=jointcallset', + 'sampleQuery': 'SELECT * FROM `datarepo-7242affb.datarepo_RP_3053.jointcallset`', + }, + { + 'name': 'sample', + 'id': f'{project_name}.{dataset_name}.sample', + 'qualifiedName': 'datarepo-7242affb.datarepo_RP_3053.sample', + 'link': 'https://console.cloud.google.com/bigquery?project=datarepo-7242affb&ws=!datarepo_RP_3053&d=datarepo_RP_3053&p=datarepo-7242affb&page=table&t=sample', + 'sampleQuery': 'SELECT * FROM `datarepo-7242affb.datarepo_RP_3053.sample`', + }, + ], + }, + 'parquet': None, + }, + 'cloudPlatform': None, + 'selfHosted': False, + 'properties': None, + 'ingestServiceAccount': None, + 'predictableFileIds': False, + 'tags': [], + 'resourceLocks': { + 'exclusive': None, + 'shared': [], + }, + }, + ), + ) + self.assertCountEqual( + list(gen_bq_table_names()), + [ + 'datarepo-7242affb.datarepo_RP_3053', + 'datarepo-5a72e31b.datarepo_RP_3056', + 'datarepo-aada2e3b.datarepo_RP_3059', + ], + ) + + @patch('loading_pipeline.lib.misc.terra_data_repository.bigquery.Client') + def test_bq_metrics_query_missing_metrics( + self, + mock_bq_client: Mock, + _: Mock, + ) -> None: + mock_bq_client.return_value.query_and_wait.return_value = iter( + [['predicted_sex,contamination_rate,percent_bases_at_20x']], + ) + bq_metrics_query('datarepo-7242affb.datarepo_RP_3053') + self.assertEqual( + mock_bq_client.return_value.query_and_wait.mock_calls[1], + call( + '\n SELECT predicted_sex,contamination_rate,percent_bases_at_20x,NULL AS collaborator_sample_id,NULL AS mean_coverage FROM `datarepo-7242affb.datarepo_RP_3053.sample`;\n ', + ), + ) diff --git a/loading_pipeline/lib/misc/validation.py b/loading_pipeline/lib/misc/validation.py new file mode 100644 index 0000000000..f6ff00619f --- /dev/null +++ b/loading_pipeline/lib/misc/validation.py @@ -0,0 +1,203 @@ +from typing import Any + +import hail as hl + +from loading_pipeline.lib.core import ( + DatasetType, + Env, + ReferenceGenome, + SampleType, +) + +ALL_VALIDATIONS = 'all' +AMBIGUOUS_THRESHOLD_PERC: float = 0.01 # Fraction of samples identified as "ambiguous_sex" above which an error will be thrown. +MIN_ROWS_PER_CONTIG = 100 +SAMPLE_TYPE_MATCH_THRESHOLD = 0.3 + + +class SeqrValidationError(Exception): + def __init__( + self, + msg: str, + error_body: dict | None = None, + ): + super().__init__(msg) + self.msg = msg + self.error_body = error_body if error_body is not None else {} + + +def validate_allele_type( + t: hl.Table | hl.MatrixTable, + dataset_type: DatasetType, + **_: Any, +) -> None: + ht = t.rows() if isinstance(t, hl.MatrixTable) else t + ht = ht.filter( + dataset_type.invalid_allele_types.contains( + hl.numeric_allele_type(ht.alleles[0], ht.alleles[1]), + ), + ) + if ht.count() > 0: + collected_alleles = sorted( + [tuple(x) for x in ht.aggregate(hl.agg.collect_as_set(ht.alleles))], + ) + # Handle case where all invalid alleles are NON_REF, indicating a gvcf: + if all('' in alleles for alleles in collected_alleles): + msg = 'Alleles with invalid allele are present in the callset. This appears to be a GVCF containing records for sites with no variants.' + raise SeqrValidationError(msg) + msg = f'Alleles with invalid AlleleType are present in the callset: {collected_alleles[:10]}' + raise SeqrValidationError(msg) + + +def validate_allele_depth_length( + mt: hl.MatrixTable, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + **_: Any, +) -> None: + ht = mt.select_rows( + found_ad_lengths=hl.agg.collect_as_set(hl.len(mt.AD)).remove( + hl.missing(hl.tint32), + ), + ).rows() + ht = ht.filter( + hl.len(ht.found_ad_lengths) > 1, + ) + if ht.count() > 0: + variant_format = dataset_type.table_key_format_fn(reference_genome) + msg = f'Found variants with unequal Allele Depth array lengths over samples (first 10, if applicable): { ({variant_format(v): v.found_ad_lengths for v in ht.take(10)}) }' + raise SeqrValidationError(msg) + + +def validate_no_duplicate_variants( + t: hl.Table | hl.MatrixTable, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + **_: Any, +) -> None: + ht = t.rows() if isinstance(t, hl.MatrixTable) else t + ht = ht.group_by(*ht.key).aggregate(n=hl.agg.count()) + ht = ht.filter(ht.n > 1) + ht = ht.select() + if ht.count() > 0: + variant_format = dataset_type.table_key_format_fn(reference_genome) + msg = f'Variants are present multiple times in the callset: {[variant_format(v) for v in ht.take(10)]}' + raise SeqrValidationError(msg) + + +def validate_expected_contig_frequency( + mt: hl.MatrixTable, + reference_genome: ReferenceGenome, + min_rows_per_contig: int = MIN_ROWS_PER_CONTIG, + **_: Any, +) -> None: + rows_per_contig = mt.aggregate_rows(hl.agg.counter(mt.locus.contig)) + missing_contigs = ( + reference_genome.standard_contigs + - reference_genome.optional_contigs + - rows_per_contig.keys() + ) + if missing_contigs: + msg = 'Missing the following expected contigs:{}'.format( + ', '.join(sorted(missing_contigs)), + ) + raise SeqrValidationError(msg) + + for contig, count in rows_per_contig.items(): + if contig in reference_genome.optional_contigs: + continue + if count < min_rows_per_contig: + msg = f'Contig {contig} has {count} rows, which is lower than expected minimum count {min_rows_per_contig}.' + raise SeqrValidationError(msg) + + +def validate_imported_field_types( + mt: hl.MatrixTable, + dataset_type: DatasetType, + additional_row_fields: dict[str, hl.expr.types.HailType | set], + **_: Any, +) -> None: + def _validate_field( + mt_schema: hl.StructExpression, + field: str, + dtype: hl.expr.types.HailType, + ) -> str | None: + if field not in mt_schema: + return f'{field}: missing' + if ( + ( + dtype == hl.tstruct + and isinstance( + mt_schema[field], + hl.expr.expressions.typed_expressions.StructExpression, + ) + ) + or (isinstance(dtype, set) and mt_schema[field].dtype in dtype) + or (mt_schema[field].dtype == dtype) + ): + return None + return f'{field}: {mt_schema[field].dtype}' + + unexpected_field_types = [] + for field, dtype in dataset_type.col_fields.items(): + unexpected_field_types.append(_validate_field(mt.col, field, dtype)) + for field, dtype in dataset_type.entries_fields.items(): + unexpected_field_types.append(_validate_field(mt.entry, field, dtype)) + for field, dtype in {**dataset_type.row_fields, **additional_row_fields}.items(): + unexpected_field_types.append(_validate_field(mt.row, field, dtype)) + unexpected_field_types = [x for x in unexpected_field_types if x is not None] + if unexpected_field_types: + msg = f'Found unexpected field types on MatrixTable after import: {unexpected_field_types}' + raise SeqrValidationError(msg) + + +def validate_sample_type( + mt: hl.MatrixTable, + reference_genome: ReferenceGenome, + sample_type: SampleType, + project_guids: list[str], + coding_and_noncoding_variants_ht: hl.Table, + sample_type_match_threshold: float = SAMPLE_TYPE_MATCH_THRESHOLD, + **_: Any, +) -> None: + if all( + project_guid in Env.SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS + for project_guid in project_guids + ): + return + coding_variants_ht = coding_and_noncoding_variants_ht.filter( + coding_and_noncoding_variants_ht.coding, + ) + has_coding = ( + mt.semi_join_rows(coding_variants_ht).count_rows() / coding_variants_ht.count() + >= sample_type_match_threshold + ) + noncoding_variants_ht = coding_and_noncoding_variants_ht.filter( + coding_and_noncoding_variants_ht.noncoding, + ) + has_noncoding = ( + mt.semi_join_rows(noncoding_variants_ht).count_rows() + / noncoding_variants_ht.count() + >= sample_type_match_threshold + ) + if not has_coding and not has_noncoding: + msg = f"Genome version validation error: dataset specified as {reference_genome.value} but doesn't contain the expected number of common {reference_genome.value} variants" + raise SeqrValidationError(msg) + if has_noncoding and not has_coding: + msg = f'Sample type validation error: dataset contains noncoding variants but is missing common coding variants for {reference_genome.value}. Please verify that the dataset contains coding variants.' + raise SeqrValidationError(msg) + if has_coding and not has_noncoding and sample_type != SampleType.WES: + msg = 'Sample type validation error: dataset sample-type is specified as WGS but appears to be WES because it contains many common coding variants but is missing common non-coding variants' + raise SeqrValidationError(msg) + if has_noncoding and has_coding and sample_type != SampleType.WGS: + msg = 'Sample type validation error: dataset sample-type is specified as WES but appears to be WGS because it contains many common non-coding variants' + raise SeqrValidationError(msg) + + +SKIPPABLE_VALIDATIONS = [ + validate_allele_depth_length, + validate_allele_type, + validate_expected_contig_frequency, + validate_no_duplicate_variants, + validate_sample_type, +] diff --git a/loading_pipeline/lib/misc/validation_test.py b/loading_pipeline/lib/misc/validation_test.py new file mode 100644 index 0000000000..bb368b85a5 --- /dev/null +++ b/loading_pipeline/lib/misc/validation_test.py @@ -0,0 +1,464 @@ +import unittest +from unittest.mock import patch + +import hail as hl + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.misc.validation import ( + SeqrValidationError, + validate_allele_depth_length, + validate_allele_type, + validate_expected_contig_frequency, + validate_imported_field_types, + validate_no_duplicate_variants, + validate_sample_type, +) + +TEST_MITO_MT = 'loading_pipeline/var/test/callsets/mito_1.mt' + + +def _mt_from_contigs(contigs): + return ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig=contig, + position=1, + reference_genome='GRCh38', + ) + for contig in contigs + ], + }, + cols={'s': ['sample_1']}, + entries={'HL': [[0.0] for _ in range(len(contigs))]}, + ) + .key_rows_by('locus') + .key_cols_by('s') + ) + + +class ValidationTest(unittest.TestCase): + def test_validate_allele_type(self) -> None: + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=3, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=4, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['A', 'T'], + # NB: star alleles should pass through this validation just fine, + # but are eventually filtered out upstream. + ['A', '*'], + ['A', '-'], + ['A', ''], + ], + }, + cols={'s': ['sample_1']}, + entries={'HL': [[0.0], [0.0], [0.0], [0.0]]}, + ) + .key_rows_by('locus', 'alleles') + .key_cols_by('s') + ) + self.assertRaisesRegex( + SeqrValidationError, + "Alleles with invalid AlleleType are present in the callset: \\[\\('A', '-'\\), \\('A', ''\\)\\]", + validate_allele_type, + mt, + DatasetType.SNV_INDEL, + ) + + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['C', ''], + ['A', ''], + ], + }, + cols={'s': ['sample_1']}, + entries={'HL': [[0.0], [0.0]]}, + ) + .key_rows_by('locus', 'alleles') + .key_cols_by('s') + ) + self.assertRaisesRegex( + SeqrValidationError, + 'Alleles with invalid allele are present in the callset. This appears to be a GVCF containing records for sites with no variants.', + validate_allele_type, + mt, + DatasetType.SNV_INDEL, + ) + + def test_validate_allele_depth_length(self) -> None: + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=3, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=4, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['A', 'T'], + # NB: star alleles should pass through this validation just fine, + # but are eventually filtered out upstream. + ['A', 'TC', 'TG'], + ['A', 'TTT'], + ['A', 'CCC'], + ], + }, + cols={'s': ['sample_1', 'sample_2']}, + entries={ + 'AD': [ + [[1, 0], [1, 0]], + [[1], [1, 0, 1]], + [[1, 0], [1]], + [[1, 0], [1, 0]], + ], + }, + ) + .key_rows_by('locus', 'alleles') + .key_cols_by('s') + ) + self.assertRaisesRegex( + SeqrValidationError, + "Found variants with unequal Allele Depth array lengths over samples \\(first 10, if applicable\\): \\{'1-2-A-TC-TG': \\{1, 3\\}, '1-3-A-TTT': \\{1, 2\\}\\}", + validate_allele_depth_length, + mt, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + ) + + def test_validate_imported_field_types(self) -> None: + mt = hl.read_matrix_table(TEST_MITO_MT) + validate_imported_field_types(mt, DatasetType.MITO, {}) + mt = mt.annotate_cols(contamination=hl.int32(mt.contamination)) + mt = mt.annotate_entries(DP=hl.float32(mt.DP)) + mt = mt.annotate_rows(vep=hl.dict({'t': '1'})) + self.assertRaisesRegex( + SeqrValidationError, + "Found unexpected field types on MatrixTable after import: \\['contamination: int32', 'DP: float32', 'vep: dict', 'tester: missing'\\]", + validate_imported_field_types, + mt, + DatasetType.MITO, + {'tester': hl.tfloat32}, + ) + + def test_validate_no_duplicate_variants(self) -> None: + mt = ( + hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['A', 'C'], + ['A', 'C'], + ['A', 'C'], + ], + }, + cols={'s': ['sample_1']}, + entries={'HL': [[0.0], [0.0], [0.0]]}, + ) + .key_rows_by('locus', 'alleles') + .key_cols_by('s') + ) + self.assertRaisesRegex( + SeqrValidationError, + "Variants are present multiple times in the callset: \\['1-2-A-C'\\]", + validate_no_duplicate_variants, + mt, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + ) + + def test_validate_expected_contig_frequency(self) -> None: + mt = _mt_from_contigs(ReferenceGenome.GRCh38.standard_contigs) + self.assertIsNone( + validate_expected_contig_frequency(mt, ReferenceGenome.GRCh38, 1), + ) + self.assertRaisesRegex( + SeqrValidationError, + 'Missing the following expected contigs', + validate_expected_contig_frequency, + mt, + ReferenceGenome.GRCh37, + 1, + ) + self.assertRaisesRegex( + SeqrValidationError, + 'which is lower than expected minimum count', + validate_expected_contig_frequency, + mt, + ReferenceGenome.GRCh38, + 2, + ) + + # Drop an optional contig + mt = _mt_from_contigs(ReferenceGenome.GRCh38.standard_contigs - {'chrY'}) + self.assertIsNone( + validate_expected_contig_frequency(mt, ReferenceGenome.GRCh38, 1), + ) + + # Drop a non-optional contig + mt = _mt_from_contigs(ReferenceGenome.GRCh38.standard_contigs - {'chr3'}) + self.assertRaisesRegex( + SeqrValidationError, + 'Missing the following expected contigs', + validate_expected_contig_frequency, + mt, + ReferenceGenome.GRCh38, + 1, + ) + + def test_validate_sample_type(self) -> None: + mt = _mt_from_contigs(ReferenceGenome.GRCh38.standard_contigs) + coding_and_noncoding_variants_ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + 'coding': True, + 'noncoding': False, + }, + { + 'locus': hl.Locus( + contig='chr2', + position=1, + reference_genome='GRCh38', + ), + 'coding': True, + 'noncoding': False, + }, + { + 'locus': hl.Locus( + contig='chr3', + position=1, + reference_genome='GRCh38', + ), + 'coding': False, + 'noncoding': True, + }, + { + 'locus': hl.Locus( + contig='chr4', + position=1, + reference_genome='GRCh38', + ), + 'coding': False, + 'noncoding': True, + }, + ], + hl.tstruct( + locus=hl.tlocus('GRCh38'), + coding=hl.tbool, + noncoding=hl.tbool, + ), + key='locus', + ) + self.assertIsNone( + validate_sample_type( + mt, + ReferenceGenome.GRCh38, + SampleType.WGS, + ['project_a'], + coding_and_noncoding_variants_ht, + ), + ) + self.assertRaisesRegex( + SeqrValidationError, + 'specified as WES but appears to be WGS', + validate_sample_type, + mt, + ReferenceGenome.GRCh38, + SampleType.WES, + ['project_a'], + coding_and_noncoding_variants_ht, + ) + + # has coding, but not noncoding now. + coding_and_noncoding_variants_ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + 'coding': True, + 'noncoding': False, + }, + { + 'locus': hl.Locus( + contig='chr2', + position=1, + reference_genome='GRCh38', + ), + 'coding': True, + 'noncoding': False, + }, + { + 'locus': hl.Locus( + contig='chr2', + position=2, + reference_genome='GRCh38', + ), + 'coding': False, + 'noncoding': True, + }, + ], + hl.tstruct( + locus=hl.tlocus('GRCh38'), + coding=hl.tbool, + noncoding=hl.tbool, + ), + key='locus', + ) + self.assertIsNone( + validate_sample_type( + mt, + ReferenceGenome.GRCh38, + SampleType.WES, + ['project_a'], + coding_and_noncoding_variants_ht, + ), + ) + self.assertRaisesRegex( + SeqrValidationError, + 'specified as WGS but appears to be WES', + validate_sample_type, + mt, + ReferenceGenome.GRCh38, + SampleType.WGS, + ['project_a'], + coding_and_noncoding_variants_ht, + ) + + # has noncoding, but not coding now. + coding_and_noncoding_variants_ht = hl.Table.parallelize( + [ + { + 'locus': hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + 'coding': False, + 'noncoding': True, + }, + { + 'locus': hl.Locus( + contig='chr2', + position=1, + reference_genome='GRCh38', + ), + 'coding': False, + 'noncoding': True, + }, + { + 'locus': hl.Locus( + contig='chr2', + position=2, + reference_genome='GRCh38', + ), + 'coding': True, + 'noncoding': False, + }, + ], + hl.tstruct( + locus=hl.tlocus('GRCh38'), + coding=hl.tbool, + noncoding=hl.tbool, + ), + key='locus', + ) + self.assertRaisesRegex( + SeqrValidationError, + 'contains noncoding variants but is missing common coding variants', + validate_sample_type, + mt, + ReferenceGenome.GRCh38, + SampleType.WGS, + ['project_a'], + coding_and_noncoding_variants_ht, + ) + + # Validation safe if all projects are to be skipped + with patch('loading_pipeline.lib.misc.validation.Env') as mock_env: + mock_env.SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS = ['project_a'] + self.assertIsNone( + validate_sample_type( + mt, + ReferenceGenome.GRCh38, + SampleType.WGS, + ['project_a'], + coding_and_noncoding_variants_ht, + ), + ) diff --git a/loading_pipeline/lib/misc/vep.py b/loading_pipeline/lib/misc/vep.py new file mode 100644 index 0000000000..bdaf7c4c66 --- /dev/null +++ b/loading_pipeline/lib/misc/vep.py @@ -0,0 +1,29 @@ +from string import Template + +import hail as hl + +from loading_pipeline.lib.core import DatasetType, Env, ReferenceGenome + +VEP_CONFIG_URI = Template( + 'file://$vep_reference_datasets_dir/$reference_genome/vep-$reference_genome.json', +) + + +def run_vep( + ht: hl.Table, + dataset_type: DatasetType, + reference_genome: ReferenceGenome, +) -> hl.Table: + if not dataset_type.veppable: + return ht + return hl.vep( + ht, + config=VEP_CONFIG_URI.substitute( + vep_reference_datasets_dir=Env.VEP_REFERENCE_DATASETS_DIR, + reference_genome=reference_genome.value, + ), + name='vep', + block_size=1000, + tolerate_parse_error=True, + csq=False, + ) diff --git a/loading_pipeline/lib/misc/vets.py b/loading_pipeline/lib/misc/vets.py new file mode 100644 index 0000000000..4934168232 --- /dev/null +++ b/loading_pipeline/lib/misc/vets.py @@ -0,0 +1,39 @@ +import hail as hl + +VETS_SNP_CUTOFF = 0.997 +VETS_INDEL_CUTOFF = 0.99 +VETS_SNP_FILTER = 'high_CALIBRATION_SENSITIVITY_SNP' +VETS_INDEL_FILTER = 'high_CALIBRATION_SENSITIVITY_INDEL' + + +def annotate_vets(mt: hl.MatrixTable) -> hl.MatrixTable: + if not hasattr(mt, 'info.CALIBRATION_SENSITIVITY'): + return mt + return mt.annotate_rows( + filters=hl.bind( + lambda is_snp, split_cs: ( + hl.case() + .when( + is_snp & (split_cs > VETS_SNP_CUTOFF), + hl.if_else( + hl.is_defined(mt.filters), + mt.filters.add(VETS_SNP_FILTER), + hl.set([VETS_SNP_FILTER]), + ), + ) + .when( + ~is_snp & (split_cs > VETS_INDEL_CUTOFF), + hl.if_else( + hl.is_defined(mt.filters), + mt.filters.add(VETS_INDEL_FILTER), + hl.set([VETS_INDEL_FILTER]), + ), + ) + .default( + mt.filters, + ) + ), + hl.is_snp(mt.alleles[0], mt.alleles[1]), + hl.parse_float(mt['info.CALIBRATION_SENSITIVITY'][mt.a_index - 1]), + ), + ) diff --git a/loading_pipeline/lib/misc/vets_test.py b/loading_pipeline/lib/misc/vets_test.py new file mode 100644 index 0000000000..b26de113b7 --- /dev/null +++ b/loading_pipeline/lib/misc/vets_test.py @@ -0,0 +1,104 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.misc.io import split_multi_hts +from loading_pipeline.lib.misc.vets import ( + annotate_vets, +) + + +class VetsTest(unittest.TestCase): + def test_annotate_vets(self) -> None: + gatk_mt = hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + ], + 'filters': [ + hl.set(['NO_HQ_GENOTYPES']), + ], + }, + cols={'s': ['sample_1']}, + entries={'HL': [[0.0]]}, + ).key_rows_by('locus') + gatk_mt = annotate_vets(gatk_mt) + dragen_mt = hl.MatrixTable.from_parts( + rows={ + 'locus': [ + hl.Locus( + contig='chr1', + position=1, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=2, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=3, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=4, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=5, + reference_genome='GRCh38', + ), + hl.Locus( + contig='chr1', + position=6, + reference_genome='GRCh38', + ), + ], + 'alleles': [ + ['A', 'T'], + ['A', 'T'], + ['A', 'T'], + ['AC', 'T'], + ['AT', 'ATC'], + ['AG', 'ATG'], + ], + 'filters': [ + hl.set(['NO_HQ_GENOTYPES']), + hl.empty_set(hl.tstr), + hl.missing(hl.tset(hl.tstr)), + hl.set(['NO_HQ_GENOTYPES']), + hl.empty_set(hl.tstr), + hl.set(['NO_HQ_GENOTYPES']), + ], + 'info.CALIBRATION_SENSITIVITY': [ + ['0.999'], + ['0.995'], + ['0.999'], + ['0.98'], + ['0.99'], + ['0.991'], + ], + }, + cols={'s': ['sample_1']}, + entries={'HL': [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]}, + ).key_rows_by('locus', 'alleles') + dragen_mt = split_multi_hts(dragen_mt, False) + dragen_mt = annotate_vets(dragen_mt) + self.assertListEqual( + dragen_mt.filters.collect(), + [ + {'NO_HQ_GENOTYPES', 'high_CALIBRATION_SENSITIVITY_SNP'}, + set(), + {'high_CALIBRATION_SENSITIVITY_SNP'}, + {'NO_HQ_GENOTYPES'}, + set(), + {'NO_HQ_GENOTYPES', 'high_CALIBRATION_SENSITIVITY_INDEL'}, + ], + ) diff --git a/loading_pipeline/lib/paths.py b/loading_pipeline/lib/paths.py new file mode 100644 index 0000000000..df59e6cc39 --- /dev/null +++ b/loading_pipeline/lib/paths.py @@ -0,0 +1,437 @@ +import hashlib +import os + +import hailtop.fs as hfs + +from loading_pipeline.lib.core import ( + DatasetType, + Env, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ( + ReferenceDataset, +) + + +def pipeline_prefix( + root: str, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +) -> str: + return os.path.join( + root, + reference_genome.value, + dataset_type.value, + ) + + +def _v03_reference_dataset_prefix( + root: str, + reference_genome: ReferenceGenome, +) -> str: + return os.path.join( + root, + reference_genome.value, + ) + + +def _callset_path_hash(callset_path: str) -> str: + # Include the most recent modified time of any + # of the callset shards if they exist. + try: + # hfs.ls throws FileNotFoundError if a non-wildcard is passed + # but not found, but does not throw if a wildcard is passed and + # there are no results. + shards = hfs.ls(callset_path) + if not shards: + key = callset_path + else: + # f.modification_time is None for directories + key = callset_path + str( + sum((f.size if f.size else 0) for f in shards), + ) + except FileNotFoundError: + key = callset_path + return hashlib.sha256( + key.encode('utf8'), + ).hexdigest() + + +def tdr_metrics_dir( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'tdr_metrics', + ) + + +def tdr_metrics_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + bq_table_name: str, +) -> str: + return os.path.join( + tdr_metrics_dir(reference_genome, dataset_type), + f'{bq_table_name}.tsv', + ) + + +def imported_callset_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'imported_callsets', + f'{_callset_path_hash(callset_path)}.mt', + ) + + +def postprocessed_callset_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'postprocessed_callsets', + f'{_callset_path_hash(callset_path)}.mt', + ) + + +def validation_errors_for_run_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'validation_errors.json', + ) + + +def metadata_for_run_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'metadata.json', + ) + + +def relatedness_check_table_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'relatedness_check', + f'{_callset_path_hash(callset_path)}.ht', + ) + + +def relatedness_check_tsv_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'relatedness_check', + f'{_callset_path_hash(callset_path)}.tsv', + ) + + +def sample_qc_json_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'sample_qc', + f'{_callset_path_hash(callset_path)}.json', + ) + + +def remapped_and_subsetted_callset_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'remapped_and_subsetted_callsets', + f'{_callset_path_hash(callset_path)}.mt', + ) + + +def runs_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +) -> str: + return os.path.join( + pipeline_prefix( + Env.PIPELINE_DATA_DIR, + reference_genome, + dataset_type, + ), + 'runs', + ) + + +def sex_check_table_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + callset_path: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'sex_check', + f'{_callset_path_hash(callset_path)}.ht', + ) + + +def valid_reference_dataset_path( + reference_genome: ReferenceGenome, + reference_dataset: ReferenceDataset, +) -> str | None: + return os.path.join( + _v03_reference_dataset_prefix( + Env.REFERENCE_DATASETS_DIR, + reference_genome, + ), + reference_dataset.value, + f'{reference_dataset.version(reference_genome)}.ht', + ) + + +def ancestry_model_rf_path() -> str: + return os.path.join( + _v03_reference_dataset_prefix( + Env.REFERENCE_DATASETS_DIR, + ReferenceGenome.GRCh38, + ), + DatasetType.SNV_INDEL, + 'ancestry_imputation_model.onnx', + ) + + +def new_entries_parquet_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'new_entries.parquet', + ) + + +def new_variant_details_parquet_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'new_variant_details.parquet', + ) + + +def new_variants_parquet_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'new_variants.parquet', + ) + + +def existing_variants_parquet_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'existing_variants.parquet', + ) + + +def new_variants_table_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + 'new_variants.ht', + ) + + +def project_pedigree_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + sample_type: SampleType, + project_guid: str, +) -> str: + return os.path.join( + pipeline_prefix( + Env.LOADING_DATASETS_DIR, + reference_genome, + dataset_type, + ), + 'pedigrees', + sample_type.value, + f'{project_guid}_pedigree.tsv', + ) + + +def loading_pipeline_queue_dir() -> str: + """ + Returns the directory where loading pipeline requests are queued. + """ + return os.path.join( + Env.LOCAL_DISK_MOUNT_DIR, + 'loading_pipeline_queue', + ) + + +# https://en.wikipedia.org/wiki/Dead_letter_queue +def loading_pipeline_deadletter_queue_dir() -> str: + return os.path.join( + Env.LOCAL_DISK_MOUNT_DIR, + 'loading_pipeline_deadletter_queue', + ) + + +def loading_pipeline_queue_path(run_id: str) -> str: + """ + Returns a new path for a loading pipeline queue request file. + """ + return os.path.join( + loading_pipeline_queue_dir(), + f'request_{run_id}.json', + ) + + +def loading_pipeline_deadletter_queue_path(run_id: str) -> str: + """ + Returns a new path for a loading pipeline queue request file. + """ + return os.path.join( + loading_pipeline_deadletter_queue_dir(), + f'request_{run_id}.json', + ) + + +def pipeline_run_success_file_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + '_SUCCESS', + ) + + +def clickhouse_load_success_file_path( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +) -> str: + return os.path.join( + runs_path( + reference_genome, + dataset_type, + ), + run_id, + '_CLICKHOUSE_LOAD_SUCCESS', + ) + + +def reference_dataset_parquet( + reference_genome: ReferenceGenome, + reference_dataset: ReferenceDataset, +) -> str: + return os.path.join( + Env.REFERENCE_DATASETS_DIR, + reference_genome.value, + reference_dataset.value, + f'{reference_dataset.version(reference_genome)}.parquet', + ) diff --git a/loading_pipeline/lib/paths_test.py b/loading_pipeline/lib/paths_test.py new file mode 100644 index 0000000000..3803bdb92a --- /dev/null +++ b/loading_pipeline/lib/paths_test.py @@ -0,0 +1,154 @@ +import unittest +from unittest.mock import patch + +import hailtop.fs as hfs + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.paths import ( + existing_variants_parquet_path, + imported_callset_path, + metadata_for_run_path, + new_variants_table_path, + project_pedigree_path, + relatedness_check_table_path, + remapped_and_subsetted_callset_path, + sex_check_table_path, + tdr_metrics_path, + validation_errors_for_run_path, +) + +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30varia*.vcf' + + +class TestPaths(unittest.TestCase): + def test_sex_check_table_path(self) -> None: + self.assertEqual( + sex_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + '/var/abc.efg/callset.vcf.gz', + ), + '/var/seqr/seqr-loading-temp/GRCh38/SNV_INDEL/sex_check/f92b8ab6b5b8c41fa20d7d49a5626b96dcd2ba79fa6f61eab7ffb80d550d951c.ht', + ) + + def test_relatedness_check_table_path(self) -> None: + self.assertEqual( + relatedness_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + '/var/abc.efg/callset.vcf.gz', + ), + '/var/seqr/seqr-loading-temp/GRCh38/SNV_INDEL/relatedness_check/f92b8ab6b5b8c41fa20d7d49a5626b96dcd2ba79fa6f61eab7ffb80d550d951c.ht', + ) + + def test_validation_errors_for_run_path(self) -> None: + self.assertEqual( + validation_errors_for_run_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + 'manual__2023-06-26T18:30:09.349671+00:00', + ), + '/var/seqr/pipeline-data/GRCh38/SNV_INDEL/runs/manual__2023-06-26T18:30:09.349671+00:00/validation_errors.json', + ) + + def test_metadata_for_run_path(self) -> None: + self.assertEqual( + metadata_for_run_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + 'manual__2023-06-26T18:30:09.349671+00:00', + ), + '/var/seqr/pipeline-data/GRCh38/SNV_INDEL/runs/manual__2023-06-26T18:30:09.349671+00:00/metadata.json', + ) + + def test_existing_variants_parquet_path(self) -> None: + self.assertEqual( + existing_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + 'manual__2023-06-26T18:30:09.349671+00:00', + ), + '/var/seqr/pipeline-data/GRCh38/GCNV/runs/manual__2023-06-26T18:30:09.349671+00:00/existing_variants.parquet', + ) + + def test_remapped_and_subsetted_callset_path(self) -> None: + self.assertEqual( + remapped_and_subsetted_callset_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + '/var/abc.efg/callset.vcf.gz', + ), + '/var/seqr/seqr-loading-temp/GRCh38/GCNV/remapped_and_subsetted_callsets/f92b8ab6b5b8c41fa20d7d49a5626b96dcd2ba79fa6f61eab7ffb80d550d951c.mt', + ) + self.assertEqual( + remapped_and_subsetted_callset_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + '/var/abc.efg/callset/*.vcf.gz', + ), + '/var/seqr/seqr-loading-temp/GRCh38/GCNV/remapped_and_subsetted_callsets/26f481b386721f9889250c6549905660728ec9f77be4b8f7eeb6c4facc76282e.mt', + ) + + def test_imported_callset_path(self) -> None: + self.assertEqual( + imported_callset_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + '/var/abc.efg/callset.vcf.gz', + ), + '/var/seqr/seqr-loading-temp/GRCh38/SNV_INDEL/imported_callsets/f92b8ab6b5b8c41fa20d7d49a5626b96dcd2ba79fa6f61eab7ffb80d550d951c.mt', + ) + + with patch('loading_pipeline.lib.paths.hfs.ls') as mock_ls: + mock_ls.return_value = [ + hfs.stat_result.FileListEntry( + path='loading_pipeline/var/test/callsets/1kg_30variants.vcf', + owner=None, + size=1732033623.804012, + typ=hfs.stat_result.FileType(2), + modification_time=1732033000, + ), + ] + self.assertEqual( + imported_callset_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + '/var/seqr/seqr-loading-temp/GRCh38/SNV_INDEL/imported_callsets/01327e46c8747f15feaad2c08875b928c274dcb248ad40837ea3f49d8b4dedfb.mt', + ) + + def test_tdr_metrics_path(self) -> None: + self.assertEqual( + tdr_metrics_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + 'datarepo-7242affb.datarepo_RP_3053', + ), + '/var/seqr/seqr-loading-temp/GRCh38/SNV_INDEL/tdr_metrics/datarepo-7242affb.datarepo_RP_3053.tsv', + ) + + def test_new_variants_table_path(self) -> None: + self.assertEqual( + new_variants_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + 'manual__2023-06-26T18:30:09.349671+00:00', + ), + '/var/seqr/pipeline-data/GRCh38/SNV_INDEL/runs/manual__2023-06-26T18:30:09.349671+00:00/new_variants.ht', + ) + + def test_project_pedigree_path(self) -> None: + self.assertEqual( + project_pedigree_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + SampleType.WES, + 'R0652_pipeline_test', + ), + '/var/seqr/seqr-loading-temp/GRCh38/GCNV/pedigrees/WES/R0652_pipeline_test_pedigree.tsv', + ) diff --git a/loading_pipeline/lib/reference_datasets/__init__.py b/loading_pipeline/lib/reference_datasets/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/reference_datasets/eigen.py b/loading_pipeline/lib/reference_datasets/eigen.py new file mode 100644 index 0000000000..84a04215bf --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/eigen.py @@ -0,0 +1,7 @@ +import hail as hl + + +def get_ht(path: str, *_) -> hl.Table: + ht = hl.read_table(path) + ht = ht.select(Eigen_phred=hl.float32(ht.info['Eigen-phred'])) + return ht.group_by(*ht.key).aggregate(Eigen_phred=hl.agg.max(ht.Eigen_phred)) diff --git a/loading_pipeline/lib/reference_datasets/gencode/__init__.py b/loading_pipeline/lib/reference_datasets/gencode/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/reference_datasets/gencode/mapping_gene_ids.py b/loading_pipeline/lib/reference_datasets/gencode/mapping_gene_ids.py new file mode 100644 index 0000000000..b668a99d2b --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gencode/mapping_gene_ids.py @@ -0,0 +1,64 @@ +import gzip +import logging + +import requests + +logger = logging.getLogger(__name__) + +# Mirror of 'http://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_{gencode_release}/gencode.v{gencode_release}.annotation.gtf.gz' +GENCODE_GTF_URL = 'https://storage.googleapis.com/seqr-reference-data/gencode/gencode.v{gencode_release}.annotation.gtf.gz' +# Mirror of 'https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_{gencode_release}/gencode.v{gencode_release}.metadata.RefSeq.gz' +GENCODE_ENSEMBL_TO_REFSEQ_URL = 'https://storage.googleapis.com/seqr-reference-data/gencode/gencode.v{gencode_release}.metadata.RefSeq.gz' + +# expected GTF file header +GENCODE_FILE_HEADER = [ + 'chrom', + 'source', + 'feature_type', + 'start', + 'end', + 'score', + 'strand', + 'phase', + 'info', +] +EXPECTED_ENSEMBLE_TO_REFSEQ_FIELDS = 3 + + +def load_gencode_gene_symbol_to_gene_id(gencode_release: int) -> dict[str, str]: + url = GENCODE_GTF_URL.format(gencode_release=gencode_release) + response = requests.get(url, stream=True, timeout=10) + gene_symbol_to_gene_id = {} + for line in gzip.GzipFile(fileobj=response.raw): + line = line.decode('ascii') # noqa: PLW2901 + if not line or line.startswith('#'): + continue + fields = line.strip().split('\t') + if len(fields) != len(GENCODE_FILE_HEADER): + msg = f'Unexpected number of fields: {fields}' + raise ValueError( + msg, + ) + record = dict(zip(GENCODE_FILE_HEADER, fields, strict=False)) + if record['feature_type'] != 'gene': + continue + # parse info field + info_fields = [x.strip().split() for x in record['info'].split(';') if x != ''] + info_fields = {k: v.strip('"') for k, v in info_fields} + gene_symbol_to_gene_id[info_fields['gene_name']] = info_fields['gene_id'].split( + '.', + )[0] + return gene_symbol_to_gene_id + + +def load_gencode_ensembl_to_refseq_id(gencode_release: int): + url = GENCODE_ENSEMBL_TO_REFSEQ_URL.format(gencode_release=gencode_release) + response = requests.get(url, stream=True, timeout=10) + ensembl_to_refseq_ids = {} + for line in gzip.GzipFile(fileobj=response.raw): + fields = line.decode('ascii').strip().split('\t') + if len(fields) > EXPECTED_ENSEMBLE_TO_REFSEQ_FIELDS: + msg = 'Unexpected number of fields on line in ensemble_to_refseq mapping' + raise ValueError(msg) + ensembl_to_refseq_ids[fields[0].split('.')[0]] = fields[1] + return ensembl_to_refseq_ids diff --git a/loading_pipeline/lib/reference_datasets/gencode/mapping_gene_ids_tests.py b/loading_pipeline/lib/reference_datasets/gencode/mapping_gene_ids_tests.py new file mode 100644 index 0000000000..edba8de050 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gencode/mapping_gene_ids_tests.py @@ -0,0 +1,64 @@ +import gzip +import unittest + +import responses + +from loading_pipeline.lib.reference_datasets.gencode.mapping_gene_ids import ( + GENCODE_ENSEMBL_TO_REFSEQ_URL, + GENCODE_GTF_URL, + load_gencode_ensembl_to_refseq_id, + load_gencode_gene_symbol_to_gene_id, +) + +GTF_DATA = [ + '#description: evidence-based annotation of the human genome, version 31 (Ensembl 97), mapped to GRCh37 with gencode-backmap', + 'chr1 HAVANA gene 11869 14409 . + . gene_id "ENSG00000223972.5_2"; gene_type "transcribed_unprocessed_pseudogene"; gene_name "DDX11L1"; level 2; hgnc_id "HGNC:37102"; havana_gene "OTTHUMG00000000961.2_2"; remap_status "full_contig"; remap_num_mappings 1; remap_target_status "overlap";', + 'chr1 HAVANA gene 621059 622053 . - . gene_id "ENSG00000284662.1_2"; gene_type "protein_coding"; gene_name "OR4F16"; level 2; hgnc_id "HGNC:15079"; havana_gene "OTTHUMG00000002581.3_2"; remap_status "full_contig"; remap_num_mappings 1; remap_target_status "overlap";', + 'GL000193.1 HAVANA gene 77815 78162 . + . gene_id "ENSG00000279783.1_5"; gene_type "processed_pseudogene"; gene_name "AC018692.2"; level 2; havana_gene "OTTHUMG00000189459.1_5"; remap_status "full_contig"; remap_num_mappings 1; remap_target_status "new";', +] +GENE_ID_MAPPING = { + 'DDX11L1': 'ENSG00000223972', + 'OR4F16': 'ENSG00000284662', + 'AC018692.2': 'ENSG00000279783', +} + + +ENSEMBL_TO_REFSEQ_DATA = b"""ENST00000424215.1\tNR_121638.1 +ENST00000378391.6\tNM_199454.3\tNP_955533.2 +ENST00000270722.10\tNM_022114.4\tNP_071397.3 +ENST00000288774.8\tNM_001374425.1\tNP_001361354.1""" + + +class LoadGencodeTestCase(unittest.TestCase): + @responses.activate + def test_load_gencode_gene_symbol_to_gene_id(self): + url = GENCODE_GTF_URL.format(gencode_release=12) + responses.add( + responses.GET, + url, + body=gzip.compress(('\n'.join(GTF_DATA)).encode()), + ) + mapping = load_gencode_gene_symbol_to_gene_id(12) + self.assertDictEqual( + mapping, + { + 'AC018692.2': 'ENSG00000279783', + 'DDX11L1': 'ENSG00000223972', + 'OR4F16': 'ENSG00000284662', + }, + ) + + @responses.activate + def test_load_gencode_ensembl_to_refseq_id(self): + url = GENCODE_ENSEMBL_TO_REFSEQ_URL.format(gencode_release=20) + responses.add(responses.GET, url, body=gzip.compress(ENSEMBL_TO_REFSEQ_DATA)) + mapping = load_gencode_ensembl_to_refseq_id(20) + self.assertDictEqual( + mapping, + { + 'ENST00000424215': 'NR_121638.1', + 'ENST00000378391': 'NM_199454.3', + 'ENST00000270722': 'NM_022114.4', + 'ENST00000288774': 'NM_001374425.1', + }, + ) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_coding_and_noncoding.py b/loading_pipeline/lib/reference_datasets/gnomad_coding_and_noncoding.py new file mode 100644 index 0000000000..fcb137d2b2 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_coding_and_noncoding.py @@ -0,0 +1,58 @@ +import hail as hl + +from loading_pipeline.lib.annotations.enums import ( + TRANSCRIPT_CONSEQUENCE_TERMS, +) +from loading_pipeline.lib.annotations.expression_helpers import ( + get_expr_for_vep_sorted_transcript_consequences_array, + get_expr_for_worst_transcript_consequence_annotations_struct, +) +from loading_pipeline.lib.core import ReferenceGenome + +GNOMAD_CODING_NONCODING_HIGH_AF_THRESHOLD = 0.90 +TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP = hl.dict( + hl.enumerate(TRANSCRIPT_CONSEQUENCE_TERMS, index_first=False), +) + + +def get_ht( + path: str, + reference_genome: ReferenceGenome, +) -> hl.Table: + ht = hl.read_table(path) + filtered_contig = 'chr1' if reference_genome == ReferenceGenome.GRCh38 else '1' + ht = hl.filter_intervals( + ht, + [ + hl.parse_locus_interval( + filtered_contig, + reference_genome=reference_genome.value, + ), + ], + ) + ht = ht.filter(ht.freq[0].AF > GNOMAD_CODING_NONCODING_HIGH_AF_THRESHOLD) + ht = ht.annotate( + sorted_transaction_consequences=( + get_expr_for_vep_sorted_transcript_consequences_array( + ht.vep, + ) + ), + ) + ht = ht.annotate( + main_transcript=( + get_expr_for_worst_transcript_consequence_annotations_struct( + ht.sorted_transaction_consequences, + ) + ), + ) + ht = ht.select( + coding=( + ht.main_transcript.major_consequence_rank + <= TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP['synonymous_variant'] + ), + noncoding=( + ht.main_transcript.major_consequence_rank + >= TRANSCRIPT_CONSEQUENCE_TERM_RANK_LOOKUP['downstream_gene_variant'] + ), + ) + return ht.filter(ht.coding | ht.noncoding) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_exomes.py b/loading_pipeline/lib/reference_datasets/gnomad_exomes.py new file mode 100644 index 0000000000..abe0fc3d88 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_exomes.py @@ -0,0 +1,21 @@ +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome +from loading_pipeline.lib.reference_datasets.gnomad_utils import get_ht as _get_ht + + +def af_popmax_expression( + ht: hl.Table, + reference_genome: ReferenceGenome, +) -> hl.Expression: + if reference_genome == ReferenceGenome.GRCh37: + return ht.popmax[ht.globals.popmax_index_dict['gnomad']].AF + return ht.grpmax['gnomad'].AF + + +def get_ht(path: str, reference_genome: ReferenceGenome) -> hl.Table: + return _get_ht( + path, + reference_genome, + af_popmax_expression, + ) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_exomes_test.py b/loading_pipeline/lib/reference_datasets/gnomad_exomes_test.py new file mode 100644 index 0000000000..639dc6d894 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_exomes_test.py @@ -0,0 +1,72 @@ +import unittest +from unittest.mock import patch + +import hail as hl + +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset + +GNOMAD_EXOMES_37_PATH = ( + 'loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht' +) +GNOMAD_EXOMES_38_PATH = ( + 'loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht' +) + + +class GnomadTest(unittest.TestCase): + def test_gnomad_exomes_37(self): + with patch.object( + ReferenceDataset, + 'path', + return_value=GNOMAD_EXOMES_37_PATH, + ): + ht = ReferenceDataset.gnomad_exomes.get_ht(ReferenceGenome.GRCh37) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + locus=hl.Locus( + contig='1', + position=12586, + reference_genome='GRCh37', + ), + alleles=['C', 'T'], + AF=0.0005589714855886996, + AN=3578, + AC=2, + Hom=0, + AF_POPMAX_OR_GLOBAL=0.0022026430815458298, + FAF_AF=9.839000267675146e-05, + Hemi=0, + ), + ], + ) + + def test_gnomad_exomes_38(self): + with patch.object( + ReferenceDataset, + 'path', + return_value=GNOMAD_EXOMES_38_PATH, + ): + ht = ReferenceDataset.gnomad_exomes.get_ht(ReferenceGenome.GRCh38) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + locus=hl.Locus( + contig='chr1', + position=12138, + reference_genome='GRCh38', + ), + alleles=['C', 'A'], + AF=0.00909090880304575, + AN=110, + AC=1, + Hom=0, + AF_POPMAX_OR_GLOBAL=0.009803921915590763, + FAF_AF=0.0, + Hemi=0, + ), + ], + ) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_genomes.py b/loading_pipeline/lib/reference_datasets/gnomad_genomes.py new file mode 100644 index 0000000000..ff63586c78 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_genomes.py @@ -0,0 +1,21 @@ +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome +from loading_pipeline.lib.reference_datasets.gnomad_utils import get_ht as _get_ht + + +def af_popmax_expression( + ht: hl.Table, + reference_genome: ReferenceGenome, +) -> hl.Expression: + if reference_genome == ReferenceGenome.GRCh37: + return ht.popmax[ht.globals.popmax_index_dict['gnomad']].AF + return ht.grpmax.AF + + +def get_ht(path: str, reference_genome: ReferenceGenome) -> hl.Table: + return _get_ht( + path, + reference_genome, + af_popmax_expression, + ) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_genomes_test.py b/loading_pipeline/lib/reference_datasets/gnomad_genomes_test.py new file mode 100644 index 0000000000..df637c2fda --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_genomes_test.py @@ -0,0 +1,72 @@ +import unittest +from unittest.mock import patch + +import hail as hl + +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset + +GNOMAD_GENOMES_37_PATH = ( + 'loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht' +) +GNOMAD_GENOMES_38_PATH = ( + 'loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht' +) + + +class GnomadTest(unittest.TestCase): + def test_gnomad_genomes_37(self): + with patch.object( + ReferenceDataset, + 'path', + return_value=GNOMAD_GENOMES_37_PATH, + ): + ht = ReferenceDataset.gnomad_genomes.get_ht(ReferenceGenome.GRCh37) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + locus=hl.Locus( + contig='1', + position=10131, + reference_genome='GRCh37', + ), + alleles=['CT', 'C'], + AF=3.6635403375839815e-05, + AN=27296, + AC=1, + Hom=0, + AF_POPMAX_OR_GLOBAL=3.6635403375839815e-05, + FAF_AF=0.0, + Hemi=0, + ), + ], + ) + + def test_gnomad_genomes_38(self): + with patch.object( + ReferenceDataset, + 'path', + return_value=GNOMAD_GENOMES_38_PATH, + ): + ht = ReferenceDataset.gnomad_genomes.get_ht(ReferenceGenome.GRCh38) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + locus=hl.Locus( + contig='chr1', + position=10057, + reference_genome='GRCh38', + ), + alleles=['A', 'C'], + AF=2.642333674884867e-05, + AN=113536, + AC=3, + Hom=0, + AF_POPMAX_OR_GLOBAL=3.779861071961932e-05, + FAF_AF=7.019999884505523e-06, + Hemi=0, + ), + ], + ) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_qc.py b/loading_pipeline/lib/reference_datasets/gnomad_qc.py new file mode 100644 index 0000000000..481a6ccda8 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_qc.py @@ -0,0 +1,9 @@ +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome + + +def get_ht(path: str, reference_genome: ReferenceGenome) -> hl.Table: + if reference_genome == ReferenceGenome.GRCh37: + return hl.read_matrix_table(path).rows() + return hl.read_table(path) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_svs.py b/loading_pipeline/lib/reference_datasets/gnomad_svs.py new file mode 100644 index 0000000000..8b453fd948 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_svs.py @@ -0,0 +1,17 @@ +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome +from loading_pipeline.lib.reference_datasets.misc import vcf_to_ht + + +def get_ht(path: str, reference_genome: ReferenceGenome) -> hl.Table: + ht = vcf_to_ht(path, reference_genome) + ht = ht.select( + KEY=ht.rsid, + AF=ht.info.AF[0], + AC=ht.info.AC[0], + AN=ht.info.AN, + N_HET=ht.info.N_HET, + N_HOM=ht.info.N_HOMALT, + ) + return ht.key_by('KEY') diff --git a/loading_pipeline/lib/reference_datasets/gnomad_svs_test.py b/loading_pipeline/lib/reference_datasets/gnomad_svs_test.py new file mode 100644 index 0000000000..bfd7c89d11 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_svs_test.py @@ -0,0 +1,93 @@ +import unittest +from unittest.mock import patch + +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset + +TEST_GNOMAD_SVS_RAW_HT = ( + 'loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht' +) + + +class GnomadSVsTest(unittest.TestCase): + @patch('loading_pipeline.lib.reference_datasets.gnomad_svs.vcf_to_ht') + def test_gnomad_svs(self, mock_vcf_to_ht): + mock_vcf_to_ht.return_value = hl.read_table(TEST_GNOMAD_SVS_RAW_HT) + ht = ReferenceDataset.gnomad_svs.get_ht(ReferenceGenome.GRCh38) + self.assertEqual( + ht.collect(), + [ + hl.Struct( + KEY='gnomAD-SV_v3_BND_chr1_1a45f73a', + locus=hl.Locus( + contig='chr1', + position=10434, + reference_genome=ReferenceGenome.GRCh38, + ), + alleles=['N', ''], + AF=0.11413399875164032, + AC=8474, + AN=74246, + N_HET=8426, + N_HOM=24, + ), + hl.Struct( + KEY='gnomAD-SV_v3_BND_chr1_3fa36917', + locus=hl.Locus( + contig='chr1', + position=10440, + reference_genome=ReferenceGenome.GRCh38, + ), + alleles=['N', ''], + AF=0.004201000090688467, + AC=466, + AN=110936, + N_HET=466, + N_HOM=0, + ), + hl.Struct( + KEY='gnomAD-SV_v3_BND_chr1_7bbf34b5', + locus=hl.Locus( + contig='chr1', + position=10464, + reference_genome=ReferenceGenome.GRCh38, + ), + alleles=['N', ''], + AF=0.03698499873280525, + AC=3119, + AN=84332, + N_HET=3115, + N_HOM=2, + ), + hl.Struct( + KEY='gnomAD-SV_v3_BND_chr1_933a2971', + locus=hl.Locus( + contig='chr1', + position=10450, + reference_genome=ReferenceGenome.GRCh38, + ), + alleles=['N', ''], + AF=0.3238990008831024, + AC=21766, + AN=67200, + N_HET=21616, + N_HOM=75, + ), + hl.Struct( + KEY='gnomAD-SV_v3_DUP_chr1_01c2781c', + locus=hl.Locus( + contig='chr1', + position=10000, + reference_genome=ReferenceGenome.GRCh38, + ), + alleles=['N', ''], + AF=0.0019970000721514225, + AC=139, + AN=69594, + N_HET=139, + N_HOM=0, + ), + ], + ) diff --git a/loading_pipeline/lib/reference_datasets/gnomad_utils.py b/loading_pipeline/lib/reference_datasets/gnomad_utils.py new file mode 100644 index 0000000000..2e02f56490 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/gnomad_utils.py @@ -0,0 +1,55 @@ +from collections.abc import Callable + +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome + + +def global_idx_field(reference_genome: ReferenceGenome) -> str: + return 'gnomad' if reference_genome == ReferenceGenome.GRCh37 else 'adj' + + +def faf_globals_field(reference_genome: ReferenceGenome) -> str: + return ( + 'popmax_index_dict' + if reference_genome == ReferenceGenome.GRCh37 + else 'faf_index_dict' + ) + + +def hemi_field(reference_genome: ReferenceGenome) -> str: + return 'gnomad_male' if reference_genome == ReferenceGenome.GRCh37 else 'XY_adj' + + +def get_ht( + path: str, + reference_genome: ReferenceGenome, + af_popmax_expression: Callable, +) -> hl.Table: + ht = hl.read_table(path) + global_idx = hl.eval(ht.globals.freq_index_dict[global_idx_field(reference_genome)]) + ht = ht.select( + AF=hl.float32(ht.freq[global_idx].AF), + AN=ht.freq[global_idx].AN, + AC=ht.freq[global_idx].AC, + Hom=ht.freq[global_idx].homozygote_count, + AF_POPMAX_OR_GLOBAL=hl.float32( + hl.or_else( + af_popmax_expression(ht, reference_genome), + ht.freq[global_idx].AF, + ), + ), + FAF_AF=hl.float32( + ht.faf[ + ht.globals[faf_globals_field(reference_genome)][ + global_idx_field(reference_genome) + ] + ].faf95, + ), + Hemi=hl.if_else( + ht.locus.in_autosome_or_par(), + 0, + ht.freq[ht.globals.freq_index_dict[hemi_field(reference_genome)]].AC, + ), + ) + return ht.select_globals() diff --git a/loading_pipeline/lib/reference_datasets/misc.py b/loading_pipeline/lib/reference_datasets/misc.py new file mode 100644 index 0000000000..12bd467560 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/misc.py @@ -0,0 +1,58 @@ +import hail as hl + +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.misc.io import split_multi_hts + +BIALLELIC = 2 + + +def compress_floats(ht: hl.Table): + # Parse float64s into float32s to save space! + return ht.select( + **{ + k: hl.float32(v) if v.dtype == hl.tfloat64 else v + for k, v in ht.row_value.items() + }, + ) + + +def filter_contigs(ht, reference_genome: ReferenceGenome): + if hasattr(ht, 'interval'): + return ht.filter( + hl.set(reference_genome.standard_contigs).contains( + ht.interval.start.contig, + ), + ) + # SV reference datasets are not keyed by locus. + if hasattr(ht, 'locus'): + return ht.filter( + hl.set(reference_genome.standard_contigs).contains(ht.locus.contig), + ) + return ht + + +def vcf_to_ht( + file_name: str, + reference_genome: ReferenceGenome, + split_multi=False, +) -> hl.Table: + mt = hl.import_vcf( + file_name, + reference_genome=reference_genome.value, + drop_samples=True, + skip_invalid_loci=True, + contig_recoding=reference_genome.contig_recoding(include_mt=True), + force_bgz=True, + array_elements_required=False, + ) + if split_multi: + return split_multi_hts(mt, True).rows() + + # Validate that there exist no multialellic variants in the table. + count_non_biallelic = mt.aggregate_rows( + hl.agg.count_where(hl.len(mt.alleles) > BIALLELIC), + ) + if count_non_biallelic: + error = f'Encountered {count_non_biallelic} multiallelic variants' + raise ValueError(error) + return mt.rows() diff --git a/loading_pipeline/lib/reference_datasets/reference_dataset.py b/loading_pipeline/lib/reference_datasets/reference_dataset.py new file mode 100644 index 0000000000..aa3e6f1cc3 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/reference_dataset.py @@ -0,0 +1,178 @@ +import importlib +import types +from collections.abc import Callable +from enum import StrEnum + +import hail as hl + +from loading_pipeline.lib.annotations import sv +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, +) +from loading_pipeline.lib.misc.validation import ( + validate_allele_type, + validate_no_duplicate_variants, +) +from loading_pipeline.lib.reference_datasets.misc import ( + compress_floats, + filter_contigs, +) + +DATASET_TYPES = 'dataset_types' +FORMATTING_ANNOTATION = 'formatting_annotation' +SELECT = 'select' +VERSION = 'version' +PATH = 'path' + + +class ReferenceDataset(StrEnum): + eigen = 'eigen' + splice_ai = 'splice_ai' + topmed = 'topmed' + gnomad_coding_and_noncoding = 'gnomad_coding_and_noncoding' + gnomad_exomes = 'gnomad_exomes' + gnomad_genomes = 'gnomad_genomes' + gnomad_qc = 'gnomad_qc' + gnomad_svs = 'gnomad_svs' + + @property + def formatting_annotation(self) -> Callable | None: + return CONFIG[self].get(FORMATTING_ANNOTATION) + + def version(self, reference_genome: ReferenceGenome) -> str: + version = CONFIG[self][reference_genome][VERSION] + if isinstance(version, types.FunctionType): + return version( + self.path(reference_genome), + ) + return version + + def dataset_types( + self, + reference_genome: ReferenceGenome, + ) -> frozenset[DatasetType]: + return CONFIG[self].get(reference_genome, {}).get(DATASET_TYPES, frozenset()) + + @property + def select( + self, + ) -> Callable[[ReferenceGenome, DatasetType, hl.Table], hl.Table] | None: + return CONFIG[self].get(SELECT) + + def path(self, reference_genome: ReferenceGenome) -> str | list[str]: + return CONFIG[self][reference_genome][PATH] + + def get_ht( + self, + reference_genome: ReferenceGenome, + ) -> hl.Table: + module = importlib.import_module( + f'loading_pipeline.lib.reference_datasets.{self.name}', + ) + path = self.path(reference_genome) + ht = module.get_ht(path, reference_genome) + ht = compress_floats(ht) + ht = filter_contigs(ht, reference_genome) + for dataset_type in self.dataset_types(reference_genome): + validate_allele_type(ht, dataset_type) + validate_no_duplicate_variants(ht, reference_genome, dataset_type) + return ht + + +CONFIG = { + ReferenceDataset.eigen: { + ReferenceGenome.GRCh37: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.1', + # NB: The download link on the Eigen website (http://www.columbia.edu/~ii2135/download.html) is broken + # as of 11/15/24 so we will host the data + PATH: 'gs://seqr-reference-data/GRCh37/eigen/EIGEN_coding_noncoding.grch37.ht', + }, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.1', + PATH: 'gs://seqr-reference-data/GRCh38/eigen/EIGEN_coding_noncoding.liftover_grch38.ht', + }, + }, + ReferenceDataset.splice_ai: { + ReferenceGenome.GRCh37: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.1', + PATH: [ + 'gs://seqr-reference-data/GRCh37/spliceai/spliceai_scores.masked.snv.hg19.vcf.gz', + 'gs://seqr-reference-data/GRCh37/spliceai/spliceai_scores.masked.indel.hg19.vcf.gz', + ], + }, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.1', + # NB: SpliceAI data is only available to download for authenticated Illumina users, so we will host the data + PATH: [ + 'gs://seqr-reference-data/GRCh38/spliceai/spliceai_scores.masked.snv.hg38.vcf.gz', + 'gs://seqr-reference-data/GRCh38/spliceai/spliceai_scores.masked.indel.hg38.vcf.gz', + ], + }, + }, + ReferenceDataset.topmed: { + ReferenceGenome.GRCh37: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.1', + PATH: 'gs://seqr-reference-data/GRCh37/TopMed/bravo-dbsnp-all.removed_chr_prefix.liftunder_GRCh37.vcf.gz', + }, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.1', + # NB: TopMed data is available to download via https://legacy.bravo.sph.umich.edu/freeze8/hg38/downloads/vcf/ + # However, users must be authenticated and accept TOS to access it so for now we will host a copy of the data + PATH: 'gs://seqr-reference-data/GRCh38/TopMed/bravo-dbsnp-all.vcf.gz', + }, + }, + ReferenceDataset.gnomad_exomes: { + ReferenceGenome.GRCh37: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.0', + PATH: 'gs://gcp-public-data--gnomad/release/2.1.1/ht/exomes/gnomad.exomes.r2.1.1.sites.ht', + }, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.0', + PATH: 'gs://gcp-public-data--gnomad/release/4.1/ht/exomes/gnomad.exomes.v4.1.sites.ht', + }, + }, + ReferenceDataset.gnomad_genomes: { + ReferenceGenome.GRCh37: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.0', + PATH: 'gs://gcp-public-data--gnomad/release/2.1.1/ht/genomes/gnomad.genomes.r2.1.1.sites.ht', + }, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.0', + PATH: 'gs://gcp-public-data--gnomad/release/4.1/ht/genomes/gnomad.genomes.v4.1.sites.ht', + }, + }, + ReferenceDataset.gnomad_qc: { + ReferenceGenome.GRCh37: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.0', + PATH: 'gs://seqr-reference-data/gnomad_qc/GRCh37/gnomad.joint.high_callrate_common_biallelic_snps.pruned.mt', + }, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SNV_INDEL]), + VERSION: '1.0', + PATH: 'gs://gcp-public-data--gnomad/release/4.0/pca/gnomad.v4.0.pca_loadings.ht', + }, + }, + ReferenceDataset.gnomad_svs: { + FORMATTING_ANNOTATION: sv.gnomad_svs, + ReferenceGenome.GRCh38: { + DATASET_TYPES: frozenset([DatasetType.SV]), + VERSION: '1.1', + PATH: 'gs://gcp-public-data--gnomad/release/4.1/genome_sv/gnomad.v4.1.sv.sites.vcf.gz', + }, + }, +} +CONFIG[ReferenceDataset.gnomad_coding_and_noncoding] = { + **CONFIG[ReferenceDataset.gnomad_genomes], +} diff --git a/loading_pipeline/lib/reference_datasets/splice_ai.py b/loading_pipeline/lib/reference_datasets/splice_ai.py new file mode 100644 index 0000000000..4d6a9e8a3f --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/splice_ai.py @@ -0,0 +1,71 @@ +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome +from loading_pipeline.lib.misc.io import ( + checkpoint, + compute_hail_n_partitions, + file_size_bytes, +) +from loading_pipeline.lib.reference_datasets.misc import vcf_to_ht + + +def remove_duplicate_scores(ht: hl.Table): + # + # SpliceAI has many duplicate rows of the ilk: + # + # 1:861264 | ["C","A"] | NA | -1.00e+01 | NA | ["A|AL645608.1|0.00|0.00|0.00|0.00|2|27|12|1"] | + # 1:861264 | ["C","A"] | NA | -1.00e+01 | NA | ["A|SAMD11|0.02|0.01|0.00|0.00|14|38|14|38"] + # + count_ht = ht.group_by(*ht.key).aggregate(n=hl.agg.count()) + duplicate_variants_ht = count_ht.filter(count_ht.n > 1) + duplicates_ht = ht.semi_join(duplicate_variants_ht) + non_duplicates_ht = ht.anti_join(duplicates_ht) + return non_duplicates_ht.union( + # Remove rows that 1) are part of duplicate variant groupings + # and 2) contain dots. Then, remove arbitrarily with .distinct() + duplicates_ht.filter( + ~duplicates_ht.info.SpliceAI[0].split(delim='\\|')[1].contains('.'), + ).distinct(), + ) + + +def get_ht( + paths: list[str], + reference_genome: ReferenceGenome, +) -> hl.Table: + # NB: We ran into weird issues...running out + # of file descriptors on dataproc :/ + hl._set_flags(use_new_shuffle=None, no_whole_stage_codegen='1') # noqa: SLF001 + ht = vcf_to_ht(paths, reference_genome) + ht, checkpoint_path = checkpoint(ht) + # The default partitions are too big, leading to OOMs. + ht = ht.repartition( + int(compute_hail_n_partitions(file_size_bytes(checkpoint_path)) * 2), + # Note that shuffle=True here, since this is one of the few + # cases in the pipeline where we want to increase the number + # of partititons. + ) + ht, _ = checkpoint(ht) + ht = remove_duplicate_scores(ht) + + # SpliceAI INFO field description from the VCF header: SpliceAIv1.3 variant annotation. These include + # delta scores (DS) and delta positions (DP) for acceptor gain (AG), acceptor loss (AL), donor gain (DG), and + # donor loss (DL). Format: ALLELE|SYMBOL|DS_AG|DS_AL|DS_DG|DS_DL|DP_AG|DP_AL|DP_DG|DP_DL + ds_start_index = 2 + ds_end_index = 6 + num_delta_scores = ds_end_index - ds_start_index + ht = ht.select( + delta_scores=ht.info.SpliceAI[0] + .split(delim='\\|')[ds_start_index:ds_end_index] + .map(hl.float32), + ) + ht = ht.annotate(delta_score=hl.max(ht.delta_scores)) + return ht.annotate( + splice_consequence_id=hl.if_else( + ht.delta_score > 0, + # Splice Consequence enum ID is the index of the max score + ht.delta_scores.index(ht.delta_score), + # If no score, use the last index for "No Consequence" + num_delta_scores, + ), + ).drop('delta_scores') diff --git a/loading_pipeline/lib/reference_datasets/topmed.py b/loading_pipeline/lib/reference_datasets/topmed.py new file mode 100644 index 0000000000..3172df2374 --- /dev/null +++ b/loading_pipeline/lib/reference_datasets/topmed.py @@ -0,0 +1,22 @@ +import hail as hl + +from loading_pipeline.lib.core import ReferenceGenome +from loading_pipeline.lib.misc.nested_field import parse_nested_field +from loading_pipeline.lib.reference_datasets.misc import vcf_to_ht + +SELECT = { + 'AC': 'info.AC#', + 'AF': 'info.AF#', + 'AN': 'info.AN', + 'Hom': 'info.Hom#', + 'Het': 'info.Het#', +} + + +def get_ht(path: str, reference_genome: ReferenceGenome) -> hl.Table: + ht = vcf_to_ht(path, reference_genome) + if reference_genome == ReferenceGenome.GRCh37: + ht = ht.filter(ht.locus.position == hl.int(ht.info.OriginalStart)) + return ht.select( + **{k: parse_nested_field(ht, v) for k, v in SELECT.items()}, + ) diff --git a/loading_pipeline/lib/tasks/__init__.py b/loading_pipeline/lib/tasks/__init__.py new file mode 100644 index 0000000000..a0e0e47498 --- /dev/null +++ b/loading_pipeline/lib/tasks/__init__.py @@ -0,0 +1,15 @@ +import luigi.util # noqa: F401 + +from loading_pipeline.lib.tasks.reference_data.updated_reference_dataset_parquet import ( + UpdatedReferenceDatasetParquetTask, +) +from loading_pipeline.lib.tasks.run_pipeline import RunPipelineTask +from loading_pipeline.lib.tasks.write_metadata_for_run import WriteMetadataForRunTask +from loading_pipeline.lib.tasks.write_success_file import WriteSuccessFileTask + +__all__ = [ + 'RunPipelineTask', + 'UpdatedReferenceDatasetParquetTask', + 'WriteMetadataForRunTask', + 'WriteSuccessFileTask', +] diff --git a/loading_pipeline/lib/tasks/base/__init__.py b/loading_pipeline/lib/tasks/base/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/tasks/base/base_hail_table.py b/loading_pipeline/lib/tasks/base/base_hail_table.py new file mode 100644 index 0000000000..e069bd35b4 --- /dev/null +++ b/loading_pipeline/lib/tasks/base/base_hail_table.py @@ -0,0 +1,71 @@ +import hail as hl +import luigi + +from loading_pipeline.lib.annotations.liftover import remove_liftover +from loading_pipeline.lib.core import Env +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) +from loading_pipeline.lib.tasks.files import GCSorLocalFolderTarget + +logger = get_logger(__name__) + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class BaseHailTableTask(luigi.Task): + def output(self) -> luigi.Target: + raise NotImplementedError + + def complete(self) -> bool: + logger.info(f'BaseHailTableTask: checking if {self.output().path} exists') + return GCSorLocalFolderTarget(self.output().path).exists() + + def init_hail(self): + # Need to use the GCP bucket as temp storage for very large callset joins + hl.init(tmp_dir=Env.HAIL_TMP_DIR, idempotent=True) + logger.info(f'Initialized hail w/ tmp_dir {Env.HAIL_TMP_DIR}') + + # Interval ref data join causes shuffle death, this prevents it + hl._set_flags(use_new_shuffle='1', no_whole_stage_codegen='1') # noqa: SLF001 + + # Ensure any cached liftover files within Hail are cleared + # to provide a clean context free of hidden state. + # This runs "before" a task to account for situations where + # the Hail write fails and we do not have the chance to + # run this method in the "after". + remove_liftover() + + +# NB: these are defined over luigi.Task instead of the BaseHailTableTask so that +# they work on file dependencies. + + +@luigi.Task.event_handler(luigi.Event.DEPENDENCY_DISCOVERED) +def dependency_discovered(task, dependency): + logger.info(f'{task} dependency_discovered {dependency} at {task.output()}') + + +@luigi.Task.event_handler(luigi.Event.DEPENDENCY_MISSING) +def dependency_missing(task): + logger.info(f'{task} dependency_missing at {task.output()}') + + +@luigi.Task.event_handler(luigi.Event.DEPENDENCY_PRESENT) +def dependency_present(task): + logger.info(f'{task} dependency_present at {task.output()}') + + +@luigi.Task.event_handler(luigi.Event.START) +def start(task): + logger.info(f'{task} start') + + +@luigi.Task.event_handler(luigi.Event.FAILURE) +def failure(task, _): + logger.exception(f'{task} failure') + + +@luigi.Task.event_handler(luigi.Event.SUCCESS) +def success(task): + logger.info(f'{task} success') diff --git a/loading_pipeline/lib/tasks/base/base_loading_pipeline_params.py b/loading_pipeline/lib/tasks/base/base_loading_pipeline_params.py new file mode 100644 index 0000000000..1e9ea4ee93 --- /dev/null +++ b/loading_pipeline/lib/tasks/base/base_loading_pipeline_params.py @@ -0,0 +1,12 @@ +import luigi + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome + + +class BaseLoadingPipelineParams(luigi.Task): + # NB: + # These params are "inherited" with the special + # luigi.util.inherits function, copying params + # but nothing else. + reference_genome = luigi.EnumParameter(enum=ReferenceGenome) + dataset_type = luigi.EnumParameter(enum=DatasetType) diff --git a/loading_pipeline/lib/tasks/base/base_loading_run_params.py b/loading_pipeline/lib/tasks/base/base_loading_run_params.py new file mode 100644 index 0000000000..43158dcc5d --- /dev/null +++ b/loading_pipeline/lib/tasks/base/base_loading_run_params.py @@ -0,0 +1,36 @@ +import luigi + +from loading_pipeline.lib.core import SampleType +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class BaseLoadingRunParams(luigi.Task): + # The difference between the "Loading Run" params + # and the "Loading Pipeline" params: + # - These params are used during standard "runs" + # of the pipeline that add a callset to the backend + # data store. + # - The "Loading Pipeline" params are shared with + # tasks that may remove data from or change the + # structure of the persisted Hail Tables. + run_id = luigi.Parameter() + sample_type = luigi.EnumParameter(enum=SampleType) + callset_path = luigi.Parameter() + project_guids = luigi.ListParameter(default=[]) + skip_check_sex_and_relatedness = luigi.BoolParameter( + default=False, + parsing=luigi.BoolParameter.EXPLICIT_PARSING, + ) + skip_expect_tdr_metrics = luigi.BoolParameter( + default=False, + parsing=luigi.BoolParameter.EXPLICIT_PARSING, + ) + validations_to_skip = luigi.ListParameter(default=[]) + is_new_gcnv_joint_call = luigi.BoolParameter( + default=False, + parsing=luigi.BoolParameter.EXPLICIT_PARSING, + description='Is this a fully joint-called callset.', + ) diff --git a/loading_pipeline/lib/tasks/base/base_update.py b/loading_pipeline/lib/tasks/base/base_update.py new file mode 100644 index 0000000000..1cacf37383 --- /dev/null +++ b/loading_pipeline/lib/tasks/base/base_update.py @@ -0,0 +1,26 @@ +import hail as hl + +from loading_pipeline.lib.misc.io import write +from loading_pipeline.lib.tasks.base.base_hail_table import BaseHailTableTask + + +class BaseUpdateTask(BaseHailTableTask): + def run(self) -> None: + self.init_hail() + if not self.output().exists(): + ht = self.initialize_table() + else: + read_fn = ( + hl.read_matrix_table + if self.output().path.endswith('mt') + else hl.read_table + ) + ht = read_fn(self.output().path) + ht = self.update_table(ht) + write(ht, self.output().path) + + def initialize_table(self) -> hl.Table: + raise NotImplementedError + + def update_table(self, ht: hl.Table) -> hl.Table: + raise NotImplementedError diff --git a/loading_pipeline/lib/tasks/base/base_write.py b/loading_pipeline/lib/tasks/base/base_write.py new file mode 100644 index 0000000000..cc0be97eac --- /dev/null +++ b/loading_pipeline/lib/tasks/base/base_write.py @@ -0,0 +1,14 @@ +import hail as hl + +from loading_pipeline.lib.misc.io import write +from loading_pipeline.lib.tasks.base.base_hail_table import BaseHailTableTask + + +class BaseWriteTask(BaseHailTableTask): + def run(self) -> None: + self.init_hail() + ht = self.create_table() + write(ht, self.output().path) + + def create_table(self) -> hl.Table: + raise NotImplementedError diff --git a/loading_pipeline/lib/tasks/base/base_write_parquet.py b/loading_pipeline/lib/tasks/base/base_write_parquet.py new file mode 100644 index 0000000000..bc1d358e0c --- /dev/null +++ b/loading_pipeline/lib/tasks/base/base_write_parquet.py @@ -0,0 +1,19 @@ +import luigi + +from loading_pipeline.lib.misc.io import checkpoint +from loading_pipeline.lib.tasks.files import GCSorLocalFolderTarget + + +class BaseWriteParquetTask(luigi.Task): + def complete(self) -> luigi.Target: + return GCSorLocalFolderTarget(self.output().path).exists() + + def run(self) -> None: + ht = self.create_table() + ht, _ = checkpoint(ht) + df = ht.to_spark(flatten=False) + df = df.withColumnRenamed('key_', 'key') + df.write.parquet( + self.output().path, + mode='overwrite', + ) diff --git a/loading_pipeline/lib/tasks/dataproc/__init__.py b/loading_pipeline/lib/tasks/dataproc/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/tasks/dataproc/base_run_job_on_dataproc.py b/loading_pipeline/lib/tasks/dataproc/base_run_job_on_dataproc.py new file mode 100644 index 0000000000..01ea67e051 --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/base_run_job_on_dataproc.py @@ -0,0 +1,147 @@ +import re +import time + +import google.api_core.exceptions +import google.cloud.dataproc_v1.types.jobs +import luigi +from google.cloud import dataproc_v1 as dataproc + +from loading_pipeline.lib.core import Env +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) +from loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster import ( + CreateDataprocClusterTask, +) +from loading_pipeline.lib.tasks.dataproc.misc import get_cluster_name, to_kebab_str_args + +FAILURE_STATUSES = { + google.cloud.dataproc_v1.types.jobs.JobStatus.State.CANCELLED, + google.cloud.dataproc_v1.types.jobs.JobStatus.State.ERROR, + google.cloud.dataproc_v1.types.jobs.JobStatus.State.ATTEMPT_FAILURE, +} +SEQR_PIPELINE_RUNNER_BUILD = f'gs://seqr-pipeline-runner-builds/{Env.DEPLOYMENT_TYPE}/{Env.PIPELINE_RUNNER_APP_VERSION}' +TIMEOUT_S = 172800 # 2 days + +logger = get_logger(__name__) + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class BaseRunJobOnDataprocTask(luigi.Task): + run_id = luigi.Parameter() + attempt_id = luigi.IntParameter() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.client = dataproc.JobControllerClient( + client_options={ + 'api_endpoint': f'{Env.GCLOUD_REGION}-dataproc.googleapis.com:443', + }, + ) + + @property + def task(self): + raise NotImplementedError + + @property + def job_id(self): + return f'{self.task.task_family}-{self.reference_genome[-2:]}-{re.sub("_", "-", self.dataset_type.value)}-{self.run_id}-{self.attempt_id}' + + def requires(self) -> [luigi.Task]: + return [self.clone(CreateDataprocClusterTask)] + + def safely_get_job( + self, + ): + try: + job = self.client.get_job( + request={ + 'project_id': Env.GCLOUD_PROJECT, + 'region': Env.GCLOUD_REGION, + 'job_id': self.job_id, + }, + ) + except google.api_core.exceptions.NotFound: + return None + else: + return job + + def complete(self) -> bool: + job = self.safely_get_job() + if not job: + return False + if job.status.state in FAILURE_STATUSES: + msg = f'Job {self.job_id} entered {job.status.state.name} state' + logger.error(msg) + logger.error(job.status.details) + return ( + job.status.state == google.cloud.dataproc_v1.types.jobs.JobStatus.State.DONE + ) + + def run(self): + job = self.safely_get_job() + # Delete the job if it exists and was failed. This handles manual re-runs of the + # same run_id. + if job and job.status.state in FAILURE_STATUSES: + logger.error( + f'Previous job {self.job_id} failed with state {job.status.state.name}', + ) + logger.error(job.status.details) + self.client.delete_job( + request={ + 'project_id': Env.GCLOUD_PROJECT, + 'region': Env.GCLOUD_REGION, + 'job_id': self.job_id, + }, + ) + job = None + + if not job: + self.client.submit_job_as_operation( + request={ + 'project_id': Env.GCLOUD_PROJECT, + 'region': Env.GCLOUD_REGION, + 'job': { + 'reference': { + 'job_id': self.job_id, + }, + 'placement': { + 'cluster_name': get_cluster_name( + self.reference_genome, + self.run_id, + ), + }, + 'pyspark_job': { + 'main_python_file_uri': f'{SEQR_PIPELINE_RUNNER_BUILD}/bin/run_task.py', + 'args': [ + self.task.task_family, + '--local-scheduler', + *to_kebab_str_args(self), + ], + 'python_file_uris': [ + f'{SEQR_PIPELINE_RUNNER_BUILD}/pyscripts.zip', + ], + }, + }, + }, + ) + wait_s = 0 + while wait_s < TIMEOUT_S: + job = self.safely_get_job() + if ( + job.status.state + == google.cloud.dataproc_v1.types.jobs.JobStatus.State.DONE + ): + msg = f'Job {self.job_id} is complete' + logger.info(msg) + break + if job.status.state in FAILURE_STATUSES: + msg = f'Job {self.job_id} entered {job.status.state.name} state' + logger.error(msg) + raise RuntimeError(msg) + logger.info( + f'Waiting for Job completion {self.job_id}', + ) + time.sleep(3) + wait_s += 3 diff --git a/loading_pipeline/lib/tasks/dataproc/create_dataproc_cluster.py b/loading_pipeline/lib/tasks/dataproc/create_dataproc_cluster.py new file mode 100644 index 0000000000..33785a8d1e --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/create_dataproc_cluster.py @@ -0,0 +1,229 @@ +import time + +import google.api_core.exceptions +import google.cloud.dataproc_v1.types.clusters +import hail as hl +import luigi +from google.cloud import dataproc_v1 as dataproc +from pip._internal.operations import freeze as pip_freeze + +from loading_pipeline.lib.core import DatasetType, Env, FeatureFlag, ReferenceGenome +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.gcp import get_service_account_credentials +from loading_pipeline.lib.misc.retry import retry +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) +from loading_pipeline.lib.tasks.dataproc.misc import get_cluster_name + +DEBIAN_IMAGE = '2.3.17-debian12' +DISK_SIZE_GB = 600 +DISK_TYPE = 'hyperdisk-balanced' +HAIL_VERSION = hl.version().split('-')[0] +INSTANCE_TYPE = 'n4-highmem-8' +PKGS = '|'.join( + [ + x.replace('gnomad_qc @ ', '').replace('onnxconverter-common @ ', '') + for x in pip_freeze.freeze() + if 'hail @' not in x + ], +) +TIMEOUT_S = 1200 +FAILURE_STATUSES = { + google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.UNKNOWN, + google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.ERROR, + google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.ERROR_DUE_TO_UPDATE, +} + +logger = get_logger(__name__) + + +def get_cluster_config( + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + run_id: str, +): + service_account_credentials = get_service_account_credentials() + return { + 'project_id': Env.GCLOUD_PROJECT, + 'cluster_name': get_cluster_name(reference_genome, run_id), + # Schema found at https://cloud.google.com/dataproc/docs/reference/rest/v1/ClusterConfig + 'config': { + 'gce_cluster_config': { + 'metadata': { + 'WHEEL': f'gs://hail-common/hailctl/dataproc/{HAIL_VERSION}/hail-{HAIL_VERSION}-py3-none-any.whl', + 'PKGS': PKGS, + 'DEPLOYMENT_TYPE': Env.DEPLOYMENT_TYPE, + 'REFERENCE_GENOME': reference_genome.value, + 'PIPELINE_RUNNER_APP_VERSION': Env.PIPELINE_RUNNER_APP_VERSION, + 'REFERENCE_DATASETS_DIR': Env.REFERENCE_DATASETS_DIR, + }, + 'internal_ip_only': False, # Recent change with 2.2 dataproc images. + 'service_account': service_account_credentials.service_account_email, + 'service_account_scopes': service_account_credentials.scopes, + }, + 'master_config': { + 'num_instances': 1, + 'machine_type_uri': INSTANCE_TYPE, + 'disk_config': { + 'boot_disk_type': DISK_TYPE, + 'boot_disk_size_gb': DISK_SIZE_GB, + }, + }, + 'worker_config': { + 'num_instances': dataset_type.dataproc_primary_workers, + 'machine_type_uri': INSTANCE_TYPE, + 'disk_config': { + 'boot_disk_type': DISK_TYPE, + 'boot_disk_size_gb': DISK_SIZE_GB, + }, + }, + 'secondary_worker_config': { + 'num_instances': dataset_type.dataproc_preemptibles, + 'machine_type_uri': INSTANCE_TYPE, + 'disk_config': { + 'boot_disk_type': DISK_TYPE, + 'boot_disk_size_gb': DISK_SIZE_GB, + }, + 'is_preemptible': True, + 'preemptibility': 'PREEMPTIBLE', + }, + 'software_config': { + 'image_version': DEBIAN_IMAGE, + 'properties': { + 'spark:spark.driver.maxResultSize': '0', + 'spark:spark.task.maxFailures': '20', + 'spark:spark.kryoserializer.buffer.max': '2g', + 'spark:spark.driver.extraJavaOptions': '-Xss16M', + 'spark:spark.executor.extraJavaOptions': '-Xss16M', + 'hdfs:dfs.replication': '1', + 'dataproc:dataproc.logging.stackdriver.enable': 'false', + 'dataproc:dataproc.monitoring.stackdriver.enable': 'false', + 'spark:spark.driver.memory': '41g', + 'yarn:yarn.nodemanager.resource.memory-mb': '50585', + 'yarn:yarn.scheduler.maximum-allocation-mb': '25292', + 'spark:spark.executor.cores': '4', + 'spark:spark.executor.memory': '10117m', + 'spark:spark.executor.memoryOverhead': '15175m', + 'spark:spark.memory.storageFraction': '0.2', + 'spark:spark.executorEnv.HAIL_WORKER_OFF_HEAP_MEMORY_PER_CORE_MB': '6323', + 'spark:spark.speculation': 'true', + 'spark-env:CHECK_SEX_AND_RELATEDNESS': '1' + if FeatureFlag.CHECK_SEX_AND_RELATEDNESS + else '0', + 'spark-env:EXPECT_TDR_METRICS': '1' + if FeatureFlag.EXPECT_TDR_METRICS + else '0', + 'spark-env:PIPELINE_DATA_DIR': Env.PIPELINE_DATA_DIR, + 'spark-env:HAIL_TMP_DIR': Env.HAIL_TMP_DIR, + 'spark-env:LOADING_DATASETS_DIR': Env.LOADING_DATASETS_DIR, + 'spark-env:REFERENCE_DATASETS_DIR': Env.REFERENCE_DATASETS_DIR, + 'spark-env:SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS': ','.join( + Env.SAMPLE_TYPE_VALIDATION_EXCLUDED_PROJECTS, + ), + }, + }, + 'lifecycle_config': {'idle_delete_ttl': {'seconds': 1200}}, + 'encryption_config': {}, + 'autoscaling_config': {}, + 'endpoint_config': {}, + 'initialization_actions': [ + { + # NB: this script initializes the python env. + 'executable_file': f'gs://hail-common/hailctl/dataproc/{HAIL_VERSION}/init_notebook.py', + 'execution_timeout': {'seconds': 1200}, + }, + { + 'executable_file': f'gs://seqr-pipeline-runner-builds/{Env.DEPLOYMENT_TYPE}/{Env.PIPELINE_RUNNER_APP_VERSION}/bin/dataproc_vep_init.bash', + 'execution_timeout': {'seconds': 1200}, + }, + ], + }, + } + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class CreateDataprocClusterTask(luigi.Task): + # NB: The luigi.dataproc.contrib module was old and bad + # so we built our own shim. + run_id = luigi.Parameter() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # https://cloud.google.com/dataproc/docs/tutorials/python-library-example + self.client = dataproc.ClusterControllerClient( + client_options={ + 'api_endpoint': f'{Env.GCLOUD_REGION}-dataproc.googleapis.com:443', + }, + ) + + def safely_get_cluster( + self, + ): + try: + cluster = self.client.get_cluster( + request={ + 'project_id': Env.GCLOUD_PROJECT, + 'region': Env.GCLOUD_REGION, + 'cluster_name': get_cluster_name( + self.reference_genome, + self.run_id, + ), + }, + ) + except google.api_core.exceptions.NotFound: + return None + else: + return cluster + + def complete(self) -> bool: + cluster = self.safely_get_cluster() + if not cluster: + return False + if cluster.status.state in FAILURE_STATUSES: + msg = f'Cluster {cluster.cluster_name} entered {cluster.status.state.name} state' + logger.error(msg) + # This will return False when the cluster is "CREATING" + return ( + cluster.status.state + == google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.RUNNING + ) + + def run(self): + if not Env.GCLOUD_PROJECT or not Env.GCLOUD_REGION: + msg = 'Environment Variables GCLOUD_PROJECT and GCLOUD_REGION are required for running the pipeline on dataproc.' + raise RuntimeError(msg) + self.get_running_cluster() + + @retry(tries=5, backoff=1) + def get_running_cluster(self): + cluster = self.safely_get_cluster() + if not cluster: + self.client.create_cluster( + request={ + 'project_id': Env.GCLOUD_PROJECT, + 'region': Env.GCLOUD_REGION, + 'cluster': get_cluster_config( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + }, + ) + wait_s = 0 + while wait_s < TIMEOUT_S: + cluster = self.safely_get_cluster() + if ( + cluster.status.state + == google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.RUNNING + ): + msg = f'Created cluster {cluster.cluster_name} with cluster uuid: {cluster.cluster_uuid}' + logger.info(msg) + break + if cluster.status.state in FAILURE_STATUSES: + msg = f'Cluster {cluster.cluster_name} entered {cluster.status.state.name} state' + logger.error(msg) + raise RuntimeError(msg) + logger.info('Waiting for cluster spinup') + time.sleep(3) + wait_s += 3 diff --git a/loading_pipeline/lib/tasks/dataproc/create_dataproc_cluster_test.py b/loading_pipeline/lib/tasks/dataproc/create_dataproc_cluster_test.py new file mode 100644 index 0000000000..54654aa933 --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/create_dataproc_cluster_test.py @@ -0,0 +1,163 @@ +import unittest +from types import SimpleNamespace +from unittest.mock import Mock, call, patch + +import google.api_core.exceptions +import google.cloud.dataproc_v1.types.clusters +import luigi + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.misc.gcp import SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE +from loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster import ( + CreateDataprocClusterTask, +) + + +@patch.multiple( + 'loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster.Env', + GCLOUD_PROJECT='proj', + GCLOUD_REGION='us-a', +) +@patch( + 'loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster.get_service_account_credentials', + return_value=SimpleNamespace( + service_account_email='test@serviceaccount.com', + scopes=SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE, + ), +) +@patch('time.sleep') +@patch( + 'loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster.dataproc.ClusterControllerClient', +) +class CreateDataprocClusterTaskTest(unittest.TestCase): + def test_spinup_cluster_already_exists_failed( + self, + mock_cluster_controller: Mock, + *_: Mock, + ) -> None: + mock_client = mock_cluster_controller.return_value + mock_client.get_cluster.return_value = SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.ERROR, + ), + cluster_name='abc', + ) + mock_client.create_cluster.side_effect = ( + google.api_core.exceptions.AlreadyExists('cluster exists') + ) + worker = luigi.worker.Worker() + task = CreateDataprocClusterTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id='2', + ) + worker.add(task) + worker.run() + self.assertFalse(task.complete()) + + def test_spinup_cluster_already_exists_success( + self, + mock_cluster_controller: Mock, + *_: Mock, + ) -> None: + mock_client = mock_cluster_controller.return_value + mock_client.get_cluster.return_value = SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.RUNNING, + ), + ) + mock_client.create_cluster.side_effect = ( + google.api_core.exceptions.AlreadyExists('cluster exists') + ) + worker = luigi.worker.Worker() + task = CreateDataprocClusterTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id='3', + ) + worker.add(task) + worker.run() + self.assertTrue(task.complete()) + + @patch('loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster.logger') + def test_spinup_cluster_doesnt_exist_failed( + self, + mock_logger: Mock, + mock_cluster_controller: Mock, + *_: Mock, + ) -> None: + mock_client = mock_cluster_controller.return_value + mock_client.get_cluster.side_effect = [ + google.api_core.exceptions.NotFound( + 'cluster not found', + ), + google.api_core.exceptions.NotFound( + 'cluster not found', + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.CREATING, + ), + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.ERROR, + ), + cluster_name='dataproc-cluster-5', + cluster_uuid='12345', + ), + ] + worker = luigi.worker.Worker() + task = CreateDataprocClusterTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id='4', + ) + worker.add(task) + luigi_task_result = worker.run() + self.assertEqual(luigi_task_result, False) + mock_logger.info.assert_has_calls([call('Waiting for cluster spinup')]) + + @patch('loading_pipeline.lib.tasks.dataproc.create_dataproc_cluster.logger') + def test_spinup_cluster_doesnt_exist_success( + self, + mock_logger: Mock, + mock_cluster_controller: Mock, + *_: Mock, + ) -> None: + mock_client = mock_cluster_controller.return_value + mock_client.get_cluster.side_effect = [ + google.api_core.exceptions.NotFound( + 'cluster not found', + ), + google.api_core.exceptions.NotFound( + 'cluster not found', + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.CREATING, + ), + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.clusters.ClusterStatus.State.RUNNING, + ), + cluster_name='dataproc-cluster-5', + cluster_uuid='12345', + ), + ] + mock_client.create_cluster.side_effect = None + worker = luigi.worker.Worker() + task = CreateDataprocClusterTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id='5', + ) + worker.add(task) + worker.run() + mock_logger.info.assert_has_calls( + [ + call('Waiting for cluster spinup'), + call('Created cluster dataproc-cluster-5 with cluster uuid: 12345'), + ], + ) diff --git a/loading_pipeline/lib/tasks/dataproc/misc.py b/loading_pipeline/lib/tasks/dataproc/misc.py new file mode 100644 index 0000000000..e35935ac17 --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/misc.py @@ -0,0 +1,21 @@ +import re + +import luigi + +from loading_pipeline.lib.core import Env, ReferenceGenome + +CLUSTER_NAME_PREFIX = 'pipeline-runner' + + +def get_cluster_name(reference_genome: ReferenceGenome, run_id: str): + return f'{Env.DEPLOYMENT_TYPE}-{CLUSTER_NAME_PREFIX}-{reference_genome.value.lower()}-{run_id}' + + +def snake_to_kebab_arg(snake_string: str) -> str: + return '--' + re.sub(r'\_', '-', snake_string).lower() + + +def to_kebab_str_args(task: luigi.Task): + return [ + e for k, v in task.to_str_params().items() for e in (snake_to_kebab_arg(k), v) + ] diff --git a/loading_pipeline/lib/tasks/dataproc/misc_test.py b/loading_pipeline/lib/tasks/dataproc/misc_test.py new file mode 100644 index 0000000000..b9c049005a --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/misc_test.py @@ -0,0 +1,51 @@ +import unittest +from unittest.mock import Mock, patch + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.tasks.dataproc.misc import to_kebab_str_args +from loading_pipeline.lib.tasks.dataproc.run_pipeline_on_dataproc import ( + RunPipelineOnDataprocTask, +) + + +@patch( + 'loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc.dataproc.JobControllerClient', +) +class MiscTest(unittest.TestCase): + def test_to_kebab_str_args(self, _: Mock): + t = RunPipelineOnDataprocTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='test_callset', + project_guids=['R0113_test_project'], + run_id='a_misc_run', + attempt_id=0, + ) + self.assertListEqual( + to_kebab_str_args(t), + [ + '--reference-genome', + 'GRCh38', + '--dataset-type', + 'SNV_INDEL', + '--run-id', + 'a_misc_run', + '--attempt-id', + '0', + '--sample-type', + 'WGS', + '--callset-path', + 'test_callset', + '--project-guids', + '["R0113_test_project"]', + '--skip-check-sex-and-relatedness', + 'False', + '--skip-expect-tdr-metrics', + 'False', + '--validations-to-skip', + '[]', + '--is-new-gcnv-joint-call', + 'False', + ], + ) diff --git a/loading_pipeline/lib/tasks/dataproc/run_pipeline_on_dataproc.py b/loading_pipeline/lib/tasks/dataproc/run_pipeline_on_dataproc.py new file mode 100644 index 0000000000..c05730c216 --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/run_pipeline_on_dataproc.py @@ -0,0 +1,16 @@ +import luigi + +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc import ( + BaseRunJobOnDataprocTask, +) +from loading_pipeline.lib.tasks.run_pipeline import RunPipelineTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class RunPipelineOnDataprocTask(BaseRunJobOnDataprocTask): + @property + def task(self) -> luigi.Task: + return RunPipelineTask diff --git a/loading_pipeline/lib/tasks/dataproc/run_pipeline_on_dataproc_test.py b/loading_pipeline/lib/tasks/dataproc/run_pipeline_on_dataproc_test.py new file mode 100644 index 0000000000..a09289a85a --- /dev/null +++ b/loading_pipeline/lib/tasks/dataproc/run_pipeline_on_dataproc_test.py @@ -0,0 +1,184 @@ +import unittest +from types import SimpleNamespace +from unittest.mock import Mock, call, patch + +import google.api_core.exceptions +import google.cloud.dataproc_v1.types.jobs +import luigi + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.tasks.dataproc.run_pipeline_on_dataproc import ( + RunPipelineOnDataprocTask, +) +from loading_pipeline.lib.test.mock_complete_task import MockCompleteTask + + +@patch( + 'loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc.CreateDataprocClusterTask', +) +@patch( + 'loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc.dataproc.JobControllerClient', +) +class WriteSuccessFileOnDataprocTaskTest(unittest.TestCase): + @patch('loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc.logger') + def test_job_already_exists_failed( + self, + mock_logger: Mock, + mock_job_controller_client: Mock, + mock_create_dataproc_cluster: Mock, + ) -> None: + mock_create_dataproc_cluster.return_value = MockCompleteTask() + mock_client = mock_job_controller_client.return_value + mock_client.get_job.return_value = SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.jobs.JobStatus.State.ERROR, + details='Google Cloud Dataproc Agent reports job failure. If logs are available, they can be found at...', + ), + ) + mock_client.submit_job_as_operation.side_effect = ( + google.api_core.exceptions.AlreadyExists('job exists') + ) + worker = luigi.worker.Worker() + task = RunPipelineOnDataprocTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='test_callset', + project_guids=['R0113_test_project'], + run_id='manual__2024-04-03', + attempt_id=0, + ) + worker.add(task) + worker.run() + self.assertFalse(task.complete()) + mock_logger.error.assert_has_calls( + [ + call( + 'Job RunPipelineTask-38-SNV-INDEL-manual__2024-04-03-0 entered ERROR state', + ), + ], + ) + + def test_job_already_exists_success( + self, + mock_job_controller_client: Mock, + mock_create_dataproc_cluster: Mock, + ) -> None: + mock_create_dataproc_cluster.return_value = MockCompleteTask() + mock_client = mock_job_controller_client.return_value + mock_client.get_job.return_value = SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.jobs.JobStatus.State.DONE, + ), + ) + worker = luigi.worker.Worker() + task = RunPipelineOnDataprocTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='test_callset', + project_guids=['R0113_test_project'], + run_id='manual__2024-04-04', + attempt_id=0, + ) + worker.add(task) + worker.run() + self.assertTrue(task.complete()) + + @patch('loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc.logger') + def test_job_failed( + self, + mock_logger: Mock, + mock_job_controller_client: Mock, + mock_create_dataproc_cluster: Mock, + ) -> None: + mock_create_dataproc_cluster.return_value = MockCompleteTask() + mock_client = mock_job_controller_client.return_value + mock_client.get_job.side_effect = [ + google.api_core.exceptions.NotFound( + 'job not found', + ), + google.api_core.exceptions.NotFound( + 'job not found', + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.jobs.JobStatus.State.PENDING, + ), + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.jobs.JobStatus.State.ERROR, + ), + ), + ] + worker = luigi.worker.Worker() + task = RunPipelineOnDataprocTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='test_callset', + project_guids=['R0113_test_project'], + run_id='manual__2024-04-05', + attempt_id=1, + ) + worker.add(task) + luigi_task_result = worker.run() + self.assertEqual(luigi_task_result, False) + mock_logger.info.assert_has_calls( + [ + call( + 'Waiting for Job completion RunPipelineTask-38-SNV-INDEL-manual__2024-04-05-1', + ), + ], + ) + + @patch('loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc.logger') + def test_job_success( + self, + mock_logger: Mock, + mock_job_controller_client: Mock, + mock_create_dataproc_cluster: Mock, + ) -> None: + mock_create_dataproc_cluster.return_value = MockCompleteTask() + mock_client = mock_job_controller_client.return_value + mock_client.get_job.side_effect = [ + google.api_core.exceptions.NotFound( + 'job not found', + ), + google.api_core.exceptions.NotFound( + 'job not found', + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.jobs.JobStatus.State.PENDING, + ), + ), + SimpleNamespace( + status=SimpleNamespace( + state=google.cloud.dataproc_v1.types.jobs.JobStatus.State.DONE, + ), + ), + ] + worker = luigi.worker.Worker() + task = RunPipelineOnDataprocTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='test_callset', + project_guids=['R0113_test_project'], + run_id='manual__2024-04-06', + attempt_id=0, + ) + worker.add(task) + worker.run() + mock_logger.info.assert_has_calls( + [ + call( + 'Waiting for Job completion RunPipelineTask-38-SNV-INDEL-manual__2024-04-06-0', + ), + call( + 'Job RunPipelineTask-38-SNV-INDEL-manual__2024-04-06-0 is complete', + ), + ], + ) diff --git a/loading_pipeline/lib/tasks/exports/__init__.py b/loading_pipeline/lib/tasks/exports/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/tasks/exports/fields.py b/loading_pipeline/lib/tasks/exports/fields.py new file mode 100644 index 0000000000..a29ba5b95c --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/fields.py @@ -0,0 +1,345 @@ +import hail as hl + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.tasks.exports.misc import ( + reformat_transcripts_for_export, + snake_to_camelcase, +) + +STANDARD_CONTIGS = hl.set( + [c.replace('MT', 'M') for c in ReferenceGenome.GRCh37.standard_contigs], +) + + +def reference_independent_contig(locus: hl.LocusExpression): + contig = locus.contig.replace('^chr', '').replace('MT', 'M') + return hl.or_missing( + # lifted over alternate contigs may be present + # even though the primary contig is filtered to + # standard contigs earlier in the pipeline + STANDARD_CONTIGS.contains(contig), + contig, + ) + + +def get_dataset_type_specific_variants_annotations( + ht: hl.Table, + dataset_type: DatasetType, +): + return { + DatasetType.MITO: lambda ht: { + 'commonLowHeteroplasmy': ht.common_low_heteroplasmy, + 'haplogroupDefining': ht.haplogroup.is_defining, + 'mitotip': ht.mitotip.trna_prediction, + }, + DatasetType.SV: lambda ht: { + 'algorithms': ht.algorithms, + 'bothsidesSupport': ht.bothsides_support, + 'cpxIntervals': ht.cpxIntervals.map( + lambda cpx_i: hl.Struct( + chrom=reference_independent_contig(cpx_i.start), + start=cpx_i.start.position, + end=cpx_i.end.position, + type=cpx_i.type, + ), + ), + 'endChrom': hl.or_missing( + ( + (ht.sv_type != 'INS') + & (ht.start_locus.contig != ht.end_locus.contig) + ), + reference_independent_contig(ht.end_locus), + ), + 'svSourceDetail': hl.or_missing( + ( + (ht.sv_type == 'INS') + & (ht.start_locus.contig != ht.end_locus.contig) + ), + hl.Struct(chrom=reference_independent_contig(ht.end_locus)), + ), + 'svType': ht.sv_type, + 'svTypeDetail': ht.sv_type_detail, + 'predictions': hl.Struct( + strvctvre=ht.strvctvre.score, + ), + 'populations': hl.Struct( + gnomad_svs=hl.Struct( + af=ht.gnomad_svs.AF, + het=ht.gnomad_svs.N_HET, + hom=ht.gnomad_svs.N_HOM, + id=ht.gnomad_svs.ID, + ), + ), + }, + DatasetType.GCNV: lambda ht: { + 'numExon': ht.num_exon, + 'svType': ht.sv_type, + 'predictions': hl.Struct( + strvctvre=ht.strvctvre.score, + ), + 'populations': hl.Struct( + sv_callset=hl.Struct( + ac=ht.gt_stats.AC, + af=ht.gt_stats.AF, + an=ht.gt_stats.AN, + het=ht.gt_stats.Het, + hom=ht.gt_stats.Hom, + ), + ), + }, + }[dataset_type](ht) + + +def get_existing_variants_export_field(dataset_type: DatasetType) -> str: + dt_fields = { + DatasetType.SNV_INDEL: ', transcripts.geneId AS geneIds', + DatasetType.MITO: '', + DatasetType.SV: ', CAST(xpos AS Int64) AS xpos, end, endChrom, sortedGeneConsequences.geneId AS geneIds', + DatasetType.GCNV: ', CAST(xpos AS Int64) AS xpos, pos AS start, end, numExon as num_exon, sortedGeneConsequences.geneId AS gene_ids', + }[dataset_type] + return f'key AS key_, variantId AS variant_id {dt_fields}' + + +def get_entries_call_annotations_fields( + dataset_type: DatasetType, +): + if dataset_type == DatasetType.GCNV: + return { + 'start': lambda ht: hl.int64(ht.start_locus.position), + 'end': lambda ht: hl.int64(ht.end_locus.position), + 'num_exon': lambda ht: ht.num_exon, + 'gene_ids': lambda ht: hl.set(ht.sorted_gene_consequences.gene_id), + } + return {} + + +def _get_calls_export_fields( + ht: hl.Table, + fe: hl.Struct, + dataset_type: DatasetType, +): + return { + DatasetType.SNV_INDEL: lambda fe: hl.Struct( + sampleId=fe.s, + gt=fe.GT.n_alt_alleles(), + gq=fe.GQ, + ab=fe.AB, + dp=fe.DP, + ), + DatasetType.MITO: lambda fe: hl.Struct( + sampleId=fe.s, + gt=fe.GT.n_alt_alleles(), + dp=fe.DP, + hl=fe.HL, + mitoCn=fe.mito_cn, + contamination=fe.contamination, + ), + DatasetType.SV: lambda fe: hl.Struct( + sampleId=fe.s, + gt=fe.GT.n_alt_alleles(), + cn=fe.CN, + gq=fe.GQ, + newCall=fe.concordance.new_call, + prevCall=fe.concordance.prev_call, + prevNumAlt=fe.concordance.prev_num_alt, + ), + DatasetType.GCNV: lambda fe: hl.Struct( + sampleId=fe.s, + gt=fe.GT.n_alt_alleles(), + cn=fe.CN, + qs=fe.QS, + defragged=fe.defragged, + **{ + snake_to_camelcase(field): hl.or_else( + getattr(fe, f'sample_{field}'), + getattr(ht, field), + ) + for field in get_entries_call_annotations_fields(dataset_type) + }, + newCall=fe.concordance.new_call, + prevCall=fe.concordance.prev_call, + prevOverlap=fe.concordance.prev_overlap, + ), + }[dataset_type](fe) + + +def get_entries_annotations_export_fields(dataset_type: DatasetType): + fields = { + 'key_': lambda ht: ht.key_, + 'xpos': lambda ht: hl.int64(ht.xpos), + } + if dataset_type in {DatasetType.SV, DatasetType.SNV_INDEL}: + fields['geneIds'] = lambda ht: ( + hl.set(ht.sorted_gene_consequences.gene_id) + if dataset_type == DatasetType.SV + else hl.set(ht.sorted_transcript_consequences.gene_id) + ) + return fields + + +def get_entries_export_fields( + ht: hl.Table, + dataset_type: DatasetType, + sample_type: SampleType, +): + return { + 'project_guid': ht.family_entries.project_guid[0], + 'family_guid': ht.family_entries.family_guid[0], + **{ + field: getattr(ht, field) + for field in get_entries_annotations_export_fields(dataset_type) + }, + **( + { + 'sample_type': sample_type.value, + } + if dataset_type in {DatasetType.SNV_INDEL, DatasetType.MITO} + else {} + ), + 'filters': ht.filters, + 'calls': hl.sorted(ht.family_entries, key=lambda fe: fe.s).map( + lambda fe: _get_calls_export_fields(ht, fe, dataset_type), + ), + 'sign': 1, + } + + +def get_variant_id_fields( + ht: hl.Table, + dataset_type: DatasetType, +): + return { + DatasetType.SNV_INDEL: lambda ht: { + 'variantId': ht.variant_id, + 'rsid': ht.rsid, + 'CAID': hl.missing(hl.tstr), + }, + DatasetType.MITO: lambda ht: { + 'variantId': ht.variant_id, + 'rsid': ht.rsid, + }, + DatasetType.SV: lambda ht: { + 'variantId': ht.variant_id, + }, + DatasetType.GCNV: lambda ht: { + 'variantId': ht.variant_id, + }, + }[dataset_type](ht) + + +def get_lifted_over_position_fields(ht: hl.Table, dataset_type: DatasetType): + if dataset_type == DatasetType.MITO: + return {'liftedOverPos': ht.rg37_locus.position} + return { + 'liftedOverChrom': ( + reference_independent_contig(ht.rg37_locus) + if hasattr(ht, 'rg37_locus') + else reference_independent_contig(ht.rg38_locus) + ), + 'liftedOverPos': ( + hl.or_missing( + hl.is_defined(reference_independent_contig(ht.rg37_locus)), + ht.rg37_locus.position, + ) + if hasattr(ht, 'rg37_locus') + else ht.rg38_locus.position + ), + } + + +def get_consequences_fields( + ht: hl.Table, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +): + return { + DatasetType.SNV_INDEL: lambda ht: { + **( + { + 'sortedMotifFeatureConsequences': ht.sortedMotifFeatureConsequences, + 'sortedRegulatoryFeatureConsequences': ht.sortedRegulatoryFeatureConsequences, + } + if reference_genome == ReferenceGenome.GRCh38 + else {} + ), + 'sortedTranscriptConsequences': ht.sortedTranscriptConsequences, + }, + DatasetType.MITO: lambda ht: { + # MITO transcripts are not exported to their own table, + # but the structure should be preserved here. + 'sortedTranscriptConsequences': hl.enumerate( + ht.sortedTranscriptConsequences, + ).starmap(reformat_transcripts_for_export), + }, + DatasetType.SV: lambda ht: { + 'sortedGeneConsequences': ht.sortedGeneConsequences, + }, + DatasetType.GCNV: lambda ht: { + 'sortedGeneConsequences': ht.sortedGeneConsequences, + }, + }[dataset_type](ht) + + +def get_variants_export_fields( + ht: hl.Table, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +): + if dataset_type in {DatasetType.SV, DatasetType.GCNV}: + rg37_contig = reference_independent_contig(ht.rg37_locus_end) + position_fields = { + 'chrom': reference_independent_contig(ht.start_locus), + 'pos': ht.start_locus.position, + 'end': ht.end_locus.position, + 'rg37LocusEnd': hl.Struct( + contig=rg37_contig, + position=hl.or_missing( + hl.is_defined(rg37_contig), + ht.rg37_locus_end.position, + ), + ), + } + return { + 'key_': ht.key_, + 'xpos': ht.xpos, + **position_fields, + **get_variant_id_fields(ht, dataset_type), + **get_lifted_over_position_fields(ht, dataset_type), + **get_dataset_type_specific_variants_annotations(ht, dataset_type), + **get_consequences_fields(ht, reference_genome, dataset_type), + } + if dataset_type == DatasetType.MITO: + return { + 'key_': ht.key_, + **get_variant_id_fields(ht, dataset_type), + **get_lifted_over_position_fields(ht, dataset_type), + **get_dataset_type_specific_variants_annotations(ht, dataset_type), + **get_consequences_fields(ht, reference_genome, dataset_type), + } + return { + 'key_': ht.key_, + **get_consequences_fields(ht, reference_genome, dataset_type), + } + + +def get_variant_details_export_fields( + ht: hl.Table, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +): + return { + 'key_': ht.key_, + **get_variant_id_fields(ht, dataset_type), + **get_lifted_over_position_fields(ht, dataset_type), + **( + { + 'sortedMotifFeatureConsequences': ht.sortedMotifFeatureConsequences, + 'sortedRegulatoryFeatureConsequences': ht.sortedRegulatoryFeatureConsequences, + } + if reference_genome == ReferenceGenome.GRCh38 + else {} + ), + 'transcripts': hl.enumerate( + ht.sortedTranscriptConsequences, + ).starmap(reformat_transcripts_for_export), + } diff --git a/loading_pipeline/lib/tasks/exports/misc.py b/loading_pipeline/lib/tasks/exports/misc.py new file mode 100644 index 0000000000..f54963b68a --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/misc.py @@ -0,0 +1,145 @@ +from collections import OrderedDict + +import hail as hl + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome +from loading_pipeline.lib.misc.nested_field import parse_nested_field + + +def snake_to_camelcase(snake_string: str): + components = snake_string.split('_') + return components[0] + ''.join(x.title() for x in components[1:]) + + +def camelcase_hl_struct(s: hl.StructExpression) -> hl.StructExpression: + return s.rename({f: snake_to_camelcase(f) for f in s}) + + +def sorted_hl_struct(s: hl.StructExpression) -> hl.StructExpression: + if not isinstance(s, hl.StructExpression): + return s + return s.select(**{k: sorted_hl_struct(s[k]) for k in sorted(s)}) + + +def array_structexpression_fields(ht: hl.Table): + return [ + field + for field in ht.row + if isinstance( + ht[field], + hl.expr.expressions.typed_expressions.ArrayStructExpression, + ) + ] + + +def reformat_transcripts_for_export(i: int, s: hl.StructExpression): + formatted_s = ( + s.annotate( + majorConsequence=s.consequenceTerms.first(), + transcriptRank=i, + ) + if hasattr(s, 'loftee') + else s.annotate( + loftee=hl.Struct( + isLofNagnag=s.isLofNagnag, + lofFilters=s.lofFilters, + ), + majorConsequence=s.consequenceTerms.first(), + transcriptRank=i, + ).drop('isLofNagnag', 'lofFilters') + ) + return sorted_hl_struct(formatted_s) + + +def export_parquet_filterable_transcripts_fields( + reference_genome: ReferenceGenome, +) -> OrderedDict[str, str]: + fields = { + k: k + for k in [ + 'canonical', + 'consequenceTerms', + 'geneId', + ] + } + if reference_genome == ReferenceGenome.GRCh38: + fields = { + **fields, + 'alphamissensePathogenicity': 'alphamissense.pathogenicity', + 'extendedIntronicSpliceRegionVariant': 'spliceregion.extended_intronic_splice_region_variant', + 'fiveutrConsequence': 'utrannotator.fiveutrConsequence', + 'isManeSelect': 'isManeSelect', + } + # Parquet export expects all fields sorted alphabetically + return OrderedDict(sorted(fields.items())) + + +def subset_consequences_fields( + ht: hl.Table, + reference_genome: ReferenceGenome, +) -> hl.Table: + if reference_genome == ReferenceGenome.GRCh38: + ht = ht.annotate( + sortedMotifFeatureConsequences=ht.sortedMotifFeatureConsequences.map( + lambda e: e.select( + 'consequenceTerms', + ), + ), + sortedRegulatoryFeatureConsequences=ht.sortedRegulatoryFeatureConsequences.map( + lambda e: e.select( + 'consequenceTerms', + ), + ), + sortedTranscriptConsequences=ht.sortedTranscriptConsequences.map( + lambda e: e.annotate(isManeSelect=hl.is_defined(e.maneSelect)), + ), + ) + return ht.annotate( + sortedTranscriptConsequences=hl.enumerate( + ht.sortedTranscriptConsequences, + ).starmap( + lambda idx, c: c.select( + **{ + new_field_name: parse_nested_field( + ht.sortedTranscriptConsequences, + existing_field_name, + )[idx] + for new_field_name, existing_field_name in export_parquet_filterable_transcripts_fields( + reference_genome, + ).items() + }, + ), + ), + ) + + +def camelcase_array_structexpression_fields( + ht: hl.Table, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, +): + for field in array_structexpression_fields(ht): + ht = ht.transmute( + **{ + snake_to_camelcase(field): ht[field].map( + camelcase_hl_struct, + ), + }, + ) + + # Custom handling of nested sorted_transcript_consequences fields for GRCh38/SNV_INDEL. + # Note that spliceregion (extended_intronic_splice_region_variant) prevents + # a more procedural approach here. + if ( + reference_genome == ReferenceGenome.GRCh38 + and dataset_type == DatasetType.SNV_INDEL + ): + ht = ht.annotate( + sortedTranscriptConsequences=ht.sortedTranscriptConsequences.map( + lambda s: s.annotate( + loftee=camelcase_hl_struct(s.loftee), + utrannotator=camelcase_hl_struct(s.utrannotator), + ), + ), + ) + return ht diff --git a/loading_pipeline/lib/tasks/exports/misc_test.py b/loading_pipeline/lib/tasks/exports/misc_test.py new file mode 100644 index 0000000000..29bd0ab510 --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/misc_test.py @@ -0,0 +1,190 @@ +import unittest + +import hail as hl + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, +) +from loading_pipeline.lib.tasks.exports.misc import ( + camelcase_array_structexpression_fields, + sorted_hl_struct, +) + +TEST_SNV_INDEL_ANNOTATIONS = ( + 'loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht' +) +TEST_GRCH37_SNV_INDEL_ANNOTATIONS = ( + 'loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht' +) + + +class MiscTest(unittest.TestCase): + def test_camelcase_array_structexpression_fields(self) -> None: + ht = hl.read_table(TEST_SNV_INDEL_ANNOTATIONS) + ht = camelcase_array_structexpression_fields( + ht, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + ) + ht = ht.annotate( + sortedTranscriptConsequences=[ht.sortedTranscriptConsequences[0]], + ) + self.assertEqual( + ht.collect()[0], + hl.Struct( + key_=0, + locus=hl.Locus( + contig='chr1', + position=876499, + reference_genome='GRCh38', + ), + alleles=['A', 'G'], + clinvar=hl.Struct( + alleleId=929885, + conflictingPathogenicities=None, + goldStars=1, + submitters=['Labcorp Genetics (formerly Invitae), Labcorp'], + conditions=['not provided'], + assertion_ids=[], + pathogenicity_id=12, + ), + rg37_locus=hl.Locus( + contig=1, + position=874501, + reference_genome='GRCh37', + ), + rsid=None, + variant_id='1-876499-A-G', + xpos=1000876499, + gt_stats=hl.Struct(AC=47, AN=81784, AF=0.0005746845272369683, hom=1), + CAID='CA502654', + check_ref=False, + gnomad_non_coding_constraint=hl.Struct(z_score=None), + hgmd=hl.Struct(accession='abcdefg', class_id=3), + gnomad_exomes=hl.Struct( + AF=0.0006690866430290043, + AN=1440770, + AC=964, + Hom=0, + AF_POPMAX_OR_GLOBAL=0.0008023773552849889, + FAF_AF=0.000633420015219599, + Hemi=0, + ), + gnomad_genomes=hl.Struct( + AF=0.0002759889466688037, + AN=152180, + AC=42, + Hom=0, + AF_POPMAX_OR_GLOBAL=0.10000000149011612, + FAF_AF=0.0002092500071739778, + Hemi=0, + ), + screen=hl.Struct(region_type_ids=[]), + dbnsfp=hl.Struct( + PrimateAI_score=0.5918066501617432, + fathmm_MKL_coding_score=0.7174800038337708, + CADD_phred=23.5, + SIFT_score=0.0010000000474974513, + REVEL_score=0.3109999895095825, + Polyphen2_HVAR_score=0.164000004529953, + VEST4_score=0.39500001072883606, + MPC_score=0.01291007362306118, + MutPred_score=None, + MutationTaster_pred_id=0, + ), + topmed=hl.Struct( + AC=41, + AF=0.00032651599030941725, + AN=125568, + Hom=0, + Het=41, + ), + exac=hl.Struct( + AF_POPMAX=0.0007150234305299819, + AF=0.00019039999460801482, + AC_Adj=20, + AC_Het=20, + AC_Hom=0, + AC_Hemi=None, + AN_Adj=47974, + ), + splice_ai=hl.Struct( + delta_score=0.0, + splice_consequence_id=4, + ), + eigen=hl.Struct(Eigen_phred=2.628000020980835), + sortedTranscriptConsequences=[ + hl.Struct( + aminoAcids='S/L', + canonical=1, + codons='tCg/tTg', + geneId='ENSG00000187634', + hgvsc='ENST00000616016.5:c.1049C>T', + hgvsp='ENSP00000478421.2:p.Ser350Leu', + transcriptId='ENST00000616016', + maneSelect='NM_001385641.1', + manePlusClinical=None, + exon=hl.Struct(index=6, total=14), + intron=None, + refseqTranscriptId='NM_001385641.1', + alphamissense=hl.Struct(pathogenicity=None), + loftee=hl.Struct(isLofNagnag=None, lofFilterIds=None), + spliceregion=hl.Struct( + extended_intronic_splice_region_variant=False, + ), + utrannotator=hl.Struct( + existingInframeOorfs=None, + existingOutofframeOorfs=None, + existingUorfs=None, + fiveutrAnnotation=hl.Struct( + type='OutOfFrame_oORF', + KozakContext='CGCATGC', + KozakStrength='Weak', + DistanceToCDS=41, + CapDistanceToStart=None, + DistanceToStop=None, + Evidence=None, + AltStop=None, + AltStopDistanceToCDS=None, + FrameWithCDS=None, + StartDistanceToCDS=None, + newSTOPDistanceToCDS=None, + alt_type=None, + alt_type_length=None, + ref_StartDistanceToCDS=None, + ref_type=None, + ref_type_length=None, + ), + fiveutrConsequenceId=None, + ), + biotypeId=39, + consequenceTermIds=[9], + ), + ], + sortedRegulatoryFeatureConsequences=[ + hl.Struct( + regulatoryFeatureId='ENSR00000344437', + biotypeId=2, + consequenceTermIds=[2], + ), + ], + sortedMotifFeatureConsequences=[ + hl.Struct( + motifFeatureId='ENSM00493959715', + consequenceTermIds=[2], + ), + ], + ), + ) + + def test_sorted_hl_struct(self) -> None: + struct = hl.Struct( + z=5, + y=hl.Struct(b=2, a=hl.Struct(d=4, c=3)), + x=hl.Struct(k=9), + ) + self.assertEqual( + sorted_hl_struct(struct), + hl.Struct(x=hl.Struct(k=9), y=hl.Struct(a=hl.Struct(c=3, d=4), b=2), z=5), + ) diff --git a/loading_pipeline/lib/tasks/exports/write_new_entries_parquet.py b/loading_pipeline/lib/tasks/exports/write_new_entries_parquet.py new file mode 100644 index 0000000000..810c8e56f8 --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/write_new_entries_parquet.py @@ -0,0 +1,115 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.annotations.fields import get_fields +from loading_pipeline.lib.annotations.shared import xpos +from loading_pipeline.lib.misc.family_entries import ( + compute_callset_family_entries_ht, + deduplicate_by_most_non_ref_calls, + deglobalize_ids, +) +from loading_pipeline.lib.misc.io import import_parquet +from loading_pipeline.lib.paths import ( + new_entries_parquet_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.base.base_write_parquet import BaseWriteParquetTask +from loading_pipeline.lib.tasks.exports.fields import ( + get_entries_annotations_export_fields, + get_entries_call_annotations_fields, + get_entries_export_fields, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_existing_variants_parquet import ( + WriteExistingVariantsParquetTask, +) +from loading_pipeline.lib.tasks.write_new_variants_table import ( + WriteNewVariantsTableTask, +) +from loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset import ( + WriteRemappedAndSubsettedCallsetTask, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteNewEntriesParquetTask(BaseWriteParquetTask): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + new_entries_parquet_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def requires(self) -> list[luigi.Task]: + return [ + self.clone(WriteExistingVariantsParquetTask), + self.clone(WriteNewVariantsTableTask), + self.clone(WriteRemappedAndSubsettedCallsetTask), + ] + + def create_table(self) -> hl.Table: + annotations_ht = hl.read_table(self.input()[1].path) + annotation_selects = { + field: func(annotations_ht) + for field, func in { + **get_entries_annotations_export_fields(self.dataset_type), + **get_entries_call_annotations_fields(self.dataset_type), + }.items() + } + annotations_ht = annotations_ht.select(**annotation_selects) + + existing_annotations_ht = import_parquet( + self.input()[0].path, + self.reference_genome, + self.dataset_type, + ) + if 'xpos' not in existing_annotations_ht.row: + existing_annotations_ht = existing_annotations_ht.annotate( + xpos=hl.int64(xpos(existing_annotations_ht)), + ) + if 'gene_ids' in existing_annotations_ht.row: + existing_annotations_ht = existing_annotations_ht.annotate( + gene_ids=hl.set(existing_annotations_ht.gene_ids), + ) + if 'geneIds' in existing_annotations_ht.row: + existing_annotations_ht = existing_annotations_ht.annotate( + geneIds=hl.set(existing_annotations_ht.geneIds), + ) + + annotations_ht = annotations_ht.union( + existing_annotations_ht.select(*annotation_selects), + ) + + mt = hl.read_matrix_table(self.input()[2].path) + ht = compute_callset_family_entries_ht( + self.dataset_type, + mt, + get_fields( + mt, + self.dataset_type.genotype_entry_annotation_fns, + **self.param_kwargs, + ), + ) + ht = deglobalize_ids(ht) + ht = deduplicate_by_most_non_ref_calls(ht) + ht = ht.join(annotations_ht) + + # the family entries ht will contain rows + # where at least one family is defined... after explosion, + # rows where a family is not defined should be removed. + ht = ht.explode(ht.family_entries) + ht = ht.filter(hl.is_defined(ht.family_entries)) + ht = ht.key_by() + ht = ht.select_globals() + return ht.select( + **get_entries_export_fields( + ht, + self.dataset_type, + self.sample_type, + ), + ) diff --git a/loading_pipeline/lib/tasks/exports/write_new_entries_parquet_test.py b/loading_pipeline/lib/tasks/exports/write_new_entries_parquet_test.py new file mode 100644 index 0000000000..05b73e2086 --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/write_new_entries_parquet_test.py @@ -0,0 +1,474 @@ +from typing import ClassVar + +import hail as hl +import luigi.worker +import pandas as pd + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS +from loading_pipeline.lib.paths import ( + new_entries_parquet_path, + new_variants_table_path, +) +from loading_pipeline.lib.tasks.exports.write_new_entries_parquet import ( + WriteNewEntriesParquetTask, +) +from loading_pipeline.lib.test.clickhouse_schema_testcase import ( + ClickhouseSchemaTestCase, +) +from loading_pipeline.lib.test.misc import ( + convert_ndarray_to_list, + copy_project_pedigree_to_mocked_dir, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_PEDIGREE_4_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_4_remap.tsv' +TEST_PEDIGREE_5 = 'loading_pipeline/var/test/pedigrees/test_pedigree_5.tsv' +TEST_MITO_EXPORT_PEDIGREE = ( + 'loading_pipeline/var/test/pedigrees/test_mito_export_pedigree.tsv' +) +TEST_SNV_INDEL_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_MITO_CALLSET = 'loading_pipeline/var/test/callsets/mito_1.mt' +TEST_SV_VCF_2 = 'loading_pipeline/var/test/callsets/sv_2.vcf' +TEST_GCNV_BED_FILE = 'loading_pipeline/var/test/callsets/gcnv_1.tsv' +TEST_SNV_INDEL_ANNOTATIONS = ( + 'loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht' +) +TEST_MITO_ANNOTATIONS = 'loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht' +TEST_SV_ANNOTATIONS = 'loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht' +TEST_GCNV_ANNOTATIONS = 'loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht' + +TEST_RUN_ID = 'manual__2024-04-03' + + +class WriteNewEntriesParquetTest(MockedDatarootTestCase, ClickhouseSchemaTestCase): + fixtures: ClassVar = ['clickhouse_test'] + + def setUp(self) -> None: + super().setUp() + ht = hl.read_table( + TEST_SNV_INDEL_ANNOTATIONS, + ) + ht = ht.filter(ht.variant_id != '1-878314-G-C') + ht.write( + new_variants_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + ht = hl.read_table( + TEST_MITO_ANNOTATIONS, + ) + ht.write( + new_variants_table_path( + ReferenceGenome.GRCh38, + DatasetType.MITO, + TEST_RUN_ID, + ), + ) + ht = hl.read_table( + TEST_SV_ANNOTATIONS, + ) + ht.write( + new_variants_table_path( + ReferenceGenome.GRCh38, + DatasetType.SV, + TEST_RUN_ID, + ), + ) + ht = hl.read_table(TEST_GCNV_ANNOTATIONS) + ht.write( + new_variants_table_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ), + ) + + def test_write_new_entries_parquet(self): + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_4_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + worker = luigi.worker.Worker() + task = WriteNewEntriesParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_SNV_INDEL_VCF, + project_guids=['R0113_test_project', 'R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_entries_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.to_dict('records')) + self.assertEqual(len(export_json), 16) + self.assertEqual( + df['family_guid'].value_counts().to_dict(), + { + 'abc_1': 2, + '345_1': 2, + '123_1': 1, + '234_1': 1, + '456_1': 1, + '567_1': 1, + '678_1': 1, + '789_1': 1, + '890_1': 1, + '901_1': 1, + 'bcd_1': 1, + 'cde_1': 1, + 'def_1': 1, + 'efg_1': 1, + }, + ) + self.assertEqual( + [export_json[0], export_json[9], export_json[15]], + [ + { + 'key': 0, + 'project_guid': 'R0114_project4', + 'family_guid': '123_1', + 'sample_type': 'WGS', + 'xpos': 1000876499, + 'geneIds': ['ENSG00000187634'], + 'filters': [], + 'calls': [ + { + 'sampleId': 'NA19675_1', + 'gt': 2, + 'gq': 15, + 'ab': 1.0, + 'dp': 5, + }, + ], + 'sign': 1, + }, + { + 'key': 0, + 'project_guid': 'R0113_test_project', + 'family_guid': 'abc_1', + 'sample_type': 'WGS', + 'xpos': 1000876499, + 'geneIds': ['ENSG00000187634'], + 'filters': [], + 'calls': [ + { + 'sampleId': 'HG00731_1', + 'gt': 2, + 'gq': 21, + 'ab': 1.0, + 'dp': 7, + }, + { + 'sampleId': 'HG00732_1', + 'gt': 2, + 'gq': 24, + 'ab': 1.0, + 'dp': 8, + }, + { + 'sampleId': 'HG00733_1', + 'gt': 2, + 'gq': 12, + 'ab': 1.0, + 'dp': 4, + }, + ], + 'sign': 1, + }, + { + 'key': 1, + 'project_guid': 'R0113_test_project', + 'family_guid': 'abc_1', + 'sample_type': 'WGS', + 'xpos': 1000878314, + 'geneIds': ['ENSG00000177000'], + 'filters': ['VQSRTrancheSNP99.00to99.90'], + 'calls': [ + { + 'sampleId': 'HG00731_1', + 'gt': 1, + 'gq': 30, + 'ab': 0.3333333432674408, + 'dp': 3, + }, + {'sampleId': 'HG00732_1', 'gt': 0, 'gq': 6, 'ab': 0.0, 'dp': 2}, + { + 'sampleId': 'HG00733_1', + 'gt': 1, + 'gq': 61, + 'ab': 0.6000000238418579, + 'dp': 5, + }, + ], + 'sign': 1, + }, + ], + ) + + def test_mito_write_new_entries_parquet(self): + copy_project_pedigree_to_mocked_dir( + TEST_MITO_EXPORT_PEDIGREE, + ReferenceGenome.GRCh38, + DatasetType.MITO, + SampleType.WGS, + 'R0116_test_project3', + ) + worker = luigi.worker.Worker() + task = WriteNewEntriesParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.MITO, + sample_type=SampleType.WGS, + callset_path=TEST_MITO_CALLSET, + project_guids=['R0116_test_project3'], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_entries_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.MITO, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.to_dict('records')) + self.assertEqual( + export_json, + [ + { + 'key': 998, + 'project_guid': 'R0116_test_project3', + 'family_guid': 'family_1', + 'sample_type': 'WGS', + 'xpos': 25000000008, + 'filters': [], + 'calls': [ + { + 'sampleId': 'RGP_1270_2', + 'gt': 2, + 'dp': 4216, + 'hl': 0.999, + 'mitoCn': 224, + 'contamination': 0.0, + }, + ], + 'sign': 1, + }, + ], + ) + + def test_sv_write_new_entries_parquet(self): + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_5, + ReferenceGenome.GRCh38, + DatasetType.SV, + SampleType.WGS, + 'R0115_test_project2', + ) + worker = luigi.worker.Worker() + task = WriteNewEntriesParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SV, + sample_type=SampleType.WGS, + callset_path=TEST_SV_VCF_2, + project_guids=['R0115_test_project2'], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_entries_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SV, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.to_dict('records')) + self.assertEqual( + export_json, + [ + { + 'key': 727, + 'project_guid': 'R0115_test_project2', + 'family_guid': 'family_2_1', + 'xpos': 1001025886, + 'geneIds': ['ENSG00000188157'], + 'filters': ['HIGH_SR_BACKGROUND', 'UNRESOLVED'], + 'calls': [ + { + 'sampleId': 'RGP_164_1', + 'gt': 0, + 'cn': None, + 'gq': 99, + 'newCall': True, + 'prevCall': False, + 'prevNumAlt': None, + }, + { + 'sampleId': 'RGP_164_2', + 'gt': 1, + 'cn': None, + 'gq': 31, + 'newCall': True, + 'prevCall': False, + 'prevNumAlt': None, + }, + { + 'sampleId': 'RGP_164_3', + 'gt': 0, + 'cn': None, + 'gq': 99, + 'newCall': True, + 'prevCall': False, + 'prevNumAlt': None, + }, + { + 'sampleId': 'RGP_164_4', + 'gt': 0, + 'cn': None, + 'gq': 99, + 'newCall': True, + 'prevCall': False, + 'prevNumAlt': None, + }, + ], + 'sign': 1, + }, + ], + ) + + def test_gcnv_write_new_entries_parquet(self): + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_5, + ReferenceGenome.GRCh38, + DatasetType.GCNV, + SampleType.WES, + 'R0115_test_project2', + ) + worker = luigi.worker.Worker() + task = WriteNewEntriesParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.GCNV, + sample_type=SampleType.WES, + callset_path=TEST_GCNV_BED_FILE, + project_guids=['R0115_test_project2'], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_entries_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.to_dict('records')) + self.assertEqual( + export_json, + [ + { + 'key': 0, + 'project_guid': 'R0115_test_project2', + 'family_guid': 'family_2_1', + 'xpos': 1000939203, + 'filters': [], + 'calls': [ + { + 'sampleId': 'RGP_164_1', + 'gt': 1, + 'cn': 1, + 'qs': 4, + 'defragged': False, + 'start': 100006937, + 'end': 100007881, + 'numExon': 2, + 'geneIds': ['ENSG00000117620', 'ENSG00000283761'], + 'newCall': False, + 'prevCall': True, + 'prevOverlap': False, + }, + { + 'sampleId': 'RGP_164_2', + 'gt': 1, + 'cn': 1, + 'qs': 5, + 'defragged': False, + 'start': 100017585, + 'end': 100023213, + 'numExon': 1, + 'geneIds': ['ENSG00000117620', 'ENSG00000283761'], + 'newCall': False, + 'prevCall': False, + 'prevOverlap': False, + }, + { + 'sampleId': 'RGP_164_3', + 'gt': 2, + 'cn': 0, + 'qs': 30, + 'defragged': False, + 'start': 100017585, + 'end': 100023213, + 'numExon': 1, + 'geneIds': ['ENSG00000117620', 'ENSG00000283761'], + 'newCall': False, + 'prevCall': True, + 'prevOverlap': False, + }, + { + 'sampleId': 'RGP_164_4', + 'gt': 2, + 'cn': 0, + 'qs': 30, + 'defragged': False, + 'start': 100017586, + 'end': 100023212, + 'numExon': 2, + 'geneIds': ['ENSG00000283761', 'ENSG22222222222'], + 'newCall': False, + 'prevCall': True, + 'prevOverlap': False, + }, + ], + 'sign': 1, + }, + ], + ) diff --git a/loading_pipeline/lib/tasks/exports/write_new_variant_details_parquet.py b/loading_pipeline/lib/tasks/exports/write_new_variant_details_parquet.py new file mode 100644 index 0000000000..d293dc8b1c --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/write_new_variant_details_parquet.py @@ -0,0 +1,60 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.paths import ( + new_variant_details_parquet_path, + new_variants_table_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.base.base_write_parquet import BaseWriteParquetTask +from loading_pipeline.lib.tasks.exports.fields import get_variant_details_export_fields +from loading_pipeline.lib.tasks.exports.misc import ( + camelcase_array_structexpression_fields, +) +from loading_pipeline.lib.tasks.files import GCSorLocalFolderTarget, GCSorLocalTarget +from loading_pipeline.lib.tasks.write_new_variants_table import ( + WriteNewVariantsTableTask, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteNewVariantDetailsParquetTask(BaseWriteParquetTask): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + new_variant_details_parquet_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def complete(self) -> luigi.Target: + return GCSorLocalFolderTarget(self.output().path).exists() + + def requires(self) -> luigi.Task: + return self.clone(WriteNewVariantsTableTask) + + def create_table(self) -> None: + ht = hl.read_table( + new_variants_table_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + ht = camelcase_array_structexpression_fields( + ht, + self.reference_genome, + self.dataset_type, + ) + ht = ht.key_by() + return ht.select( + **get_variant_details_export_fields( + ht, + self.reference_genome, + self.dataset_type, + ), + ) diff --git a/loading_pipeline/lib/tasks/exports/write_new_variant_details_parquet_test.py b/loading_pipeline/lib/tasks/exports/write_new_variant_details_parquet_test.py new file mode 100644 index 0000000000..cb4f211777 --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/write_new_variant_details_parquet_test.py @@ -0,0 +1,397 @@ +import os +from unittest import mock +from unittest.mock import Mock + +import hail as hl +import luigi.worker +import pandas as pd + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS +from loading_pipeline.lib.paths import ( + existing_variants_parquet_path, + new_variant_details_parquet_path, +) +from loading_pipeline.lib.tasks.exports.write_new_variant_details_parquet import ( + WriteNewVariantDetailsParquetTask, +) +from loading_pipeline.lib.test.misc import ( + convert_ndarray_to_list, + copy_project_pedigree_to_mocked_dir, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase +from loading_pipeline.var.test.vep.mock_vep_data import ( + MOCK_37_VEP_DATA, + MOCK_38_VEP_DATA, +) + +TEST_SNV_INDEL_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' + +TEST_RUN_ID = 'manual__2024-04-03' + +EXISTING_SNV_INDEL_VARIANT_IDS = [ + '1-871269-A-C', + '1-874734-C-T', + '1-878314-G-C', + '1-878809-C-T', + '1-879576-C-T', + '1-881070-G-A', + '1-881627-G-A', + '1-881918-G-A', + '1-883485-C-T', + '1-883625-A-G', + '1-883918-G-A', + '1-887560-A-C', + '1-887801-A-G', + '1-888529-G-A', + '1-888659-T-C', + '1-889158-G-C', + '1-889159-A-C', + '1-889238-G-A', + '1-894573-G-A', + '1-896922-C-T', + '1-897325-G-C', + '1-898313-C-T', + '1-898323-T-C', + '1-898467-C-T', + '1-899959-G-GC', + '1-900505-G-C', + '1-902024-G-A', + '1-902069-T-C', + '1-902088-G-A', + '1-902088-G-ACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACT', +] + + +def _write_existing_variants_parquet_fixture( + variant_ids: list[str], + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + max_key_: int, +) -> None: + n = len(variant_ids) + path = existing_variants_parquet_path(reference_genome, dataset_type, TEST_RUN_ID) + os.makedirs(os.path.dirname(path), exist_ok=True) + pd.DataFrame( + { + 'variant_id': variant_ids, + 'key_': range(max_key_ - n + 1, max_key_ + 1), + }, + ).to_parquet(path) + + +SNV_INDEL_GRCH38_MOCK_VEP_DATA = MOCK_38_VEP_DATA.annotate( + transcript_consequences=hl.array( + [ + MOCK_38_VEP_DATA.transcript_consequences[0].annotate( + am_pathogenicity=hl.missing(hl.tfloat32), + exon='6/14', + gene_id='ENSG00000187634', + hgvsc='ENST00000616016.5:c.1049C>T', + hgvsp='ENSP00000478421.2:p.Ser350Leu', + lof=hl.missing(hl.tstr), + lof_filter=hl.missing(hl.tstr), + mane_select='NM_001385641.1', + transcript_id='ENST00000616016', + fiveutr_annotation=hl.dict( + { + '1': hl.struct( + type='OutOfFrame_oORF', + KozakContext='CGCATGC', + KozakStrength='Weak', + DistanceToCDS='41', + CapDistanceToStart=hl.missing(hl.tstr), + DistanceToStop=hl.missing(hl.tstr), + Evidence=hl.missing(hl.tstr), + AltStop=hl.missing(hl.tstr), + AltStopDistanceToCDS=hl.missing(hl.tstr), + FrameWithCDS=hl.missing(hl.tstr), + StartDistanceToCDS=hl.missing(hl.tstr), + newSTOPDistanceToCDS=hl.missing(hl.tstr), + alt_type=hl.missing(hl.tstr), + alt_type_length=hl.missing(hl.tstr), + ref_StartDistanceToCDS=hl.missing(hl.tstr), + ref_type=hl.missing(hl.tstr), + ref_type_length=hl.missing(hl.tstr), + ), + }, + ), + ), + ], + ), +) + +SNV_INDEL_GRCH37_MOCK_VEP_DATA = MOCK_37_VEP_DATA.annotate( + transcript_consequences=hl.array( + [ + MOCK_37_VEP_DATA.transcript_consequences[0].annotate( + amino_acids='E/G', + codons='gAa/gGa', + gene_id='ENSG00000186092', + hgvsc='ENST00000335137.3:c.44A>G', + hgvsp='ENSP00000334393.3:p.Glu15Gly', + transcript_id='ENST00000335137', + lof=hl.missing(hl.tstr), + lof_filter=hl.missing(hl.tstr), + ), + ], + ), +) + + +class WriteNewVariantDetailsParquetTest(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + _write_existing_variants_parquet_fixture( + EXISTING_SNV_INDEL_VARIANT_IDS, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + max_key_=-1, + ) + _write_existing_variants_parquet_fixture( + EXISTING_SNV_INDEL_VARIANT_IDS, + ReferenceGenome.GRCh37, + DatasetType.SNV_INDEL, + max_key_=1423, + ) + + # Make an incomplete parquet to validate overwrite-ing. + os.makedirs( + new_variant_details_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + exist_ok=True, + ) + with open( + os.path.join( + new_variant_details_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + 'incomplete_file.parquet', + ), + 'w', + ) as f: + f.write('') + + @mock.patch( + 'loading_pipeline.lib.tasks.write_new_variants_table.load_gencode_ensembl_to_refseq_id', + ) + @mock.patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_write_new_variant_details_parquet_test( + self, + mock_vep: Mock, + mock_load_gencode_ensembl_to_refseq_id: Mock, + ) -> None: + mock_load_gencode_ensembl_to_refseq_id.return_value = hl.dict( + {'ENST00000616016': 'NM_001385641.1'}, + ) + mock_vep.side_effect = lambda ht, **_: ht.annotate( + vep=SNV_INDEL_GRCH38_MOCK_VEP_DATA, + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + worker = luigi.worker.Worker() + task = WriteNewVariantDetailsParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_SNV_INDEL_VCF, + project_guids=[ + 'R0113_test_project', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + skip_expect_tdr_metrics=True, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_variant_details_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + self.assertListEqual( + list(export_json[0].keys()), + [ + 'key', + 'variantId', + 'rsid', + 'CAID', + 'liftedOverChrom', + 'liftedOverPos', + 'sortedMotifFeatureConsequences', + 'sortedRegulatoryFeatureConsequences', + 'transcripts', + ], + ) + self.assertEqual( + export_json[0]['key'], + 0, + ) + self.assertEqual( + export_json[0]['transcripts'][0], + { + 'alphamissense': {'pathogenicity': None}, + 'aminoAcids': 'S/L', + 'biotype': 'protein_coding', + 'canonical': 1, + 'codons': 'tCg/tTg', + 'consequenceTerms': ['missense_variant'], + 'exon': {'index': 6, 'total': 14}, + 'geneId': 'ENSG00000187634', + 'hgvsc': 'ENST00000616016.5:c.1049C>T', + 'hgvsp': 'ENSP00000478421.2:p.Ser350Leu', + 'intron': None, + 'transcriptId': 'ENST00000616016', + 'transcriptRank': 0, + 'majorConsequence': 'missense_variant', + 'maneSelect': 'NM_001385641.1', + 'manePlusClinical': None, + 'refseqTranscriptId': 'NM_001385641.1', + 'loftee': {'isLofNagnag': None, 'lofFilters': None}, + 'spliceregion': { + 'extended_intronic_splice_region_variant': False, + }, + 'utrannotator': { + 'existingInframeOorfs': None, + 'existingOutofframeOorfs': None, + 'existingUorfs': None, + 'fiveutrAnnotation': { + 'AltStop': None, + 'AltStopDistanceToCDS': None, + 'CapDistanceToStart': None, + 'DistanceToCDS': 41, + 'DistanceToStop': None, + 'Evidence': None, + 'FrameWithCDS': None, + 'KozakContext': 'CGCATGC', + 'KozakStrength': 'Weak', + 'StartDistanceToCDS': None, + 'alt_type': None, + 'alt_type_length': None, + 'newSTOPDistanceToCDS': None, + 'ref_StartDistanceToCDS': None, + 'ref_type': None, + 'ref_type_length': None, + 'type': 'OutOfFrame_oORF', + }, + 'fiveutrConsequence': None, + }, + }, + ) + self.assertEqual( + list(export_json[0]['transcripts'][0].keys()), + sorted(export_json[0]['transcripts'][0].keys()), + ) + self.assertEqual( + list( + export_json[0]['transcripts'][0]['utrannotator'][ + 'fiveutrAnnotation' + ].keys(), + ), + sorted( + export_json[0]['transcripts'][0]['utrannotator'][ + 'fiveutrAnnotation' + ].keys(), + ), + ) + + @mock.patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_grch37_write_new_variant_details_parquet_test( + self, + mock_vep: Mock, + ) -> None: + mock_vep.side_effect = lambda ht, **_: ht.annotate( + vep=SNV_INDEL_GRCH37_MOCK_VEP_DATA, + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh37, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + worker = luigi.worker.Worker() + task = WriteNewVariantDetailsParquetTask( + reference_genome=ReferenceGenome.GRCh37, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_SNV_INDEL_VCF, + project_guids=[ + 'R0113_test_project', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + skip_expect_tdr_metrics=True, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + os.path.join( + new_variant_details_parquet_path( + ReferenceGenome.GRCh37, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + self.assertListEqual( + list(export_json[0].keys()), + [ + 'key', + 'variantId', + 'rsid', + 'CAID', + 'liftedOverChrom', + 'liftedOverPos', + 'transcripts', + ], + ) + self.assertEqual( + export_json[0]['key'], + 1424, + ) + self.assertEqual(export_json[0]['CAID'], None) + self.assertEqual( + export_json[0]['transcripts'][0], + { + 'aminoAcids': 'E/G', + 'biotype': 'protein_coding', + 'canonical': 1, + 'codons': 'gAa/gGa', + 'consequenceTerms': ['missense_variant'], + 'geneId': 'ENSG00000186092', + 'hgvsc': 'ENST00000335137.3:c.44A>G', + 'hgvsp': 'ENSP00000334393.3:p.Glu15Gly', + 'loftee': {'isLofNagnag': None, 'lofFilters': None}, + 'majorConsequence': 'missense_variant', + 'transcriptId': 'ENST00000335137', + 'transcriptRank': 0, + }, + ) + self.assertEqual( + list(export_json[0]['transcripts'][0].keys()), + sorted(export_json[0]['transcripts'][0].keys()), + ) diff --git a/loading_pipeline/lib/tasks/exports/write_new_variants_parquet.py b/loading_pipeline/lib/tasks/exports/write_new_variants_parquet.py new file mode 100644 index 0000000000..7ed692e99f --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/write_new_variants_parquet.py @@ -0,0 +1,59 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.paths import ( + new_variants_parquet_path, + new_variants_table_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.base.base_write_parquet import BaseWriteParquetTask +from loading_pipeline.lib.tasks.exports.fields import get_variants_export_fields +from loading_pipeline.lib.tasks.exports.misc import ( + camelcase_array_structexpression_fields, + subset_consequences_fields, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_new_variants_table import ( + WriteNewVariantsTableTask, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteNewVariantsParquetTask(BaseWriteParquetTask): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + new_variants_parquet_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def requires(self) -> luigi.Task: + return self.clone(WriteNewVariantsTableTask) + + def create_table(self) -> None: + ht = hl.read_table( + new_variants_table_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + ht = camelcase_array_structexpression_fields( + ht, + self.reference_genome, + self.dataset_type, + ) + if self.dataset_type.should_write_new_variant_details: + ht = subset_consequences_fields( + ht, + self.reference_genome, + ) + ht = ht.key_by() + return ht.select( + **get_variants_export_fields(ht, self.reference_genome, self.dataset_type), + ) diff --git a/loading_pipeline/lib/tasks/exports/write_new_variants_parquet_test.py b/loading_pipeline/lib/tasks/exports/write_new_variants_parquet_test.py new file mode 100644 index 0000000000..8fb2acee29 --- /dev/null +++ b/loading_pipeline/lib/tasks/exports/write_new_variants_parquet_test.py @@ -0,0 +1,538 @@ +import os +from unittest import mock +from unittest.mock import Mock + +import hail as hl +import luigi.worker +import pandas as pd + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS +from loading_pipeline.lib.paths import ( + existing_variants_parquet_path, + new_variants_parquet_path, + new_variants_table_path, + remapped_and_subsetted_callset_path, +) +from loading_pipeline.lib.tasks.exports.write_new_variants_parquet import ( + WriteNewVariantsParquetTask, +) +from loading_pipeline.lib.test.misc import ( + convert_ndarray_to_list, + copy_project_pedigree_to_mocked_dir, +) +from loading_pipeline.lib.test.mock_complete_task import MockCompleteTask +from loading_pipeline.lib.test.mocked_reference_datasets_testcase import ( + MockedReferenceDatasetsTestCase, +) +from loading_pipeline.var.test.vep.mock_vep_data import ( + MOCK_37_VEP_DATA, + MOCK_38_VEP_DATA, +) + +TEST_SNV_INDEL_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_MITO_CALLSET = 'loading_pipeline/var/test/callsets/mito_1.mt' +TEST_MITO_EXPORT_PEDIGREE = ( + 'loading_pipeline/var/test/pedigrees/test_mito_export_pedigree.tsv' +) +TEST_SV_VCF = 'loading_pipeline/var/test/callsets/sv_1.vcf' +TEST_PEDIGREE_5 = 'loading_pipeline/var/test/pedigrees/test_pedigree_5.tsv' + +TEST_GCNV_ANNOTATIONS = 'loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht' + +TEST_RUN_ID = 'manual__2024-04-03' + +EXISTING_SNV_INDEL_VARIANT_IDS = [ + '1-871269-A-C', + '1-874734-C-T', + '1-878314-G-C', + '1-878809-C-T', + '1-879576-C-T', + '1-881070-G-A', + '1-881627-G-A', + '1-881918-G-A', + '1-883485-C-T', + '1-883625-A-G', + '1-883918-G-A', + '1-887560-A-C', + '1-887801-A-G', + '1-888529-G-A', + '1-888659-T-C', + '1-889158-G-C', + '1-889159-A-C', + '1-889238-G-A', + '1-894573-G-A', + '1-896922-C-T', + '1-897325-G-C', + '1-898313-C-T', + '1-898323-T-C', + '1-898467-C-T', + '1-899959-G-GC', + '1-900505-G-C', + '1-902024-G-A', + '1-902069-T-C', + '1-902088-G-A', + '1-902088-G-ACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACT', +] + +EXISTING_MITO_VARIANT_IDS = ['M-3-T-C', 'M-12-T-C'] + +EXISTING_SV_VARIANT_IDS = [ + 'BND_chr1_6', + 'DUP_chr1_5', + 'DEL_chr1_12', + 'BND_chr1_9', + 'INS_chr1_65', + 'CPX_chr1_41', + 'INS_chr1_268', + 'CPX_chr1_54', + 'INS_chr1_688', + 'CPX_chr1_251', + 'CPX_chrX_251', + 'CPX_chrX_252', +] + + +def _write_existing_variants_parquet_fixture( + variant_ids: list[str], + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + max_key_: int, +) -> None: + n = len(variant_ids) + path = existing_variants_parquet_path(reference_genome, dataset_type, TEST_RUN_ID) + os.makedirs(os.path.dirname(path), exist_ok=True) + pd.DataFrame( + { + 'variant_id': variant_ids, + 'key_': range(max_key_ - n + 1, max_key_ + 1), + }, + ).to_parquet(path) + + +SNV_INDEL_GRCH38_MOCK_VEP_DATA = MOCK_38_VEP_DATA.annotate( + motif_feature_consequences=hl.array( + [ + hl.struct( + consequence_terms=hl.array(['TF_binding_site_variant']), + motif_feature_id='motif_1', + ), + ], + ), + regulatory_feature_consequences=hl.array( + [MOCK_38_VEP_DATA.regulatory_feature_consequences[0]], + ), + transcript_consequences=hl.array( + [ + MOCK_38_VEP_DATA.transcript_consequences[0].annotate( + am_pathogenicity=hl.missing(hl.tfloat32), + gene_id='ENSG00000187634', + ), + ], + ), +) + +SNV_INDEL_GRCH37_MOCK_VEP_DATA = MOCK_37_VEP_DATA.annotate( + transcript_consequences=hl.array( + [ + MOCK_37_VEP_DATA.transcript_consequences[0].annotate( + gene_id='ENSG00000186092', + ), + ], + ), +) + + +class WriteNewVariantsParquetTest(MockedReferenceDatasetsTestCase): + def setUp(self) -> None: + super().setUp() + _write_existing_variants_parquet_fixture( + EXISTING_SNV_INDEL_VARIANT_IDS, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + max_key_=-1, + ) + _write_existing_variants_parquet_fixture( + EXISTING_SNV_INDEL_VARIANT_IDS, + ReferenceGenome.GRCh37, + DatasetType.SNV_INDEL, + max_key_=1423, + ) + _write_existing_variants_parquet_fixture( + EXISTING_MITO_VARIANT_IDS, + ReferenceGenome.GRCh38, + DatasetType.MITO, + max_key_=997, + ) + _write_existing_variants_parquet_fixture( + EXISTING_SV_VARIANT_IDS, + ReferenceGenome.GRCh38, + DatasetType.SV, + max_key_=726, + ) + ht = hl.read_table(TEST_GCNV_ANNOTATIONS) + ht.write( + new_variants_table_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ), + ) + ht.write( + remapped_and_subsetted_callset_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + 'fake_callset', + ), + ) + + @mock.patch( + 'loading_pipeline.lib.tasks.write_new_variants_table.load_gencode_ensembl_to_refseq_id', + ) + @mock.patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_write_new_variants_parquet_test( + self, + mock_vep: Mock, + mock_load_gencode_ensembl_to_refseq_id: Mock, + ) -> None: + mock_load_gencode_ensembl_to_refseq_id.return_value = hl.dict( + {'ENST00000327044': 'NM_015658.4'}, + ) + mock_vep.side_effect = lambda ht, **_: ht.annotate( + vep=SNV_INDEL_GRCH38_MOCK_VEP_DATA, + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + worker = luigi.worker.Worker() + task = WriteNewVariantsParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_SNV_INDEL_VCF, + project_guids=[ + 'R0113_test_project', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + skip_expect_tdr_metrics=True, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + export_json[0]['sortedTranscriptConsequences'] = [ + export_json[0]['sortedTranscriptConsequences'][0], + ] + self.assertEqual( + export_json, + [ + { + 'key': 0, + 'sortedMotifFeatureConsequences': [ + { + 'consequenceTerms': ['TF_binding_site_variant'], + }, + ], + 'sortedRegulatoryFeatureConsequences': [ + { + 'consequenceTerms': ['regulatory_region_variant'], + }, + ], + 'sortedTranscriptConsequences': [ + { + 'alphamissensePathogenicity': None, + 'canonical': 1, + 'consequenceTerms': ['missense_variant'], + 'extendedIntronicSpliceRegionVariant': False, + 'fiveutrConsequence': None, + 'geneId': 'ENSG00000187634', + 'isManeSelect': True, + }, + ], + }, + ], + ) + + @mock.patch('loading_pipeline.lib.misc.vep.hl.vep') + def test_grch37_write_new_variants_parquet_test( + self, + mock_vep: Mock, + ) -> None: + mock_vep.side_effect = lambda ht, **_: ht.annotate( + vep=SNV_INDEL_GRCH37_MOCK_VEP_DATA, + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh37, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + worker = luigi.worker.Worker() + task = WriteNewVariantsParquetTask( + reference_genome=ReferenceGenome.GRCh37, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_SNV_INDEL_VCF, + project_guids=[ + 'R0113_test_project', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + skip_expect_tdr_metrics=True, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_variants_parquet_path( + ReferenceGenome.GRCh37, + DatasetType.SNV_INDEL, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + export_json[0]['sortedTranscriptConsequences'] = [ + export_json[0]['sortedTranscriptConsequences'][0], + ] + self.assertEqual( + export_json, + [ + { + 'key': 1424, + 'sortedTranscriptConsequences': [ + { + 'canonical': 1, + 'consequenceTerms': ['missense_variant'], + 'geneId': 'ENSG00000186092', + }, + ], + }, + ], + ) + + def test_mito_write_new_variants_parquet_test( + self, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_MITO_EXPORT_PEDIGREE, + ReferenceGenome.GRCh38, + DatasetType.MITO, + SampleType.WGS, + 'R0116_test_project3', + ) + worker = luigi.worker.Worker() + task = WriteNewVariantsParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.MITO, + sample_type=SampleType.WGS, + callset_path=TEST_MITO_CALLSET, + project_guids=[ + 'R0116_test_project3', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + skip_expect_tdr_metrics=True, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.MITO, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + self.assertEqual( + export_json, + [ + { + 'key': 998, + 'variantId': 'M-8-G-T', + 'rsid': 'rs1603218446', + 'liftedOverPos': 8, + 'commonLowHeteroplasmy': True, + 'haplogroupDefining': False, + 'mitotip': 'likely_pathogenic', + 'sortedTranscriptConsequences': [ + { + 'aminoAcids': None, + 'biotype': 'Mt_tRNA', + 'canonical': 1, + 'codons': None, + 'consequenceTerms': ['non_coding_transcript_exon_variant'], + 'geneId': 'ENSG00000210049', + 'hgvsc': 'ENST00000387314.1:n.2T>C', + 'hgvsp': None, + 'loftee': {'isLofNagnag': None, 'lofFilters': None}, + 'majorConsequence': 'non_coding_transcript_exon_variant', + 'transcriptId': 'ENST00000387314', + 'transcriptRank': 0, + }, + ], + }, + ], + ) + + @mock.patch( + 'loading_pipeline.lib.tasks.write_new_variants_table.load_gencode_gene_symbol_to_gene_id', + ) + def test_sv_write_new_variants_parquet_test( + self, + mock_load_gencode_gene_symbol_to_gene_id: Mock, + ) -> None: + mock_load_gencode_gene_symbol_to_gene_id.return_value = hl.dict( + {'TAS1R1': 'ENSG00000173662'}, + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_5, + ReferenceGenome.GRCh38, + DatasetType.SV, + SampleType.WGS, + 'R0115_test_project2', + ) + worker = luigi.worker.Worker() + task = WriteNewVariantsParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SV, + sample_type=SampleType.WGS, + callset_path=TEST_SV_VCF, + project_guids=[ + 'R0115_test_project2', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + skip_expect_tdr_metrics=True, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.SV, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + export_json[0]['sortedGeneConsequences'] = [ + export_json[0]['sortedGeneConsequences'][0], + ] + self.assertEqual( + export_json, + [ + { + 'key': 727, + 'xpos': 1006558902, + 'chrom': '1', + 'pos': 6558902, + 'end': 6559723, + 'rg37LocusEnd': {'contig': '1', 'position': 6619783}, + 'variantId': 'CPX_chr1_22', + 'liftedOverChrom': '1', + 'liftedOverPos': 6618962, + 'algorithms': 'manta', + 'bothsidesSupport': True, + 'cpxIntervals': [ + {'chrom': '1', 'start': 6558902, 'end': 6559723, 'type': 'INV'}, + {'chrom': '1', 'start': 6559655, 'end': 6559723, 'type': 'DUP'}, + ], + 'endChrom': None, + 'svSourceDetail': None, + 'svType': 'CPX', + 'svTypeDetail': 'INVdup', + 'predictions': {'strvctvre': None}, + 'populations': {'gnomad_svs': None}, + 'sortedGeneConsequences': [ + {'geneId': 'ENSG00000173662', 'majorConsequence': 'INTRONIC'}, + ], + }, + ], + ) + + @mock.patch( + 'loading_pipeline.lib.tasks.exports.write_new_variants_parquet.WriteNewVariantsTableTask', + ) + def test_gcnv_write_new_variants_parquet_test( + self, + write_new_variants_table_task: Mock, + ) -> None: + write_new_variants_table_task.return_value = MockCompleteTask() + worker = luigi.worker.Worker() + task = WriteNewVariantsParquetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.GCNV, + sample_type=SampleType.WES, + callset_path='fake_callset', + project_guids=[ + 'fake_project', + ], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + df = pd.read_parquet( + new_variants_parquet_path( + ReferenceGenome.GRCh38, + DatasetType.GCNV, + TEST_RUN_ID, + ), + ) + export_json = convert_ndarray_to_list(df.head(1).to_dict('records')) + self.assertEqual( + export_json, + [ + { + 'key': 0, + 'xpos': 1000939203, + 'chrom': '1', + 'pos': 939203, + 'end': 939558, + 'rg37LocusEnd': {'contig': '1', 'position': 874938}, + 'variantId': 'suffix_16456_DEL', + 'liftedOverChrom': '1', + 'liftedOverPos': 874583, + 'numExon': 1, + 'svType': 'DUP', + 'predictions': {'strvctvre': 0.4490000009536743}, + 'populations': { + 'sv_callset': { + 'ac': 1, + 'af': 4.3387713958509266e-05, + 'an': 23048, + 'het': None, + 'hom': None, + }, + }, + 'sortedGeneConsequences': [ + {'geneId': 'ENSG00000187634', 'majorConsequence': 'LOF'}, + ], + }, + ], + ) diff --git a/loading_pipeline/lib/tasks/files.py b/loading_pipeline/lib/tasks/files.py new file mode 100644 index 0000000000..7368631767 --- /dev/null +++ b/loading_pipeline/lib/tasks/files.py @@ -0,0 +1,49 @@ +import os + +import hailtop.fs as hfs +import luigi +from luigi.contrib import gcs + + +def CallsetTask(pathname: str) -> luigi.Task: # noqa: N802 + if 'vcf' in pathname: + return VCFFileTask(pathname) + if pathname.endswith('mt'): + return HailTableTask(pathname) + return RawFileTask(pathname) + + +def GCSorLocalTarget(pathname: str) -> luigi.Target: # noqa: N802 + return ( + gcs.GCSTarget(pathname) + if pathname.startswith('gs://') + else luigi.LocalTarget(pathname) + ) + + +def GCSorLocalFolderTarget(pathname: str) -> luigi.Target: # noqa: N802 + return GCSorLocalTarget(os.path.join(pathname, '_SUCCESS')) + + +class RawFileTask(luigi.Task): + pathname = luigi.Parameter() + + def output(self) -> luigi.Target: + return GCSorLocalTarget(self.pathname) + + +class VCFFileTask(RawFileTask): + def complete(self) -> bool: + # NB: hail supports reading glob bgz files. + path = self.pathname + if not path.startswith(('gs://', 's3://')): + path = os.path.abspath(path) + try: + return len(hfs.ls(path)) > 0 + except FileNotFoundError: + return False + + +class HailTableTask(RawFileTask): + def complete(self) -> bool: + return GCSorLocalFolderTarget(self.pathname).exists() diff --git a/loading_pipeline/lib/tasks/files_test.py b/loading_pipeline/lib/tasks/files_test.py new file mode 100644 index 0000000000..b2dfd937e0 --- /dev/null +++ b/loading_pipeline/lib/tasks/files_test.py @@ -0,0 +1,40 @@ +import os +import tempfile +import unittest + +from loading_pipeline.lib.tasks.files import ( + CallsetTask, + HailTableTask, + RawFileTask, + VCFFileTask, +) + + +class FilesTest(unittest.TestCase): + def test_raw_file(self) -> None: + with tempfile.NamedTemporaryFile(suffix='.txt') as f: + self.assertTrue(RawFileTask(f.name).complete()) + + def test_vcf_file(self) -> None: + with tempfile.NamedTemporaryFile(suffix='.vcf.bgz') as f: + self.assertTrue(VCFFileTask(f.name).complete()) + + def test_hail_table(self) -> None: + with tempfile.TemporaryDirectory(suffix='.ht') as d: + self.assertFalse(HailTableTask(d).complete()) + with open(os.path.join(d, '_SUCCESS'), 'w') as f: + f.write('0') + self.assertTrue(HailTableTask(d).complete()) + + def test_callset_task(self) -> None: + with tempfile.NamedTemporaryFile(suffix='.txt') as f: + self.assertTrue(CallsetTask(f.name).complete()) + + with tempfile.NamedTemporaryFile(suffix='.vcf') as f: + self.assertTrue(CallsetTask(f.name).complete()) + + with tempfile.TemporaryDirectory(suffix='.mt') as d: + self.assertFalse(CallsetTask(d).complete()) + with open(os.path.join(d, '_SUCCESS'), 'w') as f: + f.write('0') + self.assertTrue(CallsetTask(d).complete()) diff --git a/loading_pipeline/lib/tasks/load_clickhouse_entries.py b/loading_pipeline/lib/tasks/load_clickhouse_entries.py new file mode 100644 index 0000000000..42f85e80a3 --- /dev/null +++ b/loading_pipeline/lib/tasks/load_clickhouse_entries.py @@ -0,0 +1,56 @@ +import json + +import hailtop.fs as hfs +import luigi +import luigi.util + +from loading_pipeline.lib.misc.clickhouse import ( + load_run_entries, +) +from loading_pipeline.lib.paths import ( + clickhouse_load_success_file_path, + metadata_for_run_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.load_clickhouse_variants import LoadClickhouseVariants + + +@luigi.util.inherits(BaseLoadingRunParams) +class LoadClickhouseEntries(luigi.Task): + attempt_id = luigi.IntParameter() + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + clickhouse_load_success_file_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def requires(self) -> luigi.Task: + return self.clone(LoadClickhouseVariants) + + def run(self): + with hfs.open( + metadata_for_run_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) as f: + family_guids = list(json.load(f)['family_samples'].keys()) + load_run_entries( + self.reference_genome, + self.dataset_type, + self.run_id, + # Note: nasty bug here where Luigi parses ListParameters to tuples. + list(self.project_guids), + family_guids, + ) + + with self.output().open('w') as f: + f.write('') diff --git a/loading_pipeline/lib/tasks/load_clickhouse_variants.py b/loading_pipeline/lib/tasks/load_clickhouse_variants.py new file mode 100644 index 0000000000..8534425293 --- /dev/null +++ b/loading_pipeline/lib/tasks/load_clickhouse_variants.py @@ -0,0 +1,41 @@ +import luigi +import luigi.util + +from loading_pipeline.lib.misc.clickhouse import ( + load_run_variants, +) +from loading_pipeline.lib.paths import ( + clickhouse_load_success_file_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_success_file import WriteSuccessFileTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class LoadClickhouseVariants(luigi.Task): + attempt_id = luigi.IntParameter() + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + clickhouse_load_success_file_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ).replace('_CLICKHOUSE_LOAD_SUCCESS', '_CLICKHOUSE_LOAD_VARIANTS_SUCCESS'), + ) + + def requires(self) -> luigi.Task: + return self.clone(WriteSuccessFileTask) + + def run(self): + load_run_variants( + self.reference_genome, + self.dataset_type, + self.run_id, + ) + + with self.output().open('w') as f: + f.write('') diff --git a/loading_pipeline/lib/tasks/reference_data/__init__.py b/loading_pipeline/lib/tasks/reference_data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/tasks/reference_data/updated_reference_dataset.py b/loading_pipeline/lib/tasks/reference_data/updated_reference_dataset.py new file mode 100644 index 0000000000..575cc1864f --- /dev/null +++ b/loading_pipeline/lib/tasks/reference_data/updated_reference_dataset.py @@ -0,0 +1,27 @@ +import luigi + +from loading_pipeline.lib.paths import valid_reference_dataset_path +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import GCSorLocalTarget + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class UpdatedReferenceDatasetTask(BaseWriteTask): + reference_dataset: ReferenceDataset = luigi.EnumParameter( + enum=ReferenceDataset, + ) + + def output(self): + return GCSorLocalTarget( + valid_reference_dataset_path( + self.reference_genome, + self.reference_dataset, + ), + ) + + def create_table(self): + return self.reference_dataset.get_ht(self.reference_genome) diff --git a/loading_pipeline/lib/tasks/reference_data/updated_reference_dataset_parquet.py b/loading_pipeline/lib/tasks/reference_data/updated_reference_dataset_parquet.py new file mode 100644 index 0000000000..ed8adfce6b --- /dev/null +++ b/loading_pipeline/lib/tasks/reference_data/updated_reference_dataset_parquet.py @@ -0,0 +1,55 @@ +import luigi + +from loading_pipeline.lib.annotations.expression_helpers import get_expr_for_variant_id +from loading_pipeline.lib.core.dataset_type import DatasetType +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.paths import reference_dataset_parquet +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.dataproc.base_run_job_on_dataproc import ( + BaseRunJobOnDataprocTask, +) +from loading_pipeline.lib.tasks.files import GCSorLocalFolderTarget, GCSorLocalTarget + + +class UpdatedReferenceDatasetParquetTask(luigi.Task): + reference_genome = luigi.EnumParameter(enum=ReferenceGenome) + dataset_type = luigi.EnumParameter(enum=DatasetType) + reference_dataset: ReferenceDataset = luigi.EnumParameter( + enum=ReferenceDataset, + ) + run_id = luigi.Parameter() + attempt_id = luigi.IntParameter() + + def complete(self) -> luigi.Target: + return GCSorLocalFolderTarget(self.output().path).exists() + + def output(self): + return GCSorLocalTarget( + reference_dataset_parquet( + self.reference_genome, + self.reference_dataset, + ), + ) + + def run(self): + ht = self.reference_dataset.get_ht(self.reference_genome) + ht = ht.annotate( + variant_id=get_expr_for_variant_id(ht), + ) + df = ht.to_spark(flatten=False) + df.write.parquet( + self.output().path, + mode='overwrite', + ) + + +class UpdatedReferenceDatasetParquetOnDataprocTask(BaseRunJobOnDataprocTask): + reference_genome = luigi.EnumParameter(enum=ReferenceGenome) + dataset_type = luigi.EnumParameter(enum=DatasetType) + reference_dataset: ReferenceDataset = luigi.EnumParameter( + enum=ReferenceDataset, + ) + + @property + def task(self) -> luigi.Task: + return UpdatedReferenceDatasetParquetTask diff --git a/loading_pipeline/lib/tasks/run_pipeline.py b/loading_pipeline/lib/tasks/run_pipeline.py new file mode 100644 index 0000000000..765ec92e65 --- /dev/null +++ b/loading_pipeline/lib/tasks/run_pipeline.py @@ -0,0 +1,33 @@ +import luigi +import luigi.util + +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.exports.write_new_entries_parquet import ( + WriteNewEntriesParquetTask, +) +from loading_pipeline.lib.tasks.exports.write_new_variant_details_parquet import ( + WriteNewVariantDetailsParquetTask, +) +from loading_pipeline.lib.tasks.exports.write_new_variants_parquet import ( + WriteNewVariantsParquetTask, +) +from loading_pipeline.lib.tasks.write_metadata_for_run import WriteMetadataForRunTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class RunPipelineTask(luigi.WrapperTask): + attempt_id = luigi.IntParameter() + + def requires(self): + return [ + self.clone(WriteMetadataForRunTask), + self.clone(WriteNewEntriesParquetTask), + self.clone(WriteNewVariantsParquetTask), + *( + [self.clone(WriteNewVariantDetailsParquetTask)] + if self.dataset_type.should_write_new_variant_details + else [] + ), + ] diff --git a/loading_pipeline/lib/tasks/validate_callset.py b/loading_pipeline/lib/tasks/validate_callset.py new file mode 100644 index 0000000000..7622bc0a03 --- /dev/null +++ b/loading_pipeline/lib/tasks/validate_callset.py @@ -0,0 +1,144 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.misc.validation import ( + ALL_VALIDATIONS, + SKIPPABLE_VALIDATIONS, + SeqrValidationError, +) +from loading_pipeline.lib.paths import ( + postprocessed_callset_path, + valid_reference_dataset_path, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.base.base_update import BaseUpdateTask +from loading_pipeline.lib.tasks.files import CallsetTask, GCSorLocalTarget +from loading_pipeline.lib.tasks.reference_data.updated_reference_dataset import ( + UpdatedReferenceDatasetTask, +) +from loading_pipeline.lib.tasks.write_postprocessed_callset import ( + WritePostprocessedCallsetTask, +) +from loading_pipeline.lib.tasks.write_validation_errors_for_run import ( + UpdatedValidationErrorsForRunTask, +) + +MAX_SNV_INDEL_ALLELE_LENGTH = 500 + + +@luigi.util.inherits(BaseLoadingRunParams) +class ValidateCallsetTask(BaseUpdateTask): + @property + def validation_dependencies(self) -> dict[str, hl.Table]: + deps = {} + if ( + ALL_VALIDATIONS not in self.validations_to_skip + and 'validate_sample_type' not in self.validations_to_skip + and self.dataset_type.can_run_validation + ): + deps['coding_and_noncoding_variants_ht'] = hl.read_table( + valid_reference_dataset_path( + self.reference_genome, + ReferenceDataset.gnomad_coding_and_noncoding, + ), + ) + return deps + + def complete(self) -> luigi.Target: + if super().complete(): + mt = hl.read_matrix_table(self.output().path) + return hasattr(mt, 'validated_sample_type') and hl.eval( + self.sample_type.value == mt.validated_sample_type, + ) + return False + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + postprocessed_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self) -> list[luigi.Task]: + requirements = [self.clone(WritePostprocessedCallsetTask)] + if ( + ALL_VALIDATIONS not in self.validations_to_skip + and 'validate_sample_type' not in self.validations_to_skip + and self.dataset_type.can_run_validation + ): + requirements = [ + *requirements, + ( + self.clone( + UpdatedReferenceDatasetTask, + reference_dataset=ReferenceDataset.gnomad_coding_and_noncoding, + ) + ), + ] + return [ + *requirements, + CallsetTask(self.callset_path), + ] + + def update_table(self, mt: hl.MatrixTable) -> hl.MatrixTable: + mt = hl.read_matrix_table( + postprocessed_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + if self.dataset_type.filter_invalid_sites: + mt = mt.filter_rows( + ( + # Rather than throwing an error, we silently remove invalid contigs. + # This happens fairly often for AnVIL requests. + hl.set(self.reference_genome.standard_contigs).contains( + mt.locus.contig, + ) + # DRAGEN callsets produce long alternate alleles + # that aren't particularly analyzable as INDELs. + & (hl.len(mt.alleles[1]) < MAX_SNV_INDEL_ALLELE_LENGTH) + ), + ) + + if ( + ALL_VALIDATIONS in self.validations_to_skip + or not self.dataset_type.can_run_validation + ): + return mt.select_globals( + callset_path=self.callset_path, + validated_sample_type=self.sample_type.value, + ) + validation_exceptions = [] + for validation_f in SKIPPABLE_VALIDATIONS: + try: + if validation_f.__name__ in self.validations_to_skip: + continue + validation_f( + mt, + **self.validation_dependencies, + **self.param_kwargs, + ) + except SeqrValidationError as e: + validation_exceptions.append(e) + if validation_exceptions: + updated_validation_errors_for_run_task = self.clone( + UpdatedValidationErrorsForRunTask, + error_messages=[e.msg for e in validation_exceptions], + error_body={ + k: v for e in validation_exceptions for k, v in e.error_body.items() + }, + ) + updated_validation_errors_for_run_task.run() + raise SeqrValidationError( + updated_validation_errors_for_run_task.to_single_error_message(), + ) + return mt.select_globals( + callset_path=self.callset_path, + validated_sample_type=self.sample_type.value, + ) diff --git a/loading_pipeline/lib/tasks/validate_callset_test.py b/loading_pipeline/lib/tasks/validate_callset_test.py new file mode 100644 index 0000000000..a56f78a894 --- /dev/null +++ b/loading_pipeline/lib/tasks/validate_callset_test.py @@ -0,0 +1,83 @@ +import json +import shutil + +import luigi.worker + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.paths import ( + valid_reference_dataset_path, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.validate_callset import ( + ValidateCallsetTask, +) +from loading_pipeline.lib.tasks.write_validation_errors_for_run import ( + UpdatedValidationErrorsForRunTask, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_CODING_AND_NONCODING_HT = 'loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht' +MULTIPLE_VALIDATION_EXCEPTIONS_VCF = ( + 'loading_pipeline/var/test/callsets/multiple_validation_exceptions.vcf' +) + +TEST_RUN_ID = 'manual__2024-04-03' + + +class ValidateCallsetTest(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + shutil.copytree( + TEST_CODING_AND_NONCODING_HT, + valid_reference_dataset_path( + ReferenceGenome.GRCh38, + ReferenceDataset.gnomad_coding_and_noncoding, + ), + ) + + def test_validate_callset_multiple_exceptions( + self, + ) -> None: + worker = luigi.worker.Worker() + validate_callset_task = ValidateCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WES, + # NB: + # This callset contains duplicate rows for chr1:902088, + # a NON_REF allele type at position chr1: 902024, missing + # all contigs but chr1, and contains non-coding variants. + callset_path=MULTIPLE_VALIDATION_EXCEPTIONS_VCF, + project_guids=['project_a'], + run_id=TEST_RUN_ID, + ) + worker.add(validate_callset_task) + worker.run() + self.assertFalse(validate_callset_task.complete()) + + updated_validation_errors_task = UpdatedValidationErrorsForRunTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WES, + callset_path=MULTIPLE_VALIDATION_EXCEPTIONS_VCF, + project_guids=['project_a'], + run_id=TEST_RUN_ID, + ) + self.assertTrue(updated_validation_errors_task.complete()) + with updated_validation_errors_task.output().open('r') as f: + self.assertDictEqual( + json.load(f), + { + 'project_guids': ['project_a'], + 'error_messages': [ + 'Alleles with invalid allele are present in the callset. This appears to be a GVCF containing records for sites with no variants.', + 'Missing the following expected contigs:chr10, chr11, chr12, chr13, chr14, chr15, chr16, chr17, chr18, chr19, chr2, chr20, chr21, chr22, chr3, chr4, chr5, chr6, chr7, chr8, chr9, chrX', + "Variants are present multiple times in the callset: ['1-902088-G-A']", + 'Sample type validation error: dataset sample-type is specified as WES but appears to be WGS because it contains many common non-coding variants', + ], + }, + ) diff --git a/loading_pipeline/lib/tasks/write_existing_variants_parquet.py b/loading_pipeline/lib/tasks/write_existing_variants_parquet.py new file mode 100644 index 0000000000..da89e0ce79 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_existing_variants_parquet.py @@ -0,0 +1,36 @@ +import luigi +import luigi.util + +from loading_pipeline.lib.misc.clickhouse import export_existing_variants_to_parquet +from loading_pipeline.lib.paths import existing_variants_parquet_path +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.exports.fields import get_existing_variants_export_field +from loading_pipeline.lib.tasks.files import ( + GCSorLocalTarget, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteExistingVariantsParquetTask(luigi.Task): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + existing_variants_parquet_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def complete(self) -> bool: + return self.output().exists() + + def run(self): + export_select_fields = get_existing_variants_export_field(self.dataset_type) + export_existing_variants_to_parquet( + self.reference_genome, + self.dataset_type, + self.run_id, + export_select_fields, + ) diff --git a/loading_pipeline/lib/tasks/write_existing_variants_parquet_test.py b/loading_pipeline/lib/tasks/write_existing_variants_parquet_test.py new file mode 100644 index 0000000000..1323c0b775 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_existing_variants_parquet_test.py @@ -0,0 +1,93 @@ +from typing import ClassVar + +import luigi.worker +import pandas as pd + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.paths import existing_variants_parquet_path +from loading_pipeline.lib.tasks.write_existing_variants_parquet import ( + WriteExistingVariantsParquetTask, +) +from loading_pipeline.lib.test.clickhouse_schema_testcase import ( + ClickhouseSchemaTestCase, +) +from loading_pipeline.lib.test.misc import convert_ndarray_to_list +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_RUN_ID = 'manual__2024-04-03' + + +class WriteExistingVariantsParquetTest( + MockedDatarootTestCase, + ClickhouseSchemaTestCase, +): + fixtures: ClassVar = ['clickhouse_test'] + + def _run_task( + self, + dataset_type: DatasetType, + reference_genome: ReferenceGenome = ReferenceGenome.GRCh38, + ) -> pd.DataFrame: + worker = luigi.worker.Worker() + task = WriteExistingVariantsParquetTask( + reference_genome=reference_genome, + dataset_type=dataset_type, + sample_type=SampleType.WGS, + callset_path='fake_callset', + run_id=TEST_RUN_ID, + ) + worker.add(task) + worker.run() + self.assertTrue(task.output().exists()) + self.assertTrue(task.complete()) + return pd.read_parquet( + existing_variants_parquet_path(reference_genome, dataset_type, TEST_RUN_ID), + ) + + def test_snv_indel(self): + df = self._run_task(DatasetType.SNV_INDEL) + self.assertEqual(list(df.columns), ['key_', 'variant_id', 'geneIds']) + df = df.sort_values('key_').reset_index(drop=True) + self.assertEqual( + convert_ndarray_to_list( + df[['key_', 'variant_id', 'geneIds']].to_dict('records'), + ), + [ + { + 'key_': 1, + 'variant_id': '1-878314-G-C', + 'geneIds': ['ENSG00000177000'], + }, + {'key_': 7, 'variant_id': '7-1234567-AGT-A', 'geneIds': []}, + {'key_': 10, 'variant_id': '10-987654-G-A', 'geneIds': []}, + ], + ) + + def test_grch37_snv_indel(self): + df = self._run_task( + DatasetType.SNV_INDEL, + reference_genome=ReferenceGenome.GRCh37, + ) + self.assertEqual(list(df.columns), ['key_', 'variant_id', 'geneIds']) + self.assertEqual(len(df), 0) + + def test_mito(self): + df = self._run_task(DatasetType.MITO) + self.assertEqual(list(df.columns), ['key_', 'variant_id']) + self.assertEqual(len(df), 0) + + def test_sv(self): + df = self._run_task(DatasetType.SV) + self.assertEqual( + list(df.columns), + ['key_', 'variant_id', 'xpos', 'end', 'endChrom', 'geneIds'], + ) + self.assertEqual(len(df), 0) + + def test_gcnv(self): + df = self._run_task(DatasetType.GCNV) + self.assertEqual( + list(df.columns), + ['key_', 'variant_id', 'xpos', 'start', 'end', 'num_exon', 'gene_ids'], + ) + self.assertEqual(len(df), 0) diff --git a/loading_pipeline/lib/tasks/write_imported_callset.py b/loading_pipeline/lib/tasks/write_imported_callset.py new file mode 100644 index 0000000000..99bf616614 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_imported_callset.py @@ -0,0 +1,82 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.misc.callsets import get_additional_row_fields +from loading_pipeline.lib.misc.io import ( + import_callset, + select_relevant_fields, +) +from loading_pipeline.lib.misc.validation import ( + validate_imported_field_types, +) +from loading_pipeline.lib.paths import ( + imported_callset_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import CallsetTask, GCSorLocalTarget +from loading_pipeline.lib.tasks.write_validation_errors_for_run import ( + with_persisted_validation_errors, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteImportedCallsetTask(BaseWriteTask): + def complete(self) -> luigi.Target: + if super().complete(): + mt = hl.read_matrix_table(self.output().path) + # Handle case where callset was previously imported + # with a different sex/relatedness flag. + additional_row_fields = get_additional_row_fields( + mt, + self.dataset_type, + self.skip_check_sex_and_relatedness, + ) + return all(hasattr(mt, field) for field in additional_row_fields) + return False + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + imported_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self) -> list[luigi.Task]: + return [ + CallsetTask(self.callset_path), + ] + + @with_persisted_validation_errors + def create_table(self) -> hl.MatrixTable: + # NB: throws SeqrValidationError + mt = import_callset( + self.callset_path, + self.reference_genome, + self.dataset_type, + ) + additional_row_fields = get_additional_row_fields( + mt, + self.dataset_type, + self.skip_check_sex_and_relatedness, + ) + # NB: throws SeqrValidationError + mt = select_relevant_fields( + mt, + self.dataset_type, + additional_row_fields, + ) + # This validation isn't override-able by the skip option. + # If a field is the wrong type, the pipeline will likely hard-fail downstream. + # NB: throws SeqrValidationError + validate_imported_field_types( + mt, + self.dataset_type, + additional_row_fields, + ) + return mt.select_globals( + callset_path=self.callset_path, + ) diff --git a/loading_pipeline/lib/tasks/write_metadata_for_run.py b/loading_pipeline/lib/tasks/write_metadata_for_run.py new file mode 100644 index 0000000000..7f0ade79c0 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_metadata_for_run.py @@ -0,0 +1,126 @@ +import json + +import hail as hl +import hailtop.fs as hfs +import luigi +import luigi.util + +from loading_pipeline.lib.core import FeatureFlag +from loading_pipeline.lib.paths import ( + metadata_for_run_path, + relatedness_check_tsv_path, + sample_qc_json_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset import ( + WriteRemappedAndSubsettedCallsetTask, +) +from loading_pipeline.lib.tasks.write_sample_qc_json import WriteSampleQCJsonTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteMetadataForRunTask(luigi.Task): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + metadata_for_run_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def requires(self) -> list[luigi.Task]: + requirements = [self.clone(WriteRemappedAndSubsettedCallsetTask)] + if ( + FeatureFlag.EXPECT_TDR_METRICS + and not self.skip_expect_tdr_metrics + and self.dataset_type.expect_tdr_metrics( + self.reference_genome, + ) + ): + requirements = [ + *requirements, + self.clone(WriteSampleQCJsonTask), + ] + return requirements + + def run(self) -> None: + metadata_json = { + 'callsets': [self.callset_path], + 'run_id': self.run_id, + 'sample_type': self.sample_type.value, + 'project_guids': self.project_guids, + 'family_samples': {}, + 'failed_family_samples': { + 'missing_samples': {}, + 'relatedness_check': {}, + 'sex_check': {}, + 'ploidy_check': {}, + }, + 'relatedness_check_file_path': relatedness_check_tsv_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + 'sample_qc': {}, + } + callset_mt = hl.read_matrix_table(self.input()[0].path) + collected_globals = callset_mt.globals.collect()[0] + metadata_json['family_samples'] = collected_globals['family_samples'] + sample_qc_loadable_samples = { + sample + for family_samples in collected_globals['family_samples'].values() + for sample in family_samples + } + for key in [ + 'missing_samples', + 'relatedness_check', + 'sex_check', + 'ploidy_check', + ]: + metadata_json['failed_family_samples'][key] = collected_globals[ + 'failed_family_samples' + ][key] + sample_qc_loadable_samples = { + *{ + sample + for meta in collected_globals['failed_family_samples'][key].values() + for sample in meta['samples'] + }, + *sample_qc_loadable_samples, + } + if ( + FeatureFlag.EXPECT_TDR_METRICS + and not self.skip_expect_tdr_metrics + and self.dataset_type.expect_tdr_metrics( + self.reference_genome, + ) + ): + with hfs.open( + sample_qc_json_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) as f: + metadata_json['sample_qc'] = { + k: v + for k, v in json.load(f).items() + if k in sample_qc_loadable_samples + } + if not metadata_json['family_samples']: + msg = 'Found no loadable families in the callset.' + raise RuntimeError(msg) + empty_families = [ + family_guid + for family_guid, samples in metadata_json['family_samples'].items() + if not samples + ] + if empty_families: + msg = f'Found families with no loadable samples: {sorted(empty_families)}' + raise RuntimeError(msg) + with self.output().open('w') as f: + json.dump(metadata_json, f) diff --git a/loading_pipeline/lib/tasks/write_metadata_for_run_test.py b/loading_pipeline/lib/tasks/write_metadata_for_run_test.py new file mode 100644 index 0000000000..2b5dc7a22d --- /dev/null +++ b/loading_pipeline/lib/tasks/write_metadata_for_run_test.py @@ -0,0 +1,188 @@ +import json +from unittest import mock +from unittest.mock import Mock + +import luigi.worker + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS +from loading_pipeline.lib.paths import relatedness_check_tsv_path +from loading_pipeline.lib.tasks.write_metadata_for_run import WriteMetadataForRunTask +from loading_pipeline.lib.test.misc import copy_project_pedigree_to_mocked_dir +from loading_pipeline.lib.test.mock_complete_task import MockCompleteTask +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_PEDIGREE_4_REMAP_2 = ( + 'loading_pipeline/var/test/pedigrees/test_pedigree_4_remap_2.tsv' +) +TEST_SAMPLE_QC_JSON = 'loading_pipeline/var/test/sample_qc_1.json' + + +class WriteMetadataForRunTaskTest(MockedDatarootTestCase): + @mock.patch( + 'loading_pipeline.lib.tasks.write_metadata_for_run.sample_qc_json_path', + lambda *_: TEST_SAMPLE_QC_JSON, + ) + @mock.patch('loading_pipeline.lib.tasks.write_metadata_for_run.FeatureFlag') + @mock.patch( + 'loading_pipeline.lib.tasks.write_sex_check_table.WriteTDRMetricsFilesTask', + ) + @mock.patch( + 'loading_pipeline.lib.tasks.write_metadata_for_run.WriteSampleQCJsonTask', + ) + def test_write_metadata_for_run_task( + self, + write_sample_qc_json_task: Mock, + write_tdr_metrics_task: Mock, + mock_ff: Mock, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_4_REMAP_2, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + mock_ff.EXPECT_TDR_METRICS = True + write_tdr_metrics_task.return_value = MockCompleteTask() + write_sample_qc_json_task.return_value = MockCompleteTask() + worker = luigi.worker.Worker() + write_metadata_for_run_task = WriteMetadataForRunTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0113_test_project', 'R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + run_id='run_123456', + ) + worker.add(write_metadata_for_run_task) + worker.run() + self.assertTrue( + 'run_123456/metadata.json' in write_metadata_for_run_task.output().path, + ) + self.assertTrue(write_metadata_for_run_task.complete()) + with write_metadata_for_run_task.output().open('r') as f: + self.assertDictEqual( + json.load(f), + { + 'callsets': [TEST_VCF], + 'project_guids': ['R0113_test_project', 'R0114_project4'], + 'failed_family_samples': { + 'missing_samples': { + 'efg_1': { + # This sample is present in the callset, but intentionally + # mapped away + 'samples': ['NA20888_1'], + 'reasons': ["Missing samples: {'NA20888_1'}"], + }, + }, + 'relatedness_check': {}, + 'sex_check': {}, + 'ploidy_check': {}, + }, + 'family_samples': { + 'abc_1': [ + 'HG00731_1', + 'HG00732_1', + 'HG00733_1', + ], + '123_1': ['NA19675_1'], + '234_1': ['NA19678_1'], + '345_1': ['NA19679_1'], + '456_1': ['NA20870_1'], + '567_1': ['NA20872_1'], + '678_1': ['NA20874_1'], + '789_1': ['NA20875_1'], + '890_1': ['NA20876_1'], + '901_1': ['NA20877_1'], + 'bcd_1': ['NA20878_1'], + 'cde_1': ['NA20881_1'], + 'def_1': ['NA20885_1'], + }, + 'run_id': 'run_123456', + 'sample_type': SampleType.WGS.value, + 'relatedness_check_file_path': relatedness_check_tsv_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + 'sample_qc': { + 'HG00731_1': {'filter_flags': ['coverage', 'contamination']}, + 'HG00732_1': {'filter_flags': ['coverage']}, + 'HG00733_1': {'filter_flags': ['contamination']}, + 'NA19675_1': {'filter_flags': []}, + 'NA20888_1': {'filter_flags': ['sample_failed']}, + }, + }, + ) + + @mock.patch('loading_pipeline.lib.tasks.write_metadata_for_run.FeatureFlag') + def test_write_metadata_for_run_task_without_tdr_metrics( + self, + mock_ff: Mock, + ) -> None: + # When WriteSampleQCJsonTask is not a requirement, every project's + # remapped and subsetted callset must still be collected. + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_4_REMAP_2, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + mock_ff.EXPECT_TDR_METRICS = False + worker = luigi.worker.Worker() + write_metadata_for_run_task = WriteMetadataForRunTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0113_test_project', 'R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + run_id='run_123457', + ) + worker.add(write_metadata_for_run_task) + worker.run() + self.assertTrue(write_metadata_for_run_task.complete()) + with write_metadata_for_run_task.output().open('r') as f: + metadata_json = json.load(f) + self.assertDictEqual( + metadata_json['family_samples'], + { + 'abc_1': [ + 'HG00731_1', + 'HG00732_1', + 'HG00733_1', + ], + '123_1': ['NA19675_1'], + '234_1': ['NA19678_1'], + '345_1': ['NA19679_1'], + '456_1': ['NA20870_1'], + '567_1': ['NA20872_1'], + '678_1': ['NA20874_1'], + '789_1': ['NA20875_1'], + '890_1': ['NA20876_1'], + '901_1': ['NA20877_1'], + 'bcd_1': ['NA20878_1'], + 'cde_1': ['NA20881_1'], + 'def_1': ['NA20885_1'], + }, + ) + self.assertDictEqual(metadata_json['sample_qc'], {}) diff --git a/loading_pipeline/lib/tasks/write_new_variants_table.py b/loading_pipeline/lib/tasks/write_new_variants_table.py new file mode 100644 index 0000000000..18c8887716 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_new_variants_table.py @@ -0,0 +1,201 @@ +import math + +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.annotations.fields import get_fields +from loading_pipeline.lib.misc.io import checkpoint, import_parquet, remap_pedigree_hash +from loading_pipeline.lib.misc.math import constrain +from loading_pipeline.lib.misc.vep import run_vep +from loading_pipeline.lib.paths import ( + existing_variants_parquet_path, + new_variants_table_path, + project_pedigree_path, + remapped_and_subsetted_callset_path, + valid_reference_dataset_path, +) +from loading_pipeline.lib.reference_datasets.gencode.mapping_gene_ids import ( + load_gencode_ensembl_to_refseq_id, + load_gencode_gene_symbol_to_gene_id, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_existing_variants_parquet import ( + WriteExistingVariantsParquetTask, +) +from loading_pipeline.lib.tasks.write_metadata_for_run import ( + WriteMetadataForRunTask, +) + +VARIANTS_PER_VEP_PARTITION = 1e3 +MIN_PARTITIONS = 10 +MAX_PARTITIONS = 10000 +GENCODE_RELEASE = 42 +GENCODE_FOR_VEP_RELEASE = 44 + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteNewVariantsTableTask(BaseWriteTask): + @property + def annotation_dependencies(self) -> dict[str, hl.Table]: + deps = {} + for reference_dataset in ReferenceDataset: + if ( + reference_dataset.formatting_annotation + and self.dataset_type + in reference_dataset.dataset_types(self.reference_genome) + ): + deps[f'{reference_dataset.value}_ht'] = hl.read_table( + valid_reference_dataset_path( + self.reference_genome, + reference_dataset, + ), + ) + + if self.dataset_type.has_gencode_ensembl_to_refseq_id_mapping( + self.reference_genome, + ): + deps['gencode_ensembl_to_refseq_id_mapping'] = hl.literal( + load_gencode_ensembl_to_refseq_id(GENCODE_FOR_VEP_RELEASE), + ) + if self.dataset_type.has_gencode_gene_symbol_to_gene_id_mapping: + deps['gencode_gene_symbol_to_gene_id_mapping'] = hl.literal( + load_gencode_gene_symbol_to_gene_id(GENCODE_RELEASE), + ) + return deps + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + new_variants_table_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def requires(self) -> list[luigi.Task]: + return [ + self.clone(WriteMetadataForRunTask), + self.clone(WriteExistingVariantsParquetTask), + ] + + def complete(self) -> bool: + return super().complete() and hl.eval( + hl.bind( + lambda updates: hl.all( + [ + updates.contains( + hl.Struct( + callset=self.callset_path, + project_guid=project_guid, + remap_pedigree_hash=remap_pedigree_hash( + project_pedigree_path( + self.reference_genome, + self.dataset_type, + self.sample_type, + project_guid, + ), + ), + ), + ) + for project_guid in self.project_guids + ], + ), + hl.read_table(self.output().path).updates, + ), + ) + + def create_table(self) -> hl.Table: + callset_ht = hl.read_matrix_table( + remapped_and_subsetted_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ).rows() + + # 1) Identify new variants. + annotations_ht = import_parquet( + existing_variants_parquet_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + self.reference_genome, + self.dataset_type, + ) + curr_max_key_ = annotations_ht.aggregate(hl.agg.max(annotations_ht.key_)) or -1 + new_variants_ht = callset_ht.repartition( + # Repartition this join to improve performance + constrain( + callset_ht.n_partitions() * 100, + MIN_PARTITIONS, + MAX_PARTITIONS, + ), + ).anti_join(annotations_ht) + + # Annotate new variants with VEP. + # Note about the repartition: our work here is cpu/memory bound and + # proportional to the number of new variants. Our default partitioning + # will under-partition in that regard, so we split up our work + # with a partitioning scheme local to this task. + new_variants_count = new_variants_ht.count() + new_variants_ht = new_variants_ht.repartition( + constrain( + math.ceil(new_variants_count / VARIANTS_PER_VEP_PARTITION), + MIN_PARTITIONS, + MAX_PARTITIONS, + ), + ) + new_variants_ht = run_vep( + new_variants_ht, + self.dataset_type, + self.reference_genome, + ) + # Adding an arbitrary checkpoint here, seems to help + new_variants_ht, _ = checkpoint(new_variants_ht) + + # An additional call to "distinct()" as a safety measure. + # At least one case a duplicate variants has slipped through + # this method, with the best hypothesis being that + # the combination of VEP/repartition is potentially unsafe. + new_variants_ht = new_variants_ht.distinct() + + # Select down to the formatting annotations fields and + # any reference dataset collection annotations. + new_variants_ht = new_variants_ht.select( + **get_fields( + new_variants_ht, + self.dataset_type.formatting_annotation_fns(self.reference_genome), + **self.annotation_dependencies, + **self.param_kwargs, + ), + ) + + # Add serial integer index + new_variants_ht = new_variants_ht.add_index(name='key_') + new_variants_ht = new_variants_ht.transmute( + key_=new_variants_ht.key_ + curr_max_key_ + 1, + ) + return new_variants_ht.annotate_globals( + updates={ + hl.Struct( + callset=self.callset_path, + project_guid=project_guid, + remap_pedigree_hash=remap_pedigree_hash( + project_pedigree_path( + self.reference_genome, + self.dataset_type, + self.sample_type, + project_guid, + ), + ), + ) + for project_guid in self.project_guids + }, + ) diff --git a/loading_pipeline/lib/tasks/write_postprocessed_callset.py b/loading_pipeline/lib/tasks/write_postprocessed_callset.py new file mode 100644 index 0000000000..0baa46d941 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_postprocessed_callset.py @@ -0,0 +1,105 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.misc.callsets import get_additional_row_fields +from loading_pipeline.lib.misc.io import ( + import_parquet, + split_multi_hts, +) +from loading_pipeline.lib.misc.sv import deduplicate_merged_sv_concordance_calls +from loading_pipeline.lib.misc.vets import annotate_vets +from loading_pipeline.lib.paths import ( + existing_variants_parquet_path, + imported_callset_path, + postprocessed_callset_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_existing_variants_parquet import ( + WriteExistingVariantsParquetTask, +) +from loading_pipeline.lib.tasks.write_imported_callset import WriteImportedCallsetTask +from loading_pipeline.lib.tasks.write_validation_errors_for_run import ( + with_persisted_validation_errors, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WritePostprocessedCallsetTask(BaseWriteTask): + def complete(self) -> luigi.Target: + if super().complete(): + mt = hl.read_matrix_table(self.output().path) + # Handle case where callset was previously imported + # with a different sex/relatedness flag. + additional_row_fields = get_additional_row_fields( + mt, + self.dataset_type, + self.skip_check_sex_and_relatedness, + ) + return all(hasattr(mt, field) for field in additional_row_fields) + return False + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + postprocessed_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self) -> list[luigi.Task]: + requires = [self.clone(WriteImportedCallsetTask)] + if self.dataset_type.re_key_by_seqr_internal_truth_vid: + requires.append(self.clone(WriteExistingVariantsParquetTask)) + return requires + + @with_persisted_validation_errors + def create_table(self) -> hl.MatrixTable: + mt = hl.read_matrix_table( + imported_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + if self.dataset_type.has_multi_allelic_variants: + # NB: throws SeqrValidationError + mt = split_multi_hts( + mt, + 'validate_no_duplicate_variants' in self.validations_to_skip, + ) + if self.dataset_type.re_key_by_seqr_internal_truth_vid and hasattr( + mt, + 'info.SEQR_INTERNAL_TRUTH_VID', + ): + mt = deduplicate_merged_sv_concordance_calls( + mt, + import_parquet( + existing_variants_parquet_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + self.reference_genome, + self.dataset_type, + ), + ) + mt = mt.key_rows_by( + variant_id=hl.if_else( + hl.is_defined(mt['info.SEQR_INTERNAL_TRUTH_VID']), + mt['info.SEQR_INTERNAL_TRUTH_VID'], + mt.variant_id, + ), + ) + + # Special handling of variant-level filter annotation for VETs filters. + # The annotations are present on the sample-level FT field but are + # expected upstream on "filters". + mt = annotate_vets(mt) + return mt.select_globals( + callset_path=self.callset_path, + ) diff --git a/loading_pipeline/lib/tasks/write_relatedness_check_table.py b/loading_pipeline/lib/tasks/write_relatedness_check_table.py new file mode 100644 index 0000000000..579edc6f2f --- /dev/null +++ b/loading_pipeline/lib/tasks/write_relatedness_check_table.py @@ -0,0 +1,44 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.methods.relatedness import call_relatedness +from loading_pipeline.lib.paths import ( + relatedness_check_table_path, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.reference_data.updated_reference_dataset import ( + UpdatedReferenceDatasetTask, +) +from loading_pipeline.lib.tasks.validate_callset import ValidateCallsetTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteRelatednessCheckTableTask(BaseWriteTask): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + relatedness_check_table_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self): + return [ + self.clone(ValidateCallsetTask), + self.clone( + UpdatedReferenceDatasetTask, + reference_dataset=ReferenceDataset.gnomad_qc, + ), + ] + + def create_table(self) -> hl.Table: + callset_mt = hl.read_matrix_table(self.input()[0].path) + return call_relatedness( + callset_mt, + hl.read_table(self.input()[1].path) if len(self.input()) > 1 else None, + ) diff --git a/loading_pipeline/lib/tasks/write_relatedness_check_table_test.py b/loading_pipeline/lib/tasks/write_relatedness_check_table_test.py new file mode 100644 index 0000000000..7cc814a5fa --- /dev/null +++ b/loading_pipeline/lib/tasks/write_relatedness_check_table_test.py @@ -0,0 +1,120 @@ +import shutil +from unittest.mock import patch + +import hail as hl +import luigi.worker + +from loading_pipeline.lib.core import ( + DatasetType, + ReferenceGenome, + SampleType, +) +from loading_pipeline.lib.misc.io import import_vcf +from loading_pipeline.lib.paths import ( + postprocessed_callset_path, + relatedness_check_table_path, + valid_reference_dataset_path, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.write_relatedness_check_table import ( + WriteRelatednessCheckTableTask, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_GNOMAD_QC_HT = ( + 'loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht' +) +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_RUN_ID = 'manual__2024-04-03' + + +class WriteRelatednessCheckTableTaskTest(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + shutil.copytree( + TEST_GNOMAD_QC_HT, + valid_reference_dataset_path( + ReferenceGenome.GRCh38, + ReferenceDataset.gnomad_qc, + ), + ) + + # Force imported callset to be complete + ht = import_vcf(TEST_VCF, ReferenceGenome.GRCh38) + ht = ht.annotate_globals(validated_sample_type=SampleType.WGS.value) + ht = ht.annotate_rows(**{'info.AF': ht.info.AF}) + ht.write( + postprocessed_callset_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + ) + + def test_relatedness_check_table_task_gnomad_qc_updated( + self, + ) -> None: + self.assertEqual( + hl.eval( + hl.read_table( + valid_reference_dataset_path( + ReferenceGenome.GRCh38, + ReferenceDataset.gnomad_qc, + ), + ).version, + ), + '1.0', + ) + with ( + patch.object( + ReferenceDataset, + 'version', + return_value='2.0', + ), + patch.object( + ReferenceDataset, + 'get_ht', + lambda *_: hl.Table.parallelize( + [], + hl.tstruct( + locus=hl.tlocus('GRCh38'), + alleles=hl.tarray(hl.tstr), + ), + key=['locus', 'alleles'], + globals=hl.Struct(version='2.0'), + ), + ), + ): + worker = luigi.worker.Worker() + task = WriteRelatednessCheckTableTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + ) + worker.add(task) + worker.run() + self.assertTrue(task.complete()) + self.assertEqual( + hl.eval( + hl.read_table( + valid_reference_dataset_path( + ReferenceGenome.GRCh38, + ReferenceDataset.gnomad_qc, + ), + ).version, + ), + '2.0', + ) + ht = hl.read_table( + relatedness_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + ) + self.assertEqual( + ht.collect(), + [], + ) diff --git a/loading_pipeline/lib/tasks/write_relatedness_check_tsv.py b/loading_pipeline/lib/tasks/write_relatedness_check_tsv.py new file mode 100644 index 0000000000..07210e2620 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_relatedness_check_tsv.py @@ -0,0 +1,29 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.paths import relatedness_check_tsv_path +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_relatedness_check_table import ( + WriteRelatednessCheckTableTask, +) + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteRelatednessCheckTsvTask(luigi.Task): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + relatedness_check_tsv_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self): + return [self.clone(WriteRelatednessCheckTableTask)] + + def run(self): + ht = hl.read_table(self.input()[0].path) + ht.export(self.output().path) diff --git a/loading_pipeline/lib/tasks/write_relatedness_check_tsv_test.py b/loading_pipeline/lib/tasks/write_relatedness_check_tsv_test.py new file mode 100644 index 0000000000..35a9956f78 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_relatedness_check_tsv_test.py @@ -0,0 +1,53 @@ +import shutil + +import luigi.worker + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.paths import relatedness_check_table_path +from loading_pipeline.lib.tasks.write_relatedness_check_tsv import ( + WriteRelatednessCheckTsvTask, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_RELATEDNESS_CHECK_1 = ( + 'loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht' +) +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_RUN_ID = 'manual__2024-04-03' + + +class WriteRelatednessCheckTsvTaskTest(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + shutil.copytree( + TEST_RELATEDNESS_CHECK_1, + relatedness_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + ) + + def test_write_relatedness_check_tsv_task( + self, + ) -> None: + worker = luigi.worker.Worker() + task = WriteRelatednessCheckTsvTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + callset_path=TEST_VCF, + run_id=TEST_RUN_ID, + sample_type=SampleType.WES, + ) + worker.add(task) + worker.run() + self.assertTrue(task.complete()) + with task.output().open('r') as f: + lines = f.readlines() + expected_lines = [ + 'i\tj\tibd0\tibd1\tibd2\tpi_hat\n', + 'HG00731_1\tHG00733_1\t0\t1\t0\t5.0000e-01\n', + 'HG00732_1\tHG00733_1\t0\t1\t0\t5.0000e-01\n', + ] + for expected_line, actual_line in zip(expected_lines, lines, strict=False): + self.assertEqual(expected_line, actual_line) diff --git a/loading_pipeline/lib/tasks/write_remapped_and_subsetted_callset.py b/loading_pipeline/lib/tasks/write_remapped_and_subsetted_callset.py new file mode 100644 index 0000000000..b0e3c74b4f --- /dev/null +++ b/loading_pipeline/lib/tasks/write_remapped_and_subsetted_callset.py @@ -0,0 +1,272 @@ +import hail as hl +import luigi +import luigi.util + +from loading_pipeline.lib.core.feature_flag import FeatureFlag +from loading_pipeline.lib.misc.family_loading_failures import ( + get_families_failed_imputed_sex_ploidy, + get_families_failed_missing_samples, + get_families_failed_relatedness_check, + get_families_failed_sex_check, +) +from loading_pipeline.lib.misc.io import ( + import_pedigree, + remap_pedigree_hash, +) +from loading_pipeline.lib.misc.pedigree import ( + parse_pedigree_ht_to_families, + parse_pedigree_ht_to_remap_ht, +) +from loading_pipeline.lib.misc.sample_ids import remap_sample_ids, subset_samples +from loading_pipeline.lib.misc.sv import overwrite_male_non_par_calls +from loading_pipeline.lib.misc.validation import SeqrValidationError +from loading_pipeline.lib.paths import ( + project_pedigree_path, + relatedness_check_table_path, + remapped_and_subsetted_callset_path, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import GCSorLocalTarget, RawFileTask +from loading_pipeline.lib.tasks.validate_callset import ValidateCallsetTask +from loading_pipeline.lib.tasks.write_relatedness_check_tsv import ( + WriteRelatednessCheckTsvTask, +) +from loading_pipeline.lib.tasks.write_sex_check_table import WriteSexCheckTableTask +from loading_pipeline.lib.tasks.write_validation_errors_for_run import ( + with_persisted_validation_errors, +) + + +def format_failures(failed_families): + return { + f.family_guid: { + 'samples': sorted(f.samples.keys()), + 'reasons': reasons, + } + for f, reasons in failed_families.items() + } + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteRemappedAndSubsettedCallsetTask(BaseWriteTask): + def complete(self) -> luigi.Target: + if not super().complete(): + return False + mt = hl.read_matrix_table(self.output().path) + return ( + bool( + hl.eval(mt.globals.family_samples), + ) + and len(hl.eval(mt.globals.remap_pedigree_hashes)) + == len(self.project_guids) + and all( + hl.eval( + mt.globals.remap_pedigree_hashes[i] + == remap_pedigree_hash( + project_pedigree_path( + self.reference_genome, + self.dataset_type, + self.sample_type, + project_guid, + ), + ), + ) + for i, project_guid in enumerate(self.project_guids) + ) + ) + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + remapped_and_subsetted_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self) -> list[luigi.Task]: + requirements = [ + self.clone(ValidateCallsetTask), + ] + requirements += [ + RawFileTask( + project_pedigree_path( + self.reference_genome, + self.dataset_type, + self.sample_type, + project_guid, + ), + ) + for project_guid in self.project_guids + ] + if ( + FeatureFlag.CHECK_SEX_AND_RELATEDNESS + and self.dataset_type.check_sex_and_relatedness + and not self.skip_check_sex_and_relatedness + ): + requirements = [ + *requirements, + self.clone(WriteRelatednessCheckTsvTask), + self.clone(WriteSexCheckTableTask), + ] + return requirements + + @with_persisted_validation_errors + def create_table(self) -> hl.MatrixTable: + callset_mt = hl.read_matrix_table(self.input()[0].path) + + # Remap, but only if the remap file is present! + remap_ht = None + project_families = {} + for i, project_guid in enumerate(self.project_guids): + pedigree_ht = import_pedigree(self.input()[i + 1].path) + if 'remap_id' in pedigree_ht.row: + project_remap_ht = parse_pedigree_ht_to_remap_ht(pedigree_ht) + remap_ht = ( + remap_ht.union(project_remap_ht) + if remap_ht is not None + else project_remap_ht + ) + + project_families[project_guid] = parse_pedigree_ht_to_families(pedigree_ht) + + if remap_ht is not None: + callset_mt = remap_sample_ids( + callset_mt, + remap_ht, + ) + + families = {f for families in project_families.values() for f in families} + families_failed_missing_samples = get_families_failed_missing_samples( + callset_mt, + families, + ) + families_failed_relatedness_check = {} + families_failed_sex_check = {} + families_failed_imputed_sex_ploidy = {} + if ( + FeatureFlag.CHECK_SEX_AND_RELATEDNESS + and self.dataset_type.check_sex_and_relatedness + and not self.skip_check_sex_and_relatedness + ): + remap_lookup = ( + hl.dict( + {r.s: r.seqr_id for r in remap_ht.collect()}, + ) + if remap_ht is not None + else hl.empty_dict(hl.tstr, hl.tstr) + ) + relatedness_check_ht = hl.read_table( + relatedness_check_table_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + sex_check_ht = hl.read_table(self.input()[-1].path) + families_failed_relatedness_check = get_families_failed_relatedness_check( + families - families_failed_missing_samples.keys(), + relatedness_check_ht, + remap_lookup, + ) + families_failed_imputed_sex_ploidy = get_families_failed_imputed_sex_ploidy( + families + - families_failed_missing_samples.keys() + - families_failed_relatedness_check.keys(), + callset_mt, + sex_check_ht, + ) + families_failed_sex_check = get_families_failed_sex_check( + families + - families_failed_missing_samples.keys() + - families_failed_relatedness_check.keys() + - families_failed_imputed_sex_ploidy.keys(), + sex_check_ht, + remap_lookup, + ) + + loadable_families = ( + families + - families_failed_missing_samples.keys() + - families_failed_relatedness_check.keys() + - families_failed_sex_check.keys() + - families_failed_imputed_sex_ploidy.keys() + ) + if not len(loadable_families): + msg = 'All families failed validation checks' + raise SeqrValidationError( + msg, + { + 'failed_family_samples': { + 'missing_samples': format_failures( + families_failed_missing_samples, + ), + 'relatedness_check': format_failures( + families_failed_relatedness_check, + ), + 'sex_check': format_failures(families_failed_sex_check), + 'ploidy_check': format_failures( + families_failed_imputed_sex_ploidy, + ), + }, + }, + ) + + mt = subset_samples( + callset_mt, + hl.Table.parallelize( + [ + {'s': sample_id} + for family in loadable_families + for sample_id in family.samples + ], + hl.tstruct(s=hl.dtype('str')), + key='s', + ), + ) + + if self.dataset_type.overwrite_male_non_par_calls: + mt = overwrite_male_non_par_calls(mt, loadable_families) + return mt.select_globals( + remap_pedigree_hashes=[ + remap_pedigree_hash( + project_pedigree_path( + self.reference_genome, + self.dataset_type, + self.sample_type, + project_guid, + ), + ) + for project_guid in self.project_guids + ], + family_samples=( + { + f.family_guid: sorted(f.samples.keys()) + for f in loadable_families + or hl.empty_dict(hl.tstr, hl.tarray(hl.tstr)) + } + ), + failed_family_samples=hl.Struct( + missing_samples=( + format_failures(families_failed_missing_samples) + or hl.empty_dict(hl.tstr, hl.tdict(hl.tstr, hl.tarray(hl.tstr))) + ), + relatedness_check=( + format_failures(families_failed_relatedness_check) + or hl.empty_dict(hl.tstr, hl.tdict(hl.tstr, hl.tarray(hl.tstr))) + ), + sex_check=( + format_failures(families_failed_sex_check) + or hl.empty_dict(hl.tstr, hl.tdict(hl.tstr, hl.tarray(hl.tstr))) + ), + ploidy_check=( + format_failures(families_failed_imputed_sex_ploidy) + or hl.empty_dict(hl.tstr, hl.tdict(hl.tstr, hl.tarray(hl.tstr))) + ), + ), + project_families={ + project_guid: sorted([f.family_guid for f in families]) + for project_guid, families in project_families.items() + }, + ) diff --git a/loading_pipeline/lib/tasks/write_remapped_and_subsetted_callset_test.py b/loading_pipeline/lib/tasks/write_remapped_and_subsetted_callset_test.py new file mode 100644 index 0000000000..b4c4e66284 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_remapped_and_subsetted_callset_test.py @@ -0,0 +1,568 @@ +import json +import shutil +from unittest.mock import Mock, patch + +import hail as hl +import luigi.worker + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.misc.io import remap_pedigree_hash +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS +from loading_pipeline.lib.paths import ( + relatedness_check_table_path, + sex_check_table_path, +) +from loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset import ( + WriteRemappedAndSubsettedCallsetTask, +) +from loading_pipeline.lib.tasks.write_validation_errors_for_run import ( + UpdatedValidationErrorsForRunTask, +) +from loading_pipeline.lib.test.misc import copy_project_pedigree_to_mocked_dir +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_PEDIGREE_3_DIFFERENT_FAMILIES = ( + 'loading_pipeline/var/test/pedigrees/test_pedigree_3_different_families.tsv' +) +TEST_PEDIGREE_4_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_4_remap.tsv' +TEST_PEDIGREE_4_REMAP_2 = ( + 'loading_pipeline/var/test/pedigrees/test_pedigree_4_remap_2.tsv' +) +TEST_PEDIGREE_7 = 'loading_pipeline/var/test/pedigrees/test_pedigree_7.tsv' +TEST_SEX_CHECK_1 = 'loading_pipeline/var/test/sex_check/test_sex_check_1.ht' +TEST_RELATEDNESS_CHECK_1 = ( + 'loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht' +) + +TEST_RUN_ID = 'manual__2024-04-03' + + +class WriteRemappedAndSubsettedCallsetTaskTest(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + # +-------------+---------------+ + # | s | predicted_sex | + # +-------------+---------------+ + # | str | str | + # +-------------+---------------+ + # | "HG00731_1" | "F" | + # | "HG00732_1" | "M" | + # | "HG00733_1" | "F" | + # | "NA19675_1" | "F" | + # | "NA19678_1" | "M" | + # | "NA19679_1" | "F" | + # | "NA20870_1" | "F" | + # | "NA20872_1" | "M" | + # | "NA20874_1" | "F" | + # | "NA20875_1" | "F" | + # | "NA20876_1" | "F" | + # | "NA20877_1" | "F" | + # | "NA20878_1" | "M" | + # | "NA20881_1" | "M" | + # | "NA20885_1" | "F" | + # | "NA20888_1" | "F" | + # +-------------+---------------+ + shutil.copytree( + TEST_SEX_CHECK_1, + sex_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + ) + # +-------------+-------------+-------+-------+-------+----------+ + # | i | j | ibd0 | ibd1 | ibd2 | pi_hat | + # +-------------+-------------+-------+-------+-------+----------+ + # | str | str | int32 | int32 | int32 | float64 | + # +-------------+-------------+-------+-------+-------+----------+ + # | "HG00731_1" | "HG00733_1" | 0 | 1 | 0 | 5.00e-01 | + # | "HG00732_1" | "HG00733_1" | 0 | 1 | 0 | 5.00e-01 | + # +-------------+-------------+-------+-------+-------+----------+ + shutil.copytree( + TEST_RELATEDNESS_CHECK_1, + relatedness_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + TEST_VCF, + ), + ) + + def test_write_remapped_and_subsetted_callset_task( + self, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + worker = luigi.worker.Worker() + wrsc_task = WriteRemappedAndSubsettedCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0113_test_project'], + validations_to_skip=[ALL_VALIDATIONS], + skip_expect_tdr_metrics=True, + ) + worker.add(wrsc_task) + worker.run() + self.assertTrue(wrsc_task.complete()) + mt = hl.read_matrix_table(wrsc_task.output().path) + self.assertEqual(mt.count(), (30, 3)) + self.assertEqual( + mt.globals.collect(), + [ + hl.Struct( + remap_pedigree_hashes=[ + hl.eval( + remap_pedigree_hash( + TEST_PEDIGREE_3_REMAP, + ), + ), + ], + failed_family_samples=hl.Struct( + missing_samples={}, + relatedness_check={}, + sex_check={}, + ploidy_check={}, + ), + family_samples={'abc_1': ['HG00731_1', 'HG00732_1', 'HG00733_1']}, + project_families={'R0113_test_project': ['abc_1']}, + ), + ], + ) + + @patch( + 'loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset.FeatureFlag', + ) + def test_write_remapped_and_subsetted_callset_task_failed_some_family_checks( + self, + mock_ff: Mock, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_4_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + mock_ff.CHECK_SEX_AND_RELATEDNESS = True + worker = luigi.worker.Worker() + wrsc_task = WriteRemappedAndSubsettedCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + skip_expect_tdr_metrics=True, + ) + worker.add(wrsc_task) + worker.run() + self.assertTrue(wrsc_task.complete()) + mt = hl.read_matrix_table(wrsc_task.output().path) + # NB: one "family"/"sample" has been removed because of a failed sex check, + # and 4 removed because of a failed ploidy check! + self.assertEqual(mt.count(), (30, 8)) + self.assertEqual( + mt.globals.collect(), + [ + hl.Struct( + remap_pedigree_hashes=[ + hl.eval( + remap_pedigree_hash( + TEST_PEDIGREE_4_REMAP, + ), + ), + ], + project_families={ + 'R0114_project4': [ + '123_1', + '234_1', + '345_1', + '456_1', + '567_1', + '678_1', + '789_1', + '890_1', + '901_1', + 'bcd_1', + 'cde_1', + 'def_1', + 'efg_1', + ], + }, + family_samples={ + '123_1': ['NA19675_1'], + '345_1': ['NA19679_1'], + '456_1': ['NA20870_1'], + '678_1': ['NA20874_1'], + '789_1': ['NA20875_1'], + '890_1': ['NA20876_1'], + '901_1': ['NA20877_1'], + 'efg_1': ['NA20888_1'], + }, + failed_family_samples=hl.Struct( + missing_samples={}, + relatedness_check={}, + sex_check={ + 'def_1': { + 'reasons': [ + 'Sample NA20885_1 has pedigree sex M but imputed sex F', + ], + 'samples': ['NA20885_1'], + }, + }, + ploidy_check={ + '234_1': { + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA19678_1']", + ], + 'samples': ['NA19678_1'], + }, + '567_1': { + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA20872_1']", + ], + 'samples': ['NA20872_1'], + }, + 'bcd_1': { + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA20878_1']", + ], + 'samples': ['NA20878_1'], + }, + 'cde_1': { + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA20881_1']", + ], + 'samples': ['NA20881_1'], + }, + }, + ), + ), + ], + ) + + def test_write_remapped_and_subsetted_callset_task_multiple_projects( + self, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_4_REMAP_2, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + worker = luigi.worker.Worker() + wrsc_task = WriteRemappedAndSubsettedCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0113_test_project', 'R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + skip_expect_tdr_metrics=True, + ) + worker.add(wrsc_task) + worker.run() + self.assertTrue(wrsc_task.complete()) + mt = hl.read_matrix_table(wrsc_task.output().path) + self.assertEqual( + mt.globals.collect(), + [ + hl.Struct( + remap_pedigree_hashes=[ + hl.eval(remap_pedigree_hash(TEST_PEDIGREE_3_REMAP)), + hl.eval(remap_pedigree_hash(TEST_PEDIGREE_4_REMAP_2)), + ], + failed_family_samples=hl.Struct( + missing_samples={ + 'efg_1': { + 'samples': ['NA20888_1'], + 'reasons': ["Missing samples: {'NA20888_1'}"], + }, + }, + relatedness_check={}, + sex_check={}, + ploidy_check={}, + ), + family_samples={ + 'abc_1': ['HG00731_1', 'HG00732_1', 'HG00733_1'], + '123_1': ['NA19675_1'], + '234_1': ['NA19678_1'], + '345_1': ['NA19679_1'], + '456_1': ['NA20870_1'], + '567_1': ['NA20872_1'], + '678_1': ['NA20874_1'], + '789_1': ['NA20875_1'], + '890_1': ['NA20876_1'], + '901_1': ['NA20877_1'], + 'bcd_1': ['NA20878_1'], + 'cde_1': ['NA20881_1'], + 'def_1': ['NA20885_1'], + }, + project_families={ + 'R0113_test_project': ['abc_1'], + 'R0114_project4': [ + '123_1', + '234_1', + '345_1', + '456_1', + '567_1', + '678_1', + '789_1', + '890_1', + '901_1', + 'bcd_1', + 'cde_1', + 'def_1', + 'efg_1', + ], + }, + ), + ], + ) + + @patch( + 'loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset.FeatureFlag', + ) + def test_write_remapped_and_subsetted_callset_task_all_families_failed( + self, + mock_ff: Mock, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_7, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + mock_ff.CHECK_SEX_AND_RELATEDNESS = True + worker = luigi.worker.Worker() + wrsc_task = WriteRemappedAndSubsettedCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + skip_expect_tdr_metrics=True, + ) + worker.add(wrsc_task) + worker.run() + self.assertFalse(wrsc_task.complete()) + updated_validation_errors_task = UpdatedValidationErrorsForRunTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WES, + callset_path=TEST_VCF, + project_guids=['R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + self.assertTrue(updated_validation_errors_task.complete()) + with updated_validation_errors_task.output().open('r') as f: + self.assertDictEqual( + json.load(f), + { + 'project_guids': ['R0114_project4'], + 'error_messages': ['All families failed validation checks'], + 'failed_family_samples': { + 'missing_samples': { + 'efg_1': { + 'samples': ['NA99999_1'], + 'reasons': ["Missing samples: {'NA99999_1'}"], + }, + }, + 'relatedness_check': {}, + 'sex_check': { + '890_1': { + 'samples': ['NA20876_1'], + 'reasons': [ + 'Sample NA20876_1 has pedigree sex M but imputed sex F', + ], + }, + '456_1': { + 'samples': ['NA20870_1'], + 'reasons': [ + 'Sample NA20870_1 has pedigree sex M but imputed sex F', + ], + }, + '123_1': { + 'samples': ['NA19675_1'], + 'reasons': [ + 'Sample NA19675_1 has pedigree sex M but imputed sex F', + ], + }, + '678_1': { + 'samples': ['NA20874_1'], + 'reasons': [ + 'Sample NA20874_1 has pedigree sex M but imputed sex F', + ], + }, + '789_1': { + 'samples': ['NA20875_1'], + 'reasons': [ + 'Sample NA20875_1 has pedigree sex M but imputed sex F', + ], + }, + '901_1': { + 'samples': ['NA20877_1'], + 'reasons': [ + 'Sample NA20877_1 has pedigree sex M but imputed sex F', + ], + }, + '345_1': { + 'samples': ['NA19679_1'], + 'reasons': [ + 'Sample NA19679_1 has pedigree sex M but imputed sex F', + ], + }, + 'def_1': { + 'samples': ['NA20885_1'], + 'reasons': [ + 'Sample NA20885_1 has pedigree sex M but imputed sex F', + ], + }, + }, + 'ploidy_check': { + '567_1': { + 'samples': ['NA20872_1'], + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA20872_1']", + ], + }, + '234_1': { + 'samples': ['NA19678_1'], + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA19678_1']", + ], + }, + 'bcd_1': { + 'samples': ['NA20878_1'], + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA20878_1']", + ], + }, + 'cde_1': { + 'samples': ['NA20881_1'], + 'reasons': [ + "Found samples with misaligned ploidy with their provided imputed sex: ['NA20881_1']", + ], + }, + }, + }, + }, + ) + + @patch( + 'loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset.FeatureFlag', + ) + def test_write_remapped_and_subsetted_callset_task_combined_validation_errors( + self, + mock_ff: Mock, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_DIFFERENT_FAMILIES, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + worker = luigi.worker.Worker() + + wrsc_task_1 = WriteRemappedAndSubsettedCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0113_test_project'], + validations_to_skip=[ALL_VALIDATIONS], + skip_expect_tdr_metrics=True, + ) + worker.add(wrsc_task_1) + worker.run() + + # Second run: load pedigree 7 where all families fail validation checks + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_7, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0114_project4', + ) + worker_2 = luigi.worker.Worker() + + wrsc_task_2 = WriteRemappedAndSubsettedCallsetTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + skip_expect_tdr_metrics=True, + ) + worker_2.add(wrsc_task_2) + worker_2.run() + + # Verify second task does not complete (all families failed) + self.assertFalse(wrsc_task_2.complete()) + + # Verify validation errors for second run + updated_validation_errors_task = UpdatedValidationErrorsForRunTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WES, + callset_path=TEST_VCF, + project_guids=['R0113_test_project', 'R0114_project4'], + validations_to_skip=[ALL_VALIDATIONS], + run_id=TEST_RUN_ID, + ) + self.assertTrue(updated_validation_errors_task.complete()) + with updated_validation_errors_task.output().open('r') as f: + validation_errors = json.load(f) + + # Verify that all families failed in the second run + self.assertIn( + 'All families failed validation checks', + validation_errors['error_messages'], + ) + # Should have missing samples, sex checks, and ploidy checks all failing + failed_samples = validation_errors['failed_family_samples'] + self.assertGreater( + len(failed_samples['missing_samples']), + 0, + 'Expected missing_samples to have failures', + ) + self.assertGreater( + len(failed_samples['sex_check']), + 0, + 'Expected sex_check to have failures', + ) + self.assertGreater( + len(failed_samples['ploidy_check']), + 0, + 'Expected ploidy_check to have failures', + ) + # Verify that both project guids are in the validation errors + self.assertIn('R0113_test_project', validation_errors['project_guids']) + self.assertIn('R0114_project4', validation_errors['project_guids']) diff --git a/loading_pipeline/lib/tasks/write_sample_qc_json.py b/loading_pipeline/lib/tasks/write_sample_qc_json.py new file mode 100644 index 0000000000..88f3dff8b4 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_sample_qc_json.py @@ -0,0 +1,82 @@ +import json +from collections import defaultdict + +import hail as hl +import hailtop.fs as hfs +import luigi +import luigi.util +import onnx + +from loading_pipeline.lib.methods.sample_qc import call_sample_qc +from loading_pipeline.lib.misc.io import import_tdr_qc_metrics +from loading_pipeline.lib.paths import ( + ancestry_model_rf_path, + sample_qc_json_path, + tdr_metrics_dir, +) +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.files import GCSorLocalTarget, RawFileTask +from loading_pipeline.lib.tasks.reference_data.updated_reference_dataset import ( + UpdatedReferenceDatasetTask, +) +from loading_pipeline.lib.tasks.write_remapped_and_subsetted_callset import ( + WriteRemappedAndSubsettedCallsetTask, +) +from loading_pipeline.lib.tasks.write_tdr_metrics_files import WriteTDRMetricsFilesTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteSampleQCJsonTask(luigi.Task): + def output(self) -> luigi.Target: + return GCSorLocalTarget( + sample_qc_json_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self): + return [ + self.clone(WriteTDRMetricsFilesTask), + self.clone( + UpdatedReferenceDatasetTask, + reference_dataset=ReferenceDataset.gnomad_qc, + ), + RawFileTask(ancestry_model_rf_path()), + self.clone(WriteRemappedAndSubsettedCallsetTask), + ] + + def run(self): + callset_mt = hl.read_matrix_table(self.input()[3].path) + tdr_metrics_ht = None + for tdr_metrics_file in hfs.ls( + tdr_metrics_dir(self.reference_genome, self.dataset_type), + ): + if not tdr_metrics_ht: + tdr_metrics_ht = import_tdr_qc_metrics(tdr_metrics_file.path) + continue + tdr_metrics_ht = tdr_metrics_ht.union( + import_tdr_qc_metrics(tdr_metrics_file.path), + ) + pop_pca_loadings_ht = hl.read_table(self.input()[1].path) + with hfs.open(self.input()[2].path, 'rb') as f: + ancestry_rf_model = onnx.load(f) + callset_mt = call_sample_qc( + callset_mt, + tdr_metrics_ht, + pop_pca_loadings_ht, + ancestry_rf_model, + self.sample_type, + ) + ht = callset_mt.cols() + sample_qc_dict = defaultdict(dict) + for row in ht.flatten().collect(): + r = dict(row) + sample_id = r.pop('s') + for field, value in r.items(): + sample_qc_dict[sample_id][field] = value + + with self.output().open('w') as f: + json.dump(sample_qc_dict, f) diff --git a/loading_pipeline/lib/tasks/write_sample_qc_json_test.py b/loading_pipeline/lib/tasks/write_sample_qc_json_test.py new file mode 100644 index 0000000000..1c2709c9b7 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_sample_qc_json_test.py @@ -0,0 +1,269 @@ +import json +import os +import shutil +from unittest.mock import Mock, patch + +import hail as hl +import hailtop.fs as hfs +import luigi.worker + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.misc.validation import ALL_VALIDATIONS +from loading_pipeline.lib.paths import ancestry_model_rf_path, tdr_metrics_dir +from loading_pipeline.lib.tasks.write_sample_qc_json import WriteSampleQCJsonTask +from loading_pipeline.lib.test.misc import copy_project_pedigree_to_mocked_dir +from loading_pipeline.lib.test.mock_complete_task import MockCompleteTask +from loading_pipeline.lib.test.mocked_reference_datasets_testcase import ( + MockedReferenceDatasetsTestCase, +) + +TEST_VCF = 'loading_pipeline/var/test/callsets/1kg_30variants.vcf' +TEST_PEDIGREE_3_REMAP = 'loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv' +TEST_TDR_METRICS_FILE = 'loading_pipeline/var/test/tdr_metrics.tsv' +TEST_RUN_ID = 'manual__2024-04-03' + +PCA_SCORES = [0.00212, 0.011, 0.0105, 0.161, 0.026] + [0.1 for _ in range(15)] +EXPECTED_ANC_PROBABILITIES = { + 'prob_afr': 0.02, + 'prob_ami': 0.0, + 'prob_amr': 0.02, + 'prob_asj': 0.9, + 'prob_eas': 0.0, + 'prob_fin': 0.0, + 'prob_mid': 0.0, + 'prob_nfe': 0.05, + 'prob_sas': 0.01, +} +TEST_ANCESTRY_IMPUTATION_MODEL_PATH = ( + 'loading_pipeline/var/test/ancestry_imputation_model.onnx' +) + + +class WriteSampleQCJsonTaskTest(MockedReferenceDatasetsTestCase): + @patch('loading_pipeline.lib.methods.sample_qc.assign_population_pcs') + @patch('loading_pipeline.lib.methods.sample_qc.pc_project') + @patch('loading_pipeline.lib.tasks.write_sample_qc_json.WriteTDRMetricsFilesTask') + def test_call_sample_qc( + self, + mock_tdr_task: Mock, + mock_pc_project: Mock, + mock_assign_population_pcs: Mock, + ) -> None: + copy_project_pedigree_to_mocked_dir( + TEST_PEDIGREE_3_REMAP, + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + SampleType.WGS, + 'R0113_test_project', + ) + os.makedirs( + os.path.dirname(ancestry_model_rf_path()), + exist_ok=True, + ) + shutil.copy2(TEST_ANCESTRY_IMPUTATION_MODEL_PATH, ancestry_model_rf_path()) + os.makedirs( + tdr_metrics_dir(ReferenceGenome.GRCh38, DatasetType.SNV_INDEL), + exist_ok=True, + ) + shutil.copy2( + TEST_TDR_METRICS_FILE, + tdr_metrics_dir(ReferenceGenome.GRCh38, DatasetType.SNV_INDEL), + ) + mock_tdr_task.return_value = MockCompleteTask() + mock_pc_project.return_value = hl.Table.parallelize( + [ + { + 's': sample_id, + 'scores': PCA_SCORES, + } + for sample_id in ('HG00731', 'HG00732', 'HG00733', 'NA19675') + ], + hl.tstruct( + s=hl.tstr, + scores=hl.tarray(hl.tfloat64), + ), + key='s', + ) + mock_assign_population_pcs.return_value = ( + hl.Table.parallelize( + [ + { + 's': sample_id, + 'pca_scores': PCA_SCORES, + 'qc_pop': 'asj', + **EXPECTED_ANC_PROBABILITIES, + } + for sample_id in ('HG00731', 'HG00732', 'HG00733', 'NA19675') + ], + hl.tstruct( + s=hl.tstr, + pca_scores=hl.tarray(hl.tfloat64), + qc_pop=hl.tstr, + prob_afr=hl.tfloat64, + prob_ami=hl.tfloat64, + prob_amr=hl.tfloat64, + prob_asj=hl.tfloat64, + prob_eas=hl.tfloat64, + prob_fin=hl.tfloat64, + prob_mid=hl.tfloat64, + prob_nfe=hl.tfloat64, + prob_sas=hl.tfloat64, + ), + key='s', + ), + None, + ) + worker = luigi.worker.Worker() + task = WriteSampleQCJsonTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + run_id=TEST_RUN_ID, + sample_type=SampleType.WGS, + callset_path=TEST_VCF, + project_guids=['R0113_test_project'], + validations_to_skip=[ALL_VALIDATIONS], + ) + worker.add(task) + worker.run() + self.assertTrue(task) + self.assertTrue(hfs.exists(task.output().path)) + + expected_qc_gen_anc_results = { + 'pca_scores': PCA_SCORES, + **EXPECTED_ANC_PROBABILITIES, + **{f'pop_PC{i + 1}': PCA_SCORES[i] for i in range(20)}, + 'qc_gen_anc': 'oth', + } + with task.output().open('r') as f: + res = json.load(f) + + self.assertCountEqual( + res['HG00731_1'], + { + 'seqr_id': 'HG00731_1', + 'vcf_id': 'HG00731', + 'filtered_callrate': 1.0, + 'contamination_rate': 5.099999904632568, + 'percent_bases_at_20x': 93.69000244140625, + 'mean_coverage': 29.309999465942383, + 'filter_flags': ['contamination', 'coverage'], + **expected_qc_gen_anc_results, + 'sample_qc.call_rate': 0.9666666666666667, + 'sample_qc.n_called': 29, + 'sample_qc.n_not_called': 1, + 'sample_qc.n_filtered': 0, + 'sample_qc.n_hom_ref': 16, + 'sample_qc.n_het': 2, + 'sample_qc.n_hom_var': 11, + 'sample_qc.n_non_ref': 13, + 'sample_qc.n_singleton': 1, + 'sample_qc.n_snp': 24, + 'sample_qc.n_insertion': 0, + 'sample_qc.n_deletion': 0, + 'sample_qc.n_transition': 15, + 'sample_qc.n_transversion': 9, + 'sample_qc.n_star': 0, + 'sample_qc.r_ti_tv': 1.6666666666666667, + 'sample_qc.r_het_hom_var': 0.18181818181818182, + 'sample_qc.r_insertion_deletion': None, + 'sample_qc.f_inbreeding.f_stat': 0.284195245767986, + 'sample_qc.f_inbreeding.n_called': 29, + 'sample_qc.f_inbreeding.expected_homs': 26.20594199999999, + 'sample_qc.f_inbreeding.observed_homs': 27, + 'fail_n_snp': True, + 'fail_r_ti_tv': False, + 'fail_r_insertion_deletion': None, + 'fail_n_insertion': True, + 'fail_n_deletion': True, + 'fail_r_het_hom_var': False, + 'fail_call_rate': False, + 'qc_metrics_filters': ['n_deletion', 'n_insertion', 'n_snp'], + }, + ) + self.assertCountEqual( + res['HG00732_1'], + { + 'seqr_id': 'HG00732_1', + 'vcf_id': 'HG00732', + 'filtered_callrate': 1.0, + 'contamination_rate': 5.0, + 'percent_bases_at_20x': 90.0, + 'mean_coverage': 28.0, + 'filter_flags': ['coverage'], + **expected_qc_gen_anc_results, + 'sample_qc.call_rate': 0.9666666666666667, + 'sample_qc.n_called': 29, + 'sample_qc.n_not_called': 1, + 'sample_qc.n_filtered': 0, + 'sample_qc.n_hom_ref': 16, + 'sample_qc.n_het': 4, + 'sample_qc.n_hom_var': 9, + 'sample_qc.n_non_ref': 13, + 'sample_qc.n_singleton': 2, + 'sample_qc.n_snp': 22, + 'sample_qc.n_insertion': 0, + 'sample_qc.n_deletion': 0, + 'sample_qc.n_transition': 13, + 'sample_qc.n_transversion': 9, + 'sample_qc.n_star': 0, + 'sample_qc.r_ti_tv': 1.4444444444444444, + 'sample_qc.r_het_hom_var': 0.4444444444444444, + 'sample_qc.r_insertion_deletion': None, + 'sample_qc.f_inbreeding.f_stat': -0.431609508464028, + 'sample_qc.f_inbreeding.n_called': 29, + 'sample_qc.f_inbreeding.expected_homs': 26.20594199999999, + 'sample_qc.f_inbreeding.observed_homs': 25, + 'fail_n_snp': True, + 'fail_r_ti_tv': False, + 'fail_r_insertion_deletion': None, + 'fail_n_insertion': True, + 'fail_n_deletion': True, + 'fail_r_het_hom_var': False, + 'fail_call_rate': False, + 'qc_metrics_filters': ['n_deletion', 'n_insertion', 'n_snp'], + }, + ) + self.assertCountEqual( + res['HG00733_1'], + { + 'seqr_id': 'HG00733_1', + 'vcf_id': 'HG00733', + 'filtered_callrate': 1.0, + 'contamination_rate': 6.0, + 'percent_bases_at_20x': 85.0, + 'mean_coverage': 36.400001525878906, + 'filter_flags': ['contamination'], + **expected_qc_gen_anc_results, + 'sample_qc.call_rate': 1.0, + 'sample_qc.n_called': 30, + 'sample_qc.n_not_called': 0, + 'sample_qc.n_filtered': 0, + 'sample_qc.n_hom_ref': 17, + 'sample_qc.n_het': 3, + 'sample_qc.n_hom_var': 10, + 'sample_qc.n_non_ref': 13, + 'sample_qc.n_singleton': 0, + 'sample_qc.n_snp': 23, + 'sample_qc.n_insertion': 0, + 'sample_qc.n_deletion': 0, + 'sample_qc.n_transition': 13, + 'sample_qc.n_transversion': 10, + 'sample_qc.n_star': 0, + 'sample_qc.r_ti_tv': 1.3, + 'sample_qc.r_het_hom_var': 0.3, + 'sample_qc.r_insertion_deletion': None, + 'sample_qc.f_inbreeding.f_stat': -0.038400752079048056, + 'sample_qc.f_inbreeding.n_called': 30, + 'sample_qc.f_inbreeding.expected_homs': 27.11094199999999, + 'sample_qc.f_inbreeding.observed_homs': 27, + 'fail_n_snp': True, + 'fail_r_ti_tv': False, + 'fail_r_insertion_deletion': None, + 'fail_n_insertion': True, + 'fail_n_deletion': True, + 'fail_r_het_hom_var': False, + 'fail_call_rate': False, + 'qc_metrics_filters': ['n_deletion', 'n_insertion', 'n_snp'], + }, + ) + self.assertFalse('NA19675' in res) diff --git a/loading_pipeline/lib/tasks/write_sex_check_table.py b/loading_pipeline/lib/tasks/write_sex_check_table.py new file mode 100644 index 0000000000..38efea1b97 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_sex_check_table.py @@ -0,0 +1,79 @@ +import hail as hl +import hailtop.fs as hfs +import luigi + +from loading_pipeline.lib.core.feature_flag import FeatureFlag +from loading_pipeline.lib.methods.sex_check import compute_sex_check_ht +from loading_pipeline.lib.misc.io import import_imputed_sex +from loading_pipeline.lib.paths import ( + imported_callset_path, + sex_check_table_path, + tdr_metrics_dir, +) +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.base.base_write import BaseWriteTask +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.write_postprocessed_callset import ( + WritePostprocessedCallsetTask, +) +from loading_pipeline.lib.tasks.write_tdr_metrics_files import WriteTDRMetricsFilesTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteSexCheckTableTask(BaseWriteTask): + callset_path = luigi.Parameter() + + @property + def predicted_sex_from_tdr(self): + # complicated enough to need a helper :/ + return ( + FeatureFlag.EXPECT_TDR_METRICS + and not self.skip_expect_tdr_metrics + and self.dataset_type.expect_tdr_metrics( + self.reference_genome, + ) + ) + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + sex_check_table_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + + def requires(self) -> list[luigi.Task]: + requirements = [] + if self.predicted_sex_from_tdr: + requirements = [ + *requirements, + self.clone(WriteTDRMetricsFilesTask), + ] + else: + requirements = [ + *requirements, + self.clone(WritePostprocessedCallsetTask), + ] + return requirements + + def create_table(self) -> hl.Table: + ht = None + if self.predicted_sex_from_tdr: + for tdr_metrics_file in hfs.ls( + tdr_metrics_dir(self.reference_genome, self.dataset_type), + ): + if not ht: + ht = import_imputed_sex(tdr_metrics_file.path) + continue + ht = ht.union(import_imputed_sex(tdr_metrics_file.path)) + else: + mt = hl.read_matrix_table( + imported_callset_path( + self.reference_genome, + self.dataset_type, + self.callset_path, + ), + ) + ht = compute_sex_check_ht(mt) + return ht diff --git a/loading_pipeline/lib/tasks/write_sex_check_table_test.py b/loading_pipeline/lib/tasks/write_sex_check_table_test.py new file mode 100644 index 0000000000..1f83d8c991 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_sex_check_table_test.py @@ -0,0 +1,157 @@ +from decimal import Decimal +from unittest.mock import Mock, patch + +import google.cloud.bigquery +import hail as hl +import luigi.worker + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.paths import sex_check_table_path, tdr_metrics_path +from loading_pipeline.lib.tasks.write_sex_check_table import ( + WriteSexCheckTableTask, +) +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +TEST_SEX_AND_RELATEDNESS_CALLSET_MT = ( + 'loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt' +) + + +class WriteSexCheckTableTaskTest(MockedDatarootTestCase): + @patch('loading_pipeline.lib.tasks.write_tdr_metrics_files.gen_bq_table_names') + @patch('loading_pipeline.lib.tasks.write_tdr_metrics_file.bq_metrics_query') + @patch( + 'loading_pipeline.lib.tasks.write_sex_check_table.FeatureFlag', + ) + def test_snv_sex_check_table_task( + self, + mock_ff: Mock, + mock_bq_metrics_query: Mock, + mock_gen_bq_table_names: Mock, + ) -> None: + mock_ff.EXPECT_TDR_METRICS = True + mock_gen_bq_table_names.return_value = [ + 'datarepo-7242affb.datarepo_RP_3053', + 'datarepo-5a72e31b.datarepo_RP_3056', + ] + mock_bq_metrics_query.side_effect = [ + iter( + [ + google.cloud.bigquery.table.Row( + ( + 'SM-NJ8MF', + 'Unknown', + Decimal('0'), + Decimal('0'), + Decimal('0'), + ), + { + 'collaborator_sample_id': 0, + 'predicted_sex': 1, + 'contamination_rate': 2, + 'percent_bases_at_20x': 3, + 'mean_coverage': 4, + }, + ), + google.cloud.bigquery.table.Row( + ( + 'SM-MWOGC', + 'Female', + Decimal('0'), + Decimal('0'), + Decimal('0'), + ), + { + 'collaborator_sample_id': 0, + 'predicted_sex': 1, + 'contamination_rate': 2, + 'percent_bases_at_20x': 3, + 'mean_coverage': 4, + }, + ), + google.cloud.bigquery.table.Row( + ('SM-MWKWL', 'Male', Decimal('0'), Decimal('0'), Decimal('0')), + { + 'collaborator_sample_id': 0, + 'predicted_sex': 1, + 'contamination_rate': 2, + 'percent_bases_at_20x': 3, + 'mean_coverage': 4, + }, + ), + ], + ), + iter( + [ + google.cloud.bigquery.table.Row( + ('SM-NGE65', 'Male', Decimal('0'), Decimal('0'), Decimal('0')), + { + 'collaborator_sample_id': 0, + 'predicted_sex': 1, + 'contamination_rate': 2, + 'percent_bases_at_20x': 3, + 'mean_coverage': 4, + }, + ), + google.cloud.bigquery.table.Row( + ('SM-NGE5G', 'Male', Decimal('0'), Decimal('0'), Decimal('0')), + { + 'collaborator_sample_id': 0, + 'predicted_sex': 1, + 'contamination_rate': 2, + 'percent_bases_at_20x': 3, + 'mean_coverage': 4, + }, + ), + google.cloud.bigquery.table.Row( + ('SM-NC6LM', 'Male', Decimal('0'), Decimal('0'), Decimal('0')), + { + 'collaborator_sample_id': 0, + 'predicted_sex': 1, + 'contamination_rate': 2, + 'percent_bases_at_20x': 3, + 'mean_coverage': 4, + }, + ), + ], + ), + ] + worker = luigi.worker.Worker() + write_sex_check_table = WriteSexCheckTableTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='na', + project_guids=['R0113_test_project'], + run_id='manual__2024-04-03', + ) + worker.add(write_sex_check_table) + worker.run() + self.assertTrue(write_sex_check_table.complete()) + sex_check_ht = hl.read_table( + sex_check_table_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + 'na', + ), + ) + self.assertEqual( + sex_check_ht.collect(), + [ + hl.Struct(s='SM-MWKWL', predicted_sex='M'), + hl.Struct(s='SM-MWOGC', predicted_sex='F'), + hl.Struct(s='SM-NC6LM', predicted_sex='M'), + hl.Struct(s='SM-NGE5G', predicted_sex='M'), + hl.Struct(s='SM-NGE65', predicted_sex='M'), + hl.Struct(s='SM-NJ8MF', predicted_sex='U'), + ], + ) + # Check underlying tdr metrics file. + with open( + tdr_metrics_path( + ReferenceGenome.GRCh38, + DatasetType.SNV_INDEL, + 'datarepo-5a72e31b.datarepo_RP_3056', + ), + ) as f: + self.assertTrue('collaborator_sample_id' in f.read()) diff --git a/loading_pipeline/lib/tasks/write_success_file.py b/loading_pipeline/lib/tasks/write_success_file.py new file mode 100644 index 0000000000..50d92b7bb4 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_success_file.py @@ -0,0 +1,38 @@ +import luigi +import luigi.util + +from loading_pipeline.lib.core.feature_flag import FeatureFlag +from loading_pipeline.lib.paths import pipeline_run_success_file_path +from loading_pipeline.lib.tasks.base.base_loading_run_params import ( + BaseLoadingRunParams, +) +from loading_pipeline.lib.tasks.dataproc.run_pipeline_on_dataproc import ( + RunPipelineOnDataprocTask, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget +from loading_pipeline.lib.tasks.run_pipeline import RunPipelineTask + + +@luigi.util.inherits(BaseLoadingRunParams) +class WriteSuccessFileTask(luigi.Task): + attempt_id = luigi.IntParameter() + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + pipeline_run_success_file_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def requires(self) -> luigi.Task: + return ( + self.clone(RunPipelineOnDataprocTask, attempt_id=self.attempt_id) + if FeatureFlag.RUN_PIPELINE_ON_DATAPROC + else self.clone(RunPipelineTask, attempt_id=self.attempt_id) + ) + + def run(self): + with self.output().open('w') as f: + f.write('') diff --git a/loading_pipeline/lib/tasks/write_success_file_test.py b/loading_pipeline/lib/tasks/write_success_file_test.py new file mode 100644 index 0000000000..f33a5d337e --- /dev/null +++ b/loading_pipeline/lib/tasks/write_success_file_test.py @@ -0,0 +1,34 @@ +from unittest import mock + +import luigi.worker + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.tasks.write_success_file import WriteSuccessFileTask +from loading_pipeline.lib.test.mock_complete_task import MockCompleteTask +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + + +class WriteSuccessFileTaskTest(MockedDatarootTestCase): + @mock.patch( + 'loading_pipeline.lib.tasks.write_success_file.RunPipelineTask', + ) + def test_write_success_file_task( + self, + mock_run_pipeline_task: mock.Mock, + ) -> None: + mock_run_pipeline_task.return_value = MockCompleteTask() + worker = luigi.worker.Worker() + write_success_file = WriteSuccessFileTask( + reference_genome=ReferenceGenome.GRCh38, + dataset_type=DatasetType.SNV_INDEL, + sample_type=SampleType.WGS, + callset_path='test_callset', + project_guids=['R0113_test_project'], + run_id='manual__2024-04-03', + attempt_id=0, + ) + worker.add(write_success_file) + worker.run() + self.assertTrue(write_success_file.complete()) + with open(write_success_file.output().path) as f: + self.assertEqual(f.read(), '') diff --git a/loading_pipeline/lib/tasks/write_tdr_metrics_file.py b/loading_pipeline/lib/tasks/write_tdr_metrics_file.py new file mode 100644 index 0000000000..9beefe4932 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_tdr_metrics_file.py @@ -0,0 +1,42 @@ +import csv + +import google.api_core.exceptions +import luigi +import luigi.util + +from loading_pipeline.lib.logger import get_logger +from loading_pipeline.lib.misc.terra_data_repository import ( + BIGQUERY_METRICS, + bq_metrics_query, +) +from loading_pipeline.lib.paths import tdr_metrics_path +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) +from loading_pipeline.lib.tasks.files import GCSorLocalTarget + +logger = get_logger(__name__) + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class WriteTDRMetricsFileTask(luigi.Task): + bq_table_name = luigi.Parameter() + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + tdr_metrics_path( + self.reference_genome, + self.dataset_type, + self.bq_table_name, + ), + ) + + def run(self): + with self.output().open('w') as f: + writer = csv.DictWriter(f, fieldnames=BIGQUERY_METRICS, delimiter='\t') + writer.writeheader() + try: + for row in bq_metrics_query(self.bq_table_name): + writer.writerow(row) + except google.api_core.exceptions.BadRequest: + logger.exception('Query Failed') diff --git a/loading_pipeline/lib/tasks/write_tdr_metrics_files.py b/loading_pipeline/lib/tasks/write_tdr_metrics_files.py new file mode 100644 index 0000000000..488d466c98 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_tdr_metrics_files.py @@ -0,0 +1,28 @@ +import luigi +import luigi.util + +from loading_pipeline.lib.misc.terra_data_repository import gen_bq_table_names +from loading_pipeline.lib.tasks.base.base_loading_pipeline_params import ( + BaseLoadingPipelineParams, +) +from loading_pipeline.lib.tasks.write_tdr_metrics_file import WriteTDRMetricsFileTask + + +@luigi.util.inherits(BaseLoadingPipelineParams) +class WriteTDRMetricsFilesTask(luigi.Task): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.dynamic_write_tdr_metrics_file_task = set() + + def complete(self) -> bool: + return len(self.dynamic_write_tdr_metrics_file_task) >= 1 and all( + write_tdr_metrics_file_task.complete() + for write_tdr_metrics_file_task in self.dynamic_write_tdr_metrics_file_task + ) + + def run(self): + for bq_table_name in gen_bq_table_names(): + self.dynamic_write_tdr_metrics_file_task.add( + self.clone(WriteTDRMetricsFileTask, bq_table_name=bq_table_name), + ) + yield self.dynamic_write_tdr_metrics_file_task diff --git a/loading_pipeline/lib/tasks/write_validation_errors_for_run.py b/loading_pipeline/lib/tasks/write_validation_errors_for_run.py new file mode 100644 index 0000000000..c8d4d2b238 --- /dev/null +++ b/loading_pipeline/lib/tasks/write_validation_errors_for_run.py @@ -0,0 +1,128 @@ +import json +from collections.abc import Callable + +import luigi +import luigi.freezing +import luigi.util + +from loading_pipeline.lib.misc.validation import SeqrValidationError +from loading_pipeline.lib.paths import validation_errors_for_run_path +from loading_pipeline.lib.tasks.base.base_loading_run_params import BaseLoadingRunParams +from loading_pipeline.lib.tasks.files import GCSorLocalTarget + + +def _deep_merge_dicts(existing: dict, new: dict) -> dict: + """Recursively merge new dict into existing dict.""" + result = existing.copy() + for key, new_value in new.items(): + if ( + key in result + and isinstance(result[key], dict) + and isinstance(new_value, dict) + ): + result[key] = _deep_merge_dicts(result[key], new_value) + else: + result[key] = new_value + return result + + +@luigi.util.inherits(BaseLoadingRunParams) +class UpdatedValidationErrorsForRunTask(luigi.Task): + project_guids = luigi.ListParameter() + error_messages = luigi.ListParameter(default=[]) + error_body = luigi.DictParameter(default={}) + + def complete(self) -> bool: + """Check if all input project_guids and error_messages are contained in the output.""" + output_path = self.output() + if not output_path.exists(): + return False + + with output_path.open('r') as f: + data = json.load(f) + + output_project_guids = set(data.get('project_guids', [])) + output_error_messages = set(data.get('error_messages', [])) + + input_project_guids = set(self.project_guids) + input_error_messages = set(self.error_messages) + + # Check if all input items are in output + return input_project_guids.issubset( + output_project_guids, + ) and input_error_messages.issubset(output_error_messages) + + def to_single_error_message(self) -> str: + with self.output().open('r') as f: + error_messages = json.load(f)['error_messages'] + if len(error_messages) == 1: + return error_messages[0] + return f'Multiple validation errors encountered: {error_messages}' + + def output(self) -> luigi.Target: + return GCSorLocalTarget( + validation_errors_for_run_path( + self.reference_genome, + self.dataset_type, + self.run_id, + ), + ) + + def run(self) -> None: + output_path = self.output() + + # Load existing data if file exists + existing_data = {} + if output_path.exists(): + with output_path.open('r') as f: + existing_data = json.load(f) + + # Append new project_guids to existing ones and deduplicate while preserving order + project_guids = list( + dict.fromkeys( + existing_data.get('project_guids', []) + list(self.project_guids), + ), + ) + + # Append new error_messages to existing ones and deduplicate while preserving order + error_messages = list( + dict.fromkeys( + existing_data.get('error_messages', []) + list(self.error_messages), + ), + ) + + # Merge error_body with new data recursively + error_body = _deep_merge_dicts( + { + k: v + for k, v in existing_data.items() + if k not in ('project_guids', 'error_messages') + }, + luigi.freezing.recursively_unfreeze(self.error_body), + ) + + validation_errors_json = { + 'project_guids': project_guids, + 'error_messages': error_messages, + **error_body, + } + with output_path.open('w') as f: + json.dump(validation_errors_json, f) + + +def with_persisted_validation_errors(f: Callable) -> Callable[[Callable], Callable]: + def wrapper(self: luigi.Task): + try: + return f(self) + except SeqrValidationError as e: + updated_validation_errors_for_run_task = self.clone( + UpdatedValidationErrorsForRunTask, + error_messages=[e.msg], + error_body=e.error_body, + ) + updated_validation_errors_for_run_task.run() + raise SeqrValidationError( + updated_validation_errors_for_run_task.to_single_error_message(), + ) from None + + return wrapper diff --git a/loading_pipeline/lib/test/__init__.py b/loading_pipeline/lib/test/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/test/clickhouse_django/__init__.py b/loading_pipeline/lib/test/clickhouse_django/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/test/clickhouse_django/dictionary_overrides.py b/loading_pipeline/lib/test/clickhouse_django/dictionary_overrides.py new file mode 100644 index 0000000000..a56eb26b0a --- /dev/null +++ b/loading_pipeline/lib/test/clickhouse_django/dictionary_overrides.py @@ -0,0 +1,56 @@ +"""Overrides Postgres-sourced dictionaries with ClickHouse-sourced versions""" + +import re + +from django.db import connections +from django.db.models.signals import post_migrate + +from loading_pipeline.lib.core import Env + +_POSTGRES_SOURCE_RE = re.compile(r'SOURCE\(POSTGRESQL\([^)]*\)\)') +_POSTGRES_SOURCED_DICTIONARIES = ['seqrdb_gene_ids', 'seqrdb_affected_status_dict'] + + +def _override_postgres_sourced_dictionary(dictionary_name): + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + """ + SELECT create_table_query FROM system.tables + WHERE database = %(database)s AND name = %(name)s + """, + {'database': Env.CLICKHOUSE_DATABASE, 'name': dictionary_name}, + ) + create_table_query = cursor.fetchone()[0] + + cursor.execute(f'DESCRIBE TABLE {Env.CLICKHOUSE_DATABASE}.`{dictionary_name}`') + columns = cursor.fetchall() + src_table = f'{dictionary_name}_src' + column_defs = ', '.join(f'`{name}` {type_}' for name, type_, *_ in columns) + cursor.execute( + f""" + CREATE OR REPLACE TABLE {Env.CLICKHOUSE_DATABASE}.{src_table} ({column_defs}) + ENGINE = Memory; + """, + ) + + source = ( + f'SOURCE(CLICKHOUSE(USER {Env.CLICKHOUSE_WRITER_USER} ' + f"PASSWORD '{Env.CLICKHOUSE_WRITER_PASSWORD}' " + f'DB {Env.CLICKHOUSE_DATABASE} TABLE {src_table}))' + ) + new_create_table_query = _POSTGRES_SOURCE_RE.sub( + source, + create_table_query, + count=1, + ).replace('CREATE DICTIONARY', 'CREATE OR REPLACE DICTIONARY', 1) + cursor.execute(new_create_table_query) + + +def _on_post_migrate(sender, using, **kwargs): # noqa: ARG001 + if using != 'clickhouse_write' or sender.name != 'clickhouse_search': + return + for dictionary_name in _POSTGRES_SOURCED_DICTIONARIES: + _override_postgres_sourced_dictionary(dictionary_name) + + +post_migrate.connect(_on_post_migrate) diff --git a/loading_pipeline/lib/test/clickhouse_django/seqr/__init__.py b/loading_pipeline/lib/test/clickhouse_django/seqr/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/test/clickhouse_django/seqr/migrations/0001_squashed_0067_remove_project_custom_reference_populations.py b/loading_pipeline/lib/test/clickhouse_django/seqr/migrations/0001_squashed_0067_remove_project_custom_reference_populations.py new file mode 100644 index 0000000000..085beeac12 --- /dev/null +++ b/loading_pipeline/lib/test/clickhouse_django/seqr/migrations/0001_squashed_0067_remove_project_custom_reference_populations.py @@ -0,0 +1,8 @@ +# No-op stand-in for the real seqr migration clickhouse_search's 0040 depends on by name. +from django.db import migrations + + +class Migration(migrations.Migration): + initial = True + dependencies = [] + operations = [] diff --git a/loading_pipeline/lib/test/clickhouse_django/seqr/migrations/__init__.py b/loading_pipeline/lib/test/clickhouse_django/seqr/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/lib/test/clickhouse_django/seqr/utils/__init__.py b/loading_pipeline/lib/test/clickhouse_django/seqr/utils/__init__.py new file mode 100644 index 0000000000..d6a3b34ab1 --- /dev/null +++ b/loading_pipeline/lib/test/clickhouse_django/seqr/utils/__init__.py @@ -0,0 +1,16 @@ +import os + +# Falls through to the real seqr/utils/ for anything not stubbed in this directory. +__path__.append( + os.path.join( + os.path.dirname(__file__), + '..', + '..', + '..', + '..', + '..', + '..', + 'seqr', + 'utils', + ), +) diff --git a/loading_pipeline/lib/test/clickhouse_django/settings.py b/loading_pipeline/lib/test/clickhouse_django/settings.py new file mode 100644 index 0000000000..78f7a6cf4d --- /dev/null +++ b/loading_pipeline/lib/test/clickhouse_django/settings.py @@ -0,0 +1,86 @@ +import os + +from loading_pipeline.lib.test.clickhouse_django import ( + dictionary_overrides, # noqa: F401 +) + +FIXTURE_DIRS = [os.path.join(os.path.dirname(__file__), '..', 'fixtures')] + +INSTALLED_APPS = [ + 'clickhouse_backend', + 'seqr', # stub package (see seqr/__init__.py), not the real app + 'clickhouse_search', +] + + +class _NoOtherAppMigrationsRouter: + """Only `clickhouse_search` may migrate anywhere; everything else is vetoed.""" + + @staticmethod + def allow_migrate(db, app_label, model_name=None, **hints): # noqa: ARG004 + if app_label == 'clickhouse_search': + return None # defer to ClickHouseRouter + return False + + +DATABASE_ROUTERS = [ + 'clickhouse_search.models.ClickHouseRouter', + 'settings._NoOtherAppMigrationsRouter', +] + +USE_TZ = True +SECRET_KEY = 'loading-pipeline-test' # noqa: S105 # nosec B105 +DEPLOYMENT_TYPE = os.environ.get('DEPLOYMENT_TYPE', 'dev') +PIPELINE_RUNNER_SERVER = os.environ.get('PIPELINE_RUNNER_SERVER', 'http://localhost') +CLICKHOUSE_IN_MEMORY_DIR = os.environ.get( + 'CLICKHOUSE_IN_MEMORY_DIR', + '/tmp/loading_pipeline_test_clickhouse_in_memory', # noqa: S108 # nosec B108 +) +CLICKHOUSE_DATA_DIR = os.environ.get( + 'CLICKHOUSE_DATA_DIR', + '/tmp/loading_pipeline_test_clickhouse_data', # noqa: S108 # nosec B108 +) + +CLICKHOUSE_WRITER_USER = os.environ.get('CLICKHOUSE_WRITER_USER', 'default') +CLICKHOUSE_WRITER_PASSWORD = os.environ.get( + 'CLICKHOUSE_WRITER_PASSWORD', + 'default_password', +) +CLICKHOUSE_DATABASE_NAME = os.environ.get('CLICKHOUSE_DATABASE', 'seqr') + +CLICKHOUSE_DB_CONFIG = { + 'ENGINE': 'clickhouse_search.backend', + 'NAME': CLICKHOUSE_DATABASE_NAME, + 'USER': CLICKHOUSE_WRITER_USER, + 'PASSWORD': CLICKHOUSE_WRITER_PASSWORD, + 'HOST': os.environ.get('CLICKHOUSE_SERVICE_HOSTNAME', 'localhost'), + 'PORT': int(os.environ.get('CLICKHOUSE_SERVICE_PORT', '9000')), + 'OPTIONS': { + 'settings': { + 'use_client_time_zone': False, + }, + }, + 'TEST': { + # Skip Django's default `test_` prefix; land on the name Env.CLICKHOUSE_DATABASE already expects. + 'NAME': CLICKHOUSE_DATABASE_NAME, + # Without this, Django assumes this alias depends on `default` and never resolves it + 'DEPENDENCIES': [], + }, +} + +DATABASES = { + 'clickhouse_write': CLICKHOUSE_DB_CONFIG, + # Mirrored so Django doesn't create/destroy a second real test database for it. + 'clickhouse': { + **CLICKHOUSE_DB_CONFIG, + 'TEST': {'MIRROR': 'clickhouse_write'}, + }, + 'default': { + 'ENGINE': 'django.db.backends.dummy', + 'NAME': 'test_default_unused', + }, + 'reference_data': { + 'ENGINE': 'django.db.backends.dummy', + 'NAME': 'test_reference_data_unused', + }, +} diff --git a/loading_pipeline/lib/test/clickhouse_schema_testcase.py b/loading_pipeline/lib/test/clickhouse_schema_testcase.py new file mode 100644 index 0000000000..198b640521 --- /dev/null +++ b/loading_pipeline/lib/test/clickhouse_schema_testcase.py @@ -0,0 +1,24 @@ +from typing import ClassVar + +from django.db import connections +from django.test import TestCase + +from loading_pipeline.lib.core import Env + + +class ClickhouseSchemaTestCase(TestCase): + databases: ClassVar = ['clickhouse_write'] + + def _fixture_teardown(self): + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + """ + SELECT name FROM system.tables + WHERE database = %(database)s AND engine NOT IN ('Dictionary', 'MaterializedView') + AND name != 'django_migrations' + """, + {'database': Env.CLICKHOUSE_DATABASE}, + ) + tables = [row[0] for row in cursor.fetchall()] + for table in tables: + cursor.execute(f'TRUNCATE TABLE `{table}`') diff --git a/loading_pipeline/lib/test/fixtures/clickhouse_test.json b/loading_pipeline/lib/test/fixtures/clickhouse_test.json new file mode 100644 index 0000000000..9de4810176 --- /dev/null +++ b/loading_pipeline/lib/test/fixtures/clickhouse_test.json @@ -0,0 +1,306 @@ +[ + { + "model": "clickhouse_search.entriessnvindel", + "pk": 1, + "fields": { + "key": 10, + "project_guid": "project_a", + "family_guid": "family_a1", + "sample_type": "WES", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_a1", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 2, + "fields": { + "key": 1, + "project_guid": "project_a", + "family_guid": "family_a2", + "sample_type": "WGS", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_a2", 1, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 3, + "fields": { + "key": 2, + "project_guid": "project_a", + "family_guid": "family_a3", + "sample_type": "WGS", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_a3", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 4, + "fields": { + "key": 3, + "project_guid": "project_a", + "family_guid": "family_a4", + "sample_type": "WES", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_a4", 0, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 5, + "fields": { + "key": 4, + "project_guid": "project_a", + "family_guid": "family_a5", + "sample_type": "WES", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": true, + "geneId_ids": [0], + "filters": [], + "sign": 1, + "calls": [["sample_a5", 0, null, null, null], ["sample_a6", 1, null, null, null], ["sample_a7", 0, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 6, + "fields": { + "key": 4, + "project_guid": "project_a", + "family_guid": "family_a6", + "sample_type": "WGS", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_a8", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 7, + "fields": { + "key": 10, + "project_guid": "project_b", + "family_guid": "family_b1", + "sample_type": "WES", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_b4", 0, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 8, + "fields": { + "key": 1, + "project_guid": "project_b", + "family_guid": "family_b2", + "sample_type": "WES", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_b5", 1, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 9, + "fields": { + "key": 2, + "project_guid": "project_b", + "family_guid": "family_b2", + "sample_type": "WES", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_b5", 0, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 10, + "fields": { + "key": 3, + "project_guid": "project_b", + "family_guid": "family_b3", + "sample_type": "WES", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_b6", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 11, + "fields": { + "key": 4, + "project_guid": "project_b", + "family_guid": "family_b3", + "sample_type": "WES", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": false, + "geneId_ids": [], + "filters": [], + "sign": 1, + "calls": [["sample_b6", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 12, + "fields": { + "key": 0, + "project_guid": "project_c", + "family_guid": "family_c1", + "sample_type": "WES", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": true, + "geneId_ids": [1], + "filters": [], + "sign": 1, + "calls": [["sample_c7", 0, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 13, + "fields": { + "key": 3, + "project_guid": "project_c", + "family_guid": "family_c2", + "sample_type": "WES", + "xpos": 123456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": true, + "geneId_ids": [1], + "filters": [], + "sign": 1, + "calls": [["sample_c8", 0, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 14, + "fields": { + "key": 4, + "project_guid": "project_c", + "family_guid": "family_c3", + "sample_type": "WES", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": true, + "geneId_ids": [1], + "filters": [], + "sign": 1, + "calls": [["sample_c9", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.entriessnvindel", + "pk": 15, + "fields": { + "key": 5, + "project_guid": "project_c", + "family_guid": "family_c4", + "sample_type": "WES", + "xpos": 133456789, + "is_gnomad_gt_5_percent": false, + "is_annotated_in_any_gene": true, + "geneId_ids": [1], + "filters": [], + "sign": 1, + "calls": [["sample_c9", 2, null, null, null]] + } + }, + { + "model": "clickhouse_search.projectpartitionssnvindel", + "pk": "project_d", + "fields": { + "project_guid": "project_d", + "n_partitions": 2 + } + }, + { + "model": "clickhouse_search.variantdetailssnvindel", + "pk": 1, + "fields": { + "key": 1, + "variant_id": "1-878314-G-C", + "transcripts": [ + [ + [0.9978], "L/F", "protein_coding", 1, "ttA/ttC", ["missense_variant"], [2, 9], "ENSG00000177000", + "ENST00000383791.8:c.156A>C", "ENSP00000373301.3:p.Leu52Phe", [null, null], [null, []], "missense_variant", + null, "NM_004844.5", "NM_004844.5", [false], "ENST00000383791", 0, [null, null, null, [ + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null + ], null] + ] + ], + "sorted_motif_feature_consequences": [], + "sorted_regulatory_feature_consequences": [] + } + }, + { + "model": "clickhouse_search.variantdetailssnvindel", + "pk": 7, + "fields": { + "key": 7, + "variant_id": "7-1234567-AGT-A", + "transcripts": [], + "sorted_motif_feature_consequences": [], + "sorted_regulatory_feature_consequences": [] + } + }, + { + "model": "clickhouse_search.variantdetailssnvindel", + "pk": 10, + "fields": { + "key": 10, + "variant_id": "10-987654-G-A", + "transcripts": [], + "sorted_motif_feature_consequences": [], + "sorted_regulatory_feature_consequences": [] + } + } +] diff --git a/loading_pipeline/lib/test/misc.py b/loading_pipeline/lib/test/misc.py new file mode 100644 index 0000000000..3f21bab165 --- /dev/null +++ b/loading_pipeline/lib/test/misc.py @@ -0,0 +1,46 @@ +import os +import shutil + +import numpy as np + +from loading_pipeline.lib.core import DatasetType, ReferenceGenome, SampleType +from loading_pipeline.lib.paths import project_pedigree_path + + +def convert_ndarray_to_list(obj): + if isinstance(obj, np.ndarray): + return [convert_ndarray_to_list(item) for item in obj.tolist()] + if isinstance(obj, dict): + return {k: convert_ndarray_to_list(v) for k, v in obj.items()} + if isinstance(obj, list): + return [convert_ndarray_to_list(item) for item in obj] + return obj + + +def copy_project_pedigree_to_mocked_dir( + pedigree_path: str, + reference_genome: ReferenceGenome, + dataset_type: DatasetType, + sample_type: SampleType, + project_guid: str, +): + os.makedirs( + os.path.dirname( + project_pedigree_path( + reference_genome, + dataset_type, + sample_type, + project_guid, + ), + ), + exist_ok=True, + ) + shutil.copy2( + pedigree_path, + project_pedigree_path( + reference_genome, + dataset_type, + sample_type, + project_guid, + ), + ) diff --git a/loading_pipeline/lib/test/mock_complete_task.py b/loading_pipeline/lib/test/mock_complete_task.py new file mode 100644 index 0000000000..5740df9678 --- /dev/null +++ b/loading_pipeline/lib/test/mock_complete_task.py @@ -0,0 +1,6 @@ +import luigi + + +class MockCompleteTask(luigi.Task): + def complete(self): + return True diff --git a/loading_pipeline/lib/test/mocked_dataroot_testcase.py b/loading_pipeline/lib/test/mocked_dataroot_testcase.py new file mode 100644 index 0000000000..204b3225a4 --- /dev/null +++ b/loading_pipeline/lib/test/mocked_dataroot_testcase.py @@ -0,0 +1,27 @@ +import os +import shutil +import tempfile +import unittest +from unittest.mock import patch + +from loading_pipeline.lib.core import Env + + +class MockedDatarootTestCase(unittest.TestCase): + def setUp(self) -> None: + super().setUp() + patcher = patch( + 'loading_pipeline.lib.paths.Env', + wraps=Env, + ) # wraps to ensure other attributes behave as they are. + self.mock_env = patcher.start() + self.addCleanup(patcher.stop) # https://stackoverflow.com/a/37534051 + for field_name in Env.__dataclass_fields__: + if field_name.endswith('_DIR'): + setattr(self.mock_env, field_name, tempfile.TemporaryDirectory().name) + + def tearDown(self) -> None: + super().tearDown() + for field_name in Env.__dataclass_fields__: + if os.path.isdir(getattr(self.mock_env, field_name)): + shutil.rmtree(getattr(self.mock_env, field_name)) diff --git a/loading_pipeline/lib/test/mocked_reference_datasets_testcase.py b/loading_pipeline/lib/test/mocked_reference_datasets_testcase.py new file mode 100644 index 0000000000..ee58892be2 --- /dev/null +++ b/loading_pipeline/lib/test/mocked_reference_datasets_testcase.py @@ -0,0 +1,38 @@ +import os +import shutil + +from loading_pipeline.lib.core.definitions import ReferenceGenome +from loading_pipeline.lib.paths import valid_reference_dataset_path +from loading_pipeline.lib.reference_datasets.reference_dataset import ReferenceDataset +from loading_pipeline.lib.test.mocked_dataroot_testcase import MockedDatarootTestCase + +REFERENCE_DATASETS_PATH = 'loading_pipeline/var/test/reference_datasets' + + +class MockedReferenceDatasetsTestCase(MockedDatarootTestCase): + def setUp(self) -> None: + super().setUp() + for reference_genome in ReferenceGenome: + path = os.path.join( + REFERENCE_DATASETS_PATH, + reference_genome.value, + ) + # Use listdir, allowing for missing datasets + # in the tests. + for dataset_name in os.listdir( + path, + ): + # Copy the entire directory tree under + # the dataset name. + shutil.copytree( + os.path.join(path, dataset_name), + os.path.dirname( + valid_reference_dataset_path( + reference_genome, + ReferenceDataset(dataset_name), + ), + ), + ) + + def tearDown(self): + super().tearDown() diff --git a/loading_pipeline/ops/__init__.py b/loading_pipeline/ops/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/ops/repartition_clickhouse_grch38_snv_indel.py b/loading_pipeline/ops/repartition_clickhouse_grch38_snv_indel.py new file mode 100644 index 0000000000..053e9f71c8 --- /dev/null +++ b/loading_pipeline/ops/repartition_clickhouse_grch38_snv_indel.py @@ -0,0 +1,114 @@ +#################################################### +# +# This script is provided as means to repartition an existing `GRCh38/SNV_INDEL/entries` table +# from a project-only partitioning strategy to one that includes project subpartitions. +# Very large genome projects with thousands of families will require additional +# splitting to maintain reasonable loading performance and to keep partition size under +# the recommended ClickHouse maximum. Unfortunately, a ClickHouse table partition definition +# is static upon creation, necessitating the expensive table re-write process demonstrated below. +# +# Post seqr-platform version x.x.x, the subpartition-ing strategy is provided by default; +# earlier installations will continue to function as-is. This script is meant to +# be run under human supervision and with caution. +# +# At the end of this script, you should run the following SQL to finalize the migration: +# EXCHANGE TABLES seqr.'GRCh38/SNV_INDEL/entries' AND staging_grch38_snvindel_repartition.'GRCh38/SNV_INDEL/repartitioned_entries' +# DROP DATABASE `staging_grch38_snvindel_repartition`; +# +# Resource Requirements: +# - Free disk space equal to 2.5x the usage of your current `GRCh38/SNV_INDEL/entries` table. +# +#################################################### +import argparse + +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.misc.clickhouse import ( + logged_query, + normalize_partition, +) + +REPARTITION_DATABASE_NAME = 'staging_grch38_snvindel_repartition' + + +def get_partitions_for_project(project_guid: str): + rows = logged_query( + """ + SELECT DISTINCT partition + FROM system.parts + WHERE + database = %(database)s + AND table = %(table)s + AND partition like %(project_guid)s + """, + { + 'database': REPARTITION_DATABASE_NAME, + 'table': 'GRCh38/SNV_INDEL/repartitioned_entries', + 'project_guid': f'%{project_guid}%', + }, + ) + return [normalize_partition(row[0]) for row in rows] + + +def main(max_insert_threads: int, project_guids: list[str]): + logged_query( + f""" + CREATE DATABASE IF NOT EXISTS {REPARTITION_DATABASE_NAME}; + """, + ) + logged_query( + f""" + CREATE TABLE IF NOT EXISTS {REPARTITION_DATABASE_NAME}.`GRCh38/SNV_INDEL/repartitioned_entries` + AS {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries` + ENGINE = CollapsingMergeTree(sign) + PARTITION BY (project_guid, partition_id) + SETTINGS deduplicate_merge_projection_mode = 'rebuild' + """, # nosec B608 + ) + if not project_guids: + project_guids = [ + x[0] + for x in logged_query( + f""" + SELECT DISTINCT project_guid from {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries` + """, # nosec B608 + ) + ] + for project_guid in project_guids: + for partition in get_partitions_for_project( + project_guid, + ): + logged_query( + f""" + ALTER TABLE {REPARTITION_DATABASE_NAME}.`GRCh38/SNV_INDEL/repartitioned_entries` + DROP PARTITION %(partition)s + """, + {'partition': partition}, + ) + logged_query( + f""" + INSERT INTO {REPARTITION_DATABASE_NAME}.`GRCh38/SNV_INDEL/repartitioned_entries` + SELECT * FROM {Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries` + WHERE project_guid=%(project_guid)s + SETTINGS max_insert_threads=%(max_insert_threads)s + """, # nosec B608 + {'project_guid': project_guid, 'max_insert_threads': max_insert_threads}, + timeout=99999, + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument( + '--max-insert-threads', + type=int, + default=4, + help='Maximum number of insert threads to use (default: 4).', + ) + parser.add_argument( + '--project-guids', + nargs='+', + required=False, + help='Optionally provide an override list of project guids: --project-guids proj1 proj2 proj3', + ) + args = parser.parse_args() + main(args.max_insert_threads, args.project_guids) diff --git a/loading_pipeline/ops/repartition_clickhouse_grch38_snv_indel_test.py b/loading_pipeline/ops/repartition_clickhouse_grch38_snv_indel_test.py new file mode 100644 index 0000000000..dca4e702af --- /dev/null +++ b/loading_pipeline/ops/repartition_clickhouse_grch38_snv_indel_test.py @@ -0,0 +1,122 @@ +from django.db import connections + +from loading_pipeline.lib.core.environment import Env +from loading_pipeline.lib.test.clickhouse_schema_testcase import ( + ClickhouseSchemaTestCase, +) +from loading_pipeline.ops.repartition_clickhouse_grch38_snv_indel import ( + REPARTITION_DATABASE_NAME, + main, +) + +_ENTRIES_TABLE = f'{Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries`' +_PRE_MIGRATION_ENTRIES_TABLE = ( + f'{Env.CLICKHOUSE_DATABASE}.`GRCh38/SNV_INDEL/entries_pre_migration`' +) + + +class RepartitionGRCh38SnvIndelTest(ClickhouseSchemaTestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + f""" + CREATE TABLE {_PRE_MIGRATION_ENTRIES_TABLE} + ( + `key` UInt32, + `project_guid` LowCardinality(String), + `family_guid` String, + `is_annotated_in_any_gene` Boolean, + `sign` Int8, + `sample_type` Enum8('WES' = 1, 'WGS' = 2) MATERIALIZED CAST(1, 'Enum8(\\'WES\\' = 1, \\'WGS\\' = 2)'), + `calls` Array(Tuple(sampleId String, gt Nullable(Enum8('REF' = 0, 'HET' = 1, 'HOM' = 2)))) MATERIALIZED CAST([], 'Array(Tuple(sampleId String, gt Nullable(Enum8(\\'REF\\' = 0, \\'HET\\' = 1, \\'HOM\\' = 2))))'), + `n_partitions` UInt8 MATERIALIZED 2, + `partition_id` UInt8 MATERIALIZED farmHash64(family_guid) % n_partitions, + PROJECTION xpos_projection + ( + SELECT * ORDER BY is_annotated_in_any_gene + ) + ) + ENGINE = CollapsingMergeTree(sign) + PARTITION BY project_guid + ORDER BY (project_guid, family_guid, key) + SETTINGS deduplicate_merge_projection_mode = 'rebuild' + """, + ) + cursor.execute( + f'EXCHANGE TABLES {_ENTRIES_TABLE} AND {_PRE_MIGRATION_ENTRIES_TABLE}', + ) + + @classmethod + def tearDownClass(cls): + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + f'EXCHANGE TABLES {_ENTRIES_TABLE} AND {_PRE_MIGRATION_ENTRIES_TABLE}', + ) + cursor.execute(f'DROP TABLE {_PRE_MIGRATION_ENTRIES_TABLE}') + super().tearDownClass() + + def setUp(self): + super().setUp() + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + f""" + INSERT INTO {_ENTRIES_TABLE} + VALUES + (0, 'project_a', 'family_a1', 0, 1), + (1, 'project_a', 'family_a2', 0, 1), + (2, 'project_a', 'family_a3', 0, 1), + (0, 'project_b', 'family_b1', 0, 1), + (1, 'project_b', 'family_b2', 0, 1), + (2, 'project_b', 'family_b2', 0, 1), + (0, 'project_c', 'family_c1', 1, 1), + (3, 'project_c', 'family_c2', 1, 1), + """, # nosec B608 + ) + + def tearDown(self): + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute(f'DROP DATABASE IF EXISTS {REPARTITION_DATABASE_NAME}') + super().tearDown() + + def test_main_all_projects(self): + main(1, []) + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + f""" + SELECT *, n_partitions, partition_id + FROM {REPARTITION_DATABASE_NAME}.`GRCh38/SNV_INDEL/repartitioned_entries` + """, # nosec B608 + ) + self.assertCountEqual( + cursor.fetchall(), + [ + (3, 'project_c', 'family_c2', True, 1, 2, 1), + (0, 'project_b', 'family_b1', 0, 1, 2, 1), + (1, 'project_b', 'family_b2', 0, 1, 2, 1), + (2, 'project_b', 'family_b2', 0, 1, 2, 1), + (2, 'project_a', 'family_a3', 0, 1, 2, 0), + (0, 'project_a', 'family_a1', 0, 1, 2, 1), + (1, 'project_a', 'family_a2', 0, 1, 2, 1), + (0, 'project_c', 'family_c1', True, 1, 2, 0), + ], + ) + + def test_main_one_project(self): + main(1, ['project_a']) + with connections['clickhouse_write'].cursor() as cursor: + cursor.execute( + f""" + SELECT *, n_partitions, partition_id + FROM {REPARTITION_DATABASE_NAME}.`GRCh38/SNV_INDEL/repartitioned_entries` + """, # nosec B608 + ) + self.assertCountEqual( + cursor.fetchall(), + [ + (2, 'project_a', 'family_a3', 0, 1, 2, 0), + (0, 'project_a', 'family_a1', 0, 1, 2, 1), + (1, 'project_a', 'family_a2', 0, 1, 2, 1), + ], + ) diff --git a/loading_pipeline/pyproject.toml b/loading_pipeline/pyproject.toml new file mode 100644 index 0000000000..43c7cbddc6 --- /dev/null +++ b/loading_pipeline/pyproject.toml @@ -0,0 +1,124 @@ +[project] +name = "seqr-loading-pipeline" +dynamic = ['version'] +requires-python = ">=3.11" +dependencies = [ + "hail==0.2.138", # NB: when upgrading hail, manually verify the below jupyter pins + "luigi==3.5.2", + "gnomad==0.8.0", + "aiofiles==24.1.0", + "pydantic==2.8.2", + "clickhouse-driver==0.2.10", # matches main seqr app's pinned version and django-clickhouse-backend's requirement + "slacker==0.14.0", + "ipykernel==6.29.2", # matches pinned version in hail init_notebook.py + "jupyter-console==6.6.3", # matches pinned version in hail init_notebook.py + "qtconsole==5.6.1", # matches pinned version in hail init_notebook.py + + # Git/URL installs (PEP 508 direct references) + "gnomad-qc @ git+https://github.com/broadinstitute/gnomad_qc.git@v4.1", + "onnxconverter-common @ git+https://github.com/microsoft/onnxconverter-common.git@f7a8eb699caa6f6a78d3bdfbcaf5dfbd43569ebd", + + # Dataproc + "pip==23.2.1", + "google-cloud-dataproc==5.16.0", + "google-cloud-bigquery==3.29.0", + "google-api-python-client==2.159.0", +] + +[dependency-groups] +prod = [ + "sqlalchemy<2.0.0" # This is required for the Luigi UI but nothing else. +] +dev = [ + "coverage>=7.2.2", + "pytest>=7.0.0", + "pytest-cov>=4.0.0", + "pytest-django>=4.8.0", + "django==4.2.30", # matches the main seqr app's pinned version + "django-clickhouse-backend==1.6", # matches the main seqr app's pinned version + "responses>=0.23.1", + "ruff==0.11.3", + "shellcheck-py>=0.10.0", + "pysam", + "pyarrow", +] + +[tool.uv] +exclude-dependencies = ["psycopg2-binary", "psycopg2"] + +[tool.pytest.ini_options] +pythonpath = ["lib/test/clickhouse_django", ".."] +DJANGO_SETTINGS_MODULE = "settings" +django_find_project = false + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.package-data] +"loading_pipeline.var" = ["liftover/*.over.chain.gz"] + +[tool.setuptools.packages.find] +include = ["loading_pipeline*"] +exclude = ["loading_pipeline.bin", "loading_pipeline.deploy", "loading_pipeline*test*"] +namespaces = false + +[tool.ruff] +extend-exclude = [ + 'download_and_create_reference_datasets/v02/*', + 'gcloud_dataproc/*', + 'hail_scripts/*', + 'kubernetes/*', + 'luigi_pipeline/lib/*', + 'luigi_pipeline/seqr*.py', + 'luigi_pipeline/tests/data/*', +] +ignore = [ + # Individual Rules + "E501", # Black is less aggressive here when touching comments and strings, we're going to let those through. + "G004", # logging-f-string, these are fine for now + + # Rule Groupings + "D", # pydocstyle is for docs... we have none + "FBT", # flake-boolean-trap... disallows boolean args to functions... fixing this code will require refactors. + "ANN", # flake8-annotations is for typed code + "DJ", # django specific + "PYI", # pyi is typing stub files + "PT", # pytest specific + "PTH", # pathlib is preferred, but we're not using it yet + "PD", # pandas specific + "NPY", # numpy specific + "TD", # todos + "FIX", # fixmes +] +line-length = 88 +select = [ + "ALL" +] +target-version = "py311" + +[tool.ruff.flake8-quotes] +inline-quotes = "single" + +[tool.ruff.per-file-ignores] +'*test*' = [ + 'ARG002', # allow unused method arguments + 'SLF001', # allow private access + 'PLR0913', # allow high arity functions + 'S101', # allow asserts in tests +] +'*migration*' = [ + 'N999', # allow invalid module names + 'RUF012', # Django migration classes' dependencies/operations are conventionally plain lists +] +'*clickhouse*' = [ + 'S608' # unsafe sql +] +'*pipeline_worker*' = [ + 'S608' # unsafe sql +] + +[tool.ruff.pylint] +max-args = 6 + +[tool.ruff.format] +quote-style = "single" diff --git a/loading_pipeline/uv.lock b/loading_pipeline/uv.lock new file mode 100644 index 0000000000..d07ecefb95 --- /dev/null +++ b/loading_pipeline/uv.lock @@ -0,0 +1,4704 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version == '3.12.*'", + "python_full_version < '3.12'", +] + +[manifest] +excludes = [ + "psycopg2", + "psycopg2-binary", +] + +[[package]] +name = "aiodns" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycares" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/2e/b86ce168485b68d40c6a810838669deacf0abf41845c383659c2b613e69f/aiodns-2.0.0.tar.gz", hash = "sha256:815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d", size = 5948, upload-time = "2019-03-02T12:02:24.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/01/8f2d49b441573fd2478833bdba91cf0b853b4c750a1fbb9e98de1b94bb22/aiodns-2.0.0-py2.py3-none-any.whl", hash = "sha256:aaa5ac584f40fe778013df0aa6544bf157799bd3f608364b451840ed2c8688de", size = 4848, upload-time = "2019-03-02T12:02:22.395Z" }, +] + +[[package]] +name = "aiofiles" +version = "24.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload-time = "2024-06-24T11:02:01.529Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994, upload-time = "2025-10-28T20:59:39.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/74/b321e7d7ca762638cdf8cdeceb39755d9c745aff7a64c8789be96ddf6e96/aiohttp-3.13.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4647d02df098f6434bafd7f32ad14942f05a9caa06c7016fdcc816f343997dd0", size = 743409, upload-time = "2025-10-28T20:56:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/99/3d/91524b905ec473beaf35158d17f82ef5a38033e5809fe8742e3657cdbb97/aiohttp-3.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e3403f24bcb9c3b29113611c3c16a2a447c3953ecf86b79775e7be06f7ae7ccb", size = 497006, upload-time = "2025-10-28T20:56:01.85Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d3/7f68bc02a67716fe80f063e19adbd80a642e30682ce74071269e17d2dba1/aiohttp-3.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43dff14e35aba17e3d6d5ba628858fb8cb51e30f44724a2d2f0c75be492c55e9", size = 493195, upload-time = "2025-10-28T20:56:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/98/31/913f774a4708775433b7375c4f867d58ba58ead833af96c8af3621a0d243/aiohttp-3.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2a9ea08e8c58bb17655630198833109227dea914cd20be660f52215f6de5613", size = 1747759, upload-time = "2025-10-28T20:56:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/e8/63/04efe156f4326f31c7c4a97144f82132c3bb21859b7bb84748d452ccc17c/aiohttp-3.13.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53b07472f235eb80e826ad038c9d106c2f653584753f3ddab907c83f49eedead", size = 1704456, upload-time = "2025-10-28T20:56:06.986Z" }, + { url = "https://files.pythonhosted.org/packages/8e/02/4e16154d8e0a9cf4ae76f692941fd52543bbb148f02f098ca73cab9b1c1b/aiohttp-3.13.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e736c93e9c274fce6419af4aac199984d866e55f8a4cec9114671d0ea9688780", size = 1807572, upload-time = "2025-10-28T20:56:08.558Z" }, + { url = "https://files.pythonhosted.org/packages/34/58/b0583defb38689e7f06798f0285b1ffb3a6fb371f38363ce5fd772112724/aiohttp-3.13.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ff5e771f5dcbc81c64898c597a434f7682f2259e0cd666932a913d53d1341d1a", size = 1895954, upload-time = "2025-10-28T20:56:10.545Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f3/083907ee3437425b4e376aa58b2c915eb1a33703ec0dc30040f7ae3368c6/aiohttp-3.13.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3b6fb0c207cc661fa0bf8c66d8d9b657331ccc814f4719468af61034b478592", size = 1747092, upload-time = "2025-10-28T20:56:12.118Z" }, + { url = "https://files.pythonhosted.org/packages/ac/61/98a47319b4e425cc134e05e5f3fc512bf9a04bf65aafd9fdcda5d57ec693/aiohttp-3.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:97a0895a8e840ab3520e2288db7cace3a1981300d48babeb50e7425609e2e0ab", size = 1606815, upload-time = "2025-10-28T20:56:14.191Z" }, + { url = "https://files.pythonhosted.org/packages/97/4b/e78b854d82f66bb974189135d31fce265dee0f5344f64dd0d345158a5973/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9e8f8afb552297aca127c90cb840e9a1d4bfd6a10d7d8f2d9176e1acc69bad30", size = 1723789, upload-time = "2025-10-28T20:56:16.101Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fc/9d2ccc794fc9b9acd1379d625c3a8c64a45508b5091c546dea273a41929e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed2f9c7216e53c3df02264f25d824b079cc5914f9e2deba94155190ef648ee40", size = 1718104, upload-time = "2025-10-28T20:56:17.655Z" }, + { url = "https://files.pythonhosted.org/packages/66/65/34564b8765ea5c7d79d23c9113135d1dd3609173da13084830f1507d56cf/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:99c5280a329d5fa18ef30fd10c793a190d996567667908bef8a7f81f8202b948", size = 1785584, upload-time = "2025-10-28T20:56:19.238Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/f6a7a426e02fc82781afd62016417b3948e2207426d90a0e478790d1c8a4/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ca6ffef405fc9c09a746cb5d019c1672cd7f402542e379afc66b370833170cf", size = 1595126, upload-time = "2025-10-28T20:56:20.836Z" }, + { url = "https://files.pythonhosted.org/packages/e5/c7/8e22d5d28f94f67d2af496f14a83b3c155d915d1fe53d94b66d425ec5b42/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:47f438b1a28e926c37632bff3c44df7d27c9b57aaf4e34b1def3c07111fdb782", size = 1800665, upload-time = "2025-10-28T20:56:22.922Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/91133c8b68b1da9fc16555706aa7276fdf781ae2bb0876c838dd86b8116e/aiohttp-3.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9acda8604a57bb60544e4646a4615c1866ee6c04a8edef9b8ee6fd1d8fa2ddc8", size = 1739532, upload-time = "2025-10-28T20:56:25.924Z" }, + { url = "https://files.pythonhosted.org/packages/17/6b/3747644d26a998774b21a616016620293ddefa4d63af6286f389aedac844/aiohttp-3.13.2-cp311-cp311-win32.whl", hash = "sha256:868e195e39b24aaa930b063c08bb0c17924899c16c672a28a65afded9c46c6ec", size = 431876, upload-time = "2025-10-28T20:56:27.524Z" }, + { url = "https://files.pythonhosted.org/packages/c3/63/688462108c1a00eb9f05765331c107f95ae86f6b197b865d29e930b7e462/aiohttp-3.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:7fd19df530c292542636c2a9a85854fab93474396a52f1695e799186bbd7f24c", size = 456205, upload-time = "2025-10-28T20:56:29.062Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/01f00e9856d0a73260e86dd8ed0c2234a466c5c1712ce1c281548df39777/aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b", size = 737623, upload-time = "2025-10-28T20:56:30.797Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1b/4be39c445e2b2bd0aab4ba736deb649fabf14f6757f405f0c9685019b9e9/aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc", size = 492664, upload-time = "2025-10-28T20:56:32.708Z" }, + { url = "https://files.pythonhosted.org/packages/28/66/d35dcfea8050e131cdd731dff36434390479b4045a8d0b9d7111b0a968f1/aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7", size = 491808, upload-time = "2025-10-28T20:56:34.57Z" }, + { url = "https://files.pythonhosted.org/packages/00/29/8e4609b93e10a853b65f8291e64985de66d4f5848c5637cddc70e98f01f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb", size = 1738863, upload-time = "2025-10-28T20:56:36.377Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fa/4ebdf4adcc0def75ced1a0d2d227577cd7b1b85beb7edad85fcc87693c75/aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3", size = 1700586, upload-time = "2025-10-28T20:56:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/da/04/73f5f02ff348a3558763ff6abe99c223381b0bace05cd4530a0258e52597/aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f", size = 1768625, upload-time = "2025-10-28T20:56:39.75Z" }, + { url = "https://files.pythonhosted.org/packages/f8/49/a825b79ffec124317265ca7d2344a86bcffeb960743487cb11988ffb3494/aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6", size = 1867281, upload-time = "2025-10-28T20:56:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/b9/48/adf56e05f81eac31edcfae45c90928f4ad50ef2e3ea72cb8376162a368f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e", size = 1752431, upload-time = "2025-10-28T20:56:43.162Z" }, + { url = "https://files.pythonhosted.org/packages/30/ab/593855356eead019a74e862f21523db09c27f12fd24af72dbc3555b9bfd9/aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7", size = 1562846, upload-time = "2025-10-28T20:56:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/39/0f/9f3d32271aa8dc35036e9668e31870a9d3b9542dd6b3e2c8a30931cb27ae/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d", size = 1699606, upload-time = "2025-10-28T20:56:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3c/52d2658c5699b6ef7692a3f7128b2d2d4d9775f2a68093f74bca06cf01e1/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b", size = 1720663, upload-time = "2025-10-28T20:56:48.528Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d4/8f8f3ff1fb7fb9e3f04fcad4e89d8a1cd8fc7d05de67e3de5b15b33008ff/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8", size = 1737939, upload-time = "2025-10-28T20:56:50.77Z" }, + { url = "https://files.pythonhosted.org/packages/03/d3/ddd348f8a27a634daae39a1b8e291ff19c77867af438af844bf8b7e3231b/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16", size = 1555132, upload-time = "2025-10-28T20:56:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/39/b8/46790692dc46218406f94374903ba47552f2f9f90dad554eed61bfb7b64c/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169", size = 1764802, upload-time = "2025-10-28T20:56:54.292Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e4/19ce547b58ab2a385e5f0b8aa3db38674785085abcf79b6e0edd1632b12f/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248", size = 1719512, upload-time = "2025-10-28T20:56:56.428Z" }, + { url = "https://files.pythonhosted.org/packages/70/30/6355a737fed29dcb6dfdd48682d5790cb5eab050f7b4e01f49b121d3acad/aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e", size = 426690, upload-time = "2025-10-28T20:56:58.736Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/b10ac09069973d112de6ef980c1f6bb31cb7dcd0bc363acbdad58f927873/aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45", size = 453465, upload-time = "2025-10-28T20:57:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/bf/78/7e90ca79e5aa39f9694dcfd74f4720782d3c6828113bb1f3197f7e7c4a56/aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be", size = 732139, upload-time = "2025-10-28T20:57:02.455Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742", size = 490082, upload-time = "2025-10-28T20:57:04.784Z" }, + { url = "https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293", size = 489035, upload-time = "2025-10-28T20:57:06.894Z" }, + { url = "https://files.pythonhosted.org/packages/d2/04/db5279e38471b7ac801d7d36a57d1230feeee130bbe2a74f72731b23c2b1/aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811", size = 1720387, upload-time = "2025-10-28T20:57:08.685Z" }, + { url = "https://files.pythonhosted.org/packages/31/07/8ea4326bd7dae2bd59828f69d7fdc6e04523caa55e4a70f4a8725a7e4ed2/aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a", size = 1688314, upload-time = "2025-10-28T20:57:10.693Z" }, + { url = "https://files.pythonhosted.org/packages/48/ab/3d98007b5b87ffd519d065225438cc3b668b2f245572a8cb53da5dd2b1bc/aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4", size = 1756317, upload-time = "2025-10-28T20:57:12.563Z" }, + { url = "https://files.pythonhosted.org/packages/97/3d/801ca172b3d857fafb7b50c7c03f91b72b867a13abca982ed6b3081774ef/aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a", size = 1858539, upload-time = "2025-10-28T20:57:14.623Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e", size = 1739597, upload-time = "2025-10-28T20:57:16.399Z" }, + { url = "https://files.pythonhosted.org/packages/c4/52/7bd3c6693da58ba16e657eb904a5b6decfc48ecd06e9ac098591653b1566/aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb", size = 1555006, upload-time = "2025-10-28T20:57:18.288Z" }, + { url = "https://files.pythonhosted.org/packages/48/30/9586667acec5993b6f41d2ebcf96e97a1255a85f62f3c653110a5de4d346/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded", size = 1683220, upload-time = "2025-10-28T20:57:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/71/01/3afe4c96854cfd7b30d78333852e8e851dceaec1c40fd00fec90c6402dd2/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b", size = 1712570, upload-time = "2025-10-28T20:57:22.253Z" }, + { url = "https://files.pythonhosted.org/packages/11/2c/22799d8e720f4697a9e66fd9c02479e40a49de3de2f0bbe7f9f78a987808/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8", size = 1733407, upload-time = "2025-10-28T20:57:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/34/cb/90f15dd029f07cebbd91f8238a8b363978b530cd128488085b5703683594/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04", size = 1550093, upload-time = "2025-10-28T20:57:26.257Z" }, + { url = "https://files.pythonhosted.org/packages/69/46/12dce9be9d3303ecbf4d30ad45a7683dc63d90733c2d9fe512be6716cd40/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476", size = 1758084, upload-time = "2025-10-28T20:57:28.349Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/0932b558da0c302ffd639fc6362a313b98fdf235dc417bc2493da8394df7/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23", size = 1716987, upload-time = "2025-10-28T20:57:30.233Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8b/f5bd1a75003daed099baec373aed678f2e9b34f2ad40d85baa1368556396/aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254", size = 425859, upload-time = "2025-10-28T20:57:32.105Z" }, + { url = "https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a", size = 452192, upload-time = "2025-10-28T20:57:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/9b/36/e2abae1bd815f01c957cbf7be817b3043304e1c87bad526292a0410fdcf9/aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b", size = 735234, upload-time = "2025-10-28T20:57:36.415Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/1ee62dde9b335e4ed41db6bba02613295a0d5b41f74a783c142745a12763/aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61", size = 490733, upload-time = "2025-10-28T20:57:38.205Z" }, + { url = "https://files.pythonhosted.org/packages/1a/aa/7a451b1d6a04e8d15a362af3e9b897de71d86feac3babf8894545d08d537/aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4", size = 491303, upload-time = "2025-10-28T20:57:40.122Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/209958dbb9b01174870f6a7538cd1f3f28274fdbc88a750c238e2c456295/aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b", size = 1717965, upload-time = "2025-10-28T20:57:42.28Z" }, + { url = "https://files.pythonhosted.org/packages/08/aa/6a01848d6432f241416bc4866cae8dc03f05a5a884d2311280f6a09c73d6/aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694", size = 1667221, upload-time = "2025-10-28T20:57:44.869Z" }, + { url = "https://files.pythonhosted.org/packages/87/4f/36c1992432d31bbc789fa0b93c768d2e9047ec8c7177e5cd84ea85155f36/aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906", size = 1757178, upload-time = "2025-10-28T20:57:47.216Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b4/8e940dfb03b7e0f68a82b88fd182b9be0a65cb3f35612fe38c038c3112cf/aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9", size = 1838001, upload-time = "2025-10-28T20:57:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ef/39f3448795499c440ab66084a9db7d20ca7662e94305f175a80f5b7e0072/aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011", size = 1716325, upload-time = "2025-10-28T20:57:51.327Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/b311500ffc860b181c05d91c59a1313bdd05c82960fdd4035a15740d431e/aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6", size = 1547978, upload-time = "2025-10-28T20:57:53.554Z" }, + { url = "https://files.pythonhosted.org/packages/31/64/b9d733296ef79815226dab8c586ff9e3df41c6aff2e16c06697b2d2e6775/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213", size = 1682042, upload-time = "2025-10-28T20:57:55.617Z" }, + { url = "https://files.pythonhosted.org/packages/3f/30/43d3e0f9d6473a6db7d472104c4eff4417b1e9df01774cb930338806d36b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49", size = 1680085, upload-time = "2025-10-28T20:57:57.59Z" }, + { url = "https://files.pythonhosted.org/packages/16/51/c709f352c911b1864cfd1087577760ced64b3e5bee2aa88b8c0c8e2e4972/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae", size = 1728238, upload-time = "2025-10-28T20:57:59.525Z" }, + { url = "https://files.pythonhosted.org/packages/19/e2/19bd4c547092b773caeb48ff5ae4b1ae86756a0ee76c16727fcfd281404b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa", size = 1544395, upload-time = "2025-10-28T20:58:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/cf/87/860f2803b27dfc5ed7be532832a3498e4919da61299b4a1f8eb89b8ff44d/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4", size = 1742965, upload-time = "2025-10-28T20:58:03.972Z" }, + { url = "https://files.pythonhosted.org/packages/67/7f/db2fc7618925e8c7a601094d5cbe539f732df4fb570740be88ed9e40e99a/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a", size = 1697585, upload-time = "2025-10-28T20:58:06.189Z" }, + { url = "https://files.pythonhosted.org/packages/0c/07/9127916cb09bb38284db5036036042b7b2c514c8ebaeee79da550c43a6d6/aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940", size = 431621, upload-time = "2025-10-28T20:58:08.636Z" }, + { url = "https://files.pythonhosted.org/packages/fb/41/554a8a380df6d3a2bba8a7726429a23f4ac62aaf38de43bb6d6cde7b4d4d/aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4", size = 457627, upload-time = "2025-10-28T20:58:11Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8e/3824ef98c039d3951cb65b9205a96dd2b20f22241ee17d89c5701557c826/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673", size = 767360, upload-time = "2025-10-28T20:58:13.358Z" }, + { url = "https://files.pythonhosted.org/packages/a4/0f/6a03e3fc7595421274fa34122c973bde2d89344f8a881b728fa8c774e4f1/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd", size = 504616, upload-time = "2025-10-28T20:58:15.339Z" }, + { url = "https://files.pythonhosted.org/packages/c6/aa/ed341b670f1bc8a6f2c6a718353d13b9546e2cef3544f573c6a1ff0da711/aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3", size = 509131, upload-time = "2025-10-28T20:58:17.693Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f0/c68dac234189dae5c4bbccc0f96ce0cc16b76632cfc3a08fff180045cfa4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf", size = 1864168, upload-time = "2025-10-28T20:58:20.113Z" }, + { url = "https://files.pythonhosted.org/packages/8f/65/75a9a76db8364b5d0e52a0c20eabc5d52297385d9af9c35335b924fafdee/aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e", size = 1719200, upload-time = "2025-10-28T20:58:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/f5/55/8df2ed78d7f41d232f6bd3ff866b6f617026551aa1d07e2f03458f964575/aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5", size = 1843497, upload-time = "2025-10-28T20:58:24.672Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e0/94d7215e405c5a02ccb6a35c7a3a6cfff242f457a00196496935f700cde5/aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad", size = 1935703, upload-time = "2025-10-28T20:58:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/0b/78/1eeb63c3f9b2d1015a4c02788fb543141aad0a03ae3f7a7b669b2483f8d4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e", size = 1792738, upload-time = "2025-10-28T20:58:29.787Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/aaf1eea4c188e51538c04cc568040e3082db263a57086ea74a7d38c39e42/aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61", size = 1624061, upload-time = "2025-10-28T20:58:32.529Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c2/3b6034de81fbcc43de8aeb209073a2286dfb50b86e927b4efd81cf848197/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661", size = 1789201, upload-time = "2025-10-28T20:58:34.618Z" }, + { url = "https://files.pythonhosted.org/packages/c9/38/c15dcf6d4d890217dae79d7213988f4e5fe6183d43893a9cf2fe9e84ca8d/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98", size = 1776868, upload-time = "2025-10-28T20:58:38.835Z" }, + { url = "https://files.pythonhosted.org/packages/04/75/f74fd178ac81adf4f283a74847807ade5150e48feda6aef024403716c30c/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693", size = 1790660, upload-time = "2025-10-28T20:58:41.507Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/7368bd0d06b16b3aba358c16b919e9c46cf11587dc572091031b0e9e3ef0/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a", size = 1617548, upload-time = "2025-10-28T20:58:43.674Z" }, + { url = "https://files.pythonhosted.org/packages/7d/4b/a6212790c50483cb3212e507378fbe26b5086d73941e1ec4b56a30439688/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be", size = 1817240, upload-time = "2025-10-28T20:58:45.787Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f7/ba5f0ba4ea8d8f3c32850912944532b933acbf0f3a75546b89269b9b7dde/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c", size = 1762334, upload-time = "2025-10-28T20:58:47.936Z" }, + { url = "https://files.pythonhosted.org/packages/7e/83/1a5a1856574588b1cad63609ea9ad75b32a8353ac995d830bf5da9357364/aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734", size = 464685, upload-time = "2025-10-28T20:58:50.642Z" }, + { url = "https://files.pythonhosted.org/packages/9f/4d/d22668674122c08f4d56972297c51a624e64b3ed1efaa40187607a7cb66e/aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f", size = 498093, upload-time = "2025-10-28T20:58:52.782Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "annoy" +version = "1.17.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/38/e321b0e05d8cc068a594279fb7c097efb1df66231c295d482d7ad51b6473/annoy-1.17.3.tar.gz", hash = "sha256:9cbfebefe0a5f843eba29c6be4c84d601f4f41ad4ded0486f1b88c3b07739c15", size = 647460, upload-time = "2023-06-14T16:37:34.152Z" } + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asgiref" +version = "3.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "avro" +version = "1.11.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/6a/f128a761a826f05e65217ea8c4f36347a4debe78980f5a0ec3bad798d353/avro-1.11.5.tar.gz", hash = "sha256:d0dcea258daa2b93e07d00fa636d21afe7e099c577abd388996df170d22afb15", size = 90574, upload-time = "2025-10-15T20:28:38.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/74/1178ebc9d305a1d2c11fc99cb13a51be8980f35a5dd133e970ab42ce16bf/avro-1.11.5-py2.py3-none-any.whl", hash = "sha256:2ef83e3b2abc79592b77223101aa53d0dad1ba4e549a9c3aff9ff228d49bdc7a", size = 123924, upload-time = "2025-10-15T20:28:36.723Z" }, +] + +[[package]] +name = "azure-common" +version = "1.1.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/71/f6f71a276e2e69264a97ad39ef850dca0a04fce67b12570730cb38d0ccac/azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3", size = 20914, upload-time = "2022-02-03T19:39:44.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/55/7f118b9c1b23ec15ca05d15a578d8207aa1706bc6f7c87218efffbbf875d/azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad", size = 14462, upload-time = "2022-02-03T19:39:42.417Z" }, +] + +[[package]] +name = "azure-core" +version = "1.36.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/c4/d4ff3bc3ddf155156460bff340bbe9533f99fac54ddea165f35a8619f162/azure_core-1.36.0.tar.gz", hash = "sha256:22e5605e6d0bf1d229726af56d9e92bc37b6e726b141a18be0b4d424131741b7", size = 351139, upload-time = "2025-10-15T00:33:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/3c/b90d5afc2e47c4a45f4bba00f9c3193b0417fad5ad3bb07869f9d12832aa/azure_core-1.36.0-py3-none-any.whl", hash = "sha256:fee9923a3a753e94a259563429f3644aaf05c486d45b1215d098115102d91d3b", size = 213302, upload-time = "2025-10-15T00:33:51.058Z" }, +] + +[[package]] +name = "azure-identity" +version = "1.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "cryptography" }, + { name = "msal" }, + { name = "msal-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/8d/1a6c41c28a37eab26dc85ab6c86992c700cd3f4a597d9ed174b0e9c69489/azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456", size = 279826, upload-time = "2025-10-06T20:30:02.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/7b/5652771e24fff12da9dde4c20ecf4682e606b104f26419d139758cc935a6/azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651", size = 191317, upload-time = "2025-10-06T20:30:04.251Z" }, +] + +[[package]] +name = "azure-mgmt-core" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/99/fa9e7551313d8c7099c89ebf3b03cd31beb12e1b498d575aa19bb59a5d04/azure_mgmt_core-1.6.0.tar.gz", hash = "sha256:b26232af857b021e61d813d9f4ae530465255cb10b3dde945ad3743f7a58e79c", size = 30818, upload-time = "2025-07-03T02:02:24.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/26/c79f962fd3172b577b6f38685724de58b6b4337a51d3aad316a43a4558c6/azure_mgmt_core-1.6.0-py3-none-any.whl", hash = "sha256:0460d11e85c408b71c727ee1981f74432bc641bb25dfcf1bb4e90a49e776dbc4", size = 29310, upload-time = "2025-07-03T02:02:25.203Z" }, +] + +[[package]] +name = "azure-mgmt-storage" +version = "20.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-common" }, + { name = "azure-mgmt-core" }, + { name = "msrest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/28/9b6b046600a39b3947feec29a827cf506547fa050c3bfe93be08a288e63a/azure-mgmt-storage-20.1.0.zip", hash = "sha256:214f3fde8c91e27d53f2e654a28d15003ad3f6f15c8438a8205f0c88a48d9451", size = 2400474, upload-time = "2022-08-10T03:36:27.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/24/33da34950a637df9bca4bac4b99be81e060613edf22a54589d17e2b7b51a/azure_mgmt_storage-20.1.0-py3-none-any.whl", hash = "sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659", size = 2334577, upload-time = "2022-08-10T03:36:23.875Z" }, +] + +[[package]] +name = "azure-storage-blob" +version = "12.27.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "cryptography" }, + { name = "isodate" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/7c/2fd872e11a88163f208b9c92de273bf64bb22d0eef9048cc6284d128a77a/azure_storage_blob-12.27.1.tar.gz", hash = "sha256:a1596cc4daf5dac9be115fcb5db67245eae894cf40e4248243754261f7b674a6", size = 597579, upload-time = "2025-10-29T12:27:16.185Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/9e/1c90a122ea6180e8c72eb7294adc92531b0e08eb3d2324c2ba70d37f4802/azure_storage_blob-12.27.1-py3-none-any.whl", hash = "sha256:65d1e25a4628b7b6acd20ff7902d8da5b4fde8e46e19c8f6d213a3abc3ece272", size = 428954, upload-time = "2025-10-29T12:27:18.072Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, +] + +[[package]] +name = "biocommons-seqrepo" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bioutils" }, + { name = "coloredlogs" }, + { name = "ipython" }, + { name = "pysam" }, + { name = "requests" }, + { name = "requests-html" }, + { name = "six" }, + { name = "tqdm" }, + { name = "yoyo-migrations" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/aa/2cc9896cf50e2748c7e3c5978774ef6c10ca19aa3525ca38ea136afcee5b/biocommons.seqrepo-0.6.7.tar.gz", hash = "sha256:2c3f982c1ed3adb1971a0dd2e7a554d096a1c5801075e384a62dd3f73d5e8c81", size = 102824, upload-time = "2024-02-14T17:28:53.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6b/75037d7fa802e4856c5c0b3e5b2b21c4b18dd0d06cdc4bd8ccadb05d67c9/biocommons.seqrepo-0.6.7-py3-none-any.whl", hash = "sha256:be142788237452f6a107fd83ab075da5abc2b92f7eecfa86e97d4b33b2941dbb", size = 39336, upload-time = "2024-02-14T17:28:51.402Z" }, +] + +[[package]] +name = "bioutils" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/d6/10fbd7127cd6618dae4041305313b672d2597a44c0da6a7e32b0e5eefec2/bioutils-0.6.1.tar.gz", hash = "sha256:6ad7a9b6da73beea798a935499339d8b60a434edc37dfc803474d2e93e0e64aa", size = 387598, upload-time = "2024-11-04T01:43:19.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/b5/29234ceb28f4cb81c925145bb2edfb8105206243144f84d960478e255484/bioutils-0.6.1-py3-none-any.whl", hash = "sha256:9928297331b9fc0a4fd4235afdef9a80a0916d8b5c2811ab781bded0dad4b9b6", size = 313484, upload-time = "2024-11-04T01:43:17.544Z" }, +] + +[[package]] +name = "bokeh" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pillow" }, + { name = "pyyaml" }, + { name = "tornado" }, + { name = "xyzservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/a8/4f750e1febe3b8d448794a7b85cd0efd2eb649eb915c990bcdd3650a5f3b/bokeh-3.4.3.tar.gz", hash = "sha256:b7c22fb0f7004b04f12e1b7b26ee0269a26737a08ded848fb58f6a34ec1eb155", size = 6410715, upload-time = "2024-07-25T10:44:33.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/5d/e96520996607c9b894a4716ddedc447a68351b0a8729f26ac012c8e7041b/bokeh-3.4.3-py3-none-any.whl", hash = "sha256:c6f33817f866fc67fbeb5df79cd13a8bb592c05c591f3fd7f4f22b824f7afa01", size = 7017720, upload-time = "2024-07-25T10:44:29.542Z" }, +] + +[[package]] +name = "boto3" +version = "1.40.69" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/36/65d292d14261aedbb9a22e5bf194d84c119c889135b42448db646d06d76b/boto3-1.40.69.tar.gz", hash = "sha256:5273f6bac347331a87db809dff97d8736c50c3be19f2bb36ad08c5131c408976", size = 111628, upload-time = "2025-11-07T20:26:26.949Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/2f/65009a8d274cd9c7211807c1a07cce17203ffe76368e3ebc4ca03a7b79de/boto3-1.40.69-py3-none-any.whl", hash = "sha256:c3f710a1990c4be1c0db43b938743d4e404c7f1f06d5f1fa0c8e9b1cea4290b2", size = 139361, upload-time = "2025-11-07T20:26:24.522Z" }, +] + +[[package]] +name = "botocore" +version = "1.40.69" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/73/42499b183ca5cef25c35338ad2636368b0ae2193654642756492e96ee906/botocore-1.40.69.tar.gz", hash = "sha256:df310ddc4d2de5543ba3df4e4b5f9907a2951896d63a9fbae115c26ca0976951", size = 14440352, upload-time = "2025-11-07T20:26:14.276Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/d6/bf2b91d4a92af6ee70e0689913414463a48cf51c0fc855c98b94bde8e7f3/botocore-1.40.69-py3-none-any.whl", hash = "sha256:5d810efeb9e18f91f32690642fa81ae60e482eefeea0d35ec72da2e3d924c1a5", size = 14103454, upload-time = "2025-11-07T20:26:09.486Z" }, +] + +[[package]] +name = "bs4" +version = "0.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698, upload-time = "2024-01-17T18:15:47.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189, upload-time = "2024-01-17T18:15:48.613Z" }, +] + +[[package]] +name = "cachetools" +version = "6.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" }, +] + +[[package]] +name = "canonicaljson" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/f2/2835b7ab464988d1f85e351a19c4d6b2e4c317ba8484ebd2a311850eab8c/canonicaljson-2.0.0.tar.gz", hash = "sha256:e2fdaef1d7fadc5d9cb59bd3d0d41b064ddda697809ac4325dced721d12f113f", size = 10716, upload-time = "2023-03-15T01:51:52.883Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/54/346f681c24a9c3a08e2e74dcee2555ccd1081705b46f791f7b228e177d06/canonicaljson-2.0.0-py3-none-any.whl", hash = "sha256:c38a315de3b5a0532f1ec1f9153cd3d716abfc565a558d00a4835428a34fca5b", size = 7921, upload-time = "2023-03-15T01:51:50.931Z" }, +] + +[[package]] +name = "certifi" +version = "2025.10.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "clickhouse-driver" +version = "0.2.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytz" }, + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/9e/d8e40b29b6269a84552441a553fc64dff28f2d7e2d92e81c6be84fe12b4c/clickhouse_driver-0.2.10.tar.gz", hash = "sha256:925fc6ecda1e5314e3f03bcb493955c068b070cdba221fb8ce27329ee8a7f71b", size = 409448, upload-time = "2025-11-10T22:49:58.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/9d/bb9ee6df5a8fb60b56f9ca76cb9b22beb6d47d45ce561dca4ef9a63c1d4a/clickhouse_driver-0.2.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946daf834f021d69acbebee7abde87bd4ad5aa46fa7b7643805abc7ff487a91f", size = 212466, upload-time = "2025-11-10T22:47:33.591Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e0/1ae285f4d5bb61bb62016deb38dc175a2b8cbe578dffdad5e1a5a02a176c/clickhouse_driver-0.2.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3572e74cd65828f72284bf607de259c059178b44b19a93cb67766b7e7458cf8e", size = 208477, upload-time = "2025-11-10T22:47:34.925Z" }, + { url = "https://files.pythonhosted.org/packages/28/04/e2fb47a4aaf9653c9ed872e1505e997d42f834b0891351ef54169e100c5c/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:767af2b2d2e02fb7abd8fc9619f8aa2de65be010d3024029d68bc9b1be564466", size = 1006131, upload-time = "2025-11-10T22:47:36.386Z" }, + { url = "https://files.pythonhosted.org/packages/e3/52/626cf3a908dde51638213a6c414e86bc66c47e384cb379c4a0533930a329/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b00005a89f0e40ec0bc313f7e131d958aa17e6af5c3260dbb5c7daf5370c5443", size = 1059838, upload-time = "2025-11-10T22:47:38.266Z" }, + { url = "https://files.pythonhosted.org/packages/12/57/a5917930760e4032e98017916bd6770308e146d44c58e450da6fa87f2d4b/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a62ad120dab6bcc68b6413b7ef0dbaef75ab5ca985d490a9e1ec13d93bf33dc3", size = 1069504, upload-time = "2025-11-10T22:47:40.681Z" }, + { url = "https://files.pythonhosted.org/packages/f5/08/4419ce43b27b6349fd14af0d8f5d8594d270b9bb24cbaca575bacfec630e/clickhouse_driver-0.2.10-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9f65e71c99f0c8a64afa348977793967f897c4f731984ed54fed4eca8d375a0", size = 998284, upload-time = "2025-11-10T22:47:42.713Z" }, + { url = "https://files.pythonhosted.org/packages/36/10/edbe55be3554e2cea7c68ed1761aaa2bea0153474d81a467a0ac862b3478/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c120b182ea7e9713b119ba2b518dd75503c18f26cb001a6e436326765fddd123", size = 971989, upload-time = "2025-11-10T22:47:44.642Z" }, + { url = "https://files.pythonhosted.org/packages/2f/18/d0b883af04067c70e99c22dbab1f085062ae764a063f22d4e144e833048d/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3da6f6d05f14780f3183f8b7b23ed9826d1e0f2f73c2471037d5335b474782e", size = 1022107, upload-time = "2025-11-10T22:47:46.148Z" }, + { url = "https://files.pythonhosted.org/packages/fe/40/11446c52c5330123354f2f88151c620e1b38ca6d5131b2cc71786ec3c067/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9617c6ef154e58c6693be6e1169000957238f83d21fe20d57bb492412cc6128d", size = 1015750, upload-time = "2025-11-10T22:47:47.702Z" }, + { url = "https://files.pythonhosted.org/packages/36/9b/32abe3c76fe8494ad1642febbe4c59dfd46477e27c401d2ac8cc8a0a6117/clickhouse_driver-0.2.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8c2dbee2083295c6d9789a10cb0c967c4e123e6315e3192e4ad935cd55967c3", size = 975901, upload-time = "2025-11-10T22:47:49.136Z" }, + { url = "https://files.pythonhosted.org/packages/5f/50/0cbbe783bf14381add11a241b4ba35349f5512d1765aabde63d7175c1f0b/clickhouse_driver-0.2.10-cp311-cp311-win32.whl", hash = "sha256:293f47bd36a5b69ede39638ea8f7c1eb3fa7e55f35778a3feb9a3615749100c4", size = 190097, upload-time = "2025-11-10T22:47:50.463Z" }, + { url = "https://files.pythonhosted.org/packages/1c/12/7bb65617527b2b9a2b4ca8cc0d1ea2d4bdbd6d05a4d9d141cef0083342db/clickhouse_driver-0.2.10-cp311-cp311-win_amd64.whl", hash = "sha256:c9aeebbb0c159173de37deef494b28a4423a767cd7c4b2d596556f7a072f90a6", size = 203591, upload-time = "2025-11-10T22:47:51.562Z" }, + { url = "https://files.pythonhosted.org/packages/a9/54/0a82bcfc66bbab7a36c37b4bd8b8d088d9001da93661e278b7f6c87a3791/clickhouse_driver-0.2.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1851f5f8b84ead0be6373ef001e8f09d48d45ec0628377e199a223e70417cd40", size = 213107, upload-time = "2025-11-10T22:47:53.314Z" }, + { url = "https://files.pythonhosted.org/packages/32/7b/8e526f6ffb9983c0c6d082e358df4b20fe1a9e95f453e704bc7a25ef4aab/clickhouse_driver-0.2.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:188775d38ff7cb36e7045441aabf3a6a8751127d8b37b6eb1b1518494eaac5bd", size = 207193, upload-time = "2025-11-10T22:47:55.146Z" }, + { url = "https://files.pythonhosted.org/packages/65/96/40f274896abf287c378575f025c602fa4e834278930dd63574ff548815c4/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ff5cba860df61845d6ae12f31d4a70ff4ae3be4e6a8a876e68af8aa4b0e45bc", size = 1046187, upload-time = "2025-11-10T22:47:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/0c/80/7b6e110c3b803fa8b3f8cdba0e08553a62c5f64e5ad57e56de3ea95cd9e1/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fad865009d96de44d548f1691ed92adee971f72c001cf4466b3ba2ac7d9db47b", size = 1088806, upload-time = "2025-11-10T22:47:59.834Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d6/7f77bd00fc01df9db2e573de21bbc1f66083549d004864b892877dee8a76/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cf0fe791e7c2adc0ab41d4770953c00f8a88bdd7e3ee83bb849a661a6c93d4ef", size = 1109839, upload-time = "2025-11-10T22:48:01.405Z" }, + { url = "https://files.pythonhosted.org/packages/55/f7/57a80ff9cc44a333021e2caf8d35fc23da6ec7b602bbc3bf8dfac0253a6e/clickhouse_driver-0.2.10-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5744daafdd0ff7520c6ae95a78211a0ff5c2cfb3513a20f5602d2bc7eed580d", size = 1049773, upload-time = "2025-11-10T22:48:03.089Z" }, + { url = "https://files.pythonhosted.org/packages/f6/3e/fcf8e9cb9edc717ce6c467a9ec7c96b4495d5f8ec4859175952149fbdaa8/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f02f6c9f71ae5c06e3b760d3d9f4f758b32acf6f71504b6d90bacca9abbfec18", size = 1006817, upload-time = "2025-11-10T22:48:05.038Z" }, + { url = "https://files.pythonhosted.org/packages/95/ab/1bc25a385012c03595b91311d8341205a5790375207d80425e2285055d42/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6df571410f149e16e0a0e5529f1c2a9e41bb62b9357a3c8b0bd0647d6bb0fd1e", size = 1051047, upload-time = "2025-11-10T22:48:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/9dd7331d08495beacf4291a6fbe5514fd0f6f8d53014121a8d70d8bd6c1e/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1e891162226a44fa169bdc996efd49b22bcf59372c35118ec5785e936fe97178", size = 1052014, upload-time = "2025-11-10T22:48:08.608Z" }, + { url = "https://files.pythonhosted.org/packages/ee/e9/af10e0ddbbd90c4ead933effff1b8914bc687bd52a70d244404db4c91529/clickhouse_driver-0.2.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3a261947ba0cf0034d044c30563ad151d1cf8156a5ff419b017c423b4235e0ac", size = 1020937, upload-time = "2025-11-10T22:48:10.993Z" }, + { url = "https://files.pythonhosted.org/packages/f8/78/dbb93037939a7f9424451d10feeb0daa0d5a76163ef2e62407f4d18705ea/clickhouse_driver-0.2.10-cp312-cp312-win32.whl", hash = "sha256:d94f4db3c338ed41b28379931756852586920c5cbac1f07fcc8b7f109b3e69db", size = 190729, upload-time = "2025-11-10T22:48:12.742Z" }, + { url = "https://files.pythonhosted.org/packages/b6/86/74bddbfaa3c116da34d8c762f728c59d9842a65f202b0b746f5d9a597869/clickhouse_driver-0.2.10-cp312-cp312-win_amd64.whl", hash = "sha256:3ce051f55bdb33396f76a77702936bfa973dfd98f7cf00a72817a1e01c9b7406", size = 204141, upload-time = "2025-11-10T22:48:14.452Z" }, + { url = "https://files.pythonhosted.org/packages/76/7f/ee5d539611b782a04845545ba391208634124f67c4d57a32d4a46eadfb58/clickhouse_driver-0.2.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e76c1189a6273c79d906ee8274b9d3c7bf8df597ee6199cb75449ee2702deb8a", size = 210645, upload-time = "2025-11-10T22:48:15.995Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/ee5a2d7a812b65d9690e46222218f33064c4bd44f3535b1ba564fb4b528b/clickhouse_driver-0.2.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8be64c77d58d4a33b3c957cdb7c5a4deeac56bf93f4188dbfb5c5454eb04c985", size = 205158, upload-time = "2025-11-10T22:48:17.745Z" }, + { url = "https://files.pythonhosted.org/packages/03/00/6c532a0aea89e3d09dd4150b1df0b92e787a306b8711d54d003d18fd1ddd/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23abafd0c883ccc1baea527c1d05a6bc0c59aae6c29ae65e1b84d498b265f8c0", size = 1033476, upload-time = "2025-11-10T22:48:19.239Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9b/137ea1ff9539da77cd022331ec4fa079cbefbd4ebbcb5c51bdd7dcd0bca0/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:77ffe2063469c637c5e57bf0713ca1b617b612d55a8392799f97e34c353e6908", size = 1079495, upload-time = "2025-11-10T22:48:20.744Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1c/e13766af7e4e174c6f17b1fbc5a078b28584f53adc91f103caacc73f569b/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df2d77779fcc1ddb68614b75bf45b8db61cf63f42a03d5624ce6922a305e609f", size = 1100658, upload-time = "2025-11-10T22:48:22.277Z" }, + { url = "https://files.pythonhosted.org/packages/41/e5/0686ad3ef1b594c16e8b13394c73ee4860fd025d70211a360f797dd7a28a/clickhouse_driver-0.2.10-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e46e31e4b14626571819e669341a3017376ce935d25b2cc0bfea9343b1b562", size = 1034175, upload-time = "2025-11-10T22:48:24.117Z" }, + { url = "https://files.pythonhosted.org/packages/d8/32/fea4e971297b50e5af3318fd90d400269ae1c74ad4d83a9453b89f578d3c/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d7435d1ff2bc577aeedf8f01d94b5777af382484f8973a9c5018d5afd0dd175c", size = 995963, upload-time = "2025-11-10T22:48:25.824Z" }, + { url = "https://files.pythonhosted.org/packages/02/c4/d42f2b69ab5903e5bc9119b179f55c9aef79fe667f77cab4d8ae90492dcd/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b60c7e3321214eec4568811bcd953836671fa078c57f6607f236414447636de2", size = 1044626, upload-time = "2025-11-10T22:48:27.927Z" }, + { url = "https://files.pythonhosted.org/packages/78/36/043b6b2d967396172a60f10bf26de2c83248857f9a1e75b481f02218d1d7/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13fdf6571e20ac79992605ad65058296ac0f2437c1e7428a98dd6d173753119e", size = 1045772, upload-time = "2025-11-10T22:48:29.439Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cf/bc5c807cbe68ce9eeac6a1997b937c81774ca86b2ab593c6efb9121a9f08/clickhouse_driver-0.2.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06b6b683af086f9049d0c5e7e660fb76013439efa640e6c8ff6673622c3838fa", size = 1006716, upload-time = "2025-11-10T22:48:31.086Z" }, + { url = "https://files.pythonhosted.org/packages/d9/21/9b0e4814aa6c78d717c22cf51e3a5bd73b4f09c4078fc3f274f8a17c3658/clickhouse_driver-0.2.10-cp313-cp313-win32.whl", hash = "sha256:8fc51b0991dc9b89ea2379a0bc0995a9ed24428aad834f6af7841cc94488b82f", size = 189789, upload-time = "2025-11-10T22:48:33.039Z" }, + { url = "https://files.pythonhosted.org/packages/85/7d/46195e09d4b43f59bc9053f81f6d0c0f25e44c8ef94218fe3c972067cdf4/clickhouse_driver-0.2.10-cp313-cp313-win_amd64.whl", hash = "sha256:fbfe244d2f06824e175492a54033d8282f0ec5644db8e7e3805f7a9d076f5fcf", size = 203020, upload-time = "2025-11-10T22:48:34.874Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9f/513e661a80b0db9b6be5ce525d6cc86339c04dfc8d75f577b775e5ac5cf1/clickhouse_driver-0.2.10-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:19dd1de015d98dd1559d14ef05de2b6a0560c98b77ef160b3b99632a87fc8212", size = 211779, upload-time = "2025-11-10T22:48:36.873Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6e/842610028ca39c826865402d46b7d7f499a9a249de219edfce889c0e025d/clickhouse_driver-0.2.10-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b6f35a9ee7f7a8ce3483764c3bc2d23c8be1c5ce3aef537b1a3cebe59fdb0c4d", size = 205709, upload-time = "2025-11-10T22:48:38.404Z" }, + { url = "https://files.pythonhosted.org/packages/c6/94/ddbcda962f7ca36cbcf7ded105f68f99b261dc29b9c28ca2eaec70382f66/clickhouse_driver-0.2.10-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:888ab59b2cccda24680cfbaeb723fd8922c6148b9a43ad4cf067fef55959f19f", size = 1032732, upload-time = "2025-11-10T22:48:40.047Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1d/9d378af127ca1d35b734c965a9ec26318253f07d2a7eaa4a5643210fe327/clickhouse_driver-0.2.10-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fbf5d692ee4df241e82d200a195dc2ddbe7fbf490ebd185fbd9da32478245399", size = 1085199, upload-time = "2025-11-10T22:48:41.784Z" }, + { url = "https://files.pythonhosted.org/packages/3c/38/d65aedbe40e08a085fe3c2fcdcfcc0cec084d2e838e653c1ed4408771d9a/clickhouse_driver-0.2.10-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f1d42ffcdc5b77346403e7ac49639a48c2fb58767a3e55657bd40e36290e9f0", size = 1089153, upload-time = "2025-11-10T22:48:43.283Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/e60fbcd5ec1458da9fe313984527e9ce5f95636c178bd2d08d6257c42c30/clickhouse_driver-0.2.10-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74b36dfb79311bcf1ba6edde926908a46778a5e9db6302f126a799550f1fb807", size = 1023508, upload-time = "2025-11-10T22:48:44.83Z" }, + { url = "https://files.pythonhosted.org/packages/9b/80/345be27d8011bcbd2fd3437d15b0e387369e2a8a8b73a7704af25bb6e90b/clickhouse_driver-0.2.10-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8c49d4b6619ce9237817185a41db6645f1557f7a77f2a822029ded1041179d55", size = 995994, upload-time = "2025-11-10T22:48:46.35Z" }, + { url = "https://files.pythonhosted.org/packages/0c/76/de011c4460a2b80e517c9a5f1b80a9fe3937e2987989e9776a79dc0a1e99/clickhouse_driver-0.2.10-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:503bbcbfedd65840489dadf3d0a2ac391888828b8f82579e6ec08efb1f362659", size = 1043865, upload-time = "2025-11-10T22:48:47.924Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/264b6bb95488eebd79565372c8fbe397df2aac1478224629ebdc229eab00/clickhouse_driver-0.2.10-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:64aa403194bf4d3bdbecc2f8412ca85f4b9a35ed8dc228f23061a9889ce18dc4", size = 1038468, upload-time = "2025-11-10T22:48:50.706Z" }, + { url = "https://files.pythonhosted.org/packages/ec/95/01b3cc32ba060132ce9183f7af9059995fed2ded8d41865e86193f17ce30/clickhouse_driver-0.2.10-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20b16b066760cfcc6a8a5342e91585a84ba22152f83421030edd3582b6e420e3", size = 998721, upload-time = "2025-11-10T22:48:52.924Z" }, + { url = "https://files.pythonhosted.org/packages/85/d4/21e3203f8d22ad32224b0623ad2772103bb3a05ce367d6b27e78e118ea2f/clickhouse_driver-0.2.10-cp314-cp314-win32.whl", hash = "sha256:5ac6eed651dd6320a50338ff331fea93d20ed13dec27c7c7bfab71f8db3c76bb", size = 192639, upload-time = "2025-11-10T22:48:54.729Z" }, + { url = "https://files.pythonhosted.org/packages/ac/6b/1e87eb25614c0477fdadd5cf0b49675bc91cfcae95a10cbb83e3a688b01b/clickhouse_driver-0.2.10-cp314-cp314-win_amd64.whl", hash = "sha256:9f17746188833162e06e6af595e6a41c2ed09c7714b96860217c696fdb7689cf", size = 206586, upload-time = "2025-11-10T22:48:56.002Z" }, + { url = "https://files.pythonhosted.org/packages/d7/64/6d8ea99c03e99aaf8dfe87961fd2e5baedc72d0a289cab1c5138acbe2d1b/clickhouse_driver-0.2.10-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cb0bbad7b79ecb41f5f348528b6b0c46850d741669dd453f5fa633a8f3eff855", size = 190729, upload-time = "2025-11-10T22:49:45.635Z" }, + { url = "https://files.pythonhosted.org/packages/40/7d/9abdd95b0da0dcf6dc644336459f132575bfbdee1a4ba377195c2032c03a/clickhouse_driver-0.2.10-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68e96e04282d126486b3820391a8ebf1d7c32b61e5fcbd701aeeda79017349e5", size = 216933, upload-time = "2025-11-10T22:49:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/33d4b6f1650847280265756e4d54f94730cdac082ab3f9e6518ba97502bf/clickhouse_driver-0.2.10-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fd9f72fcfe86e0fef0681cd124325714e92e96ad1fd675dfbeaccdfb7bd2f64", size = 219670, upload-time = "2025-11-10T22:49:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/d6/c0/320b7cb5e2b6ab73e10ca6f1c5d0a2f04b42dc3acb689533d102d9f3f5e4/clickhouse_driver-0.2.10-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e24582110f3d532b35e106583981bea0b7a3b10167c8a890a7b6ea5c7c6ce6d6", size = 192945, upload-time = "2025-11-10T22:49:51.168Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coloredlogs" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "humanfriendly" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "commonmark" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/48/a60f593447e8f0894ebb7f6e6c1f25dafc5e89c5879fdc9360ae93ff83f0/commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", size = 95764, upload-time = "2019-10-04T15:37:39.817Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/92/dfd892312d822f36c55366118b95d914e5f16de11044a27cf10a7d71bbbf/commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9", size = 51068, upload-time = "2019-10-04T15:37:37.674Z" }, +] + +[[package]] +name = "configparser" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/ac/ea19242153b5e8be412a726a70e82c7b5c1537c83f61b20995b2eda3dcd7/configparser-7.2.0.tar.gz", hash = "sha256:b629cc8ae916e3afbd36d1b3d093f34193d851e11998920fdcfc4552218b7b70", size = 51273, upload-time = "2025-03-08T16:04:09.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/fe/f61e7129e9e689d9e40bbf8a36fb90f04eceb477f4617c02c6a18463e81f/configparser-7.2.0-py3-none-any.whl", hash = "sha256:fee5e1f3db4156dcd0ed95bc4edfa3580475537711f67a819c966b389d09ce62", size = 17232, upload-time = "2025-03-08T16:04:07.743Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "coverage" +version = "7.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/89/12/3e2d2ec71796e0913178478e693a06af6a3bc9f7f9cb899bf85a426d8370/coverage-7.11.1.tar.gz", hash = "sha256:b4b3a072559578129a9e863082a2972a2abd8975bc0e2ec57da96afcd6580a8a", size = 814037, upload-time = "2025-11-07T10:52:41.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/09/7d035b041643d4d99c8ea374b7f0363ebb5edf02121ea4bfddaf7f738e08/coverage-7.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9f8be6327cb57e73f1933a111b31ca3e8db68eba70921244296cd9541f8405cf", size = 216729, upload-time = "2025-11-07T10:50:07.543Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d0/3b31528bb14c2dc498c09804ee4bfe3e17ca28b1de6c2e3e850c99ed2b39/coverage-7.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3386b3d974eea5b8fbc31388c2847d5b3ce783aa001048c7c13ad0e0f9f97284", size = 217232, upload-time = "2025-11-07T10:50:09.064Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1c/713bd524fec4d3d1d2813de0fad233d4ff9e3bbd9bf8f8052bb0359e0f3f/coverage-7.11.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dd5a0e53989aa0d2b94871ac9a990f7b6247c3afe49af77f8750d7bcf1e66efa", size = 247628, upload-time = "2025-11-07T10:50:10.609Z" }, + { url = "https://files.pythonhosted.org/packages/b2/05/2887d76a5e160eb1b62dc99b1f177052799c37134d38e8b208e01bd4d712/coverage-7.11.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e17d99e4a9989ccc52d672543ed9d8741d90730ba331d452793be5733b4fee58", size = 249545, upload-time = "2025-11-07T10:50:12.187Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/bb95b8396a7c8deb0426a1261d62851b28a380a849546f730a8ee36471f7/coverage-7.11.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ece0ace8d8fc20cc29e2108d4031517c03d9e08883f10c1df16bef84d469110", size = 251658, upload-time = "2025-11-07T10:50:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/1397eaee431b43dbe2ec683401c8341d65993434d69f3a36087c5c280fb1/coverage-7.11.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:54bf4a13bfcf6f07c4b7d83970074dc2fa8b5782e8dee962f5eb4dfbc3a275ef", size = 247742, upload-time = "2025-11-07T10:50:16.001Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ea/b71c504fe7fd58495ccabe1cd4afd7e5685d563e2019ae4865cb0b44f652/coverage-7.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b48e85160795648323fc3a9d8efe11be65a033b564e1db28b53866810da6cf35", size = 249351, upload-time = "2025-11-07T10:50:17.852Z" }, + { url = "https://files.pythonhosted.org/packages/10/35/e44cb3d633cdeec7c6def511f552494a16bfa4e6cb5e916d9a0d4c98a933/coverage-7.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b77e7bb5765988a7a80463b999085cd66c6515113fc88b46910217f19ee99fe", size = 247423, upload-time = "2025-11-07T10:50:19.439Z" }, + { url = "https://files.pythonhosted.org/packages/af/88/c344ab065706a9df03b558fe4bcb9d367f92d5983f6a672c03eeb0905d39/coverage-7.11.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ce345819ddedcbe797d8ba824deeb0d55710037dfd47efd95709ab9e1b841e0c", size = 247150, upload-time = "2025-11-07T10:50:20.919Z" }, + { url = "https://files.pythonhosted.org/packages/34/5b/b0b6c986e41c6072d0c57761e648c120a34b1004f7de5b90bda5cb7542eb/coverage-7.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:abde2bd52560527124d9e6515daa1f1e3c7e820a37af63d063723867775220aa", size = 248047, upload-time = "2025-11-07T10:50:22.599Z" }, + { url = "https://files.pythonhosted.org/packages/06/2b/aa232a409b63422910e180ccd5f7083e6e41d942608f3513e617006c0253/coverage-7.11.1-cp311-cp311-win32.whl", hash = "sha256:049883a469ec823b1c9556050380e61f580d52f8abfc8be2071f3512a2bc3859", size = 219201, upload-time = "2025-11-07T10:50:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/41/d4/ec0155c883ddc43b2ff08e3b88fc846a4642a117306f8891188f217bd823/coverage-7.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:784a9fe33335296857db05b97dcb16df811418515a2355fc4811b0c2b029b4be", size = 220134, upload-time = "2025-11-07T10:50:26.035Z" }, + { url = "https://files.pythonhosted.org/packages/71/59/96dc2070a2f124e27c9b8d6e45e35d44f01b056b6eaf6793bfff40e84c4a/coverage-7.11.1-cp311-cp311-win_arm64.whl", hash = "sha256:2bcfeb983a53f0d3ee3ebc004827723d8accb619f64bf90aff73b7703dfe14bd", size = 218807, upload-time = "2025-11-07T10:50:27.685Z" }, + { url = "https://files.pythonhosted.org/packages/0f/31/04af7e42fdb3681e4d73d37bf3f375f0488aa38d1001ee746c7dbfe09643/coverage-7.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:421e2d237dcecdefa9b77cae1aa0dfff5c495f29e053e776172457e289976311", size = 216896, upload-time = "2025-11-07T10:50:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e9/1c3628a1225bdea66295a117cd2bb1d324d9c433c40078b24d50f55448a7/coverage-7.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:08ef89c812072ecd52a862b46e131f75596475d23cc7f5a75410394341d4332f", size = 217261, upload-time = "2025-11-07T10:50:33.008Z" }, + { url = "https://files.pythonhosted.org/packages/2b/80/4d4f943da23c432b2bba8664f4eada9b19911081852e8cc89776c61d0b94/coverage-7.11.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bc6e0b2d6ed317810b4e435ffabc31b2d517d6ceb4183dfd6af4748c52d170eb", size = 248742, upload-time = "2025-11-07T10:50:34.634Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e1/c4b42f02fbb6ce08e05d7a2b26bcf5df11d3e67a3806e40415f7ab9511e7/coverage-7.11.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b59736704df8b1f8b1dafb36b16f2ef8a952e4410465634442459426bd2319ae", size = 251503, upload-time = "2025-11-07T10:50:36.501Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/3df60e88f1dabccae4994c6df4a2f23d4cd0eee27fc3ae8f0bb2e78cb538/coverage-7.11.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:843816452d8bfc4c2be72546b3b382850cb91150feaa963ec7d2b665ec9d4768", size = 252590, upload-time = "2025-11-07T10:50:38.059Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/2b9fae11361b0348c2d3612a8179d2cc8b6b245e8b14d5479c75b9f18613/coverage-7.11.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:19363046125d4a423c25d3d7c90bab3a0230932c16014198f87a6b3960c1b187", size = 249133, upload-time = "2025-11-07T10:50:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2b/e33712a8eede02762a536bdc2f89e736e0ad87bd13b35d724306585aeb54/coverage-7.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e37486aed7045c280ebdc207026bdef9267730177d929a5e25250e1f33cc125", size = 250524, upload-time = "2025-11-07T10:50:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/84/c9/6181877977a0f6e46b9c93a8382b8c671769fb12df8a15be8d6091541b77/coverage-7.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c68180e67b4843674bfb1d3ec928ffcfc94081b5da959e616405eca51c23356", size = 248673, upload-time = "2025-11-07T10:50:43.153Z" }, + { url = "https://files.pythonhosted.org/packages/9b/d6/ff26c2eb57d4dcd46c6ed136d6b04aceb7f58f48dcc500c77f7194711a6f/coverage-7.11.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cf825b60f94d1706c22d4887310db26cc3117d545ac6ad4229b4a0d718afcf9a", size = 248251, upload-time = "2025-11-07T10:50:45.069Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ff/411803f1fcb9efe00afbc96442564cc691f537541a8bde377cf1ac04e695/coverage-7.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:437149272ff0440df66044bd6ee87cbc252463754ca43cafa496cfb2f57f56dd", size = 250111, upload-time = "2025-11-07T10:50:46.701Z" }, + { url = "https://files.pythonhosted.org/packages/c1/9f/781c045e1e5f8930f8266f224318040413b60837749d2ed11883b7478c81/coverage-7.11.1-cp312-cp312-win32.whl", hash = "sha256:98ea0b8d1addfc333494c2248af367e8ecb27724a99804a18376b801f876da58", size = 219407, upload-time = "2025-11-07T10:50:48.862Z" }, + { url = "https://files.pythonhosted.org/packages/26/59/813d8eedc96a781e8a6f9c37f6ecb4326ebbffdafe2e1154ed2def468b76/coverage-7.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d49a473799e55a465bcadd19525977ab80031b8b86baaa622241808df4585cd", size = 220220, upload-time = "2025-11-07T10:50:51.576Z" }, + { url = "https://files.pythonhosted.org/packages/63/5f/c0905d9159d38194943a21d7d013f1c2f0c43e7d63f680ed56269728418a/coverage-7.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:0c77e5951ab176a6ccb70c6f688fca2a7ac834753ba82ee4eb741be655f30b43", size = 218856, upload-time = "2025-11-07T10:50:53.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/01/0c50c318f5e8f1a482da05d788d0ff06137803ed8fface4a1ba51e04b3ad/coverage-7.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:da9930594ca99d66eb6f613d7beba850db2f8dfa86810ee35ae24e4d5f2bb97d", size = 216920, upload-time = "2025-11-07T10:50:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/20/11/9f038e6c2baea968c377ab355b0d1d0a46b5f38985691bf51164e1b78c1f/coverage-7.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc47a280dc014220b0fc6e5f55082a3f51854faf08fd9635b8a4f341c46c77d3", size = 217301, upload-time = "2025-11-07T10:50:57.609Z" }, + { url = "https://files.pythonhosted.org/packages/68/cd/9dcf93d81d0cddaa0bba90c3b4580e6f1ddf833918b816930d250cc553a4/coverage-7.11.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:74003324321bbf130939146886eddf92e48e616b5910215e79dea6edeb8ee7c8", size = 248277, upload-time = "2025-11-07T10:50:59.442Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/b2c7c494046c9c783d3cac4c812fc24d6104dd36a7a598e7dd6fea3e7927/coverage-7.11.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:211f7996265daab60a8249af4ca6641b3080769cbedcffc42cc4841118f3a305", size = 250871, upload-time = "2025-11-07T10:51:01.094Z" }, + { url = "https://files.pythonhosted.org/packages/a5/5a/b359649566954498aa17d7c98093182576d9e435ceb4ea917b3b48d56f86/coverage-7.11.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70619d194d8fea0cb028cb6bb9c85b519c7509c1d1feef1eea635183bc8ecd27", size = 252115, upload-time = "2025-11-07T10:51:03.087Z" }, + { url = "https://files.pythonhosted.org/packages/f3/17/3cef1ede3739622950f0737605353b797ec564e70c9d254521b10f4b03ba/coverage-7.11.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e0208bb59d441cfa3321569040f8e455f9261256e0df776c5462a1e5a9b31e13", size = 248442, upload-time = "2025-11-07T10:51:04.888Z" }, + { url = "https://files.pythonhosted.org/packages/5f/63/d5854c47ae42d9d18855329db6bc528f5b7f4f874257edb00cf8b483f9f8/coverage-7.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:545714d8765bda1c51f8b1c96e0b497886a054471c68211e76ef49dd1468587d", size = 250253, upload-time = "2025-11-07T10:51:06.515Z" }, + { url = "https://files.pythonhosted.org/packages/48/e8/c7706f8a5358a59c18b489e7e19e83d6161b7c8bc60771f95920570c94a8/coverage-7.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d0a2b02c1e20158dd405054bcca87f91fd5b7605626aee87150819ea616edd67", size = 248217, upload-time = "2025-11-07T10:51:08.405Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c9/a2136dfb168eb09e2f6d9d6b6c986243fdc0b3866a9376adb263d3c3378b/coverage-7.11.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0f4aa986a4308a458e0fb572faa3eb3db2ea7ce294604064b25ab32b435a468", size = 248040, upload-time = "2025-11-07T10:51:10.626Z" }, + { url = "https://files.pythonhosted.org/packages/18/9a/a63991c0608ddc6adf65e6f43124951aaf36bd79f41937b028120b8268ea/coverage-7.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d51cc6687e8bbfd1e041f52baed0f979cd592242cf50bf18399a7e03afc82d88", size = 249801, upload-time = "2025-11-07T10:51:12.63Z" }, + { url = "https://files.pythonhosted.org/packages/84/19/947acf7c0c6e90e4ec3abf474133ed36d94407d07e36eafdfd3acb59fee9/coverage-7.11.1-cp313-cp313-win32.whl", hash = "sha256:1b3067db3afe6deeca2b2c9f0ec23820d5f1bd152827acfadf24de145dfc5f66", size = 219430, upload-time = "2025-11-07T10:51:14.329Z" }, + { url = "https://files.pythonhosted.org/packages/35/54/36fef7afb3884450c7b6d494fcabe2fab7c669d547c800ca30f41c1dc212/coverage-7.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:39a4c44b0cd40e3c9d89b2b7303ebd6ab9ae8a63f9e9a8c4d65a181a0b33aebe", size = 220239, upload-time = "2025-11-07T10:51:16.418Z" }, + { url = "https://files.pythonhosted.org/packages/d3/dc/7d38bb99e8e69200b7dd5de15507226bd90eac102dfc7cc891b9934cdc76/coverage-7.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:a2e3560bf82fa8169a577e054cbbc29888699526063fee26ea59ea2627fd6e73", size = 218868, upload-time = "2025-11-07T10:51:18.186Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/d1ff54fbd6bcad42dbcfd13b417e636ef84aae194353b1ef3361700f2525/coverage-7.11.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47a4f362a10285897ab3aa7a4b37d28213a4f2626823923613d6d7a3584dd79a", size = 217615, upload-time = "2025-11-07T10:51:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/73/f9/6ed59e7cf1488d6f975e5b14ef836f5e537913523e92175135f8518a83ce/coverage-7.11.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0df35fa7419ef571db9dacd50b0517bc54dbfe37eb94043b5fc3540bff276acd", size = 217960, upload-time = "2025-11-07T10:51:22.797Z" }, + { url = "https://files.pythonhosted.org/packages/c4/74/2dab1dc2ebe16f074f80ae483b0f45faf278d102be703ac01b32cd85b6c3/coverage-7.11.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e1a2c621d341c9d56f7917e56fbb56be4f73fe0d0e8dae28352fb095060fd467", size = 259262, upload-time = "2025-11-07T10:51:24.467Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/eccfe039663e29a50a54b0c2c8d076acd174d7ac50d018ef8a5b1c37c8dc/coverage-7.11.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6c354b111be9b2234d9573d75dd30ca4e414b7659c730e477e89be4f620b3fb5", size = 261326, upload-time = "2025-11-07T10:51:26.232Z" }, + { url = "https://files.pythonhosted.org/packages/f0/bb/2b829aa23fd5ee8318e33cc02a606eb09900921291497963adc3f06af8bb/coverage-7.11.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4589bd44698728f600233fb2881014c9b8ec86637ef454c00939e779661dbe7e", size = 263758, upload-time = "2025-11-07T10:51:27.912Z" }, + { url = "https://files.pythonhosted.org/packages/ac/03/d44c3d70e5da275caf2cad2071da6b425412fbcb1d1d5a81f1f89b45e3f1/coverage-7.11.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c6956fc8754f2309131230272a7213a483a32ecbe29e2b9316d808a28f2f8ea1", size = 258444, upload-time = "2025-11-07T10:51:30.107Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c1/cf61d9f46ae088774c65dd3387a15dfbc72de90c1f6e105025e9eda19b42/coverage-7.11.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63926a97ed89dc6a087369b92dcb8b9a94cead46c08b33a7f1f4818cd8b6a3c3", size = 261335, upload-time = "2025-11-07T10:51:31.814Z" }, + { url = "https://files.pythonhosted.org/packages/95/9a/b3299bb14f11f2364d78a2b9704491b15395e757af6116694731ce4e5834/coverage-7.11.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f5311ba00c53a7fb2b293fdc1f478b7286fe2a845a7ba9cda053f6e98178f0b4", size = 258951, upload-time = "2025-11-07T10:51:33.925Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a3/73cb2763e59f14ba6d8d6444b1f640a9be2242bfb59b7e50581c695db7ff/coverage-7.11.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:31bf5ffad84c974f9e72ac53493350f36b6fa396109159ec704210698f12860b", size = 257840, upload-time = "2025-11-07T10:51:36.092Z" }, + { url = "https://files.pythonhosted.org/packages/85/db/482e72589a952027e238ffa3a15f192c552e0685fd0c5220ad05b5f17d56/coverage-7.11.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:227ee59fbc4a8c57a7383a1d7af6ca94a78ae3beee4045f38684548a8479a65b", size = 260040, upload-time = "2025-11-07T10:51:38.277Z" }, + { url = "https://files.pythonhosted.org/packages/18/a1/b931d3ee099c2dca8e9ea56c07ae84c0f91562f7bbbcccab8c91b3474ef1/coverage-7.11.1-cp313-cp313t-win32.whl", hash = "sha256:a447d97b3ce680bb1da2e6bd822ebb71be6a1fb77ce2c2ad2fe4bd8aacec3058", size = 220102, upload-time = "2025-11-07T10:51:40.017Z" }, + { url = "https://files.pythonhosted.org/packages/9a/53/b553b7bfa6207def4918f0cb72884c844fa4c3f1566e58fbb4f34e54cdc5/coverage-7.11.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6d11180437c67bde2248563a42b8e5bbf85c8df78fae13bf818ad17bfb15f02", size = 221166, upload-time = "2025-11-07T10:51:41.921Z" }, + { url = "https://files.pythonhosted.org/packages/6b/45/1c1d58b3ed585598764bd2fe41fcf60ccafe15973ad621c322ba52e22d32/coverage-7.11.1-cp313-cp313t-win_arm64.whl", hash = "sha256:1e19a4c43d612760c6f7190411fb157e2d8a6dde00c91b941d43203bd3b17f6f", size = 219439, upload-time = "2025-11-07T10:51:43.753Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c2/ac2c3417eaa4de1361036ebbc7da664242b274b2e00c4b4a1cfc7b29920b/coverage-7.11.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0305463c45c5f21f0396cd5028de92b1f1387e2e0756a85dd3147daa49f7a674", size = 216967, upload-time = "2025-11-07T10:51:45.55Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a3/afef455d03c468ee303f9df9a6f407e8bea64cd576fca914ff888faf52ca/coverage-7.11.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fa4d468d5efa1eb6e3062be8bd5f45cbf28257a37b71b969a8c1da2652dfec77", size = 217298, upload-time = "2025-11-07T10:51:47.31Z" }, + { url = "https://files.pythonhosted.org/packages/9d/59/6e2fb3fb58637001132dc32228b4fb5b332d75d12f1353cb00fe084ee0ba/coverage-7.11.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d2b2f5fc8fe383cbf2d5c77d6c4b2632ede553bc0afd0cdc910fa5390046c290", size = 248337, upload-time = "2025-11-07T10:51:49.48Z" }, + { url = "https://files.pythonhosted.org/packages/1d/5e/ce442bab963e3388658da8bde6ddbd0a15beda230afafaa25e3c487dc391/coverage-7.11.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bde6488c1ad509f4fb1a4f9960fd003d5a94adef61e226246f9699befbab3276", size = 250853, upload-time = "2025-11-07T10:51:51.215Z" }, + { url = "https://files.pythonhosted.org/packages/d1/2f/43f94557924ca9b64e09f1c3876da4eec44a05a41e27b8a639d899716c0e/coverage-7.11.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a69e0d6fa0b920fe6706a898c52955ec5bcfa7e45868215159f45fd87ea6da7c", size = 252190, upload-time = "2025-11-07T10:51:53.262Z" }, + { url = "https://files.pythonhosted.org/packages/8c/fa/a04e769b92bc5628d4bd909dcc3c8219efe5e49f462e29adc43e198ecfde/coverage-7.11.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:976e51e4a549b80e4639eda3a53e95013a14ff6ad69bb58ed604d34deb0e774c", size = 248335, upload-time = "2025-11-07T10:51:55.388Z" }, + { url = "https://files.pythonhosted.org/packages/99/d0/b98ab5d2abe425c71117a7c690ead697a0b32b83256bf0f566c726b7f77b/coverage-7.11.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d61fcc4d384c82971a3d9cf00d0872881f9ded19404c714d6079b7a4547e2955", size = 250209, upload-time = "2025-11-07T10:51:57.263Z" }, + { url = "https://files.pythonhosted.org/packages/9c/3f/b9c4fbd2e6d1b64098f99fb68df7f7c1b3e0a0968d24025adb24f359cdec/coverage-7.11.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:284c5df762b533fae3ebd764e3b81c20c1c9648d93ef34469759cb4e3dfe13d0", size = 248163, upload-time = "2025-11-07T10:51:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/08/fc/3e4d54fb6368b0628019eefd897fc271badbd025410fd5421a65fb58758f/coverage-7.11.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:bab32cb1d4ad2ac6dcc4e17eee5fa136c2a1d14ae914e4bce6c8b78273aece3c", size = 247983, upload-time = "2025-11-07T10:52:01.027Z" }, + { url = "https://files.pythonhosted.org/packages/b9/4a/a5700764a12e932b35afdddb2f59adbca289c1689455d06437f609f3ef35/coverage-7.11.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:36f2fed9ce392ca450fb4e283900d0b41f05c8c5db674d200f471498be3ce747", size = 249646, upload-time = "2025-11-07T10:52:02.856Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2c/45ed33d9e80a1cc9b44b4bd535d44c154d3204671c65abd90ec1e99522a2/coverage-7.11.1-cp314-cp314-win32.whl", hash = "sha256:853136cecb92a5ba1cc8f61ec6ffa62ca3c88b4b386a6c835f8b833924f9a8c5", size = 219700, upload-time = "2025-11-07T10:52:05.05Z" }, + { url = "https://files.pythonhosted.org/packages/90/d7/5845597360f6434af1290118ebe114642865f45ce47e7e822d9c07b371be/coverage-7.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:77443d39143e20927259a61da0c95d55ffc31cf43086b8f0f11a92da5260d592", size = 220516, upload-time = "2025-11-07T10:52:07.259Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d0/d311a06f9cf7a48a98ffcfd0c57db0dcab6da46e75c439286a50dc648161/coverage-7.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:829acb88fa47591a64bf5197e96a931ce9d4b3634c7f81a224ba3319623cdf6c", size = 219091, upload-time = "2025-11-07T10:52:09.216Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3d/c6a84da4fa9b840933045b19dd19d17b892f3f2dd1612903260291416dba/coverage-7.11.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2ad1fe321d9522ea14399de83e75a11fb6a8887930c3679feb383301c28070d9", size = 217700, upload-time = "2025-11-07T10:52:11.348Z" }, + { url = "https://files.pythonhosted.org/packages/94/10/a4fc5022017dd7ac682dc423849c241dfbdad31734b8f96060d84e70b587/coverage-7.11.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f69c332f0c3d1357c74decc9b1843fcd428cf9221bf196a20ad22aa1db3e1b6c", size = 217968, upload-time = "2025-11-07T10:52:13.203Z" }, + { url = "https://files.pythonhosted.org/packages/59/2d/a554cd98924d296de5816413280ac3b09e42a05fb248d66f8d474d321938/coverage-7.11.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:576baeea4eebde684bf6c91c01e97171c8015765c8b2cfd4022a42b899897811", size = 259334, upload-time = "2025-11-07T10:52:15.079Z" }, + { url = "https://files.pythonhosted.org/packages/05/98/d484cb659ec33958ca96b6f03438f56edc23b239d1ad0417b7a97fc1848a/coverage-7.11.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:28ad84c694fa86084cfd3c1eab4149844b8cb95bd8e5cbfc4a647f3ee2cce2b3", size = 261445, upload-time = "2025-11-07T10:52:17.134Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/920cba122cc28f4557c0507f8bd7c6e527ebcc537d0309186f66464a8fd9/coverage-7.11.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1043ff958f09fc3f552c014d599f3c6b7088ba97d7bc1bd1cce8603cd75b520", size = 263858, upload-time = "2025-11-07T10:52:19.836Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a0/036397bdbee0f3bd46c2e26fdfbb1a61b2140bf9059240c37b61149047fa/coverage-7.11.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c6681add5060c2742dafcf29826dff1ff8eef889a3b03390daeed84361c428bd", size = 258381, upload-time = "2025-11-07T10:52:21.687Z" }, + { url = "https://files.pythonhosted.org/packages/b6/61/2533926eb8990f182eb287f4873216c8ca530cc47241144aabf46fe80abe/coverage-7.11.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:773419b225ec9a75caa1e941dd0c83a91b92c2b525269e44e6ee3e4c630607db", size = 261321, upload-time = "2025-11-07T10:52:23.612Z" }, + { url = "https://files.pythonhosted.org/packages/32/6e/618f7e203a998e4f6b8a0fa395744a416ad2adbcdc3735bc19466456718a/coverage-7.11.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a9cb272a0e0157dbb9b2fd0b201b759bd378a1a6138a16536c025c2ce4f7643b", size = 258933, upload-time = "2025-11-07T10:52:25.514Z" }, + { url = "https://files.pythonhosted.org/packages/22/40/6b1c27f772cb08a14a338647ead1254a57ee9dabbb4cacbc15df7f278741/coverage-7.11.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:e09adb2a7811dc75998eef68f47599cf699e2b62eed09c9fefaeb290b3920f34", size = 257756, upload-time = "2025-11-07T10:52:27.845Z" }, + { url = "https://files.pythonhosted.org/packages/73/07/f9cd12f71307a785ea15b009c8d8cc2543e4a867bd04b8673843970b6b43/coverage-7.11.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1335fa8c2a2fea49924d97e1e3500cfe8d7c849f5369f26bb7559ad4259ccfab", size = 260086, upload-time = "2025-11-07T10:52:29.776Z" }, + { url = "https://files.pythonhosted.org/packages/34/02/31c5394f6f5d72a466966bcfdb61ce5a19862d452816d6ffcbb44add16ee/coverage-7.11.1-cp314-cp314t-win32.whl", hash = "sha256:4782d71d2a4fa7cef95e853b7097c8bbead4dbd0e6f9c7152a6b11a194b794db", size = 220483, upload-time = "2025-11-07T10:52:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/7f/96/81e1ef5fbfd5090113a96e823dbe055e4c58d96ca73b1fb0ad9d26f9ec36/coverage-7.11.1-cp314-cp314t-win_amd64.whl", hash = "sha256:939f45e66eceb63c75e8eb8fc58bb7077c00f1a41b0e15c6ef02334a933cfe93", size = 221592, upload-time = "2025-11-07T10:52:33.724Z" }, + { url = "https://files.pythonhosted.org/packages/38/7a/a5d050de44951ac453a2046a0f3fb5471a4a557f0c914d00db27d543d94c/coverage-7.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:01c575bdbef35e3f023b50a146e9a75c53816e4f2569109458155cd2315f87d9", size = 219627, upload-time = "2025-11-07T10:52:36.285Z" }, + { url = "https://files.pythonhosted.org/packages/76/32/bd9f48c28e23b2f08946f8e83983617b00619f5538dbd7e1045fa7e88c00/coverage-7.11.1-py3-none-any.whl", hash = "sha256:0fa848acb5f1da24765cee840e1afe9232ac98a8f9431c6112c15b34e880b9e8", size = 208689, upload-time = "2025-11-07T10:52:38.646Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cryptography" +version = "46.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, + { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, + { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" }, + { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, +] + +[[package]] +name = "cssselect" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/0a/c3ea9573b1dc2e151abfe88c7fe0c26d1892fe6ed02d0cdb30f0d57029d5/cssselect-1.3.0.tar.gz", hash = "sha256:57f8a99424cfab289a1b6a816a43075a4b00948c86b4dcf3ef4ee7e15f7ab0c7", size = 42870, upload-time = "2025-03-10T09:30:29.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl", hash = "sha256:56d1bf3e198080cc1667e137bc51de9cadfca259f03c2d4e09037b3e01e30f0d", size = 18786, upload-time = "2025-03-10T09:30:28.048Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/ad/71e708ff4ca377c4230530d6a7aa7992592648c122a2cd2b321cf8b35a76/debugpy-1.8.17.tar.gz", hash = "sha256:fd723b47a8c08892b1a16b2c6239a8b96637c62a59b94bb5dab4bac592a58a8e", size = 1644129, upload-time = "2025-09-17T16:33:20.633Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/53/3af72b5c159278c4a0cf4cffa518675a0e73bdb7d1cac0239b815502d2ce/debugpy-1.8.17-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:d3fce3f0e3de262a3b67e69916d001f3e767661c6e1ee42553009d445d1cd840", size = 2207154, upload-time = "2025-09-17T16:33:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/8f/6d/204f407df45600e2245b4a39860ed4ba32552330a0b3f5f160ae4cc30072/debugpy-1.8.17-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:c6bdf134457ae0cac6fb68205776be635d31174eeac9541e1d0c062165c6461f", size = 3170322, upload-time = "2025-09-17T16:33:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/1b8f87d39cf83c6b713de2620c31205299e6065622e7dd37aff4808dd410/debugpy-1.8.17-cp311-cp311-win32.whl", hash = "sha256:e79a195f9e059edfe5d8bf6f3749b2599452d3e9380484cd261f6b7cd2c7c4da", size = 5155078, upload-time = "2025-09-17T16:33:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c5/c012c60a2922cc91caa9675d0ddfbb14ba59e1e36228355f41cab6483469/debugpy-1.8.17-cp311-cp311-win_amd64.whl", hash = "sha256:b532282ad4eca958b1b2d7dbcb2b7218e02cb934165859b918e3b6ba7772d3f4", size = 5179011, upload-time = "2025-09-17T16:33:35.711Z" }, + { url = "https://files.pythonhosted.org/packages/08/2b/9d8e65beb2751876c82e1aceb32f328c43ec872711fa80257c7674f45650/debugpy-1.8.17-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:f14467edef672195c6f6b8e27ce5005313cb5d03c9239059bc7182b60c176e2d", size = 2549522, upload-time = "2025-09-17T16:33:38.466Z" }, + { url = "https://files.pythonhosted.org/packages/b4/78/eb0d77f02971c05fca0eb7465b18058ba84bd957062f5eec82f941ac792a/debugpy-1.8.17-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:24693179ef9dfa20dca8605905a42b392be56d410c333af82f1c5dff807a64cc", size = 4309417, upload-time = "2025-09-17T16:33:41.299Z" }, + { url = "https://files.pythonhosted.org/packages/37/42/c40f1d8cc1fed1e75ea54298a382395b8b937d923fcf41ab0797a554f555/debugpy-1.8.17-cp312-cp312-win32.whl", hash = "sha256:6a4e9dacf2cbb60d2514ff7b04b4534b0139facbf2abdffe0639ddb6088e59cf", size = 5277130, upload-time = "2025-09-17T16:33:43.554Z" }, + { url = "https://files.pythonhosted.org/packages/72/22/84263b205baad32b81b36eac076de0cdbe09fe2d0637f5b32243dc7c925b/debugpy-1.8.17-cp312-cp312-win_amd64.whl", hash = "sha256:e8f8f61c518952fb15f74a302e068b48d9c4691768ade433e4adeea961993464", size = 5319053, upload-time = "2025-09-17T16:33:53.033Z" }, + { url = "https://files.pythonhosted.org/packages/50/76/597e5cb97d026274ba297af8d89138dfd9e695767ba0e0895edb20963f40/debugpy-1.8.17-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:857c1dd5d70042502aef1c6d1c2801211f3ea7e56f75e9c335f434afb403e464", size = 2538386, upload-time = "2025-09-17T16:33:54.594Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/ce5c34fcdfec493701f9d1532dba95b21b2f6394147234dce21160bd923f/debugpy-1.8.17-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:3bea3b0b12f3946e098cce9b43c3c46e317b567f79570c3f43f0b96d00788088", size = 4292100, upload-time = "2025-09-17T16:33:56.353Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/7873cf2146577ef71d2a20bf553f12df865922a6f87b9e8ee1df04f01785/debugpy-1.8.17-cp313-cp313-win32.whl", hash = "sha256:e34ee844c2f17b18556b5bbe59e1e2ff4e86a00282d2a46edab73fd7f18f4a83", size = 5277002, upload-time = "2025-09-17T16:33:58.231Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/18c79a1cee5ff539a94ec4aa290c1c069a5580fd5cfd2fb2e282f8e905da/debugpy-1.8.17-cp313-cp313-win_amd64.whl", hash = "sha256:6c5cd6f009ad4fca8e33e5238210dc1e5f42db07d4b6ab21ac7ffa904a196420", size = 5319047, upload-time = "2025-09-17T16:34:00.586Z" }, + { url = "https://files.pythonhosted.org/packages/de/45/115d55b2a9da6de812696064ceb505c31e952c5d89c4ed1d9bb983deec34/debugpy-1.8.17-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:045290c010bcd2d82bc97aa2daf6837443cd52f6328592698809b4549babcee1", size = 2536899, upload-time = "2025-09-17T16:34:02.657Z" }, + { url = "https://files.pythonhosted.org/packages/5a/73/2aa00c7f1f06e997ef57dc9b23d61a92120bec1437a012afb6d176585197/debugpy-1.8.17-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:b69b6bd9dba6a03632534cdf67c760625760a215ae289f7489a452af1031fe1f", size = 4268254, upload-time = "2025-09-17T16:34:04.486Z" }, + { url = "https://files.pythonhosted.org/packages/86/b5/ed3e65c63c68a6634e3ba04bd10255c8e46ec16ebed7d1c79e4816d8a760/debugpy-1.8.17-cp314-cp314-win32.whl", hash = "sha256:5c59b74aa5630f3a5194467100c3b3d1c77898f9ab27e3f7dc5d40fc2f122670", size = 5277203, upload-time = "2025-09-17T16:34:06.65Z" }, + { url = "https://files.pythonhosted.org/packages/b0/26/394276b71c7538445f29e792f589ab7379ae70fd26ff5577dfde71158e96/debugpy-1.8.17-cp314-cp314-win_amd64.whl", hash = "sha256:893cba7bb0f55161de4365584b025f7064e1f88913551bcd23be3260b231429c", size = 5318493, upload-time = "2025-09-17T16:34:08.483Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d0/89247ec250369fc76db477720a26b2fce7ba079ff1380e4ab4529d2fe233/debugpy-1.8.17-py2.py3-none-any.whl", hash = "sha256:60c7dca6571efe660ccb7a9508d73ca14b8796c4ed484c2002abba714226cfef", size = 5283210, upload-time = "2025-09-17T16:34:25.835Z" }, +] + +[[package]] +name = "decorator" +version = "4.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/93/84fa12f2dc341f8cf5f022ee09e109961055749df2d0c75c5f98746cfe6c/decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7", size = 33629, upload-time = "2020-02-29T05:24:43.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/1b/72a1821152d07cf1d8b6fce298aeb06a7eb90f4d6d41acec9861e7cc6df0/decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", size = 9239, upload-time = "2020-02-29T05:24:45.993Z" }, +] + +[[package]] +name = "deprecated" +version = "1.2.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload-time = "2025-01-27T10:46:25.7Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, +] + +[[package]] +name = "dill" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, +] + +[[package]] +name = "django" +version = "4.2.30" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "sqlparse" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/b5/f1a53dc68da6429d6e0345bb848161e2381a2e9f02700148911e8582c2b3/django-4.2.30.tar.gz", hash = "sha256:4ebc7a434e3819db6cf4b399fb5b3f536310a30e8486f08b66886840be84b37c", size = 10468707, upload-time = "2026-04-07T14:05:45.57Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/b7/a7c96f239cf91313a6589233fed55111c7063b26683b226802732c455dbc/django-4.2.30-py3-none-any.whl", hash = "sha256:4d07aaf1c62f9984842b67c2874ebbf7056a17be253860299b93ae1881faad65", size = 7997231, upload-time = "2026-04-07T14:05:38.241Z" }, +] + +[[package]] +name = "django-clickhouse-backend" +version = "1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "clickhouse-driver" }, + { name = "django" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/db/55e54cc0793e391ae0f7797f010771ce31348e89629d4db7dec2aebb66f8/django_clickhouse_backend-1.6.tar.gz", hash = "sha256:fd4840b8789f571838fbc8a4c323e9600fed0ee34113fa761ef7a4f231298e10", size = 76500, upload-time = "2026-01-12T06:26:10.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/56/995c790c736c2016fe0ae6418a84b65b201bd3134d81e50868d36a43f640/django_clickhouse_backend-1.6-py3-none-any.whl", hash = "sha256:6e1ddba09d7c2bcbb3dd2a9c80606c75c5b42c6f9d220104751857c925a9a5e0", size = 88911, upload-time = "2026-01-12T06:26:08.744Z" }, +] + +[[package]] +name = "entrypoints" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/8d/a7121ffe5f402dc015277d2d31eb82d2187334503a011c18f2e78ecbb9b2/entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4", size = 13974, upload-time = "2022-02-02T21:30:28.172Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/a8/365059bbcd4572cbc41de17fd5b682be5868b218c3c5479071865cab9078/entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f", size = 5294, upload-time = "2022-02-02T21:30:26.024Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fake-useragent" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/43/948d10bf42735709edb5ae51e23297d034086f17fc7279fef385a7acb473/fake_useragent-2.2.0.tar.gz", hash = "sha256:4e6ab6571e40cc086d788523cf9e018f618d07f9050f822ff409a4dfe17c16b2", size = 158898, upload-time = "2025-04-14T15:32:19.238Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/37/b3ea9cd5558ff4cb51957caca2193981c6b0ff30bd0d2630ac62505d99d0/fake_useragent-2.2.0-py3-none-any.whl", hash = "sha256:67f35ca4d847b0d298187443aaf020413746e56acd985a611908c73dba2daa24", size = 161695, upload-time = "2025-04-14T15:32:17.732Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.9.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1f/3ee70b0a55137442038f2a33469cc5fddd7e0ad2abf83d7497c18a2b6923/flatbuffers-25.9.23.tar.gz", hash = "sha256:676f9fa62750bb50cf531b42a0a2a118ad8f7f797a511eda12881c016f093b12", size = 22067, upload-time = "2025-09-24T05:25:30.106Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/1b/00a78aa2e8fbd63f9af08c9c19e6deb3d5d66b4dda677a0f61654680ee89/flatbuffers-25.9.23-py2.py3-none-any.whl", hash = "sha256:255538574d6cb6d0a79a17ec8bc0d30985913b87513a01cce8bcdb6b4c44d0e2", size = 30869, upload-time = "2025-09-24T05:25:28.912Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "ga4gh-vrs" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bioutils" }, + { name = "canonicaljson" }, + { name = "coloredlogs" }, + { name = "jsonschema" }, + { name = "numpy" }, + { name = "python-jsonschema-objects" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/bc/e12a97faa2a61662de0ef2d553a728e770a3f0f81e1f5e64163932539d2e/ga4gh.vrs-0.8.4.tar.gz", hash = "sha256:60c503bd1decbe0de99ab47b5a71712dead416d6d200311e053dcf1314762487", size = 17108490, upload-time = "2023-05-08T11:32:02.011Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/85/d131cf5884262a5e4d842fad45795676e3277ed6f523a1b6650dd6282ea9/ga4gh.vrs-0.8.4-py2.py3-none-any.whl", hash = "sha256:fc2ca9ea7a5d8de08190f045d8bb1ec78ad7c42483f5cf02e6015346facd3202", size = 47993, upload-time = "2023-05-08T11:31:58.882Z" }, +] + +[package.optional-dependencies] +extras = [ + { name = "biocommons-seqrepo" }, + { name = "bioutils" }, + { name = "click" }, + { name = "hgvs" }, + { name = "requests" }, +] + +[[package]] +name = "gnomad" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annoy" }, + { name = "ga4gh-vrs", extra = ["extras"] }, + { name = "hdbscan" }, + { name = "ipywidgets" }, + { name = "networkx" }, + { name = "onnx" }, + { name = "onnxruntime" }, + { name = "scikit-learn" }, + { name = "skl2onnx" }, + { name = "slackclient" }, + { name = "statsmodels" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/e7/5e3a228383c65a64082e92b38d7d332aa6d75300ccc8b870cbd5d7f4c48a/gnomad-0.8.0.tar.gz", hash = "sha256:41dcba41d872df36b63196dec1675f08489959ddf1bd320487aa7d977e8b4183", size = 191660, upload-time = "2024-04-19T14:23:15.301Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/e5/8f4b4fa1639f86ef5087bb06ab179e6d1bae31e5d9efa0529b1c98f9871d/gnomad-0.8.0-py3-none-any.whl", hash = "sha256:feb3ca957cb94afb9d0b3b1bef04e436843e81cd487284169ef6543b1a209c3a", size = 209240, upload-time = "2024-04-19T14:23:03.1Z" }, +] + +[[package]] +name = "gnomad-qc" +version = "0.0.0" +source = { git = "https://github.com/broadinstitute/gnomad_qc.git?rev=v4.1#16fce5e8d4b1742153efe71166f2fd32eeac8dde" } + +[[package]] +name = "google-api-core" +version = "2.25.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", +] +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/cd/63f1557235c2440fe0577acdbc32577c5c002684c58c7f4d770a92366a24/google_api_core-2.25.2.tar.gz", hash = "sha256:1c63aa6af0d0d5e37966f157a77f9396d820fba59f9e43e9415bc3dc5baff300", size = 166266, upload-time = "2025-10-03T00:07:34.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/d8/894716a5423933f5c8d2d5f04b16f052a515f78e815dab0c2c6f1fd105dc/google_api_core-2.25.2-py3-none-any.whl", hash = "sha256:e9a8f62d363dc8424a8497f4c2a47d6bcda6c16514c935629c257ab5d10210e7", size = 162489, upload-time = "2025-10-03T00:07:32.924Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, + { name = "grpcio-status" }, +] + +[[package]] +name = "google-api-core" +version = "2.28.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.13.*'", + "python_full_version == '3.12.*'", + "python_full_version < '3.12'", +] +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/da/83d7043169ac2c8c7469f0e375610d78ae2160134bf1b80634c482fa079c/google_api_core-2.28.1.tar.gz", hash = "sha256:2b405df02d68e68ce0fbc138559e6036559e685159d148ae5861013dc201baf8", size = 176759, upload-time = "2025-10-28T21:34:51.529Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/d4/90197b416cb61cefd316964fd9e7bd8324bcbafabf40eef14a9f20b81974/google_api_core-2.28.1-py3-none-any.whl", hash = "sha256:4021b0f8ceb77a6fb4de6fde4502cecab45062e66ff4f2895169e0b35bc9466c", size = 173706, upload-time = "2025-10-28T21:34:50.151Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, + { name = "grpcio-status" }, +] + +[[package]] +name = "google-api-python-client" +version = "2.159.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", version = "2.25.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "google-api-core", version = "2.28.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, + { name = "google-auth" }, + { name = "google-auth-httplib2" }, + { name = "httplib2" }, + { name = "uritemplate" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/9f/12b58cca5a93d63fd6a7abed570423bdf2db4349eb9361ac5214d42ed7d6/google_api_python_client-2.159.0.tar.gz", hash = "sha256:55197f430f25c907394b44fa078545ffef89d33fd4dca501b7db9f0d8e224bd6", size = 12302576, upload-time = "2025-01-14T11:25:36.648Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ab/d0671375afe79e6e8c51736e115a69bb6b4bcdc80cd5c01bf667486cd24c/google_api_python_client-2.159.0-py2.py3-none-any.whl", hash = "sha256:baef0bb631a60a0bd7c0bf12a5499e3a40cd4388484de7ee55c1950bf820a0cf", size = 12814228, upload-time = "2025-01-14T11:25:33.273Z" }, +] + +[[package]] +name = "google-auth" +version = "2.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "pyasn1-modules" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/ef/66d14cf0e01b08d2d51ffc3c20410c4e134a1548fc246a6081eae585a4fe/google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483", size = 296359, upload-time = "2025-11-06T00:13:36.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/d1/385110a9ae86d91cc14c5282c61fe9f4dc41c0b9f7d423c6ad77038c4448/google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16", size = 223114, upload-time = "2025-11-06T00:13:35.209Z" }, +] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "httplib2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/83/7ef576d1c7ccea214e7b001e69c006bc75e058a3a1f2ab810167204b698b/google_auth_httplib2-0.2.1.tar.gz", hash = "sha256:5ef03be3927423c87fb69607b42df23a444e434ddb2555b73b3679793187b7de", size = 11086, upload-time = "2025-10-30T21:13:16.569Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/a7/ca23dd006255f70e2bc469d3f9f0c82ea455335bfd682ad4d677adc435de/google_auth_httplib2-0.2.1-py3-none-any.whl", hash = "sha256:1be94c611db91c01f9703e7f62b0a59bbd5587a95571c7b6fade510d648bc08b", size = 9525, upload-time = "2025-10-30T21:13:15.758Z" }, +] + +[[package]] +name = "google-auth-oauthlib" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/98/52a79d64ca8fd2e37eff8da6c78c26b2209f19d8ace8cafd1634453c4393/google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593", size = 21351, upload-time = "2022-12-12T21:57:54.622Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/0e/bfc3d7de5d1788871d1be3e6862fe3e56d92b446909b7b032c373fc4ecab/google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576", size = 19588, upload-time = "2022-12-12T21:57:52.762Z" }, +] + +[[package]] +name = "google-cloud-bigquery" +version = "3.29.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", version = "2.25.2", source = { registry = "https://pypi.org/simple" }, extra = ["grpc"], marker = "python_full_version >= '3.14'" }, + { name = "google-api-core", version = "2.28.1", source = { registry = "https://pypi.org/simple" }, extra = ["grpc"], marker = "python_full_version < '3.14'" }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "google-resumable-media" }, + { name = "packaging" }, + { name = "python-dateutil" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/36/87875a9775985849f18d4b3e320e4acdeb5232db3d49cfa6269e7c7867b8/google_cloud_bigquery-3.29.0.tar.gz", hash = "sha256:fafc2b455ffce3bcc6ce0e884184ef50b6a11350a83b91e327fadda4d5566e72", size = 467180, upload-time = "2025-01-21T18:15:06.788Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/60/9e1430f0fe17f8e8e931eff468021516f74f2573f261221529767dd59591/google_cloud_bigquery-3.29.0-py2.py3-none-any.whl", hash = "sha256:5453a4eabe50118254eda9778f3d7dad413490de5f7046b5e66c98f5a1580308", size = 244605, upload-time = "2025-01-21T18:15:03.862Z" }, +] + +[[package]] +name = "google-cloud-core" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", version = "2.25.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "google-api-core", version = "2.28.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, + { name = "google-auth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/03/ef0bc99d0e0faf4fdbe67ac445e18cdaa74824fd93cd069e7bb6548cb52d/google_cloud_core-2.5.0.tar.gz", hash = "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963", size = 36027, upload-time = "2025-10-29T23:17:39.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/20/bfa472e327c8edee00f04beecc80baeddd2ab33ee0e86fd7654da49d45e9/google_cloud_core-2.5.0-py3-none-any.whl", hash = "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc", size = 29469, upload-time = "2025-10-29T23:17:38.548Z" }, +] + +[[package]] +name = "google-cloud-dataproc" +version = "5.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", version = "2.25.2", source = { registry = "https://pypi.org/simple" }, extra = ["grpc"], marker = "python_full_version >= '3.14'" }, + { name = "google-api-core", version = "2.28.1", source = { registry = "https://pypi.org/simple" }, extra = ["grpc"], marker = "python_full_version < '3.14'" }, + { name = "google-auth" }, + { name = "grpc-google-iam-v1" }, + { name = "proto-plus" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/ff/e2360c2dc17030b5f7700ace60fc560cd9ff15097f234446f730e8e4c952/google_cloud_dataproc-5.16.0.tar.gz", hash = "sha256:23b2d8ae4f648e01b66fed0abea114b600d3363d955b8558c7645a93f28d6e3c", size = 545103, upload-time = "2024-12-13T01:06:09.041Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/0e/13d8c25d19030a04891f407fe4dffdc4b5e5fa53728e6e59952aef489487/google_cloud_dataproc-5.16.0-py2.py3-none-any.whl", hash = "sha256:3fae8b702ad8446f22bf6c7528dfe201df9596089ec25b65a30bb0942e1a0f60", size = 470162, upload-time = "2024-12-13T01:06:07.329Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468, upload-time = "2025-03-26T14:32:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313, upload-time = "2025-03-26T14:57:38.758Z" }, + { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048, upload-time = "2025-03-26T14:41:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669, upload-time = "2025-03-26T14:41:31.432Z" }, + { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476, upload-time = "2025-03-26T14:29:10.211Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, + { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467, upload-time = "2025-03-26T14:36:06.909Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309, upload-time = "2025-03-26T15:06:15.318Z" }, + { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133, upload-time = "2025-03-26T14:41:34.388Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773, upload-time = "2025-03-26T14:41:35.19Z" }, + { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475, upload-time = "2025-03-26T14:29:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243, upload-time = "2025-03-26T14:41:35.975Z" }, + { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870, upload-time = "2025-03-26T14:41:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241, upload-time = "2025-03-26T14:41:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048, upload-time = "2025-03-26T14:41:46.696Z" }, +] + +[[package]] +name = "google-resumable-media" +version = "2.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-crc32c" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099, upload-time = "2024-08-07T22:20:38.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251, upload-time = "2024-08-07T22:20:36.409Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.72.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload-time = "2025-11-06T18:29:24.087Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, +] + +[[package]] +name = "greenlet" +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, + { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, + { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, + { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" }, + { url = "https://files.pythonhosted.org/packages/67/24/28a5b2fa42d12b3d7e5614145f0bd89714c34c08be6aabe39c14dd52db34/greenlet-3.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9c6de1940a7d828635fbd254d69db79e54619f165ee7ce32fda763a9cb6a58c", size = 1548385, upload-time = "2025-11-04T12:42:11.067Z" }, + { url = "https://files.pythonhosted.org/packages/6a/05/03f2f0bdd0b0ff9a4f7b99333d57b53a7709c27723ec8123056b084e69cd/greenlet-3.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03c5136e7be905045160b1b9fdca93dd6727b180feeafda6818e6496434ed8c5", size = 1613329, upload-time = "2025-11-04T12:42:12.928Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" }, + { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, + { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, + { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, + { url = "https://files.pythonhosted.org/packages/27/45/80935968b53cfd3f33cf99ea5f08227f2646e044568c9b1555b58ffd61c2/greenlet-3.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee7a6ec486883397d70eec05059353b8e83eca9168b9f3f9a361971e77e0bcd0", size = 1564846, upload-time = "2025-11-04T12:42:15.191Z" }, + { url = "https://files.pythonhosted.org/packages/69/02/b7c30e5e04752cb4db6202a3858b149c0710e5453b71a3b2aec5d78a1aab/greenlet-3.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:326d234cbf337c9c3def0676412eb7040a35a768efc92504b947b3e9cfc7543d", size = 1633814, upload-time = "2025-11-04T12:42:17.175Z" }, + { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, + { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, + { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, + { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload-time = "2025-11-04T12:42:19.395Z" }, + { url = "https://files.pythonhosted.org/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload-time = "2025-11-04T12:42:21.174Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, + { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, + { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, + { url = "https://files.pythonhosted.org/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload-time = "2025-11-04T12:42:25.341Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, +] + +[[package]] +name = "grpc-google-iam-v1" +version = "0.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos", extra = ["grpc"] }, + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/1e/1011451679a983f2f5c6771a1682542ecb027776762ad031fd0d7129164b/grpc_google_iam_v1-0.14.3.tar.gz", hash = "sha256:879ac4ef33136c5491a6300e27575a9ec760f6cdf9a2518798c1b8977a5dc389", size = 23745, upload-time = "2025-10-15T21:14:53.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/bd/330a1bbdb1afe0b96311249e699b6dc9cfc17916394fd4503ac5aca2514b/grpc_google_iam_v1-0.14.3-py3-none-any.whl", hash = "sha256:7a7f697e017a067206a3dfef44e4c634a34d3dee135fe7d7a4613fe3e59217e6", size = 32690, upload-time = "2025-10-15T21:14:51.72Z" }, +] + +[[package]] +name = "grpcio" +version = "1.76.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/00/8163a1beeb6971f66b4bbe6ac9457b97948beba8dd2fc8e1281dce7f79ec/grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a", size = 5843567, upload-time = "2025-10-21T16:20:52.829Z" }, + { url = "https://files.pythonhosted.org/packages/10/c1/934202f5cf335e6d852530ce14ddb0fef21be612ba9ecbbcbd4d748ca32d/grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c", size = 11848017, upload-time = "2025-10-21T16:20:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/8dec16b1863d74af6eb3543928600ec2195af49ca58b16334972f6775663/grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465", size = 6412027, upload-time = "2025-10-21T16:20:59.3Z" }, + { url = "https://files.pythonhosted.org/packages/d7/64/7b9e6e7ab910bea9d46f2c090380bab274a0b91fb0a2fe9b0cd399fffa12/grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48", size = 7075913, upload-time = "2025-10-21T16:21:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/093c46e9546073cefa789bd76d44c5cb2abc824ca62af0c18be590ff13ba/grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da", size = 6615417, upload-time = "2025-10-21T16:21:03.844Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b6/5709a3a68500a9c03da6fb71740dcdd5ef245e39266461a03f31a57036d8/grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397", size = 7199683, upload-time = "2025-10-21T16:21:06.195Z" }, + { url = "https://files.pythonhosted.org/packages/91/d3/4b1f2bf16ed52ce0b508161df3a2d186e4935379a159a834cb4a7d687429/grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749", size = 8163109, upload-time = "2025-10-21T16:21:08.498Z" }, + { url = "https://files.pythonhosted.org/packages/5c/61/d9043f95f5f4cf085ac5dd6137b469d41befb04bd80280952ffa2a4c3f12/grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00", size = 7626676, upload-time = "2025-10-21T16:21:10.693Z" }, + { url = "https://files.pythonhosted.org/packages/36/95/fd9a5152ca02d8881e4dd419cdd790e11805979f499a2e5b96488b85cf27/grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054", size = 3997688, upload-time = "2025-10-21T16:21:12.746Z" }, + { url = "https://files.pythonhosted.org/packages/60/9c/5c359c8d4c9176cfa3c61ecd4efe5affe1f38d9bae81e81ac7186b4c9cc8/grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d", size = 4709315, upload-time = "2025-10-21T16:21:15.26Z" }, + { url = "https://files.pythonhosted.org/packages/bf/05/8e29121994b8d959ffa0afd28996d452f291b48cfc0875619de0bde2c50c/grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8", size = 5799718, upload-time = "2025-10-21T16:21:17.939Z" }, + { url = "https://files.pythonhosted.org/packages/d9/75/11d0e66b3cdf998c996489581bdad8900db79ebd83513e45c19548f1cba4/grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280", size = 11825627, upload-time = "2025-10-21T16:21:20.466Z" }, + { url = "https://files.pythonhosted.org/packages/28/50/2f0aa0498bc188048f5d9504dcc5c2c24f2eb1a9337cd0fa09a61a2e75f0/grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4", size = 6359167, upload-time = "2025-10-21T16:21:23.122Z" }, + { url = "https://files.pythonhosted.org/packages/66/e5/bbf0bb97d29ede1d59d6588af40018cfc345b17ce979b7b45424628dc8bb/grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11", size = 7044267, upload-time = "2025-10-21T16:21:25.995Z" }, + { url = "https://files.pythonhosted.org/packages/f5/86/f6ec2164f743d9609691115ae8ece098c76b894ebe4f7c94a655c6b03e98/grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6", size = 6573963, upload-time = "2025-10-21T16:21:28.631Z" }, + { url = "https://files.pythonhosted.org/packages/60/bc/8d9d0d8505feccfdf38a766d262c71e73639c165b311c9457208b56d92ae/grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8", size = 7164484, upload-time = "2025-10-21T16:21:30.837Z" }, + { url = "https://files.pythonhosted.org/packages/67/e6/5d6c2fc10b95edf6df9b8f19cf10a34263b7fd48493936fffd5085521292/grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980", size = 8127777, upload-time = "2025-10-21T16:21:33.577Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c8/dce8ff21c86abe025efe304d9e31fdb0deaaa3b502b6a78141080f206da0/grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882", size = 7594014, upload-time = "2025-10-21T16:21:41.882Z" }, + { url = "https://files.pythonhosted.org/packages/e0/42/ad28191ebf983a5d0ecef90bab66baa5a6b18f2bfdef9d0a63b1973d9f75/grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958", size = 3984750, upload-time = "2025-10-21T16:21:44.006Z" }, + { url = "https://files.pythonhosted.org/packages/9e/00/7bd478cbb851c04a48baccaa49b75abaa8e4122f7d86da797500cccdd771/grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347", size = 4704003, upload-time = "2025-10-21T16:21:46.244Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ed/71467ab770effc9e8cef5f2e7388beb2be26ed642d567697bb103a790c72/grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", size = 5807716, upload-time = "2025-10-21T16:21:48.475Z" }, + { url = "https://files.pythonhosted.org/packages/2c/85/c6ed56f9817fab03fa8a111ca91469941fb514e3e3ce6d793cb8f1e1347b/grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", size = 11821522, upload-time = "2025-10-21T16:21:51.142Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/2b8a235ab40c39cbc141ef647f8a6eb7b0028f023015a4842933bc0d6831/grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", size = 6362558, upload-time = "2025-10-21T16:21:54.213Z" }, + { url = "https://files.pythonhosted.org/packages/bd/64/9784eab483358e08847498ee56faf8ff6ea8e0a4592568d9f68edc97e9e9/grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", size = 7049990, upload-time = "2025-10-21T16:21:56.476Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/8c12319a6369434e7a184b987e8e9f3b49a114c489b8315f029e24de4837/grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", size = 6575387, upload-time = "2025-10-21T16:21:59.051Z" }, + { url = "https://files.pythonhosted.org/packages/15/0f/f12c32b03f731f4a6242f771f63039df182c8b8e2cf8075b245b409259d4/grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", size = 7166668, upload-time = "2025-10-21T16:22:02.049Z" }, + { url = "https://files.pythonhosted.org/packages/ff/2d/3ec9ce0c2b1d92dd59d1c3264aaec9f0f7c817d6e8ac683b97198a36ed5a/grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", size = 8124928, upload-time = "2025-10-21T16:22:04.984Z" }, + { url = "https://files.pythonhosted.org/packages/1a/74/fd3317be5672f4856bcdd1a9e7b5e17554692d3db9a3b273879dc02d657d/grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", size = 7589983, upload-time = "2025-10-21T16:22:07.881Z" }, + { url = "https://files.pythonhosted.org/packages/45/bb/ca038cf420f405971f19821c8c15bcbc875505f6ffadafe9ffd77871dc4c/grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", size = 3984727, upload-time = "2025-10-21T16:22:10.032Z" }, + { url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" }, + { url = "https://files.pythonhosted.org/packages/b4/46/39adac80de49d678e6e073b70204091e76631e03e94928b9ea4ecf0f6e0e/grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62", size = 5808417, upload-time = "2025-10-21T16:22:15.02Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f5/a4531f7fb8b4e2a60b94e39d5d924469b7a6988176b3422487be61fe2998/grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", size = 11828219, upload-time = "2025-10-21T16:22:17.954Z" }, + { url = "https://files.pythonhosted.org/packages/4b/1c/de55d868ed7a8bd6acc6b1d6ddc4aa36d07a9f31d33c912c804adb1b971b/grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", size = 6367826, upload-time = "2025-10-21T16:22:20.721Z" }, + { url = "https://files.pythonhosted.org/packages/59/64/99e44c02b5adb0ad13ab3adc89cb33cb54bfa90c74770f2607eea629b86f/grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", size = 7049550, upload-time = "2025-10-21T16:22:23.637Z" }, + { url = "https://files.pythonhosted.org/packages/43/28/40a5be3f9a86949b83e7d6a2ad6011d993cbe9b6bd27bea881f61c7788b6/grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", size = 6575564, upload-time = "2025-10-21T16:22:26.016Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a9/1be18e6055b64467440208a8559afac243c66a8b904213af6f392dc2212f/grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", size = 7176236, upload-time = "2025-10-21T16:22:28.362Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/dba05d3fcc151ce6e81327541d2cc8394f442f6b350fead67401661bf041/grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", size = 8125795, upload-time = "2025-10-21T16:22:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/4a/45/122df922d05655f63930cf42c9e3f72ba20aadb26c100ee105cad4ce4257/grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", size = 7592214, upload-time = "2025-10-21T16:22:33.831Z" }, + { url = "https://files.pythonhosted.org/packages/4a/6e/0b899b7f6b66e5af39e377055fb4a6675c9ee28431df5708139df2e93233/grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", size = 4062961, upload-time = "2025-10-21T16:22:36.468Z" }, + { url = "https://files.pythonhosted.org/packages/19/41/0b430b01a2eb38ee887f88c1f07644a1df8e289353b78e82b37ef988fb64/grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", size = 4834462, upload-time = "2025-10-21T16:22:39.772Z" }, +] + +[[package]] +name = "grpcio-status" +version = "1.71.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/d1/b6e9877fedae3add1afdeae1f89d1927d296da9cf977eca0eb08fb8a460e/grpcio_status-1.71.2.tar.gz", hash = "sha256:c7a97e176df71cdc2c179cd1847d7fc86cca5832ad12e9798d7fed6b7a1aab50", size = 13677, upload-time = "2025-06-28T04:24:05.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/58/317b0134129b556a93a3b0afe00ee675b5657f0155509e22fcb853bafe2d/grpcio_status-1.71.2-py3-none-any.whl", hash = "sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3", size = 14424, upload-time = "2025-06-28T04:23:42.136Z" }, +] + +[[package]] +name = "hail" +version = "0.2.138" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiodns" }, + { name = "aiohttp" }, + { name = "avro" }, + { name = "azure-identity" }, + { name = "azure-mgmt-storage" }, + { name = "azure-storage-blob" }, + { name = "bokeh" }, + { name = "boto3" }, + { name = "botocore" }, + { name = "decorator" }, + { name = "deprecated" }, + { name = "dill" }, + { name = "frozenlist" }, + { name = "google-auth" }, + { name = "google-auth-oauthlib" }, + { name = "humanize" }, + { name = "janus" }, + { name = "jproperties" }, + { name = "nest-asyncio" }, + { name = "numpy" }, + { name = "orjson" }, + { name = "pandas" }, + { name = "parsimonious" }, + { name = "plotly" }, + { name = "pyspark" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, + { name = "scipy" }, + { name = "setuptools" }, + { name = "sortedcontainers" }, + { name = "tabulate" }, + { name = "typer" }, + { name = "uvloop", marker = "sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/95/1aeb6cc7c4fd0f61088315a9056e37f4d2faa5316051eabb55b4ec602265/hail-0.2.138-py3-none-any.whl", hash = "sha256:9d995a97b4f8eee7478203ec5acf1af2036e80ac1dd8bdc4fa4ac8ab114a1ac5", size = 133093982, upload-time = "2026-04-16T21:34:15.647Z" }, +] + +[[package]] +name = "hdbscan" +version = "0.8.40" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scikit-learn" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/84/6b010387b795f774e1ec695df3c8660c15abd041783647d5e7e4076bfc6b/hdbscan-0.8.40.tar.gz", hash = "sha256:c9e383ff17beee0591075ff65d524bda5b5a35dfb01d218245a7ba30c8d48a17", size = 6904096, upload-time = "2024-11-18T16:14:05.384Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/6b/88b8c8023c0c0b27589ad83c82084a1b751917a3e09bdf7fcacf7e6bd523/hdbscan-0.8.40-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5e958f0d7a33cd2b5e8e927b47f7360bf8a3e7d72355dd65a701e8aabe407b27", size = 1491349, upload-time = "2024-11-18T16:16:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/e5/72/84bc7b6ea9eb59ca6c5e4d3f32313cdfa8f4ab5cfece6fb6dfef4c9149fc/hdbscan-0.8.40-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b95447c9c2cf6c95f98210c0edee3dc463d0a237e5531076855d9776495c96fc", size = 4459927, upload-time = "2025-10-11T11:55:49.958Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ef/32c8a0b3dc6e6c4e433b85b30c3723d8eb48d115c0185b82ab89e1a0ef89/hdbscan-0.8.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0d6197ee045b173e1f16e6884386f335a56091e373a839dd24f7331a8fa9ed", size = 4576215, upload-time = "2024-11-18T16:14:11.241Z" }, + { url = "https://files.pythonhosted.org/packages/64/b1/96c347c7740efa1ac803be64155159284f92fafcff88c1077344e64eead5/hdbscan-0.8.40-cp311-cp311-win_amd64.whl", hash = "sha256:127cbe8c858dc77adfde33a3e1ce4f3bea810f78b01d2bd47b1147d4b5a50472", size = 732173, upload-time = "2024-11-18T16:18:40.361Z" }, + { url = "https://files.pythonhosted.org/packages/33/ff/4739886abb990dc6feb7b02eafb38a7eaf090fffef6336e70a03d693f433/hdbscan-0.8.40-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:353eaa22e42bee69df095744dbb8b29360e516bd9dcb84580dceeeb755f004cc", size = 1497291, upload-time = "2024-11-18T16:16:54.731Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0f/97a315772abf99b3c230e3d57f3fa426d163ce4d6070241d68a3f0241ea9/hdbscan-0.8.40-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:991e745aa51abfb8abfb0e1525b9309df03a2f67fdd8df96e18f91fe7fe06806", size = 4362227, upload-time = "2025-10-11T11:53:16.452Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cb/6b4254f8a33e075118512e55acf3485c155ea52c6c35d69a985bdc59297c/hdbscan-0.8.40-cp312-cp312-win_amd64.whl", hash = "sha256:1b55a935ed7b329adac52072e1c4028979dfc54312ca08de2deece9c97d6ebb1", size = 726198, upload-time = "2024-11-18T16:18:09.99Z" }, + { url = "https://files.pythonhosted.org/packages/80/2d/ca4d81a5aa5b8ccde1d41b892a2f480c2df238c58f113eee4df50473a3b0/hdbscan-0.8.40-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:32ea7bc4ce8854b5549d341edc841a29766feb62f8c399520e6e0940a41c5e39", size = 4336968, upload-time = "2025-10-11T11:53:10.417Z" }, +] + +[[package]] +name = "hgvs" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "biocommons-seqrepo" }, + { name = "bioutils" }, + { name = "configparser" }, + { name = "ipython" }, + { name = "parsley" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/35/15d86f2e862a697626fdfc7c91d6ccf862bdbb7a7c595b428bf9dddb6c3c/hgvs-1.5.4.tar.gz", hash = "sha256:06abb6363bb0c8ef9f3f8f9dc333d3a346ab5f9ebcb20a5bb56c69256262559f", size = 2223400, upload-time = "2022-11-21T20:03:51.412Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/b7/8950a1ce90093f2f1342cb745d50028553a587f6d0973e1e7a97e364b348/hgvs-1.5.4-py2.py3-none-any.whl", hash = "sha256:598640bae0de34ff29c58440904fc9156d7a1bc750ddef5894edd415c772b957", size = 107263, upload-time = "2022-11-21T20:03:49.302Z" }, +] + +[[package]] +name = "httplib2" +version = "0.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/77/6653db69c1f7ecfe5e3f9726fdadc981794656fcd7d98c4209fecfea9993/httplib2-0.31.0.tar.gz", hash = "sha256:ac7ab497c50975147d4f7b1ade44becc7df2f8954d42b38b3d69c515f531135c", size = 250759, upload-time = "2025-09-11T12:16:03.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/a2/0d269db0f6163be503775dc8b6a6fa15820cc9fdc866f6ba608d86b721f2/httplib2-0.31.0-py3-none-any.whl", hash = "sha256:b9cd78abea9b4e43a7714c6e0f8b6b8561a6fc1e95d5dbd367f5bf0ef35f5d24", size = 91148, upload-time = "2025-09-11T12:16:01.803Z" }, +] + +[[package]] +name = "humanfriendly" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyreadline3", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, +] + +[[package]] +name = "humanize" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/43/50033d25ad96a7f3845f40999b4778f753c3901a11808a584fed7c00d9f5/humanize-4.14.0.tar.gz", hash = "sha256:2fa092705ea640d605c435b1ca82b2866a1b601cdf96f076d70b79a855eba90d", size = 82939, upload-time = "2025-10-15T13:04:51.214Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/5b/9512c5fb6c8218332b530f13500c6ff5f3ce3342f35e0dd7be9ac3856fd3/humanize-4.14.0-py3-none-any.whl", hash = "sha256:d57701248d040ad456092820e6fde56c930f17749956ac47f4f655c0c547bfff", size = 132092, upload-time = "2025-10-15T13:04:49.404Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "inflection" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091, upload-time = "2020-08-22T08:16:29.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454, upload-time = "2020-08-22T08:16:27.816Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipykernel" +version = "6.29.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/e4/6f1b4ab7d7fb9268d67a6c7c4520a7d76a5bbafd7abb716ed43b006153e0/ipykernel-6.29.2.tar.gz", hash = "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0", size = 161175, upload-time = "2024-02-07T13:43:12.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/9a/0c7b514c73b42cf4ce516ee26c8940a0b23a9754dafaa459a939220240fd/ipykernel-6.29.2-py3-none-any.whl", hash = "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055", size = 116062, upload-time = "2024-02-07T13:43:09.058Z" }, +] + +[[package]] +name = "ipython" +version = "9.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/e6/48c74d54039241a456add616464ea28c6ebf782e4110d419411b83dae06f/ipython-9.7.0.tar.gz", hash = "sha256:5f6de88c905a566c6a9d6c400a8fed54a638e1f7543d17aae2551133216b1e4e", size = 4422115, upload-time = "2025-11-05T12:18:54.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/aa/62893d6a591d337aa59dcc4c6f6c842f1fe20cd72c8c5c1f980255243252/ipython-9.7.0-py3-none-any.whl", hash = "sha256:bce8ac85eb9521adc94e1845b4c03d88365fd6ac2f4908ec4ed1eb1b0a065f9f", size = 618911, upload-time = "2025-11-05T12:18:52.484Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/48/d3dbac45c2814cb73812f98dd6b38bbcc957a4e7bb31d6ea9c03bf94ed87/ipywidgets-8.1.7.tar.gz", hash = "sha256:15f1ac050b9ccbefd45dccfbb2ef6bed0029d8278682d569d71b8dd96bee0376", size = 116721, upload-time = "2025-05-05T12:42:03.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/6a/9166369a2f092bd286d24e6307de555d63616e8ddb373ebad2b5635ca4cd/ipywidgets-8.1.7-py3-none-any.whl", hash = "sha256:764f2602d25471c213919b8a1997df04bef869251db4ca8efba1b76b1bd9f7bb", size = 139806, upload-time = "2025-05-05T12:41:56.833Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "janus" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/a8/facab7275d7d3d2032f375843fe46fad1cfa604a108b5a238638d4615bdc/janus-1.0.0.tar.gz", hash = "sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612", size = 19043, upload-time = "2021-12-17T09:00:33.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/84/7bfe436fa6a4943eecb17c2cca9c84215299684575376d664ea6bf294439/janus-1.0.0-py3-none-any.whl", hash = "sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a", size = 6895, upload-time = "2021-12-17T09:00:32.868Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/5d/447af5ea094b9e4c4054f82e223ada074c552335b9b4b2d14bd9b35a67c4/joblib-1.5.2.tar.gz", hash = "sha256:3faa5c39054b2f03ca547da9b2f52fde67c06240c31853f306aea97f13647b55", size = 331077, upload-time = "2025-08-27T12:15:46.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/e8/685f47e0d754320684db4425a0967f7d3fa70126bffd76110b7009a0090f/joblib-1.5.2-py3-none-any.whl", hash = "sha256:4e1f0bdbb987e6d843c70cf43714cb276623def372df3c22fe5266b2670bc241", size = 308396, upload-time = "2025-08-27T12:15:45.188Z" }, +] + +[[package]] +name = "jproperties" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/27/00abf648c6d573275d409b70196b66d9fb40ef03b8d1baf671ae3774e145/jproperties-2.1.2.tar.gz", hash = "sha256:036fcd52c10a8a1c21e6fa2a1c292c93892e759b76490acc4809213a36ddc329", size = 23860, upload-time = "2024-07-21T20:40:50.29Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/6f/55bc5837e9fe7a86a5acb553adec901257d709062bfaef7debd4d8cfee12/jproperties-2.1.2-py2.py3-none-any.whl", hash = "sha256:4108e868353a9f4a12bb86a92df5462d0e18d00119169533972ce473029be79a", size = 17981, upload-time = "2024-07-21T20:40:49.034Z" }, +] + +[[package]] +name = "jsonschema" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "pyrsistent" }, + { name = "setuptools" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/11/a69e2a3c01b324a77d3a7c0570faa372e8448b666300c4117a516f8b1212/jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a", size = 167226, upload-time = "2019-11-18T12:57:10.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/8f/51e89ce52a085483359217bc72cdbf6e75ee595d5b1d4b5ade40c7e018b8/jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", size = 56305, upload-time = "2019-11-18T12:57:08.454Z" }, +] + +[[package]] +name = "jupyter-client" +version = "7.4.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "entrypoints" }, + { name = "jupyter-core" }, + { name = "nest-asyncio" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/33/71778cdd2c69445bcd3bb6029da2e43cc9b5cbbeef4f4982ef3aaf396650/jupyter_client-7.4.9.tar.gz", hash = "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392", size = 329115, upload-time = "2023-01-12T20:05:10.58Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/a7/ef3b7c8b9d6730a21febdd0809084e4cea6d2a7e43892436adecdd0acbd4/jupyter_client-7.4.9-py3-none-any.whl", hash = "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7", size = 133492, upload-time = "2023-01-12T20:05:08.044Z" }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "lockfile" +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799", size = 20874, upload-time = "2015-11-25T18:29:58.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa", size = 13564, upload-time = "2015-11-25T18:29:51.462Z" }, +] + +[[package]] +name = "luigi" +version = "3.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-daemon" }, + { name = "python-dateutil" }, + { name = "tenacity" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/bf/40a9ea8860a0d6387fe974d10d93b539fb5e477fc590e5d7673d2322b42d/luigi-3.5.2.tar.gz", hash = "sha256:d000fe6a6ea77c9376674fe87a045ac00c3fcf7ebe8414655a06630aa9db5111", size = 1226476, upload-time = "2024-09-04T11:52:42.471Z" } + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, + { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, + { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, + { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, + { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, + { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, + { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" }, + { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" }, +] + +[[package]] +name = "markdown" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "ml-dtypes" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/a7/aad060393123cfb383956dca68402aff3db1e1caffd5764887ed5153f41b/ml_dtypes-0.5.3.tar.gz", hash = "sha256:95ce33057ba4d05df50b1f3cfefab22e351868a843b3b15a46c65836283670c9", size = 692316, upload-time = "2025-07-29T18:39:19.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/f1/720cb1409b5d0c05cff9040c0e9fba73fa4c67897d33babf905d5d46a070/ml_dtypes-0.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4a177b882667c69422402df6ed5c3428ce07ac2c1f844d8a1314944651439458", size = 667412, upload-time = "2025-07-29T18:38:25.275Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d5/05861ede5d299f6599f86e6bc1291714e2116d96df003cfe23cc54bcc568/ml_dtypes-0.5.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9849ce7267444c0a717c80c6900997de4f36e2815ce34ac560a3edb2d9a64cd2", size = 4964606, upload-time = "2025-07-29T18:38:27.045Z" }, + { url = "https://files.pythonhosted.org/packages/db/dc/72992b68de367741bfab8df3b3fe7c29f982b7279d341aa5bf3e7ef737ea/ml_dtypes-0.5.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3f5ae0309d9f888fd825c2e9d0241102fadaca81d888f26f845bc8c13c1e4ee", size = 4938435, upload-time = "2025-07-29T18:38:29.193Z" }, + { url = "https://files.pythonhosted.org/packages/81/1c/d27a930bca31fb07d975a2d7eaf3404f9388114463b9f15032813c98f893/ml_dtypes-0.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:58e39349d820b5702bb6f94ea0cb2dc8ec62ee81c0267d9622067d8333596a46", size = 206334, upload-time = "2025-07-29T18:38:30.687Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/6922499effa616012cb8dc445280f66d100a7ff39b35c864cfca019b3f89/ml_dtypes-0.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:66c2756ae6cfd7f5224e355c893cfd617fa2f747b8bbd8996152cbdebad9a184", size = 157584, upload-time = "2025-07-29T18:38:32.187Z" }, + { url = "https://files.pythonhosted.org/packages/0d/eb/bc07c88a6ab002b4635e44585d80fa0b350603f11a2097c9d1bfacc03357/ml_dtypes-0.5.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:156418abeeda48ea4797db6776db3c5bdab9ac7be197c1233771e0880c304057", size = 663864, upload-time = "2025-07-29T18:38:33.777Z" }, + { url = "https://files.pythonhosted.org/packages/cf/89/11af9b0f21b99e6386b6581ab40fb38d03225f9de5f55cf52097047e2826/ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1db60c154989af253f6c4a34e8a540c2c9dce4d770784d426945e09908fbb177", size = 4951313, upload-time = "2025-07-29T18:38:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d8/a9/b98b86426c24900b0c754aad006dce2863df7ce0bb2bcc2c02f9cc7e8489/ml_dtypes-0.5.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b255acada256d1fa8c35ed07b5f6d18bc21d1556f842fbc2d5718aea2cd9e55", size = 4928805, upload-time = "2025-07-29T18:38:38.29Z" }, + { url = "https://files.pythonhosted.org/packages/50/c1/85e6be4fc09c6175f36fb05a45917837f30af9a5146a5151cb3a3f0f9e09/ml_dtypes-0.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:da65e5fd3eea434ccb8984c3624bc234ddcc0d9f4c81864af611aaebcc08a50e", size = 208182, upload-time = "2025-07-29T18:38:39.72Z" }, + { url = "https://files.pythonhosted.org/packages/9e/17/cf5326d6867be057f232d0610de1458f70a8ce7b6290e4b4a277ea62b4cd/ml_dtypes-0.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:8bb9cd1ce63096567f5f42851f5843b5a0ea11511e50039a7649619abfb4ba6d", size = 161560, upload-time = "2025-07-29T18:38:41.072Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/1bcc98a66de7b2455dfb292f271452cac9edc4e870796e0d87033524d790/ml_dtypes-0.5.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5103856a225465371fe119f2fef737402b705b810bd95ad5f348e6e1a6ae21af", size = 663781, upload-time = "2025-07-29T18:38:42.984Z" }, + { url = "https://files.pythonhosted.org/packages/fd/2c/bd2a79ba7c759ee192b5601b675b180a3fd6ccf48ffa27fe1782d280f1a7/ml_dtypes-0.5.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cae435a68861660af81fa3c5af16b70ca11a17275c5b662d9c6f58294e0f113", size = 4956217, upload-time = "2025-07-29T18:38:44.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/f3/091ba84e5395d7fe5b30c081a44dec881cd84b408db1763ee50768b2ab63/ml_dtypes-0.5.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6936283b56d74fbec431ca57ce58a90a908fdbd14d4e2d22eea6d72bb208a7b7", size = 4933109, upload-time = "2025-07-29T18:38:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/bc/24/054036dbe32c43295382c90a1363241684c4d6aaa1ecc3df26bd0c8d5053/ml_dtypes-0.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:d0f730a17cf4f343b2c7ad50cee3bd19e969e793d2be6ed911f43086460096e4", size = 208187, upload-time = "2025-07-29T18:38:48.24Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/7dc3ec6794a4a9004c765e0c341e32355840b698f73fd2daff46f128afc1/ml_dtypes-0.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:2db74788fc01914a3c7f7da0763427280adfc9cd377e9604b6b64eb8097284bd", size = 161559, upload-time = "2025-07-29T18:38:50.493Z" }, + { url = "https://files.pythonhosted.org/packages/12/91/e6c7a0d67a152b9330445f9f0cf8ae6eee9b83f990b8c57fe74631e42a90/ml_dtypes-0.5.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:93c36a08a6d158db44f2eb9ce3258e53f24a9a4a695325a689494f0fdbc71770", size = 689321, upload-time = "2025-07-29T18:38:52.03Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6c/b7b94b84a104a5be1883305b87d4c6bd6ae781504474b4cca067cb2340ec/ml_dtypes-0.5.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e44a3761f64bc009d71ddb6d6c71008ba21b53ab6ee588dadab65e2fa79eafc", size = 5274495, upload-time = "2025-07-29T18:38:53.797Z" }, + { url = "https://files.pythonhosted.org/packages/5b/38/6266604dffb43378055394ea110570cf261a49876fc48f548dfe876f34cc/ml_dtypes-0.5.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdf40d2aaabd3913dec11840f0d0ebb1b93134f99af6a0a4fd88ffe924928ab4", size = 5285422, upload-time = "2025-07-29T18:38:56.603Z" }, + { url = "https://files.pythonhosted.org/packages/7c/88/8612ff177d043a474b9408f0382605d881eeb4125ba89d4d4b3286573a83/ml_dtypes-0.5.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:aec640bd94c4c85c0d11e2733bd13cbb10438fb004852996ec0efbc6cacdaf70", size = 661182, upload-time = "2025-07-29T18:38:58.414Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2b/0569a5e88b29240d373e835107c94ae9256fb2191d3156b43b2601859eff/ml_dtypes-0.5.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bda32ce212baa724e03c68771e5c69f39e584ea426bfe1a701cb01508ffc7035", size = 4956187, upload-time = "2025-07-29T18:39:00.611Z" }, + { url = "https://files.pythonhosted.org/packages/51/66/273c2a06ae44562b104b61e6b14444da00061fd87652506579d7eb2c40b1/ml_dtypes-0.5.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c205cac07d24a29840c163d6469f61069ce4b065518519216297fc2f261f8db9", size = 4930911, upload-time = "2025-07-29T18:39:02.405Z" }, + { url = "https://files.pythonhosted.org/packages/93/ab/606be3e87dc0821bd360c8c1ee46108025c31a4f96942b63907bb441b87d/ml_dtypes-0.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:cd7c0bb22d4ff86d65ad61b5dd246812e8993fbc95b558553624c33e8b6903ea", size = 216664, upload-time = "2025-07-29T18:39:03.927Z" }, + { url = "https://files.pythonhosted.org/packages/30/a2/e900690ca47d01dffffd66375c5de8c4f8ced0f1ef809ccd3b25b3e6b8fa/ml_dtypes-0.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:9d55ea7f7baf2aed61bf1872116cefc9d0c3693b45cae3916897ee27ef4b835e", size = 160203, upload-time = "2025-07-29T18:39:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/53/21/783dfb51f40d2660afeb9bccf3612b99f6a803d980d2a09132b0f9d216ab/ml_dtypes-0.5.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:e12e29764a0e66a7a31e9b8bf1de5cc0423ea72979f45909acd4292de834ccd3", size = 689324, upload-time = "2025-07-29T18:39:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/09/f7/a82d249c711abf411ac027b7163f285487f5e615c3e0716c61033ce996ab/ml_dtypes-0.5.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19f6c3a4f635c2fc9e2aa7d91416bd7a3d649b48350c51f7f715a09370a90d93", size = 5275917, upload-time = "2025-07-29T18:39:09.339Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3c/541c4b30815ab90ebfbb51df15d0b4254f2f9f1e2b4907ab229300d5e6f2/ml_dtypes-0.5.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ab039ffb40f3dc0aeeeba84fd6c3452781b5e15bef72e2d10bcb33e4bbffc39", size = 5285284, upload-time = "2025-07-29T18:39:11.532Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msal" +version = "1.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/dc/18d48843499e278538890dc709e9ee3dea8375f8be8e82682851df1b48b5/msal-1.34.0-py3-none-any.whl", hash = "sha256:f669b1644e4950115da7a176441b0e13ec2975c29528d8b9e81316023676d6e1", size = 116987, upload-time = "2025-09-22T23:05:47.294Z" }, +] + +[[package]] +name = "msal-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315, upload-time = "2025-03-14T23:51:03.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583, upload-time = "2025-03-14T23:51:03.016Z" }, +] + +[[package]] +name = "msrest" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "certifi" }, + { name = "isodate" }, + { name = "requests" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/77/8397c8fb8fc257d8ea0fa66f8068e073278c65f05acb17dcb22a02bfdc42/msrest-0.7.1.zip", hash = "sha256:6e7661f46f3afd88b75667b7187a92829924446c7ea1d169be8c4bb7eeb788b9", size = 175332, upload-time = "2022-06-13T22:41:25.111Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/cf/f2966a2638144491f8696c27320d5219f48a072715075d168b31d3237720/msrest-0.7.1-py3-none-any.whl", hash = "sha256:21120a810e1233e5e6cc7fe40b474eeb4ec6f757a15d7cf86702c369f9567c32", size = 85384, upload-time = "2022-06-13T22:41:22.42Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604, upload-time = "2025-10-06T14:48:54.277Z" }, + { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715, upload-time = "2025-10-06T14:48:55.445Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332, upload-time = "2025-10-06T14:48:56.706Z" }, + { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212, upload-time = "2025-10-06T14:48:58.042Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671, upload-time = "2025-10-06T14:49:00.004Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491, upload-time = "2025-10-06T14:49:01.393Z" }, + { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322, upload-time = "2025-10-06T14:49:02.745Z" }, + { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694, upload-time = "2025-10-06T14:49:04.15Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715, upload-time = "2025-10-06T14:49:05.967Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189, upload-time = "2025-10-06T14:49:07.37Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845, upload-time = "2025-10-06T14:49:08.759Z" }, + { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374, upload-time = "2025-10-06T14:49:10.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345, upload-time = "2025-10-06T14:49:12.331Z" }, + { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940, upload-time = "2025-10-06T14:49:13.821Z" }, + { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229, upload-time = "2025-10-06T14:49:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308, upload-time = "2025-10-06T14:49:16.871Z" }, + { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037, upload-time = "2025-10-06T14:49:18.457Z" }, + { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023, upload-time = "2025-10-06T14:49:19.648Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, + { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, + { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545, upload-time = "2025-10-06T14:49:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305, upload-time = "2025-10-06T14:49:26.778Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363, upload-time = "2025-10-06T14:49:28.562Z" }, + { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375, upload-time = "2025-10-06T14:49:29.96Z" }, + { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346, upload-time = "2025-10-06T14:49:31.404Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107, upload-time = "2025-10-06T14:49:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592, upload-time = "2025-10-06T14:49:34.52Z" }, + { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024, upload-time = "2025-10-06T14:49:35.956Z" }, + { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484, upload-time = "2025-10-06T14:49:37.631Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579, upload-time = "2025-10-06T14:49:39.502Z" }, + { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654, upload-time = "2025-10-06T14:49:41.32Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511, upload-time = "2025-10-06T14:49:46.021Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895, upload-time = "2025-10-06T14:49:48.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073, upload-time = "2025-10-06T14:49:50.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226, upload-time = "2025-10-06T14:49:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, + { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, + { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, + { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, + { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, + { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, + { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, + { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, + { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, + { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, + { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, + { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, + { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, + { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, + { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, + { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, + { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, + { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, + { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, + { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, + { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, + { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, + { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, + { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, + { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, + { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "networkx" +version = "3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e7/0e07379944aa8afb49a556a2b54587b828eb41dc9adc56fb7615b678ca53/numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb", size = 21259519, upload-time = "2025-10-15T16:15:19.012Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cb/5a69293561e8819b09e34ed9e873b9a82b5f2ade23dce4c51dc507f6cfe1/numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f", size = 14452796, upload-time = "2025-10-15T16:15:23.094Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/ff11611200acd602a1e5129e36cfd25bf01ad8e5cf927baf2e90236eb02e/numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36", size = 5381639, upload-time = "2025-10-15T16:15:25.572Z" }, + { url = "https://files.pythonhosted.org/packages/ea/77/e95c757a6fe7a48d28a009267408e8aa382630cc1ad1db7451b3bc21dbb4/numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032", size = 6914296, upload-time = "2025-10-15T16:15:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a3/d2/137c7b6841c942124eae921279e5c41b1c34bab0e6fc60c7348e69afd165/numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7", size = 14591904, upload-time = "2025-10-15T16:15:29.044Z" }, + { url = "https://files.pythonhosted.org/packages/bb/32/67e3b0f07b0aba57a078c4ab777a9e8e6bc62f24fb53a2337f75f9691699/numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda", size = 16939602, upload-time = "2025-10-15T16:15:31.106Z" }, + { url = "https://files.pythonhosted.org/packages/95/22/9639c30e32c93c4cee3ccdb4b09c2d0fbff4dcd06d36b357da06146530fb/numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0", size = 16372661, upload-time = "2025-10-15T16:15:33.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/e9/a685079529be2b0156ae0c11b13d6be647743095bb51d46589e95be88086/numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a", size = 18884682, upload-time = "2025-10-15T16:15:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/cf/85/f6f00d019b0cc741e64b4e00ce865a57b6bed945d1bbeb1ccadbc647959b/numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1", size = 6570076, upload-time = "2025-10-15T16:15:38.225Z" }, + { url = "https://files.pythonhosted.org/packages/7d/10/f8850982021cb90e2ec31990291f9e830ce7d94eef432b15066e7cbe0bec/numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996", size = 13089358, upload-time = "2025-10-15T16:15:40.404Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ad/afdd8351385edf0b3445f9e24210a9c3971ef4de8fd85155462fc4321d79/numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c", size = 10462292, upload-time = "2025-10-15T16:15:42.896Z" }, + { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" }, + { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" }, + { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" }, + { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" }, + { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" }, + { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" }, + { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" }, + { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" }, + { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" }, + { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" }, + { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" }, + { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" }, + { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" }, + { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" }, + { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" }, + { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" }, + { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" }, + { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" }, + { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" }, + { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" }, + { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" }, + { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" }, + { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" }, + { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" }, + { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" }, + { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" }, + { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" }, + { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" }, + { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b6/64898f51a86ec88ca1257a59c1d7fd077b60082a119affefcdf1dd0df8ca/numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05", size = 21131552, upload-time = "2025-10-15T16:17:55.845Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4c/f135dc6ebe2b6a3c77f4e4838fa63d350f85c99462012306ada1bd4bc460/numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346", size = 14377796, upload-time = "2025-10-15T16:17:58.308Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a4/f33f9c23fcc13dd8412fc8614559b5b797e0aba9d8e01dfa8bae10c84004/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e", size = 5306904, upload-time = "2025-10-15T16:18:00.596Z" }, + { url = "https://files.pythonhosted.org/packages/28/af/c44097f25f834360f9fb960fa082863e0bad14a42f36527b2a121abdec56/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b", size = 6819682, upload-time = "2025-10-15T16:18:02.32Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8c/cd283b54c3c2b77e188f63e23039844f56b23bba1712318288c13fe86baf/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847", size = 14422300, upload-time = "2025-10-15T16:18:04.271Z" }, + { url = "https://files.pythonhosted.org/packages/b0/f0/8404db5098d92446b3e3695cf41c6f0ecb703d701cb0b7566ee2177f2eee/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d", size = 16760806, upload-time = "2025-10-15T16:18:06.668Z" }, + { url = "https://files.pythonhosted.org/packages/95/8e/2844c3959ce9a63acc7c8e50881133d86666f0420bcde695e115ced0920f/numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f", size = 12973130, upload-time = "2025-10-15T16:18:09.397Z" }, +] + +[[package]] +name = "oauthlib" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, +] + +[[package]] +name = "onnx" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ml-dtypes" }, + { name = "numpy" }, + { name = "protobuf" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/2f/c619eb65769357e9b6de9212c9a821ab39cd484448e5d6b3fb5fb0a64c6d/onnx-1.19.1.tar.gz", hash = "sha256:737524d6eb3907d3499ea459c6f01c5a96278bb3a0f2ff8ae04786fb5d7f1ed5", size = 12033525, upload-time = "2025-10-10T04:01:34.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/07/0019c72924909e4f64b9199770630ab7b8d7914b912b03230e68f5eda7ae/onnx-1.19.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:17aaf5832126de0a5197a5864e4f09a764dd7681d3035135547959b4b6b77a09", size = 18320936, upload-time = "2025-10-10T04:00:04.235Z" }, + { url = "https://files.pythonhosted.org/packages/af/2f/5c47acf740dc35f0decc640844260fbbdc0efa0565657c93fd7ff30f13f3/onnx-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01b292a4d0b197c45d8184545bbc8ae1df83466341b604187c1b05902cb9c920", size = 18044269, upload-time = "2025-10-10T04:00:07.449Z" }, + { url = "https://files.pythonhosted.org/packages/d5/61/6c457ee8c3a62a3cad0a4bfa4c5436bb3ac4df90c3551d40bee1224b5b51/onnx-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1839af08ab4a909e4af936b8149c27f8c64b96138981024e251906e0539d8bf9", size = 18218092, upload-time = "2025-10-10T04:00:11.135Z" }, + { url = "https://files.pythonhosted.org/packages/54/d5/ab832e1369505e67926a70e9a102061f89ad01f91aa296c4b1277cb81b25/onnx-1.19.1-cp311-cp311-win32.whl", hash = "sha256:0bdbb676e3722bd32f9227c465d552689f49086f986a696419d865cb4e70b989", size = 16344809, upload-time = "2025-10-10T04:00:14.634Z" }, + { url = "https://files.pythonhosted.org/packages/8b/b5/6eb4611d24b85002f878ba8476b4cecbe6f9784c0236a3c5eff85236cc0a/onnx-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:1346853df5c1e3ebedb2e794cf2a51e0f33759affd655524864ccbcddad7035b", size = 16464319, upload-time = "2025-10-10T04:00:18.235Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ff/f0e1f06420c70e20d497fec7c94a864d069943b6312bedd4224c0ab946f8/onnx-1.19.1-cp311-cp311-win_arm64.whl", hash = "sha256:2d69c280c0e665b7f923f499243b9bb84fe97970b7a4668afa0032045de602c8", size = 16437503, upload-time = "2025-10-10T04:00:21.247Z" }, + { url = "https://files.pythonhosted.org/packages/50/07/f6c5b2cffef8c29e739616d1415aea22f7b7ef1f19c17f02b7cff71f5498/onnx-1.19.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:3612193a89ddbce5c4e86150869b9258780a82fb8c4ca197723a4460178a6ce9", size = 18327840, upload-time = "2025-10-10T04:00:24.259Z" }, + { url = "https://files.pythonhosted.org/packages/93/20/0568ebd52730287ae80cac8ac893a7301c793ea1630984e2519ee92b02a9/onnx-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c2fd2f744e7a3880ad0c262efa2edf6d965d0bd02b8f327ec516ad4cb0f2f15", size = 18042539, upload-time = "2025-10-10T04:00:27.693Z" }, + { url = "https://files.pythonhosted.org/packages/14/fd/cd7a0fd10a04f8cc5ae436b63e0022e236fe51b9dbb8ee6317fd48568c72/onnx-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:485d3674d50d789e0ee72fa6f6e174ab81cb14c772d594f992141bd744729d8a", size = 18218271, upload-time = "2025-10-10T04:00:30.495Z" }, + { url = "https://files.pythonhosted.org/packages/65/68/cc8b8c05469fe08384b446304ad7e6256131ca0463bf6962366eebec98c0/onnx-1.19.1-cp312-cp312-win32.whl", hash = "sha256:638bc56ff1a5718f7441e887aeb4e450f37a81c6eac482040381b140bd9ba601", size = 16345111, upload-time = "2025-10-10T04:00:34.982Z" }, + { url = "https://files.pythonhosted.org/packages/c7/5e/d1cb16693598a512c2cf9ffe0841d8d8fd2c83ae8e889efd554f5aa427cf/onnx-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:bc7e2e4e163e679721e547958b5a7db875bf822cad371b7c1304aa4401a7c7a4", size = 16465621, upload-time = "2025-10-10T04:00:39.107Z" }, + { url = "https://files.pythonhosted.org/packages/90/32/da116cc61fdef334782aa7f87a1738431dd1af1a5d1a44bd95d6d51ad260/onnx-1.19.1-cp312-cp312-win_arm64.whl", hash = "sha256:17c215b1c0f20fe93b4cbe62668247c1d2294b9bc7f6be0ca9ced28e980c07b7", size = 16437505, upload-time = "2025-10-10T04:00:42.255Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b8/ab1fdfe2e8502f4dc4289fc893db35816bd20d080d8370f86e74dda5f598/onnx-1.19.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:4e5f938c68c4dffd3e19e4fd76eb98d298174eb5ebc09319cdd0ec5fe50050dc", size = 18327815, upload-time = "2025-10-10T04:00:45.682Z" }, + { url = "https://files.pythonhosted.org/packages/04/40/eb875745a4b92aea10e5e32aa2830f409c4d7b6f7b48ca1c4eaad96636c5/onnx-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:86e20a5984b017feeef2dbf4ceff1c7c161ab9423254968dd77d3696c38691d0", size = 18041464, upload-time = "2025-10-10T04:00:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/8586135f40dbe4989cec4d413164bc8fc5c73d37c566f33f5ea3a7f2b6f6/onnx-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d9c467f0f29993c12f330736af87972f30adb8329b515f39d63a0db929cb2c", size = 18218244, upload-time = "2025-10-10T04:00:51.891Z" }, + { url = "https://files.pythonhosted.org/packages/51/b5/4201254b8683129db5da3fb55aa1f7e56d0a8d45c66ce875dec21ca1ff25/onnx-1.19.1-cp313-cp313-win32.whl", hash = "sha256:65eee353a51b4e4ca3e797784661e5376e2b209f17557e04921eac9166a8752e", size = 16345330, upload-time = "2025-10-10T04:00:54.858Z" }, + { url = "https://files.pythonhosted.org/packages/69/67/c6d239afbcdbeb6805432969b908b5c9f700c96d332b34e3f99518d76caf/onnx-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:c3bc87e38b53554b1fc9ef7b275c81c6f5c93c90a91935bb0aa8d4d498a6d48e", size = 16465567, upload-time = "2025-10-10T04:00:57.893Z" }, + { url = "https://files.pythonhosted.org/packages/99/fe/89f1e40f5bc54595ff0dcf5391ce19e578b528973ccc74dd99800196d30d/onnx-1.19.1-cp313-cp313-win_arm64.whl", hash = "sha256:e41496f400afb980ec643d80d5164753a88a85234fa5c06afdeebc8b7d1ec252", size = 16437562, upload-time = "2025-10-10T04:01:00.703Z" }, + { url = "https://files.pythonhosted.org/packages/86/43/b186ccbc8fe7e93643a6a6d40bbf2bb6ce4fb9469bbd3453c77e270c50ad/onnx-1.19.1-cp313-cp313t-macosx_12_0_universal2.whl", hash = "sha256:5f6274abf0fd74e80e78ecbb44bd44509409634525c89a9b38276c8af47dc0a2", size = 18355703, upload-time = "2025-10-10T04:01:03.735Z" }, + { url = "https://files.pythonhosted.org/packages/60/f1/22ee4d8b8f9fa4cb1d1b9579da3b4b5187ddab33846ec5ac744af02c0e2b/onnx-1.19.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:07dcd4d83584eb4bf8f21ac04c82643712e5e93ac2a0ed10121ec123cb127e1e", size = 18047830, upload-time = "2025-10-10T04:01:06.552Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/8f3d51e3a095d42cdf2039a590cff06d024f2a10efbd0b1a2a6b3825f019/onnx-1.19.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1975860c3e720db25d37f1619976582828264bdcc64fa7511c321ac4fc01add3", size = 18221126, upload-time = "2025-10-10T04:01:09.77Z" }, + { url = "https://files.pythonhosted.org/packages/4f/0d/f9d6c2237083f1aac14b37f0b03b0d81f1147a8e2af0c3828165e0a6a67b/onnx-1.19.1-cp313-cp313t-win_amd64.whl", hash = "sha256:9807d0e181f6070ee3a6276166acdc571575d1bd522fc7e89dba16fd6e7ffed9", size = 16465560, upload-time = "2025-10-10T04:01:13.212Z" }, + { url = "https://files.pythonhosted.org/packages/36/70/8418a58faa7d606d6a92cab69ae8d361b3b3969bf7e7e9a65a86d5d1b674/onnx-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6ee83e6929d75005482d9f304c502ac7c9b8d6db153aa6b484dae74d0f28570", size = 18042812, upload-time = "2025-10-10T04:01:15.919Z" }, +] + +[[package]] +name = "onnxconverter-common" +version = "1.16.0" +source = { git = "https://github.com/microsoft/onnxconverter-common.git?rev=f7a8eb699caa6f6a78d3bdfbcaf5dfbd43569ebd#f7a8eb699caa6f6a78d3bdfbcaf5dfbd43569ebd" } +dependencies = [ + { name = "numpy" }, + { name = "onnx" }, + { name = "packaging" }, + { name = "protobuf" }, +] + +[[package]] +name = "onnxruntime" +version = "1.23.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coloredlogs" }, + { name = "flatbuffers" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "sympy" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/be/467b00f09061572f022ffd17e49e49e5a7a789056bad95b54dfd3bee73ff/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:6f91d2c9b0965e86827a5ba01531d5b669770b01775b23199565d6c1f136616c", size = 17196113, upload-time = "2025-10-22T03:47:33.526Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a8/3c23a8f75f93122d2b3410bfb74d06d0f8da4ac663185f91866b03f7da1b/onnxruntime-1.23.2-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:87d8b6eaf0fbeb6835a60a4265fde7a3b60157cf1b2764773ac47237b4d48612", size = 19153857, upload-time = "2025-10-22T03:46:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d8/506eed9af03d86f8db4880a4c47cd0dffee973ef7e4f4cff9f1d4bcf7d22/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbfd2fca76c855317568c1b36a885ddea2272c13cb0e395002c402f2360429a6", size = 15220095, upload-time = "2025-10-22T03:46:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/e9/80/113381ba832d5e777accedc6cb41d10f9eca82321ae31ebb6bcede530cea/onnxruntime-1.23.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da44b99206e77734c5819aa2142c69e64f3b46edc3bd314f6a45a932defc0b3e", size = 17372080, upload-time = "2025-10-22T03:47:00.265Z" }, + { url = "https://files.pythonhosted.org/packages/3a/db/1b4a62e23183a0c3fe441782462c0ede9a2a65c6bbffb9582fab7c7a0d38/onnxruntime-1.23.2-cp311-cp311-win_amd64.whl", hash = "sha256:902c756d8b633ce0dedd889b7c08459433fbcf35e9c38d1c03ddc020f0648c6e", size = 13468349, upload-time = "2025-10-22T03:47:25.783Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9e/f748cd64161213adeef83d0cb16cb8ace1e62fa501033acdd9f9341fff57/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:b8f029a6b98d3cf5be564d52802bb50a8489ab73409fa9db0bf583eabb7c2321", size = 17195929, upload-time = "2025-10-22T03:47:36.24Z" }, + { url = "https://files.pythonhosted.org/packages/91/9d/a81aafd899b900101988ead7fb14974c8a58695338ab6a0f3d6b0100f30b/onnxruntime-1.23.2-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:218295a8acae83905f6f1aed8cacb8e3eb3bd7513a13fe4ba3b2664a19fc4a6b", size = 19157705, upload-time = "2025-10-22T03:46:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/4e40f2fba272a6698d62be2cd21ddc3675edfc1a4b9ddefcc4648f115315/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76ff670550dc23e58ea9bc53b5149b99a44e63b34b524f7b8547469aaa0dcb8c", size = 15226915, upload-time = "2025-10-22T03:46:27.773Z" }, + { url = "https://files.pythonhosted.org/packages/ef/88/9cc25d2bafe6bc0d4d3c1db3ade98196d5b355c0b273e6a5dc09c5d5d0d5/onnxruntime-1.23.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f9b4ae77f8e3c9bee50c27bc1beede83f786fe1d52e99ac85aa8d65a01e9b77", size = 17382649, upload-time = "2025-10-22T03:47:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b4/569d298f9fc4d286c11c45e85d9ffa9e877af12ace98af8cab52396e8f46/onnxruntime-1.23.2-cp312-cp312-win_amd64.whl", hash = "sha256:25de5214923ce941a3523739d34a520aac30f21e631de53bba9174dc9c004435", size = 13470528, upload-time = "2025-10-22T03:47:28.106Z" }, + { url = "https://files.pythonhosted.org/packages/3d/41/fba0cabccecefe4a1b5fc8020c44febb334637f133acefc7ec492029dd2c/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_arm64.whl", hash = "sha256:2ff531ad8496281b4297f32b83b01cdd719617e2351ffe0dba5684fb283afa1f", size = 17196337, upload-time = "2025-10-22T03:46:35.168Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f9/2d49ca491c6a986acce9f1d1d5fc2099108958cc1710c28e89a032c9cfe9/onnxruntime-1.23.2-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:162f4ca894ec3de1a6fd53589e511e06ecdc3ff646849b62a9da7489dee9ce95", size = 19157691, upload-time = "2025-10-22T03:46:43.518Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a1/428ee29c6eaf09a6f6be56f836213f104618fb35ac6cc586ff0f477263eb/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45d127d6e1e9b99d1ebeae9bcd8f98617a812f53f46699eafeb976275744826b", size = 15226898, upload-time = "2025-10-22T03:46:30.039Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2b/b57c8a2466a3126dbe0a792f56ad7290949b02f47b86216cd47d857e4b77/onnxruntime-1.23.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8bace4e0d46480fbeeb7bbe1ffe1f080e6663a42d1086ff95c1551f2d39e7872", size = 17382518, upload-time = "2025-10-22T03:47:05.407Z" }, + { url = "https://files.pythonhosted.org/packages/4a/93/aba75358133b3a941d736816dd392f687e7eab77215a6e429879080b76b6/onnxruntime-1.23.2-cp313-cp313-win_amd64.whl", hash = "sha256:1f9cc0a55349c584f083c1c076e611a7c35d5b867d5d6e6d6c823bf821978088", size = 13470276, upload-time = "2025-10-22T03:47:31.193Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3d/6830fa61c69ca8e905f237001dbfc01689a4e4ab06147020a4518318881f/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9d2385e774f46ac38f02b3a91a91e30263d41b2f1f4f26ae34805b2a9ddef466", size = 15229610, upload-time = "2025-10-22T03:46:32.239Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ca/862b1e7a639460f0ca25fd5b6135fb42cf9deea86d398a92e44dfda2279d/onnxruntime-1.23.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2b9233c4947907fd1818d0e581c049c41ccc39b2856cc942ff6d26317cee145", size = 17394184, upload-time = "2025-10-22T03:47:08.127Z" }, +] + +[[package]] +name = "orjson" +version = "3.11.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/fe/ed708782d6709cc60eb4c2d8a361a440661f74134675c72990f2c48c785f/orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d", size = 5945188, upload-time = "2025-10-24T15:50:38.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/1d/1ea6005fffb56715fd48f632611e163d1604e8316a5bad2288bee9a1c9eb/orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39", size = 243498, upload-time = "2025-10-24T15:48:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/37/d7/ffed10c7da677f2a9da307d491b9eb1d0125b0307019c4ad3d665fd31f4f/orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d", size = 128961, upload-time = "2025-10-24T15:48:49.571Z" }, + { url = "https://files.pythonhosted.org/packages/a2/96/3e4d10a18866d1368f73c8c44b7fe37cc8a15c32f2a7620be3877d4c55a3/orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175", size = 130321, upload-time = "2025-10-24T15:48:50.713Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1f/465f66e93f434f968dd74d5b623eb62c657bdba2332f5a8be9f118bb74c7/orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040", size = 129207, upload-time = "2025-10-24T15:48:52.193Z" }, + { url = "https://files.pythonhosted.org/packages/28/43/d1e94837543321c119dff277ae8e348562fe8c0fafbb648ef7cb0c67e521/orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63", size = 136323, upload-time = "2025-10-24T15:48:54.806Z" }, + { url = "https://files.pythonhosted.org/packages/bf/04/93303776c8890e422a5847dd012b4853cdd88206b8bbd3edc292c90102d1/orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9", size = 137440, upload-time = "2025-10-24T15:48:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ef/75519d039e5ae6b0f34d0336854d55544ba903e21bf56c83adc51cd8bf82/orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a", size = 136680, upload-time = "2025-10-24T15:48:57.476Z" }, + { url = "https://files.pythonhosted.org/packages/b5/18/bf8581eaae0b941b44efe14fee7b7862c3382fbc9a0842132cfc7cf5ecf4/orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be", size = 136160, upload-time = "2025-10-24T15:48:59.631Z" }, + { url = "https://files.pythonhosted.org/packages/c4/35/a6d582766d351f87fc0a22ad740a641b0a8e6fc47515e8614d2e4790ae10/orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7", size = 140318, upload-time = "2025-10-24T15:49:00.834Z" }, + { url = "https://files.pythonhosted.org/packages/76/b3/5a4801803ab2e2e2d703bce1a56540d9f99a9143fbec7bf63d225044fef8/orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549", size = 406330, upload-time = "2025-10-24T15:49:02.327Z" }, + { url = "https://files.pythonhosted.org/packages/80/55/a8f682f64833e3a649f620eafefee175cbfeb9854fc5b710b90c3bca45df/orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905", size = 149580, upload-time = "2025-10-24T15:49:03.517Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e4/c132fa0c67afbb3eb88274fa98df9ac1f631a675e7877037c611805a4413/orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907", size = 139846, upload-time = "2025-10-24T15:49:04.761Z" }, + { url = "https://files.pythonhosted.org/packages/54/06/dc3491489efd651fef99c5908e13951abd1aead1257c67f16135f95ce209/orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c", size = 135781, upload-time = "2025-10-24T15:49:05.969Z" }, + { url = "https://files.pythonhosted.org/packages/79/b7/5e5e8d77bd4ea02a6ac54c42c818afb01dd31961be8a574eb79f1d2cfb1e/orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a", size = 131391, upload-time = "2025-10-24T15:49:07.355Z" }, + { url = "https://files.pythonhosted.org/packages/0f/dc/9484127cc1aa213be398ed735f5f270eedcb0c0977303a6f6ddc46b60204/orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045", size = 126252, upload-time = "2025-10-24T15:49:08.869Z" }, + { url = "https://files.pythonhosted.org/packages/63/51/6b556192a04595b93e277a9ff71cd0cc06c21a7df98bcce5963fa0f5e36f/orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50", size = 243571, upload-time = "2025-10-24T15:49:10.008Z" }, + { url = "https://files.pythonhosted.org/packages/1c/2c/2602392ddf2601d538ff11848b98621cd465d1a1ceb9db9e8043181f2f7b/orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853", size = 128891, upload-time = "2025-10-24T15:49:11.297Z" }, + { url = "https://files.pythonhosted.org/packages/4e/47/bf85dcf95f7a3a12bf223394a4f849430acd82633848d52def09fa3f46ad/orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938", size = 130137, upload-time = "2025-10-24T15:49:12.544Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4d/a0cb31007f3ab6f1fd2a1b17057c7c349bc2baf8921a85c0180cc7be8011/orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415", size = 129152, upload-time = "2025-10-24T15:49:13.754Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ef/2811def7ce3d8576b19e3929fff8f8f0d44bc5eb2e0fdecb2e6e6cc6c720/orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44", size = 136834, upload-time = "2025-10-24T15:49:15.307Z" }, + { url = "https://files.pythonhosted.org/packages/00/d4/9aee9e54f1809cec8ed5abd9bc31e8a9631d19460e3b8470145d25140106/orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2", size = 137519, upload-time = "2025-10-24T15:49:16.557Z" }, + { url = "https://files.pythonhosted.org/packages/db/ea/67bfdb5465d5679e8ae8d68c11753aaf4f47e3e7264bad66dc2f2249e643/orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708", size = 136749, upload-time = "2025-10-24T15:49:17.796Z" }, + { url = "https://files.pythonhosted.org/packages/01/7e/62517dddcfce6d53a39543cd74d0dccfcbdf53967017c58af68822100272/orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210", size = 136325, upload-time = "2025-10-24T15:49:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/40516739f99ab4c7ec3aaa5cc242d341fcb03a45d89edeeaabc5f69cb2cf/orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241", size = 140204, upload-time = "2025-10-24T15:49:20.545Z" }, + { url = "https://files.pythonhosted.org/packages/82/18/ff5734365623a8916e3a4037fcef1cd1782bfc14cf0992afe7940c5320bf/orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b", size = 406242, upload-time = "2025-10-24T15:49:21.884Z" }, + { url = "https://files.pythonhosted.org/packages/e1/43/96436041f0a0c8c8deca6a05ebeaf529bf1de04839f93ac5e7c479807aec/orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c", size = 150013, upload-time = "2025-10-24T15:49:23.185Z" }, + { url = "https://files.pythonhosted.org/packages/1b/48/78302d98423ed8780479a1e682b9aecb869e8404545d999d34fa486e573e/orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9", size = 139951, upload-time = "2025-10-24T15:49:24.428Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7b/ad613fdcdaa812f075ec0875143c3d37f8654457d2af17703905425981bf/orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa", size = 136049, upload-time = "2025-10-24T15:49:25.973Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/9cf47c3ff5f39b8350fb21ba65d789b6a1129d4cbb3033ba36c8a9023520/orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140", size = 131461, upload-time = "2025-10-24T15:49:27.259Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3b/e2425f61e5825dc5b08c2a5a2b3af387eaaca22a12b9c8c01504f8614c36/orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e", size = 126167, upload-time = "2025-10-24T15:49:28.511Z" }, + { url = "https://files.pythonhosted.org/packages/23/15/c52aa7112006b0f3d6180386c3a46ae057f932ab3425bc6f6ac50431cca1/orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534", size = 243525, upload-time = "2025-10-24T15:49:29.737Z" }, + { url = "https://files.pythonhosted.org/packages/ec/38/05340734c33b933fd114f161f25a04e651b0c7c33ab95e9416ade5cb44b8/orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff", size = 128871, upload-time = "2025-10-24T15:49:31.109Z" }, + { url = "https://files.pythonhosted.org/packages/55/b9/ae8d34899ff0c012039b5a7cb96a389b2476e917733294e498586b45472d/orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad", size = 130055, upload-time = "2025-10-24T15:49:33.382Z" }, + { url = "https://files.pythonhosted.org/packages/33/aa/6346dd5073730451bee3681d901e3c337e7ec17342fb79659ec9794fc023/orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5", size = 129061, upload-time = "2025-10-24T15:49:34.935Z" }, + { url = "https://files.pythonhosted.org/packages/39/e4/8eea51598f66a6c853c380979912d17ec510e8e66b280d968602e680b942/orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a", size = 136541, upload-time = "2025-10-24T15:49:36.923Z" }, + { url = "https://files.pythonhosted.org/packages/9a/47/cb8c654fa9adcc60e99580e17c32b9e633290e6239a99efa6b885aba9dbc/orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436", size = 137535, upload-time = "2025-10-24T15:49:38.307Z" }, + { url = "https://files.pythonhosted.org/packages/43/92/04b8cc5c2b729f3437ee013ce14a60ab3d3001465d95c184758f19362f23/orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9", size = 136703, upload-time = "2025-10-24T15:49:40.795Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fd/d0733fcb9086b8be4ebcfcda2d0312865d17d0d9884378b7cffb29d0763f/orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73", size = 136293, upload-time = "2025-10-24T15:49:42.347Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/3c5514e806837c210492d72ae30ccf050ce3f940f45bf085bab272699ef4/orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0", size = 140131, upload-time = "2025-10-24T15:49:43.638Z" }, + { url = "https://files.pythonhosted.org/packages/9c/dd/ba9d32a53207babf65bd510ac4d0faaa818bd0df9a9c6f472fe7c254f2e3/orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196", size = 406164, upload-time = "2025-10-24T15:49:45.498Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f9/f68ad68f4af7c7bde57cd514eaa2c785e500477a8bc8f834838eb696a685/orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a", size = 149859, upload-time = "2025-10-24T15:49:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d2/7f847761d0c26818395b3d6b21fb6bc2305d94612a35b0a30eae65a22728/orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6", size = 139926, upload-time = "2025-10-24T15:49:48.321Z" }, + { url = "https://files.pythonhosted.org/packages/9f/37/acd14b12dc62db9a0e1d12386271b8661faae270b22492580d5258808975/orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839", size = 136007, upload-time = "2025-10-24T15:49:49.938Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a9/967be009ddf0a1fffd7a67de9c36656b28c763659ef91352acc02cbe364c/orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a", size = 131314, upload-time = "2025-10-24T15:49:51.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/db/399abd6950fbd94ce125cb8cd1a968def95174792e127b0642781e040ed4/orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de", size = 126152, upload-time = "2025-10-24T15:49:52.922Z" }, + { url = "https://files.pythonhosted.org/packages/25/e3/54ff63c093cc1697e758e4fceb53164dd2661a7d1bcd522260ba09f54533/orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803", size = 243501, upload-time = "2025-10-24T15:49:54.288Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7d/e2d1076ed2e8e0ae9badca65bf7ef22710f93887b29eaa37f09850604e09/orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54", size = 128862, upload-time = "2025-10-24T15:49:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/9f/37/ca2eb40b90621faddfa9517dfe96e25f5ae4d8057a7c0cdd613c17e07b2c/orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e", size = 130047, upload-time = "2025-10-24T15:49:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/c7/62/1021ed35a1f2bad9040f05fa4cc4f9893410df0ba3eaa323ccf899b1c90a/orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316", size = 129073, upload-time = "2025-10-24T15:49:58.782Z" }, + { url = "https://files.pythonhosted.org/packages/e8/3f/f84d966ec2a6fd5f73b1a707e7cd876813422ae4bf9f0145c55c9c6a0f57/orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1", size = 136597, upload-time = "2025-10-24T15:50:00.12Z" }, + { url = "https://files.pythonhosted.org/packages/32/78/4fa0aeca65ee82bbabb49e055bd03fa4edea33f7c080c5c7b9601661ef72/orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc", size = 137515, upload-time = "2025-10-24T15:50:01.57Z" }, + { url = "https://files.pythonhosted.org/packages/c1/9d/0c102e26e7fde40c4c98470796d050a2ec1953897e2c8ab0cb95b0759fa2/orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f", size = 136703, upload-time = "2025-10-24T15:50:02.944Z" }, + { url = "https://files.pythonhosted.org/packages/df/ac/2de7188705b4cdfaf0b6c97d2f7849c17d2003232f6e70df98602173f788/orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf", size = 136311, upload-time = "2025-10-24T15:50:04.441Z" }, + { url = "https://files.pythonhosted.org/packages/e0/52/847fcd1a98407154e944feeb12e3b4d487a0e264c40191fb44d1269cbaa1/orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606", size = 140127, upload-time = "2025-10-24T15:50:07.398Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ae/21d208f58bdb847dd4d0d9407e2929862561841baa22bdab7aea10ca088e/orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780", size = 406201, upload-time = "2025-10-24T15:50:08.796Z" }, + { url = "https://files.pythonhosted.org/packages/8d/55/0789d6de386c8366059db098a628e2ad8798069e94409b0d8935934cbcb9/orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23", size = 149872, upload-time = "2025-10-24T15:50:10.234Z" }, + { url = "https://files.pythonhosted.org/packages/cc/1d/7ff81ea23310e086c17b41d78a72270d9de04481e6113dbe2ac19118f7fb/orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155", size = 139931, upload-time = "2025-10-24T15:50:11.623Z" }, + { url = "https://files.pythonhosted.org/packages/77/92/25b886252c50ed64be68c937b562b2f2333b45afe72d53d719e46a565a50/orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394", size = 136065, upload-time = "2025-10-24T15:50:13.025Z" }, + { url = "https://files.pythonhosted.org/packages/63/b8/718eecf0bb7e9d64e4956afaafd23db9f04c776d445f59fe94f54bdae8f0/orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1", size = 131310, upload-time = "2025-10-24T15:50:14.46Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bf/def5e25d4d8bfce296a9a7c8248109bf58622c21618b590678f945a2c59c/orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d", size = 126151, upload-time = "2025-10-24T15:50:15.878Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "parse" +version = "1.20.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/78/d9b09ba24bb36ef8b83b71be547e118d46214735b6dfb39e4bfde0e9b9dd/parse-1.20.2.tar.gz", hash = "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce", size = 29391, upload-time = "2024-06-11T04:41:57.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/31/ba45bf0b2aa7898d81cbbfac0e88c267befb59ad91a19e36e1bc5578ddb1/parse-1.20.2-py2.py3-none-any.whl", hash = "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558", size = 20126, upload-time = "2024-06-11T04:41:55.057Z" }, +] + +[[package]] +name = "parsimonious" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/91/abdc50c4ef06fdf8d047f60ee777ca9b2a7885e1a9cea81343fbecda52d7/parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c", size = 52172, upload-time = "2022-09-03T17:01:17.004Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/0f/c8b64d9b54ea631fcad4e9e3c8dbe8c11bb32a623be94f22974c88e71eaf/parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f", size = 48427, upload-time = "2022-09-03T17:01:13.814Z" }, +] + +[[package]] +name = "parsley" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/52/cac2f9e78c26cff8bb518bdb4f2b5a0c7058dec7a62087ed48fe87478ef0/Parsley-1.3.tar.gz", hash = "sha256:9444278d47161d5f2be76a767809a3cbe6db4db822f46a4fd7481d4057208d41", size = 99616, upload-time = "2015-09-09T02:53:04.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/d6/4fed8d65e28a970e1c5cb33ce9c7e22e3de745e1b2ae37af051ef16aea3b/Parsley-1.3-py2.py3-none-any.whl", hash = "sha256:c3bc417b8c7e3a96c87c0f2f751bfd784ed5156ffccebe2f84330df5685f8dc3", size = 88932, upload-time = "2015-09-09T02:53:09.977Z" }, +] + +[[package]] +name = "parso" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, +] + +[[package]] +name = "patsy" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/44/ed13eccdd0519eff265f44b670d46fbb0ec813e2274932dc1c0e48520f7d/patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0", size = 399942, upload-time = "2025-10-20T16:17:37.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a", size = 233301, upload-time = "2025-10-20T16:17:36.563Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, + { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, + { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, + { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, + { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, + { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, + { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, + { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +] + +[[package]] +name = "pip" +version = "23.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/e63fb4e0d20e48bd2167bb7e857abc0e21679e24805ba921a224df8977c0/pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2", size = 2109449, upload-time = "2023-07-22T09:17:34.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", size = 2086091, upload-time = "2023-07-22T09:17:31.548Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, +] + +[[package]] +name = "plotly" +version = "5.24.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/4f/428f6d959818d7425a94c190a6b26fbc58035cbef40bf249be0b62a9aedd/plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae", size = 9479398, upload-time = "2024-09-12T15:36:31.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ae/580600f441f6fc05218bd6c9d5794f4aef072a7d9093b291f1c50a9db8bc/plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089", size = 19054220, upload-time = "2024-09-12T15:36:24.08Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "propcache" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +] + +[[package]] +name = "proto-plus" +version = "1.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, +] + +[[package]] +name = "protobuf" +version = "5.29.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/29/d09e70352e4e88c9c7a198d5645d7277811448d76c23b00345670f7c8a38/protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84", size = 425226, upload-time = "2025-05-28T23:51:59.82Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/11/6e40e9fc5bba02988a214c07cf324595789ca7820160bfd1f8be96e48539/protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079", size = 422963, upload-time = "2025-05-28T23:51:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/81/7f/73cefb093e1a2a7c3ffd839e6f9fcafb7a427d300c7f8aef9c64405d8ac6/protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc", size = 434818, upload-time = "2025-05-28T23:51:44.297Z" }, + { url = "https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671", size = 418091, upload-time = "2025-05-28T23:51:45.907Z" }, + { url = "https://files.pythonhosted.org/packages/6c/04/98f6f8cf5b07ab1294c13f34b4e69b3722bb609c5b701d6c169828f9f8aa/protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015", size = 319824, upload-time = "2025-05-28T23:51:47.545Z" }, + { url = "https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61", size = 319942, upload-time = "2025-05-28T23:51:49.11Z" }, + { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823, upload-time = "2025-05-28T23:51:58.157Z" }, +] + +[[package]] +name = "psutil" +version = "7.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, + { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, + { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, + { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, + { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, + { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, + { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, + { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "py" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", size = 207796, upload-time = "2021-11-04T17:17:01.377Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", size = 98708, upload-time = "2021-11-04T17:17:00.152Z" }, +] + +[[package]] +name = "py4j" +version = "0.10.9.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/f2/b34255180c72c36ff7097f7c2cdca02abcbd89f5eebf7c7c41262a9a0637/py4j-0.10.9.7.tar.gz", hash = "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb", size = 1508234, upload-time = "2022-08-12T22:49:09.792Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/30/a58b32568f1623aaad7db22aa9eafc4c6c194b429ff35bdc55ca2726da47/py4j-0.10.9.7-py2.py3-none-any.whl", hash = "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b", size = 200481, upload-time = "2022-08-12T22:49:07.05Z" }, +] + +[[package]] +name = "pyarrow" +version = "22.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/53/04a7fdc63e6056116c9ddc8b43bc28c12cdd181b85cbeadb79278475f3ae/pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9", size = 1151151, upload-time = "2025-10-24T12:30:00.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/b7/18f611a8cdc43417f9394a3ccd3eace2f32183c08b9eddc3d17681819f37/pyarrow-22.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a", size = 34272022, upload-time = "2025-10-24T10:04:28.973Z" }, + { url = "https://files.pythonhosted.org/packages/26/5c/f259e2526c67eb4b9e511741b19870a02363a47a35edbebc55c3178db22d/pyarrow-22.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e", size = 35995834, upload-time = "2025-10-24T10:04:35.467Z" }, + { url = "https://files.pythonhosted.org/packages/50/8d/281f0f9b9376d4b7f146913b26fac0aa2829cd1ee7e997f53a27411bbb92/pyarrow-22.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215", size = 45030348, upload-time = "2025-10-24T10:04:43.366Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e5/53c0a1c428f0976bf22f513d79c73000926cb00b9c138d8e02daf2102e18/pyarrow-22.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d", size = 47699480, upload-time = "2025-10-24T10:04:51.486Z" }, + { url = "https://files.pythonhosted.org/packages/95/e1/9dbe4c465c3365959d183e6345d0a8d1dc5b02ca3f8db4760b3bc834cf25/pyarrow-22.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8", size = 48011148, upload-time = "2025-10-24T10:04:59.585Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b4/7caf5d21930061444c3cf4fa7535c82faf5263e22ce43af7c2759ceb5b8b/pyarrow-22.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016", size = 50276964, upload-time = "2025-10-24T10:05:08.175Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f3/cec89bd99fa3abf826f14d4e53d3d11340ce6f6af4d14bdcd54cd83b6576/pyarrow-22.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c", size = 28106517, upload-time = "2025-10-24T10:05:14.314Z" }, + { url = "https://files.pythonhosted.org/packages/af/63/ba23862d69652f85b615ca14ad14f3bcfc5bf1b99ef3f0cd04ff93fdad5a/pyarrow-22.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d", size = 34211578, upload-time = "2025-10-24T10:05:21.583Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d0/f9ad86fe809efd2bcc8be32032fa72e8b0d112b01ae56a053006376c5930/pyarrow-22.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8", size = 35989906, upload-time = "2025-10-24T10:05:29.485Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a8/f910afcb14630e64d673f15904ec27dd31f1e009b77033c365c84e8c1e1d/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5", size = 45021677, upload-time = "2025-10-24T10:05:38.274Z" }, + { url = "https://files.pythonhosted.org/packages/13/95/aec81f781c75cd10554dc17a25849c720d54feafb6f7847690478dcf5ef8/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe", size = 47726315, upload-time = "2025-10-24T10:05:47.314Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d4/74ac9f7a54cfde12ee42734ea25d5a3c9a45db78f9def949307a92720d37/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e", size = 47990906, upload-time = "2025-10-24T10:05:58.254Z" }, + { url = "https://files.pythonhosted.org/packages/2e/71/fedf2499bf7a95062eafc989ace56572f3343432570e1c54e6599d5b88da/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9", size = 50306783, upload-time = "2025-10-24T10:06:08.08Z" }, + { url = "https://files.pythonhosted.org/packages/68/ed/b202abd5a5b78f519722f3d29063dda03c114711093c1995a33b8e2e0f4b/pyarrow-22.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d", size = 27972883, upload-time = "2025-10-24T10:06:14.204Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d6/d0fac16a2963002fc22c8fa75180a838737203d558f0ed3b564c4a54eef5/pyarrow-22.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e6e95176209257803a8b3d0394f21604e796dadb643d2f7ca21b66c9c0b30c9a", size = 34204629, upload-time = "2025-10-24T10:06:20.274Z" }, + { url = "https://files.pythonhosted.org/packages/c6/9c/1d6357347fbae062ad3f17082f9ebc29cc733321e892c0d2085f42a2212b/pyarrow-22.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:001ea83a58024818826a9e3f89bf9310a114f7e26dfe404a4c32686f97bd7901", size = 35985783, upload-time = "2025-10-24T10:06:27.301Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/782344c2ce58afbea010150df07e3a2f5fdad299cd631697ae7bd3bac6e3/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ce20fe000754f477c8a9125543f1936ea5b8867c5406757c224d745ed033e691", size = 45020999, upload-time = "2025-10-24T10:06:35.387Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8b/5362443737a5307a7b67c1017c42cd104213189b4970bf607e05faf9c525/pyarrow-22.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e0a15757fccb38c410947df156f9749ae4a3c89b2393741a50521f39a8cf202a", size = 47724601, upload-time = "2025-10-24T10:06:43.551Z" }, + { url = "https://files.pythonhosted.org/packages/69/4d/76e567a4fc2e190ee6072967cb4672b7d9249ac59ae65af2d7e3047afa3b/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cedb9dd9358e4ea1d9bce3665ce0797f6adf97ff142c8e25b46ba9cdd508e9b6", size = 48001050, upload-time = "2025-10-24T10:06:52.284Z" }, + { url = "https://files.pythonhosted.org/packages/01/5e/5653f0535d2a1aef8223cee9d92944cb6bccfee5cf1cd3f462d7cb022790/pyarrow-22.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:252be4a05f9d9185bb8c18e83764ebcfea7185076c07a7a662253af3a8c07941", size = 50307877, upload-time = "2025-10-24T10:07:02.405Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f8/1d0bd75bf9328a3b826e24a16e5517cd7f9fbf8d34a3184a4566ef5a7f29/pyarrow-22.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:a4893d31e5ef780b6edcaf63122df0f8d321088bb0dee4c8c06eccb1ca28d145", size = 27977099, upload-time = "2025-10-24T10:08:07.259Z" }, + { url = "https://files.pythonhosted.org/packages/90/81/db56870c997805bf2b0f6eeeb2d68458bf4654652dccdcf1bf7a42d80903/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1", size = 34336685, upload-time = "2025-10-24T10:07:11.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/98/0727947f199aba8a120f47dfc229eeb05df15bcd7a6f1b669e9f882afc58/pyarrow-22.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:ba95112d15fd4f1105fb2402c4eab9068f0554435e9b7085924bcfaac2cc306f", size = 36032158, upload-time = "2025-10-24T10:07:18.626Z" }, + { url = "https://files.pythonhosted.org/packages/96/b4/9babdef9c01720a0785945c7cf550e4acd0ebcd7bdd2e6f0aa7981fa85e2/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c064e28361c05d72eed8e744c9605cbd6d2bb7481a511c74071fd9b24bc65d7d", size = 44892060, upload-time = "2025-10-24T10:07:26.002Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ca/2f8804edd6279f78a37062d813de3f16f29183874447ef6d1aadbb4efa0f/pyarrow-22.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6f9762274496c244d951c819348afbcf212714902742225f649cf02823a6a10f", size = 47504395, upload-time = "2025-10-24T10:07:34.09Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f0/77aa5198fd3943682b2e4faaf179a674f0edea0d55d326d83cb2277d9363/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a9d9ffdc2ab696f6b15b4d1f7cec6658e1d788124418cb30030afbae31c64746", size = 48066216, upload-time = "2025-10-24T10:07:43.528Z" }, + { url = "https://files.pythonhosted.org/packages/79/87/a1937b6e78b2aff18b706d738c9e46ade5bfcf11b294e39c87706a0089ac/pyarrow-22.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ec1a15968a9d80da01e1d30349b2b0d7cc91e96588ee324ce1b5228175043e95", size = 50288552, upload-time = "2025-10-24T10:07:53.519Z" }, + { url = "https://files.pythonhosted.org/packages/60/ae/b5a5811e11f25788ccfdaa8f26b6791c9807119dffcf80514505527c384c/pyarrow-22.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:bba208d9c7decf9961998edf5c65e3ea4355d5818dd6cd0f6809bec1afb951cc", size = 28262504, upload-time = "2025-10-24T10:08:00.932Z" }, + { url = "https://files.pythonhosted.org/packages/bd/b0/0fa4d28a8edb42b0a7144edd20befd04173ac79819547216f8a9f36f9e50/pyarrow-22.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:9bddc2cade6561f6820d4cd73f99a0243532ad506bc510a75a5a65a522b2d74d", size = 34224062, upload-time = "2025-10-24T10:08:14.101Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/7a719076b3c1be0acef56a07220c586f25cd24de0e3f3102b438d18ae5df/pyarrow-22.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:e70ff90c64419709d38c8932ea9fe1cc98415c4f87ea8da81719e43f02534bc9", size = 35990057, upload-time = "2025-10-24T10:08:21.842Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/359ed54c93b47fb6fe30ed16cdf50e3f0e8b9ccfb11b86218c3619ae50a8/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:92843c305330aa94a36e706c16209cd4df274693e777ca47112617db7d0ef3d7", size = 45068002, upload-time = "2025-10-24T10:08:29.034Z" }, + { url = "https://files.pythonhosted.org/packages/55/fc/4945896cc8638536ee787a3bd6ce7cec8ec9acf452d78ec39ab328efa0a1/pyarrow-22.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:6dda1ddac033d27421c20d7a7943eec60be44e0db4e079f33cc5af3b8280ccde", size = 47737765, upload-time = "2025-10-24T10:08:38.559Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5e/7cb7edeb2abfaa1f79b5d5eb89432356155c8426f75d3753cbcb9592c0fd/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:84378110dd9a6c06323b41b56e129c504d157d1a983ce8f5443761eb5256bafc", size = 48048139, upload-time = "2025-10-24T10:08:46.784Z" }, + { url = "https://files.pythonhosted.org/packages/88/c6/546baa7c48185f5e9d6e59277c4b19f30f48c94d9dd938c2a80d4d6b067c/pyarrow-22.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:854794239111d2b88b40b6ef92aa478024d1e5074f364033e73e21e3f76b25e0", size = 50314244, upload-time = "2025-10-24T10:08:55.771Z" }, + { url = "https://files.pythonhosted.org/packages/3c/79/755ff2d145aafec8d347bf18f95e4e81c00127f06d080135dfc86aea417c/pyarrow-22.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:b883fe6fd85adad7932b3271c38ac289c65b7337c2c132e9569f9d3940620730", size = 28757501, upload-time = "2025-10-24T10:09:59.891Z" }, + { url = "https://files.pythonhosted.org/packages/0e/d2/237d75ac28ced3147912954e3c1a174df43a95f4f88e467809118a8165e0/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7a820d8ae11facf32585507c11f04e3f38343c1e784c9b5a8b1da5c930547fe2", size = 34355506, upload-time = "2025-10-24T10:09:02.953Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/733dfffe6d3069740f98e57ff81007809067d68626c5faef293434d11bd6/pyarrow-22.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:c6ec3675d98915bf1ec8b3c7986422682f7232ea76cad276f4c8abd5b7319b70", size = 36047312, upload-time = "2025-10-24T10:09:10.334Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2b/29d6e3782dc1f299727462c1543af357a0f2c1d3c160ce199950d9ca51eb/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3e739edd001b04f654b166204fc7a9de896cf6007eaff33409ee9e50ceaff754", size = 45081609, upload-time = "2025-10-24T10:09:18.61Z" }, + { url = "https://files.pythonhosted.org/packages/8d/42/aa9355ecc05997915af1b7b947a7f66c02dcaa927f3203b87871c114ba10/pyarrow-22.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7388ac685cab5b279a41dfe0a6ccd99e4dbf322edfb63e02fc0443bf24134e91", size = 47703663, upload-time = "2025-10-24T10:09:27.369Z" }, + { url = "https://files.pythonhosted.org/packages/ee/62/45abedde480168e83a1de005b7b7043fd553321c1e8c5a9a114425f64842/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f633074f36dbc33d5c05b5dc75371e5660f1dbf9c8b1d95669def05e5425989c", size = 48066543, upload-time = "2025-10-24T10:09:34.908Z" }, + { url = "https://files.pythonhosted.org/packages/84/e9/7878940a5b072e4f3bf998770acafeae13b267f9893af5f6d4ab3904b67e/pyarrow-22.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4c19236ae2402a8663a2c8f21f1870a03cc57f0bef7e4b6eb3238cc82944de80", size = 50288838, upload-time = "2025-10-24T10:09:44.394Z" }, + { url = "https://files.pythonhosted.org/packages/7b/03/f335d6c52b4a4761bcc83499789a1e2e16d9d201a58c327a9b5cc9a41bd9/pyarrow-22.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0c34fe18094686194f204a3b1787a27456897d8a2d62caf84b61e8dfbc0252ae", size = 29185594, upload-time = "2025-10-24T10:09:53.111Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycares" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/ad/9d1e96486d2eb5a2672c4d9a2dd372d015b8d7a332c6ac2722c4c8e6bbbf/pycares-4.11.0.tar.gz", hash = "sha256:c863d9003ca0ce7df26429007859afd2a621d3276ed9fef154a9123db9252557", size = 654473, upload-time = "2025-09-09T15:18:21.849Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/0f/2e68eb38244b5bbd68cd8d21e82d5f937353b563fd2f1aae28987e38a93d/pycares-4.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c2971af3a4094280f7c24293ff4d361689c175c1ebcbea6b3c1560eaff7cb240", size = 145863, upload-time = "2025-09-09T15:16:31.253Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3c/3c0ddeed957667438dd6151e9c41f21b54b49a3c16159807ca5d52eff621/pycares-4.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d69e2034160e1219665decb8140e439afc7a7afcfd4adff08eb0f6142405c3e", size = 141825, upload-time = "2025-09-09T15:16:32.408Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/f285b4944e69f611d1f4fadae63675edfb4380a980e6b6e99acca9d7e731/pycares-4.11.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3bd81ad69f607803f531ff5cfa1262391fa06e78488c13495cee0f70d02e0287", size = 642673, upload-time = "2025-09-09T15:16:33.664Z" }, + { url = "https://files.pythonhosted.org/packages/c5/44/61550e684035e71c894752e074b3722e5f1d40739840ca8b0b295209def7/pycares-4.11.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:0aed0974eab3131d832e7e84a73ddb0dddbc57393cd8c0788d68a759a78c4a7b", size = 690263, upload-time = "2025-09-09T15:16:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e6/e5e5e96821bb98106222fb8f617ba3e0c8828e75e74c67685f0044c77907/pycares-4.11.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:30d197180af626bb56f17e1fa54640838d7d12ed0f74665a3014f7155435b199", size = 682092, upload-time = "2025-09-09T15:16:36.119Z" }, + { url = "https://files.pythonhosted.org/packages/51/37/3c065239229e5ca57f2f46bac2cedaf32b26a22dae5d728751e8623efb4d/pycares-4.11.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cb711a66246561f1cae51244deef700eef75481a70d99611fd3c8ab5bd69ab49", size = 643995, upload-time = "2025-09-09T15:16:40.623Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/a3a24b205a725e51eebf3d766e512ccca07462da60211a238d906535105c/pycares-4.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7aba9a312a620052133437f2363aae90ae4695ee61cb2ee07cbb9951d4c69ddd", size = 627004, upload-time = "2025-09-09T15:16:44.199Z" }, + { url = "https://files.pythonhosted.org/packages/61/08/d9d2d4b15fcb6bd703306fa5ad426df22d5c7076e689b62bfbcb884b8a87/pycares-4.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c2af7a9d3afb63da31df1456d38b91555a6c147710a116d5cc70ab1e9f457a4f", size = 673235, upload-time = "2025-09-09T15:16:45.449Z" }, + { url = "https://files.pythonhosted.org/packages/1c/51/bc12de8ab3b36c0352a2b157d556dbdae942652d88f6db83034fa3b5cdaf/pycares-4.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d5fe089be67bc5927f0c0bd60c082c79f22cf299635ee3ddd370ae2a6e8b4ae0", size = 656624, upload-time = "2025-09-09T15:16:46.905Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ab/dd42b95634edcb26bdf0abde579f78d5ede3377fb46e3947ec223b2fbba5/pycares-4.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35ff1ec260372c97ed688efd5b3c6e5481f2274dea08f6c4ea864c195a9673c6", size = 631904, upload-time = "2025-09-09T15:16:48.587Z" }, + { url = "https://files.pythonhosted.org/packages/59/59/f87c36aba61cc1a94c739a83cd55fdb73075739929e0a5a7bcc2ce880aa3/pycares-4.11.0-cp311-cp311-win32.whl", hash = "sha256:ff3d25883b7865ea34c00084dd22a7be7c58fd3131db6b25c35eafae84398f9d", size = 118829, upload-time = "2025-09-09T15:16:49.77Z" }, + { url = "https://files.pythonhosted.org/packages/70/b1/d7ce974454eafc6c81f87ae512f3dc2917c6e57af60c57aaef34b3729ce3/pycares-4.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:f4695153333607e63068580f2979b377b641a03bc36e02813659ffbea2b76fe2", size = 144578, upload-time = "2025-09-09T15:16:50.702Z" }, + { url = "https://files.pythonhosted.org/packages/7a/3b/f783b8fed44eb5c8a32a675613e5ac566dba149e58e3ab3097b9bfeb209e/pycares-4.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:dc54a21586c096df73f06f9bdf594e8d86d7be84e5d4266358ce81c04c3cc88c", size = 115683, upload-time = "2025-09-09T15:16:52.102Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4e/4821b66feefaaa8ec03494c1a11614c430983572e54ff062b4589441e199/pycares-4.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b93d624560ba52287873bacff70b42c99943821ecbc810b959b0953560f53c36", size = 145906, upload-time = "2025-09-09T15:16:53.204Z" }, + { url = "https://files.pythonhosted.org/packages/e8/81/93a505dcbb7533254b0ce1da519591dcda889d6a66dcdfa5737e3280e18a/pycares-4.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:775d99966e28c8abd9910ddef2de0f1e173afc5a11cea9f184613c747373ab80", size = 141972, upload-time = "2025-09-09T15:16:54.43Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d6/76994c8b21316e48ea6c3ce3298574c28f90c9c41428a3349a57104621c9/pycares-4.11.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:84fde689557361764f052850a2d68916050adbfd9321f6105aca1d8f1a9bd49b", size = 637832, upload-time = "2025-09-09T15:16:55.523Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a4/5ca7e316d0edb714d78974cb34f4883f63fe9f580644c2db99fb62b05f56/pycares-4.11.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:30ceed06f3bf5eff865a34d21562c25a7f3dad0ed336b9dd415330e03a6c50c4", size = 687751, upload-time = "2025-09-09T15:16:57.55Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8d/c5c578fdd335d7b1dcaea88fae3497390095b5b05a1ba34a29f62d037abb/pycares-4.11.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:97d971b3a88a803bb95ff8a40ea4d68da59319eb8b59e924e318e2560af8c16d", size = 678362, upload-time = "2025-09-09T15:16:58.859Z" }, + { url = "https://files.pythonhosted.org/packages/b9/96/9be4d838a9348dd2e72a90c34d186b918b66d499af5be79afa18a6ba2808/pycares-4.11.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2d5cac829da91ade70ce1af97dad448c6cd4778b48facbce1b015e16ced93642", size = 641069, upload-time = "2025-09-09T15:17:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/39/d6/8ea9b5dcef6b566cde034aa2b68743f7b0a19fa0fba9ea01a4f98b8a57fb/pycares-4.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee1ea367835eb441d246164c09d1f9703197af4425fc6865cefcde9e2ca81f85", size = 622357, upload-time = "2025-09-09T15:17:01.205Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/3401e89b5d2970e30e02f9beb29ad59e2a8f19ef2c68c978de2b764cacb0/pycares-4.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3139ec1f4450a4b253386035c5ecd2722582ae3320a456df5021ffe3f174260a", size = 670290, upload-time = "2025-09-09T15:17:02.413Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c4/ff6a166e1d1d1987339548a19d0b1d52ec3ead8b3a8a2247a0d96e56013c/pycares-4.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5d70324ca1d82c6c4b00aa678347f7560d1ef2ce1d181978903459a97751543a", size = 652958, upload-time = "2025-09-09T15:17:04.203Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/fc084b395921c9b862d31a83f809fe649c24314b51b527ad0ab0df33edd4/pycares-4.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e2f8d9cfe0eb3a2997fde5df99b1aaea5a46dabfcfcac97b2d05f027c2cd5e28", size = 629239, upload-time = "2025-09-09T15:17:05.477Z" }, + { url = "https://files.pythonhosted.org/packages/b0/7f/2f26062bea95ab657f979217d50df563dc9fd9cc4c5dd21a6e7323e9efe7/pycares-4.11.0-cp312-cp312-win32.whl", hash = "sha256:1571a7055c03a95d5270c914034eac7f8bfa1b432fc1de53d871b821752191a4", size = 118918, upload-time = "2025-09-09T15:17:06.882Z" }, + { url = "https://files.pythonhosted.org/packages/a5/86/277473d20f3df4e00fa7e0ebb21955b2830b15247462aaf8f3fc8c4950be/pycares-4.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:7570e0b50db619b2ee370461c462617225dc3a3f63f975c6f117e2f0c94f82ca", size = 144560, upload-time = "2025-09-09T15:17:07.891Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f9/d65ad17ec921d8b7eb42161dec2024ee2f5c9f1c44cabf0dd1b7f4fac6c5/pycares-4.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:f199702740f3b766ed8c70efb885538be76cb48cd0cb596b948626f0b825e07a", size = 115695, upload-time = "2025-09-09T15:17:09.333Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a9/62fea7ad72ac1fed2ac9dd8e9a7379b7eb0288bf2b3ea5731642c3a6f7de/pycares-4.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c296ab94d1974f8d2f76c499755a9ce31ffd4986e8898ef19b90e32525f7d84", size = 145909, upload-time = "2025-09-09T15:17:10.491Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/0317d6d0d3bd7599c53b8f1db09ad04260647d2f6842018e322584791fd5/pycares-4.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0fcd3a8bac57a0987d9b09953ba0f8703eb9dca7c77f7051d8c2ed001185be8", size = 141974, upload-time = "2025-09-09T15:17:11.634Z" }, + { url = "https://files.pythonhosted.org/packages/63/11/731b565ae1e81c43dac247a248ee204628186f6df97c9927bd06c62237f8/pycares-4.11.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:bac55842047567ddae177fb8189b89a60633ac956d5d37260f7f71b517fd8b87", size = 637796, upload-time = "2025-09-09T15:17:12.815Z" }, + { url = "https://files.pythonhosted.org/packages/f5/30/a2631fe2ffaa85475cdbff7df1d9376bc0b2a6ae77ca55d53233c937a5da/pycares-4.11.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:4da2e805ed8c789b9444ef4053f6ef8040cd13b0c1ca6d3c4fe6f9369c458cb4", size = 687734, upload-time = "2025-09-09T15:17:14.015Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b7/b3a5f99d4ab776662e71d5a56e8f6ea10741230ff988d1f502a8d429236b/pycares-4.11.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:ea785d1f232b42b325578f0c8a2fa348192e182cc84a1e862896076a4a2ba2a7", size = 678320, upload-time = "2025-09-09T15:17:15.442Z" }, + { url = "https://files.pythonhosted.org/packages/ea/77/a00d962b90432993afbf3bd05da8fe42117e0d9037cd7fd428dc41094d7b/pycares-4.11.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:aa160dc9e785212c49c12bb891e242c949758b99542946cc8e2098ef391f93b0", size = 641012, upload-time = "2025-09-09T15:17:16.728Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fb/9266979ba59d37deee1fd74452b2ae32a7395acafe1bee510ac023c6c9a5/pycares-4.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7830709c23bbc43fbaefbb3dde57bdd295dc86732504b9d2e65044df8fd5e9fb", size = 622363, upload-time = "2025-09-09T15:17:17.835Z" }, + { url = "https://files.pythonhosted.org/packages/91/c2/16dbc3dc33781a3c79cbdd76dd1cda808d98ba078d9a63a725d6a1fad181/pycares-4.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ef1ab7abbd238bb2dbbe871c3ea39f5a7fc63547c015820c1e24d0d494a1689", size = 670294, upload-time = "2025-09-09T15:17:19.214Z" }, + { url = "https://files.pythonhosted.org/packages/ff/75/f003905e55298a6dd5e0673a2dc11e31518a5141393b925dc05fcaba9fb4/pycares-4.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a4060d8556c908660512d42df1f4a874e4e91b81f79e3a9090afedc7690ea5ba", size = 652973, upload-time = "2025-09-09T15:17:20.388Z" }, + { url = "https://files.pythonhosted.org/packages/55/2a/eafb235c371979e11f8998d686cbaa91df6a84a34ffe4d997dfe57c45445/pycares-4.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a98fac4a3d4f780817016b6f00a8a2c2f41df5d25dfa8e5b1aa0d783645a6566", size = 629235, upload-time = "2025-09-09T15:17:21.92Z" }, + { url = "https://files.pythonhosted.org/packages/05/99/60f19eb1c8eb898882dd8875ea51ad0aac3aff5780b27247969e637cc26a/pycares-4.11.0-cp313-cp313-win32.whl", hash = "sha256:faa8321bc2a366189dcf87b3823e030edf5ac97a6b9a7fc99f1926c4bf8ef28e", size = 118918, upload-time = "2025-09-09T15:17:23.327Z" }, + { url = "https://files.pythonhosted.org/packages/2a/14/bc89ad7225cba73068688397de09d7cad657d67b93641c14e5e18b88e685/pycares-4.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:6f74b1d944a50fa12c5006fd10b45e1a45da0c5d15570919ce48be88e428264c", size = 144556, upload-time = "2025-09-09T15:17:24.341Z" }, + { url = "https://files.pythonhosted.org/packages/af/88/4309576bd74b5e6fc1f39b9bc5e4b578df2cadb16bdc026ac0cc15663763/pycares-4.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f7581793d8bb3014028b8397f6f80b99db8842da58f4409839c29b16397ad", size = 115692, upload-time = "2025-09-09T15:17:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/2a/70/a723bc79bdcac60361b40184b649282ac0ab433b90e9cc0975370c2ff9c9/pycares-4.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:df0a17f4e677d57bca3624752bbb515316522ad1ce0de07ed9d920e6c4ee5d35", size = 145910, upload-time = "2025-09-09T15:17:26.774Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/46311ef5a384b5f0bb206851135dde8f86b3def38fdbee9e3c03475d35ae/pycares-4.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b44e54cad31d3c3be5e8149ac36bc1c163ec86e0664293402f6f846fb22ad00", size = 142053, upload-time = "2025-09-09T15:17:27.956Z" }, + { url = "https://files.pythonhosted.org/packages/74/23/d236fc4f134d6311e4ad6445571e8285e84a3e155be36422ff20c0fbe471/pycares-4.11.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:80752133442dc7e6dd9410cec227c49f69283c038c316a8585cca05ec32c2766", size = 637878, upload-time = "2025-09-09T15:17:29.173Z" }, + { url = "https://files.pythonhosted.org/packages/f7/92/6edd41282b3f0e3d9defaba7b05c39730d51c37c165d9d3b319349c975aa/pycares-4.11.0-cp314-cp314-manylinux_2_28_ppc64le.whl", hash = "sha256:84b0b402dd333403fdce0e204aef1ef834d839c439c0c1aa143dc7d1237bb197", size = 687865, upload-time = "2025-09-09T15:17:30.549Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a9/4d7cf4d72600fd47d9518f9ce99703a3e8711fb08d2ef63d198056cdc9a9/pycares-4.11.0-cp314-cp314-manylinux_2_28_s390x.whl", hash = "sha256:c0eec184df42fc82e43197e073f9cc8f93b25ad2f11f230c64c2dc1c80dbc078", size = 678396, upload-time = "2025-09-09T15:17:32.304Z" }, + { url = "https://files.pythonhosted.org/packages/0b/4b/e546eeb1d8ff6559e2e3bef31a6ea0c6e57ec826191941f83a3ce900ca89/pycares-4.11.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ee751409322ff10709ee867d5aea1dc8431eec7f34835f0f67afd016178da134", size = 640786, upload-time = "2025-09-09T15:17:33.602Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f5/b4572d9ee9c26de1f8d1dc80730df756276b9243a6794fa3101bbe56613d/pycares-4.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1732db81e348bfce19c9bf9448ba660aea03042eeeea282824da1604a5bd4dcf", size = 621857, upload-time = "2025-09-09T15:17:34.74Z" }, + { url = "https://files.pythonhosted.org/packages/17/f2/639090376198bcaeff86562b25e1bce05a481cfb1e605f82ce62285230cd/pycares-4.11.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:702d21823996f139874aba5aa9bb786d69e93bde6e3915b99832eb4e335d31ae", size = 670130, upload-time = "2025-09-09T15:17:35.982Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c4/cf40773cd9c36a12cebbe1e9b6fb120f9160dc9bfe0398d81a20b6c69972/pycares-4.11.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:218619b912cef7c64a339ab0e231daea10c994a05699740714dff8c428b9694a", size = 653133, upload-time = "2025-09-09T15:17:37.179Z" }, + { url = "https://files.pythonhosted.org/packages/32/6b/06054d977b0a9643821043b59f523f3db5e7684c4b1b4f5821994d5fa780/pycares-4.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:719f7ddff024fdacde97b926b4b26d0cc25901d5ef68bb994a581c420069936d", size = 629344, upload-time = "2025-09-09T15:17:38.308Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6f/14bb0c2171a286d512e3f02d6168e608ffe5f6eceab78bf63e3073091ae3/pycares-4.11.0-cp314-cp314-win32.whl", hash = "sha256:d552fb2cb513ce910d1dc22dbba6420758a991a356f3cd1b7ec73a9e31f94d01", size = 121804, upload-time = "2025-09-09T15:17:39.388Z" }, + { url = "https://files.pythonhosted.org/packages/24/dc/6822f9ad6941027f70e1cf161d8631456531a87061588ed3b1dcad07d49d/pycares-4.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:23d50a0842e8dbdddf870a7218a7ab5053b68892706b3a391ecb3d657424d266", size = 148005, upload-time = "2025-09-09T15:17:40.44Z" }, + { url = "https://files.pythonhosted.org/packages/ea/24/24ff3a80aa8471fbb62785c821a8e90f397ca842e0489f83ebf7ee274397/pycares-4.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:836725754c32363d2c5d15b931b3ebd46b20185c02e850672cb6c5f0452c1e80", size = 119239, upload-time = "2025-09-09T15:17:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/fe/2f3558d298ff8db31d5c83369001ab72af3b86a0374d9b0d40dc63314187/pycares-4.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c9d839b5700542b27c1a0d359cbfad6496341e7c819c7fea63db9588857065ed", size = 146408, upload-time = "2025-09-09T15:17:43.74Z" }, + { url = "https://files.pythonhosted.org/packages/3c/c8/516901e46a1a73b3a75e87a35f3a3a4fe085f1214f37d954c9d7e782bd6d/pycares-4.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:31b85ad00422b38f426e5733a71dfb7ee7eb65a99ea328c508d4f552b1760dc8", size = 142371, upload-time = "2025-09-09T15:17:45.186Z" }, + { url = "https://files.pythonhosted.org/packages/ac/99/c3fba0aa575f331ebed91f87ba960ffbe0849211cdf103ab275bc0107ac6/pycares-4.11.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:cdac992206756b024b371760c55719eb5cd9d6b2cb25a8d5a04ae1b0ff426232", size = 647504, upload-time = "2025-09-09T15:17:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e4/1cdc3ec9c92f8069ec18c58b016b2df7c44a088e2849f37ed457554961aa/pycares-4.11.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:ffb22cee640bc12ee0e654eba74ecfb59e2e0aebc5bccc3cc7ef92f487008af7", size = 697122, upload-time = "2025-09-09T15:17:47.772Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d5/bd8f370b97bb73e5bdd55dc2a78e18d6f49181cf77e88af0599d16f5c073/pycares-4.11.0-cp314-cp314t-manylinux_2_28_s390x.whl", hash = "sha256:00538826d2eaf4a0e4becb0753b0ac8d652334603c445c9566c9eb273657eb4c", size = 687543, upload-time = "2025-09-09T15:17:49.183Z" }, + { url = "https://files.pythonhosted.org/packages/33/38/49b77b9cf5dffc0b1fdd86656975c3bc1a58b79bdc883a9ef749b17a013c/pycares-4.11.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:29daa36548c04cdcd1a78ae187a4b7b003f0b357a2f4f1f98f9863373eedc759", size = 649565, upload-time = "2025-09-09T15:17:51.03Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/f6d57bfb99d00a6a7363f95c8d3a930fe82a868d9de24c64c8048d66f16a/pycares-4.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cf306f3951740d7bed36149a6d8d656a7d5432dd4bbc6af3bb6554361fc87401", size = 631242, upload-time = "2025-09-09T15:17:52.298Z" }, + { url = "https://files.pythonhosted.org/packages/33/a2/7b9121c71cfe06a8474e221593f83a78176fae3b79e5853d2dfd13ab01cc/pycares-4.11.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:386da2581db4ea2832629e275c061103b0be32f9391c5dfaea7f6040951950ad", size = 680304, upload-time = "2025-09-09T15:17:53.638Z" }, + { url = "https://files.pythonhosted.org/packages/5b/07/dfe76807f637d8b80e1a59dfc4a1bceabdd0205a45b2ebf78b415ae72af3/pycares-4.11.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:45d3254a694459fdb0640ef08724ca9d4b4f6ff6d7161c9b526d7d2e2111379e", size = 661039, upload-time = "2025-09-09T15:17:55.024Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9b/55d50c5acd46cbe95d0da27740a83e721d89c0ce7e42bff9891a9f29a855/pycares-4.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eddf5e520bb88b23b04ac1f28f5e9a7c77c718b8b4af3a4a7a2cc4a600f34502", size = 637560, upload-time = "2025-09-09T15:17:56.492Z" }, + { url = "https://files.pythonhosted.org/packages/1f/79/2b2e723d1b929dbe7f99e80a56abb29a4f86988c1f73195d960d706b1629/pycares-4.11.0-cp314-cp314t-win32.whl", hash = "sha256:8a75a406432ce39ce0ca41edff7486df6c970eb0fe5cfbe292f195a6b8654461", size = 122235, upload-time = "2025-09-09T15:17:57.576Z" }, + { url = "https://files.pythonhosted.org/packages/93/fe/bf3b3ed9345a38092e72cd9890a5df5c2349fc27846a714d823a41f0ee27/pycares-4.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:3784b80d797bcc2ff2bf3d4b27f46d8516fe1707ff3b82c2580dc977537387f9", size = 148575, upload-time = "2025-09-09T15:17:58.699Z" }, + { url = "https://files.pythonhosted.org/packages/ce/20/c0c5cfcf89725fe533b27bc5f714dc4efa8e782bf697c36f9ddf04ba975d/pycares-4.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:afc6503adf8b35c21183b9387be64ca6810644ef54c9ef6c99d1d5635c01601b", size = 119690, upload-time = "2025-09-09T15:17:59.809Z" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pydantic" +version = "2.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/99/d0a5dca411e0a017762258013ba9905cd6e7baa9a3fd1fe8b6529472902e/pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a", size = 739834, upload-time = "2024-07-04T02:59:49.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/fa/b7f815b8c9ad021c07f88875b601222ef5e70619391ade4a49234d12d278/pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8", size = 423875, upload-time = "2024-07-04T02:59:45.33Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/e3/0d5ad91211dba310f7ded335f4dad871172b9cc9ce204f5a56d76ccd6247/pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4", size = 388371, upload-time = "2024-07-03T17:04:13.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/db/f6a724db226d990a329910727cfac43539ff6969edc217286dd05cda3ef6/pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312", size = 1834507, upload-time = "2024-07-03T17:00:44.754Z" }, + { url = "https://files.pythonhosted.org/packages/9b/83/6f2bfe75209d557ae1c3550c1252684fc1827b8b12fbed84c3b4439e135d/pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88", size = 1773527, upload-time = "2024-07-03T17:00:47.141Z" }, + { url = "https://files.pythonhosted.org/packages/93/ef/513ea76d7ca81f2354bb9c8d7839fc1157673e652613f7e1aff17d8ce05d/pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc", size = 1787879, upload-time = "2024-07-03T17:00:49.729Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/ac294caecf235f0cc651de6232f1642bb793af448d1cfc541b0dc1fd72b8/pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43", size = 1774694, upload-time = "2024-07-03T17:00:52.201Z" }, + { url = "https://files.pythonhosted.org/packages/46/a4/08f12b5512f095963550a7cb49ae010e3f8f3f22b45e508c2cb4d7744fce/pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6", size = 1976369, upload-time = "2024-07-03T17:00:55.025Z" }, + { url = "https://files.pythonhosted.org/packages/15/59/b2495be4410462aedb399071c71884042a2c6443319cbf62d00b4a7ed7a5/pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121", size = 2691250, upload-time = "2024-07-03T17:00:57.166Z" }, + { url = "https://files.pythonhosted.org/packages/3c/ae/fc99ce1ba791c9e9d1dee04ce80eef1dae5b25b27e3fc8e19f4e3f1348bf/pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1", size = 2061462, upload-time = "2024-07-03T17:00:59.381Z" }, + { url = "https://files.pythonhosted.org/packages/44/bb/eb07cbe47cfd638603ce3cb8c220f1a054b821e666509e535f27ba07ca5f/pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b", size = 1893923, upload-time = "2024-07-03T17:01:01.943Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/5a52400553b8faa0e7f11fd7a2ba11e8d2feb50b540f9e7973c49b97eac0/pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27", size = 1966779, upload-time = "2024-07-03T17:01:04.864Z" }, + { url = "https://files.pythonhosted.org/packages/4c/5b/fb37fe341344d9651f5c5f579639cd97d50a457dc53901aa8f7e9f28beb9/pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b", size = 2109044, upload-time = "2024-07-03T17:01:07.241Z" }, + { url = "https://files.pythonhosted.org/packages/70/1a/6f7278802dbc66716661618807ab0dfa4fc32b09d1235923bbbe8b3a5757/pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a", size = 1708265, upload-time = "2024-07-03T17:01:11.061Z" }, + { url = "https://files.pythonhosted.org/packages/35/7f/58758c42c61b0bdd585158586fecea295523d49933cb33664ea888162daf/pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2", size = 1901750, upload-time = "2024-07-03T17:01:13.335Z" }, + { url = "https://files.pythonhosted.org/packages/6f/47/ef0d60ae23c41aced42921728650460dc831a0adf604bfa66b76028cb4d0/pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231", size = 1839225, upload-time = "2024-07-03T17:01:15.981Z" }, + { url = "https://files.pythonhosted.org/packages/6a/23/430f2878c9cd977a61bb39f71751d9310ec55cee36b3d5bf1752c6341fd0/pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9", size = 1768604, upload-time = "2024-07-03T17:01:18.188Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2b/ec4e7225dee79e0dc80ccc3c35ab33cc2c4bbb8a1a7ecf060e5e453651ec/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f", size = 1789767, upload-time = "2024-07-03T17:01:20.86Z" }, + { url = "https://files.pythonhosted.org/packages/64/b0/38b24a1fa6d2f96af3148362e10737ec073768cd44d3ec21dca3be40a519/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52", size = 1772061, upload-time = "2024-07-03T17:01:23.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/da/bb73274c42cb60decfa61e9eb0c9029da78b3b9af0a9de0309dbc8ff87b6/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237", size = 1974573, upload-time = "2024-07-03T17:01:26.318Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/41693110fb3552556180460daffdb8bbeefb87fc026fd9aa4b849374015c/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe", size = 2625596, upload-time = "2024-07-03T17:01:28.775Z" }, + { url = "https://files.pythonhosted.org/packages/09/b3/a5a54b47cccd1ab661ed5775235c5e06924753c2d4817737c5667bfa19a8/pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e", size = 2099064, upload-time = "2024-07-03T17:01:30.962Z" }, + { url = "https://files.pythonhosted.org/packages/52/fa/443a7a6ea54beaba45ff3a59f3d3e6e3004b7460bcfb0be77bcf98719d3b/pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24", size = 1900345, upload-time = "2024-07-03T17:01:33.634Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e6/9aca9ffae60f9cdf0183069de3e271889b628d0fb175913fcb3db5618fb1/pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1", size = 1968252, upload-time = "2024-07-03T17:01:36.291Z" }, + { url = "https://files.pythonhosted.org/packages/46/5e/6c716810ea20a6419188992973a73c2fb4eb99cd382368d0637ddb6d3c99/pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd", size = 2119191, upload-time = "2024-07-03T17:01:38.905Z" }, + { url = "https://files.pythonhosted.org/packages/06/fc/6123b00a9240fbb9ae0babad7a005d51103d9a5d39c957a986f5cdd0c271/pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688", size = 1717788, upload-time = "2024-07-03T17:01:41.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/36/e61ad5a46607a469e2786f398cd671ebafcd9fb17f09a2359985c7228df5/pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d", size = 1898188, upload-time = "2024-07-03T17:01:44.155Z" }, + { url = "https://files.pythonhosted.org/packages/49/75/40b0e98b658fdba02a693b3bacb4c875a28bba87796c7b13975976597d8c/pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686", size = 1838688, upload-time = "2024-07-03T17:01:46.508Z" }, + { url = "https://files.pythonhosted.org/packages/75/02/d8ba2d4a266591a6a623c68b331b96523d4b62ab82a951794e3ed8907390/pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a", size = 1768409, upload-time = "2024-07-03T17:01:49.013Z" }, + { url = "https://files.pythonhosted.org/packages/91/ae/25ecd9bc4ce4993e99a1a3c9ab111c082630c914260e129572fafed4ecc2/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b", size = 1789317, upload-time = "2024-07-03T17:01:51.78Z" }, + { url = "https://files.pythonhosted.org/packages/7a/80/72057580681cdbe55699c367963d9c661b569a1d39338b4f6239faf36cdc/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19", size = 1771949, upload-time = "2024-07-03T17:01:53.881Z" }, + { url = "https://files.pythonhosted.org/packages/a2/be/d9bbabc55b05019013180f141fcaf3b14dbe15ca7da550e95b60c321009a/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac", size = 1974392, upload-time = "2024-07-03T17:01:56.005Z" }, + { url = "https://files.pythonhosted.org/packages/79/2d/7bcd938c6afb0f40293283f5f09988b61fb0a4f1d180abe7c23a2f665f8e/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703", size = 2625565, upload-time = "2024-07-03T17:01:58.508Z" }, + { url = "https://files.pythonhosted.org/packages/ac/88/ca758e979457096008a4b16a064509028e3e092a1e85a5ed6c18ced8da88/pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c", size = 2098784, upload-time = "2024-07-03T17:02:01.13Z" }, + { url = "https://files.pythonhosted.org/packages/eb/de/2fad6d63c3c42e472e985acb12ec45b7f56e42e6f4cd6dfbc5e87ee8678c/pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83", size = 1900198, upload-time = "2024-07-03T17:02:04.348Z" }, + { url = "https://files.pythonhosted.org/packages/fe/50/077c7f35b6488dc369a6d22993af3a37901e198630f38ac43391ca730f5b/pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203", size = 1968005, upload-time = "2024-07-03T17:02:06.737Z" }, + { url = "https://files.pythonhosted.org/packages/5d/1f/f378631574ead46d636b9a04a80ff878b9365d4b361b1905ef1667d4182a/pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0", size = 2118920, upload-time = "2024-07-03T17:02:09.976Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ea/e4943f17df7a3031d709481fe4363d4624ae875a6409aec34c28c9e6cf59/pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e", size = 1717397, upload-time = "2024-07-03T17:02:12.495Z" }, + { url = "https://files.pythonhosted.org/packages/13/63/b95781763e8d84207025071c0cec16d921c0163c7a9033ae4b9a0e020dc7/pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20", size = 1898013, upload-time = "2024-07-03T17:02:15.157Z" }, +] + +[[package]] +name = "pyee" +version = "13.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/03/1fd98d5841cd7964a27d729ccf2199602fe05eb7a405c1462eb7277945ed/pyee-13.0.0.tar.gz", hash = "sha256:b391e3c5a434d1f5118a25615001dbc8f669cf410ab67d04c4d4e07c55481c37", size = 31250, upload-time = "2025-03-17T18:53:15.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/4d/b9add7c84060d4c1906abe9a7e5359f2a60f7a9a4f67268b2766673427d8/pyee-13.0.0-py3-none-any.whl", hash = "sha256:48195a3cddb3b1515ce0695ed76036b5ccc2ef3a9f963ff9f77aec0139845498", size = 15730, upload-time = "2025-03-17T18:53:14.532Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "pyppeteer" +version = "0.0.25" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "pyee" }, + { name = "tqdm" }, + { name = "urllib3" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/16/a5e8d617994cac605f972523bb25f12e3ff9c30baee29b4a9c50467229d9/pyppeteer-0.0.25.tar.gz", hash = "sha256:51fe769b722a1718043b74d12c20420f29e0dd9eeea2b66652b7f93a9ad465dd", size = 1188361, upload-time = "2018-09-26T23:59:49.98Z" } + +[[package]] +name = "pyquery" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cssselect" }, + { name = "lxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/48/79e774ea00b671d08867f06d9258203be81834236c150ac00e942d8fc4db/pyquery-2.0.1.tar.gz", hash = "sha256:0194bb2706b12d037db12c51928fe9ebb36b72d9e719565daba5a6c595322faf", size = 44999, upload-time = "2024-08-30T08:12:24.289Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/f5/5067b48012967ea166b9bd0a015b69e0560e4c6e7c06f28d9bab8f9dd10b/pyquery-2.0.1-py3-none-any.whl", hash = "sha256:aedfa0bd0eb9afc94b3ddbec8f375a6362b32bc9662f46e3e0d866483f4771b0", size = 22573, upload-time = "2024-08-30T08:12:22.586Z" }, +] + +[[package]] +name = "pyreadline3" +version = "3.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839, upload-time = "2024-09-19T02:40:10.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, +] + +[[package]] +name = "pyrsistent" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/3a/5031723c09068e9c8c2f0bc25c3a9245f2b1d1aea8396c787a408f2b95ca/pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", size = 103642, upload-time = "2023-10-25T21:06:56.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/63/7544dc7d0953294882a5c587fb1b10a26e0c23d9b92281a14c2514bac1f7/pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", size = 83481, upload-time = "2023-10-25T21:06:15.238Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a0/49249bc14d71b1bf2ffe89703acfa86f2017c25cfdabcaea532b8c8a5810/pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", size = 120222, upload-time = "2023-10-25T21:06:17.144Z" }, + { url = "https://files.pythonhosted.org/packages/a1/94/9808e8c9271424120289b9028a657da336ad7e43da0647f62e4f6011d19b/pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", size = 120002, upload-time = "2023-10-25T21:06:18.727Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f6/9ecfb78b2fc8e2540546db0fe19df1fae0f56664a5958c21ff8861b0f8da/pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", size = 116850, upload-time = "2023-10-25T21:06:20.424Z" }, + { url = "https://files.pythonhosted.org/packages/83/c8/e6d28bc27a0719f8eaae660357df9757d6e9ca9be2691595721de9e8adfc/pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", size = 60775, upload-time = "2023-10-25T21:06:21.815Z" }, + { url = "https://files.pythonhosted.org/packages/98/87/c6ef52ff30388f357922d08de012abdd3dc61e09311d88967bdae23ab657/pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", size = 63306, upload-time = "2023-10-25T21:06:22.874Z" }, + { url = "https://files.pythonhosted.org/packages/15/ee/ff2ed52032ac1ce2e7ba19e79bd5b05d152ebfb77956cf08fcd6e8d760ea/pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", size = 83537, upload-time = "2023-10-25T21:06:24.17Z" }, + { url = "https://files.pythonhosted.org/packages/80/f1/338d0050b24c3132bcfc79b68c3a5f54bce3d213ecef74d37e988b971d8a/pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", size = 122615, upload-time = "2023-10-25T21:06:25.815Z" }, + { url = "https://files.pythonhosted.org/packages/07/3a/e56d6431b713518094fae6ff833a04a6f49ad0fbe25fb7c0dc7408e19d20/pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", size = 122335, upload-time = "2023-10-25T21:06:28.631Z" }, + { url = "https://files.pythonhosted.org/packages/4a/bb/5f40a4d5e985a43b43f607250e766cdec28904682c3505eb0bd343a4b7db/pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", size = 118510, upload-time = "2023-10-25T21:06:30.718Z" }, + { url = "https://files.pythonhosted.org/packages/1c/13/e6a22f40f5800af116c02c28e29f15c06aa41cb2036f6a64ab124647f28b/pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", size = 60865, upload-time = "2023-10-25T21:06:32.742Z" }, + { url = "https://files.pythonhosted.org/packages/75/ef/2fa3b55023ec07c22682c957808f9a41836da4cd006b5f55ec76bf0fbfa6/pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", size = 63239, upload-time = "2023-10-25T21:06:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/23/88/0acd180010aaed4987c85700b7cc17f9505f3edb4e5873e4dc67f613e338/pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", size = 58106, upload-time = "2023-10-25T21:06:54.387Z" }, +] + +[[package]] +name = "pysam" +version = "0.23.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2b/1cf19890a0e4c73ad2672ce7eb485606c4bd2846eef2d892c078ab193c92/pysam-0.23.3.tar.gz", hash = "sha256:9ebcb1f004b296fd139b103ec6fd7e415e80f89f194eb7d0d972ac6d11bbaf24", size = 4974405, upload-time = "2025-06-10T11:19:54.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/59/74eccdbb18a26a49d99b9cef50e3630b76b1c430756e6f04891d12f4d43f/pysam-0.23.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cb4c9c4eb245d643b60c7ec750d5554ebf17c6c9646f4f54439f94a3b3de15de", size = 8667888, upload-time = "2025-06-10T11:19:11.209Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/ae4e639c9187bfd60f3110d9166bf079044e091011f400173bebf2740eae/pysam-0.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3449070e0bbe716f9eccd3911d2482476478fbad63f739378d0203f470a446d6", size = 8415426, upload-time = "2025-06-10T11:22:44.903Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f3/e8cd509f5250e0656076cd0f4a6c9e7d2c520e5599272a8519a3d50ca6ba/pysam-0.23.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c6cb7069dcecca3d40bbe4a6d5adea5cafe483c11854892dbabd6e10e5776049", size = 25904314, upload-time = "2025-06-10T11:22:47.215Z" }, + { url = "https://files.pythonhosted.org/packages/7b/98/936efaa190ad843c71ca397addc02e676ea4fb389437e2ca0471ad39efb0/pysam-0.23.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a7e9c835126f94ff57199e2f58e61436e12e84d47077e70aac8aa03531c4cc71", size = 26452466, upload-time = "2025-06-10T11:19:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/ac/dd/432569a859c5820b882fb692628b0df7cc9de1fe61c5eb5b979df31a7720/pysam-0.23.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b249367a4ad100e61afac9156bde6183c6119f2612bbd5d97ebe3153c643aed", size = 25547736, upload-time = "2025-06-10T11:22:49.708Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6b/2a8060a279373eb64c5c77e7a0ef2e5bd0d3adc85623aa228d877038f2a2/pysam-0.23.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a720cc0818aa84aca5ee4ef884fda82367598e77ec0c95d2050f670fb1fd0db5", size = 25865391, upload-time = "2025-06-10T11:19:17.103Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/dd9f94da44463ecfddb7075f1048c044155c725d7d79fde2e7957561a3b0/pysam-0.23.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69f90c0867fe43f04004bcea963f6b2e68b39180afab54bf551f61f43856638b", size = 6177042, upload-time = "2025-06-10T11:19:19.517Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e9/686e711a559a02e4c3ba0bc78cf031d9ddb525e9f0b2984d1b66536ba94a/pysam-0.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2310d72bfae7a0980d414156267e25b57aa221a768c11c087f3f7d00ceb9fed4", size = 8398187, upload-time = "2025-06-10T11:22:52.284Z" }, + { url = "https://files.pythonhosted.org/packages/8a/82/fca396e13969d1020956b02e567e0d357be0af0f3aebc2b4d97bed780a6d/pysam-0.23.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:b2e45983efea190d374fcda0b6e0c835d6e9e474e02694729f3b3a14d680fa62", size = 23343831, upload-time = "2025-06-10T11:22:54.594Z" }, + { url = "https://files.pythonhosted.org/packages/df/a6/c100df6c8118b4ce1f9c086bb9cf5bccd4f71d05ceb2ecf474f3b0ea87b8/pysam-0.23.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4099393fc5097b5081c7efaf46b0109e4f0a8ed18f86d497219a8bf739c73992", size = 24021198, upload-time = "2025-06-10T11:19:21.379Z" }, + { url = "https://files.pythonhosted.org/packages/f1/92/32e1b13f30f16fe2c948f9b9e04c6e7698beaa539ea1a2bcddc51ed6c9b7/pysam-0.23.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4f04b9aa9b23d767fe36652eacb8370791e3b56816a7e50553d52c65ccdce77f", size = 22925815, upload-time = "2025-06-10T11:22:56.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7d/ccfaa2d6f9f07b357696b07883d5c5471f980938c2293324631425d95523/pysam-0.23.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:701843e5dc67c8eb217c3265039c699a5f83cce64fbc4225268141796e972353", size = 23351352, upload-time = "2025-06-10T11:19:24.207Z" }, + { url = "https://files.pythonhosted.org/packages/88/87/55cabf614bcc96f4a548ab4cf5fe465dd562d193f4f4cd5246cc0a1a18ab/pysam-0.23.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d3177c5b3e102bde297f86e079d23fa385ac88f16c4252502079ef368056d55", size = 8660576, upload-time = "2025-06-10T11:19:26.918Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2f/4708f52028610af96fa82e3ef46bcf96a35f1bd3c38aa6f015b31b578fff/pysam-0.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b6f6891684213e89ee679c5ac786b4e845e7d39d24f6ea0e4d8ed8be9c34f48", size = 8420107, upload-time = "2025-06-10T11:22:59.325Z" }, + { url = "https://files.pythonhosted.org/packages/d9/35/e65f76cfa17d680017bbb61f2a2b3ad34169de5c3747ed4273c194ad13b3/pysam-0.23.3-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:735b938b809f0dc19a389cf3cee04fe7a451e21e2b20d3e45fa6bc23016ae21d", size = 26547806, upload-time = "2025-06-10T11:23:02.083Z" }, + { url = "https://files.pythonhosted.org/packages/3f/60/2c8574f13f5a9c07cc14f5b48f70591fcd1ccb50dd59ad9784d48ed31db4/pysam-0.23.3-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:b721ae4c9118e0c27e1500be278c3b62022c886eeb913ecabc0463fdf98da38f", size = 27262067, upload-time = "2025-06-10T11:19:29.222Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ef/6ca22f37b3c771f5df38a533d8276dabaacc89a034341a0ec33b7ec21d5e/pysam-0.23.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:915bd2883eed08b16a41964a33923818e67166ca69a51086598d27287df6bb4f", size = 26036767, upload-time = "2025-06-10T11:23:04.839Z" }, + { url = "https://files.pythonhosted.org/packages/99/a4/d52ac0f89fa90ab98998e5c0640963f3f4c1e9703fd4dd0aaa4facaea187/pysam-0.23.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b80f1092ba290b738d6ed230cc58cc75ca815fda441afe76cb4c25639aec7ee7", size = 26477588, upload-time = "2025-06-10T11:19:31.96Z" }, +] + +[[package]] +name = "pyspark" +version = "3.5.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "py4j" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/65/2764b1840aa6ea5f7e668a36702c3128ac54d0b861d3d57669b2453469a6/pyspark-3.5.7.tar.gz", hash = "sha256:80e36514e0c5c126d35a26adf4f405cd4a69de96a8ea8a3c1e9a65fce2fb4eaa", size = 317370347, upload-time = "2025-09-23T19:46:10.326Z" } + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "pytest-django" +version = "4.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/f6/3851312120c2bf2f19cafff931e75059aad1ba670703cd751e2fde9bc942/pytest_django-4.14.0.tar.gz", hash = "sha256:26787dd3f422cfbab8f55b80a776e2edea7a11092cb74e960bef1312515708ef", size = 94700, upload-time = "2026-08-10T14:13:08.319Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/03/850bffad2b581c440ca51c039d74504d5a422c94bda0bdb8a8ba5068d48b/pytest_django-4.14.0-py3-none-any.whl", hash = "sha256:c533b08d89cc675efcd5398eea270b34547e35f9a3608e2c9748dd88428ea187", size = 27067, upload-time = "2026-08-10T14:13:06.998Z" }, +] + +[[package]] +name = "python-daemon" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lockfile" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/37/4f10e37bdabc058a32989da2daf29e57dc59dbc5395497f3d36d5f5e2694/python_daemon-3.1.2.tar.gz", hash = "sha256:f7b04335adc473de877f5117e26d5f1142f4c9f7cd765408f0877757be5afbf4", size = 71576, upload-time = "2024-12-03T08:41:07.843Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/3c/b88167e2d6785c0e781ee5d498b07472aeb9b6765da3b19e7cc9e0813841/python_daemon-3.1.2-py3-none-any.whl", hash = "sha256:b906833cef63502994ad48e2eab213259ed9bb18d54fa8774dcba2ff7864cec6", size = 30872, upload-time = "2024-12-03T08:41:03.322Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/da/95963cebfc578dabd323d7263958dfb68898617912bb09327dd30e9c8d13/python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c", size = 10508, upload-time = "2023-02-21T17:40:06.209Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/a6/145655273568ee78a581e734cf35beb9e33a370b29c5d3c8fee3744de29f/python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd", size = 8067, upload-time = "2023-02-21T17:40:05.117Z" }, +] + +[[package]] +name = "python-jsonschema-objects" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "inflection" }, + { name = "jsonschema" }, + { name = "markdown" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/2d/e76f262a047b425062a3fa57d4163995d74c866ef999584ed1c367a70c80/python_jsonschema_objects-0.4.6.tar.gz", hash = "sha256:7d4405d7346362d18be61058fde20b7b3d9c1dbb1104904d2e907d14de6a34b2", size = 67994, upload-time = "2023-09-15T14:24:03.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/f3/315deda6c45e7ce44407df0d71b6ff6c25ab92de12d54462c905a7423736/python_jsonschema_objects-0.4.6-py2.py3-none-any.whl", hash = "sha256:918ab5dd413499cba2441c7bfe8ae07d2f159aa8199aa09345287677a57b3fb6", size = 28241, upload-time = "2023-09-15T14:24:01.735Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "pyzmq" +version = "24.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, + { name = "py", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/0d/b06cf99a64d4187632f4ac9ddf6be99cd35de06fe72d75140496a8e0eef5/pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77", size = 1219822, upload-time = "2022-09-21T11:39:01.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/49/6d80a45d8ff25a7e30752c49a4a73a0642341b2364aa993473b5a0f4e003/pyzmq-24.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00", size = 1831224, upload-time = "2022-09-21T11:54:29.963Z" }, + { url = "https://files.pythonhosted.org/packages/93/03/edb302ae50adfbed34570c8d3c251fe71c57f9d42a4fc086152f1a390415/pyzmq-24.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc", size = 1246012, upload-time = "2022-09-21T12:06:04.014Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5e/d6966d962f9dfe8c98fd1b182e63cc5379c89a586fc83387bece3eeef5e0/pyzmq-24.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef", size = 881633, upload-time = "2022-09-21T12:49:28.635Z" }, + { url = "https://files.pythonhosted.org/packages/8e/3e/f27100244e96d78c9cfafa1cb457be760f756abd700ac6790f97a6eef271/pyzmq-24.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3", size = 1132176, upload-time = "2022-09-21T11:48:44.899Z" }, + { url = "https://files.pythonhosted.org/packages/52/c5/ca38e710e645de5bec3425706d37be6fb9c977f604d81526276b2418c08b/pyzmq-24.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace", size = 1077166, upload-time = "2022-09-21T11:51:42.675Z" }, + { url = "https://files.pythonhosted.org/packages/47/68/3d75e48e898034e878ba99729715f4e92c6b82d2f36fe5c033c60c7ac9b0/pyzmq-24.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff", size = 1408881, upload-time = "2022-09-21T12:49:55.14Z" }, + { url = "https://files.pythonhosted.org/packages/a8/bc/1d5ffcba5f33ddb321645add42f76bfdb66e529797cad05c551186a81362/pyzmq-24.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8", size = 1739207, upload-time = "2022-09-21T11:50:43.651Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e1/6441995e97a3fdd7cb9c85791d95a4f902b328fe5ef295f9fb3b039facdf/pyzmq-24.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1", size = 1628197, upload-time = "2022-09-21T11:50:45.059Z" }, + { url = "https://files.pythonhosted.org/packages/37/bc/b06363931ea30e29d96b108f711e77740f9d599f6494604c544e9169fe98/pyzmq-24.0.1-cp311-cp311-win32.whl", hash = "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2", size = 889207, upload-time = "2022-09-21T11:47:09.482Z" }, + { url = "https://files.pythonhosted.org/packages/be/23/0a0534008de7b1e12e17077a465626405a53c5d66f2e6af2c8da0d9c5471/pyzmq-24.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8", size = 990257, upload-time = "2022-09-21T11:50:53.684Z" }, +] + +[[package]] +name = "qtconsole" +version = "5.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "qtpy" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/83/d2b11f2f737c276d8650a04ad3bf478d10fbcd55fe39f129cdb9e6843d31/qtconsole-5.6.1.tar.gz", hash = "sha256:5cad1c7e6c75d3ef8143857fd2ed28062b4b92b933c2cc328252d18a9cfd0be5", size = 435808, upload-time = "2024-10-28T23:59:26.449Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/8a/635610fb6131bc702229e2780d7b042416866ab78f8ed1ff24c4b23a2f4c/qtconsole-5.6.1-py3-none-any.whl", hash = "sha256:3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950", size = 125035, upload-time = "2024-10-28T23:59:24.191Z" }, +] + +[[package]] +name = "qtpy" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/01/392eba83c8e47b946b929d7c46e0f04b35e9671f8bb6fc36b6f7945b4de8/qtpy-2.4.3.tar.gz", hash = "sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb", size = 66982, upload-time = "2025-02-11T15:09:25.759Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl", hash = "sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1", size = 95045, upload-time = "2025-02-11T15:09:24.162Z" }, +] + +[[package]] +name = "regex" +version = "2025.11.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/a9/546676f25e573a4cf00fe8e119b78a37b6a8fe2dc95cda877b30889c9c45/regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01", size = 414669, upload-time = "2025-11-03T21:34:22.089Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/90/4fb5056e5f03a7048abd2b11f598d464f0c167de4f2a51aa868c376b8c70/regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031", size = 488081, upload-time = "2025-11-03T21:31:11.946Z" }, + { url = "https://files.pythonhosted.org/packages/85/23/63e481293fac8b069d84fba0299b6666df720d875110efd0338406b5d360/regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4", size = 290554, upload-time = "2025-11-03T21:31:13.387Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9d/b101d0262ea293a0066b4522dfb722eb6a8785a8c3e084396a5f2c431a46/regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50", size = 288407, upload-time = "2025-11-03T21:31:14.809Z" }, + { url = "https://files.pythonhosted.org/packages/0c/64/79241c8209d5b7e00577ec9dca35cd493cc6be35b7d147eda367d6179f6d/regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f", size = 793418, upload-time = "2025-11-03T21:31:16.556Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e2/23cd5d3573901ce8f9757c92ca4db4d09600b865919b6d3e7f69f03b1afd/regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118", size = 860448, upload-time = "2025-11-03T21:31:18.12Z" }, + { url = "https://files.pythonhosted.org/packages/2a/4c/aecf31beeaa416d0ae4ecb852148d38db35391aac19c687b5d56aedf3a8b/regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2", size = 907139, upload-time = "2025-11-03T21:31:20.753Z" }, + { url = "https://files.pythonhosted.org/packages/61/22/b8cb00df7d2b5e0875f60628594d44dba283e951b1ae17c12f99e332cc0a/regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e", size = 800439, upload-time = "2025-11-03T21:31:22.069Z" }, + { url = "https://files.pythonhosted.org/packages/02/a8/c4b20330a5cdc7a8eb265f9ce593f389a6a88a0c5f280cf4d978f33966bc/regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0", size = 782965, upload-time = "2025-11-03T21:31:23.598Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4c/ae3e52988ae74af4b04d2af32fee4e8077f26e51b62ec2d12d246876bea2/regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58", size = 854398, upload-time = "2025-11-03T21:31:25.008Z" }, + { url = "https://files.pythonhosted.org/packages/06/d1/a8b9cf45874eda14b2e275157ce3b304c87e10fb38d9fc26a6e14eb18227/regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab", size = 845897, upload-time = "2025-11-03T21:31:26.427Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fe/1830eb0236be93d9b145e0bd8ab499f31602fe0999b1f19e99955aa8fe20/regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e", size = 788906, upload-time = "2025-11-03T21:31:28.078Z" }, + { url = "https://files.pythonhosted.org/packages/66/47/dc2577c1f95f188c1e13e2e69d8825a5ac582ac709942f8a03af42ed6e93/regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf", size = 265812, upload-time = "2025-11-03T21:31:29.72Z" }, + { url = "https://files.pythonhosted.org/packages/50/1e/15f08b2f82a9bbb510621ec9042547b54d11e83cb620643ebb54e4eb7d71/regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a", size = 277737, upload-time = "2025-11-03T21:31:31.422Z" }, + { url = "https://files.pythonhosted.org/packages/f4/fc/6500eb39f5f76c5e47a398df82e6b535a5e345f839581012a418b16f9cc3/regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc", size = 270290, upload-time = "2025-11-03T21:31:33.041Z" }, + { url = "https://files.pythonhosted.org/packages/e8/74/18f04cb53e58e3fb107439699bd8375cf5a835eec81084e0bddbd122e4c2/regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41", size = 489312, upload-time = "2025-11-03T21:31:34.343Z" }, + { url = "https://files.pythonhosted.org/packages/78/3f/37fcdd0d2b1e78909108a876580485ea37c91e1acf66d3bb8e736348f441/regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36", size = 291256, upload-time = "2025-11-03T21:31:35.675Z" }, + { url = "https://files.pythonhosted.org/packages/bf/26/0a575f58eb23b7ebd67a45fccbc02ac030b737b896b7e7a909ffe43ffd6a/regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1", size = 288921, upload-time = "2025-11-03T21:31:37.07Z" }, + { url = "https://files.pythonhosted.org/packages/ea/98/6a8dff667d1af907150432cf5abc05a17ccd32c72a3615410d5365ac167a/regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7", size = 798568, upload-time = "2025-11-03T21:31:38.784Z" }, + { url = "https://files.pythonhosted.org/packages/64/15/92c1db4fa4e12733dd5a526c2dd2b6edcbfe13257e135fc0f6c57f34c173/regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69", size = 864165, upload-time = "2025-11-03T21:31:40.559Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e7/3ad7da8cdee1ce66c7cd37ab5ab05c463a86ffeb52b1a25fe7bd9293b36c/regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48", size = 912182, upload-time = "2025-11-03T21:31:42.002Z" }, + { url = "https://files.pythonhosted.org/packages/84/bd/9ce9f629fcb714ffc2c3faf62b6766ecb7a585e1e885eb699bcf130a5209/regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c", size = 803501, upload-time = "2025-11-03T21:31:43.815Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0f/8dc2e4349d8e877283e6edd6c12bdcebc20f03744e86f197ab6e4492bf08/regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695", size = 787842, upload-time = "2025-11-03T21:31:45.353Z" }, + { url = "https://files.pythonhosted.org/packages/f9/73/cff02702960bc185164d5619c0c62a2f598a6abff6695d391b096237d4ab/regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98", size = 858519, upload-time = "2025-11-03T21:31:46.814Z" }, + { url = "https://files.pythonhosted.org/packages/61/83/0e8d1ae71e15bc1dc36231c90b46ee35f9d52fab2e226b0e039e7ea9c10a/regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74", size = 850611, upload-time = "2025-11-03T21:31:48.289Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f5/70a5cdd781dcfaa12556f2955bf170cd603cb1c96a1827479f8faea2df97/regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0", size = 789759, upload-time = "2025-11-03T21:31:49.759Z" }, + { url = "https://files.pythonhosted.org/packages/59/9b/7c29be7903c318488983e7d97abcf8ebd3830e4c956c4c540005fcfb0462/regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204", size = 266194, upload-time = "2025-11-03T21:31:51.53Z" }, + { url = "https://files.pythonhosted.org/packages/1a/67/3b92df89f179d7c367be654ab5626ae311cb28f7d5c237b6bb976cd5fbbb/regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9", size = 277069, upload-time = "2025-11-03T21:31:53.151Z" }, + { url = "https://files.pythonhosted.org/packages/d7/55/85ba4c066fe5094d35b249c3ce8df0ba623cfd35afb22d6764f23a52a1c5/regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26", size = 270330, upload-time = "2025-11-03T21:31:54.514Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a7/dda24ebd49da46a197436ad96378f17df30ceb40e52e859fc42cac45b850/regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4", size = 489081, upload-time = "2025-11-03T21:31:55.9Z" }, + { url = "https://files.pythonhosted.org/packages/19/22/af2dc751aacf88089836aa088a1a11c4f21a04707eb1b0478e8e8fb32847/regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76", size = 291123, upload-time = "2025-11-03T21:31:57.758Z" }, + { url = "https://files.pythonhosted.org/packages/a3/88/1a3ea5672f4b0a84802ee9891b86743438e7c04eb0b8f8c4e16a42375327/regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a", size = 288814, upload-time = "2025-11-03T21:32:01.12Z" }, + { url = "https://files.pythonhosted.org/packages/fb/8c/f5987895bf42b8ddeea1b315c9fedcfe07cadee28b9c98cf50d00adcb14d/regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361", size = 798592, upload-time = "2025-11-03T21:32:03.006Z" }, + { url = "https://files.pythonhosted.org/packages/99/2a/6591ebeede78203fa77ee46a1c36649e02df9eaa77a033d1ccdf2fcd5d4e/regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160", size = 864122, upload-time = "2025-11-03T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/94/d6/be32a87cf28cf8ed064ff281cfbd49aefd90242a83e4b08b5a86b38e8eb4/regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe", size = 912272, upload-time = "2025-11-03T21:32:06.148Z" }, + { url = "https://files.pythonhosted.org/packages/62/11/9bcef2d1445665b180ac7f230406ad80671f0fc2a6ffb93493b5dd8cd64c/regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850", size = 803497, upload-time = "2025-11-03T21:32:08.162Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a7/da0dc273d57f560399aa16d8a68ae7f9b57679476fc7ace46501d455fe84/regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc", size = 787892, upload-time = "2025-11-03T21:32:09.769Z" }, + { url = "https://files.pythonhosted.org/packages/da/4b/732a0c5a9736a0b8d6d720d4945a2f1e6f38f87f48f3173559f53e8d5d82/regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9", size = 858462, upload-time = "2025-11-03T21:32:11.769Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f5/a2a03df27dc4c2d0c769220f5110ba8c4084b0bfa9ab0f9b4fcfa3d2b0fc/regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b", size = 850528, upload-time = "2025-11-03T21:32:13.906Z" }, + { url = "https://files.pythonhosted.org/packages/d6/09/e1cd5bee3841c7f6eb37d95ca91cdee7100b8f88b81e41c2ef426910891a/regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7", size = 789866, upload-time = "2025-11-03T21:32:15.748Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/702f5ea74e2a9c13d855a6a85b7f80c30f9e72a95493260193c07f3f8d74/regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c", size = 266189, upload-time = "2025-11-03T21:32:17.493Z" }, + { url = "https://files.pythonhosted.org/packages/8b/00/6e29bb314e271a743170e53649db0fdb8e8ff0b64b4f425f5602f4eb9014/regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5", size = 277054, upload-time = "2025-11-03T21:32:19.042Z" }, + { url = "https://files.pythonhosted.org/packages/25/f1/b156ff9f2ec9ac441710764dda95e4edaf5f36aca48246d1eea3f1fd96ec/regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467", size = 270325, upload-time = "2025-11-03T21:32:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/20/28/fd0c63357caefe5680b8ea052131acbd7f456893b69cc2a90cc3e0dc90d4/regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281", size = 491984, upload-time = "2025-11-03T21:32:23.466Z" }, + { url = "https://files.pythonhosted.org/packages/df/ec/7014c15626ab46b902b3bcc4b28a7bae46d8f281fc7ea9c95e22fcaaa917/regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39", size = 292673, upload-time = "2025-11-03T21:32:25.034Z" }, + { url = "https://files.pythonhosted.org/packages/23/ab/3b952ff7239f20d05f1f99e9e20188513905f218c81d52fb5e78d2bf7634/regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7", size = 291029, upload-time = "2025-11-03T21:32:26.528Z" }, + { url = "https://files.pythonhosted.org/packages/21/7e/3dc2749fc684f455f162dcafb8a187b559e2614f3826877d3844a131f37b/regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed", size = 807437, upload-time = "2025-11-03T21:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/1b/0b/d529a85ab349c6a25d1ca783235b6e3eedf187247eab536797021f7126c6/regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19", size = 873368, upload-time = "2025-11-03T21:32:30.4Z" }, + { url = "https://files.pythonhosted.org/packages/7d/18/2d868155f8c9e3e9d8f9e10c64e9a9f496bb8f7e037a88a8bed26b435af6/regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b", size = 914921, upload-time = "2025-11-03T21:32:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/2d/71/9d72ff0f354fa783fe2ba913c8734c3b433b86406117a8db4ea2bf1c7a2f/regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a", size = 812708, upload-time = "2025-11-03T21:32:34.305Z" }, + { url = "https://files.pythonhosted.org/packages/e7/19/ce4bf7f5575c97f82b6e804ffb5c4e940c62609ab2a0d9538d47a7fdf7d4/regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6", size = 795472, upload-time = "2025-11-03T21:32:36.364Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/fd1063a176ffb7b2315f9a1b08d17b18118b28d9df163132615b835a26ee/regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce", size = 868341, upload-time = "2025-11-03T21:32:38.042Z" }, + { url = "https://files.pythonhosted.org/packages/12/43/103fb2e9811205e7386366501bc866a164a0430c79dd59eac886a2822950/regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd", size = 854666, upload-time = "2025-11-03T21:32:40.079Z" }, + { url = "https://files.pythonhosted.org/packages/7d/22/e392e53f3869b75804762c7c848bd2dd2abf2b70fb0e526f58724638bd35/regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2", size = 799473, upload-time = "2025-11-03T21:32:42.148Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f9/8bd6b656592f925b6845fcbb4d57603a3ac2fb2373344ffa1ed70aa6820a/regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a", size = 268792, upload-time = "2025-11-03T21:32:44.13Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/0e7d603467775ff65cd2aeabf1b5b50cc1c3708556a8b849a2fa4dd1542b/regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c", size = 280214, upload-time = "2025-11-03T21:32:45.853Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d0/2afc6f8e94e2b64bfb738a7c2b6387ac1699f09f032d363ed9447fd2bb57/regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e", size = 271469, upload-time = "2025-11-03T21:32:48.026Z" }, + { url = "https://files.pythonhosted.org/packages/31/e9/f6e13de7e0983837f7b6d238ad9458800a874bf37c264f7923e63409944c/regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6", size = 489089, upload-time = "2025-11-03T21:32:50.027Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5c/261f4a262f1fa65141c1b74b255988bd2fa020cc599e53b080667d591cfc/regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4", size = 291059, upload-time = "2025-11-03T21:32:51.682Z" }, + { url = "https://files.pythonhosted.org/packages/8e/57/f14eeb7f072b0e9a5a090d1712741fd8f214ec193dba773cf5410108bb7d/regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73", size = 288900, upload-time = "2025-11-03T21:32:53.569Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6b/1d650c45e99a9b327586739d926a1cd4e94666b1bd4af90428b36af66dc7/regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f", size = 799010, upload-time = "2025-11-03T21:32:55.222Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/d66dcbc6b628ce4e3f7f0cbbb84603aa2fc0ffc878babc857726b8aab2e9/regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d", size = 864893, upload-time = "2025-11-03T21:32:57.239Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2d/f238229f1caba7ac87a6c4153d79947fb0261415827ae0f77c304260c7d3/regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be", size = 911522, upload-time = "2025-11-03T21:32:59.274Z" }, + { url = "https://files.pythonhosted.org/packages/bd/3d/22a4eaba214a917c80e04f6025d26143690f0419511e0116508e24b11c9b/regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db", size = 803272, upload-time = "2025-11-03T21:33:01.393Z" }, + { url = "https://files.pythonhosted.org/packages/84/b1/03188f634a409353a84b5ef49754b97dbcc0c0f6fd6c8ede505a8960a0a4/regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62", size = 787958, upload-time = "2025-11-03T21:33:03.379Z" }, + { url = "https://files.pythonhosted.org/packages/99/6a/27d072f7fbf6fadd59c64d210305e1ff865cc3b78b526fd147db768c553b/regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f", size = 859289, upload-time = "2025-11-03T21:33:05.374Z" }, + { url = "https://files.pythonhosted.org/packages/9a/70/1b3878f648e0b6abe023172dacb02157e685564853cc363d9961bcccde4e/regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02", size = 850026, upload-time = "2025-11-03T21:33:07.131Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d5/68e25559b526b8baab8e66839304ede68ff6727237a47727d240006bd0ff/regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed", size = 789499, upload-time = "2025-11-03T21:33:09.141Z" }, + { url = "https://files.pythonhosted.org/packages/fc/df/43971264857140a350910d4e33df725e8c94dd9dee8d2e4729fa0d63d49e/regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4", size = 271604, upload-time = "2025-11-03T21:33:10.9Z" }, + { url = "https://files.pythonhosted.org/packages/01/6f/9711b57dc6894a55faf80a4c1b5aa4f8649805cb9c7aef46f7d27e2b9206/regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad", size = 280320, upload-time = "2025-11-03T21:33:12.572Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/f6eaa207d4377481f5e1775cdeb5a443b5a59b392d0065f3417d31d80f87/regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f", size = 273372, upload-time = "2025-11-03T21:33:14.219Z" }, + { url = "https://files.pythonhosted.org/packages/c3/06/49b198550ee0f5e4184271cee87ba4dfd9692c91ec55289e6282f0f86ccf/regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc", size = 491985, upload-time = "2025-11-03T21:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/ce/bf/abdafade008f0b1c9da10d934034cb670432d6cf6cbe38bbb53a1cfd6cf8/regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49", size = 292669, upload-time = "2025-11-03T21:33:18.32Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ef/0c357bb8edbd2ad8e273fcb9e1761bc37b8acbc6e1be050bebd6475f19c1/regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536", size = 291030, upload-time = "2025-11-03T21:33:20.048Z" }, + { url = "https://files.pythonhosted.org/packages/79/06/edbb67257596649b8fb088d6aeacbcb248ac195714b18a65e018bf4c0b50/regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95", size = 807674, upload-time = "2025-11-03T21:33:21.797Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d9/ad4deccfce0ea336296bd087f1a191543bb99ee1c53093dcd4c64d951d00/regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009", size = 873451, upload-time = "2025-11-03T21:33:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/13/75/a55a4724c56ef13e3e04acaab29df26582f6978c000ac9cd6810ad1f341f/regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9", size = 914980, upload-time = "2025-11-03T21:33:25.999Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/a1657ee15bd9116f70d4a530c736983eed997b361e20ecd8f5ca3759d5c5/regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d", size = 812852, upload-time = "2025-11-03T21:33:27.852Z" }, + { url = "https://files.pythonhosted.org/packages/b8/6f/f7516dde5506a588a561d296b2d0044839de06035bb486b326065b4c101e/regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6", size = 795566, upload-time = "2025-11-03T21:33:32.364Z" }, + { url = "https://files.pythonhosted.org/packages/d9/dd/3d10b9e170cc16fb34cb2cef91513cf3df65f440b3366030631b2984a264/regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154", size = 868463, upload-time = "2025-11-03T21:33:34.459Z" }, + { url = "https://files.pythonhosted.org/packages/f5/8e/935e6beff1695aa9085ff83195daccd72acc82c81793df480f34569330de/regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267", size = 854694, upload-time = "2025-11-03T21:33:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/92/12/10650181a040978b2f5720a6a74d44f841371a3d984c2083fc1752e4acf6/regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379", size = 799691, upload-time = "2025-11-03T21:33:39.079Z" }, + { url = "https://files.pythonhosted.org/packages/67/90/8f37138181c9a7690e7e4cb388debbd389342db3c7381d636d2875940752/regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38", size = 274583, upload-time = "2025-11-03T21:33:41.302Z" }, + { url = "https://files.pythonhosted.org/packages/8f/cd/867f5ec442d56beb56f5f854f40abcfc75e11d10b11fdb1869dd39c63aaf/regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de", size = 284286, upload-time = "2025-11-03T21:33:43.324Z" }, + { url = "https://files.pythonhosted.org/packages/20/31/32c0c4610cbc070362bf1d2e4ea86d1ea29014d400a6d6c2486fcfd57766/regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801", size = 274741, upload-time = "2025-11-03T21:33:45.557Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-html" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bs4" }, + { name = "fake-useragent" }, + { name = "parse" }, + { name = "pyppeteer" }, + { name = "pyquery" }, + { name = "requests" }, + { name = "w3lib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/76/27a8fd44f43d265af17e75be753b6ebf67c93b1d4dc7cf6eb6ea2d03a13c/requests-html-0.10.0.tar.gz", hash = "sha256:7e929ecfed95fb1d0994bb368295d6d7c4d06b03fcb900c33d7d0b17e6003947", size = 17292, upload-time = "2019-02-17T20:14:19.486Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/bc/a4380f09bab3a776182578ce6b2771e57259d0d4dbce178205779abdc347/requests_html-0.10.0-py3-none-any.whl", hash = "sha256:cb8a78cf829c4eca9d6233f28524f65dd2bfaafb4bdbbc407f0a0b8f487df6e2", size = 13388, upload-time = "2019-02-17T20:14:17.541Z" }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, +] + +[[package]] +name = "responses" +version = "0.25.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/95/89c054ad70bfef6da605338b009b2e283485835351a9935c7bfbfaca7ffc/responses-0.25.8.tar.gz", hash = "sha256:9374d047a575c8f781b94454db5cab590b6029505f488d12899ddb10a4af1cf4", size = 79320, upload-time = "2025-08-08T19:01:46.709Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/4c/cc276ce57e572c102d9542d383b2cfd551276581dc60004cb94fe8774c11/responses-0.25.8-py3-none-any.whl", hash = "sha256:0c710af92def29c8352ceadff0c3fe340ace27cf5af1bbe46fb71275bcd2831c", size = 34769, upload-time = "2025-08-08T19:01:45.018Z" }, +] + +[[package]] +name = "rich" +version = "12.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "commonmark" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/23/814edf09ec6470d52022b9e95c23c1bef77f0bc451761e1504ebd09606d3/rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0", size = 220114, upload-time = "2022-10-02T16:27:00.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/60/81ac2e7d1e3b861ab478a72e3b20fc91c4302acd2274822e493758941829/rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e", size = 237505, upload-time = "2022-10-02T16:26:58.086Z" }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, +] + +[[package]] +name = "ruff" +version = "0.11.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/93/f51326459536f64876c932ed26c54fad11775dfda9a690966a8a8a3388d2/ruff-0.11.3.tar.gz", hash = "sha256:8d5fcdb3bb359adc12b757ed832ee743993e7474b9de714bb9ea13c4a8458bf9", size = 3902954, upload-time = "2025-04-03T13:19:59.916Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/54/34341a6363405eea37d05d0062d3f4bff4b268b08e8f4f36fb6f4593b653/ruff-0.11.3-py3-none-linux_armv6l.whl", hash = "sha256:cb893a5eedff45071d52565300a20cd4ac088869e156b25e0971cb98c06f5dd7", size = 10097109, upload-time = "2025-04-03T13:19:18.616Z" }, + { url = "https://files.pythonhosted.org/packages/ee/33/636511dcacae6710660aa1d746c98f1b63d969b5b04fb4dcaf9a3b068a3f/ruff-0.11.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:58edd48af0e201e2f494789de80f5b2f2b46c9a2991a12ea031254865d5f6aa3", size = 10896580, upload-time = "2025-04-03T13:19:22.123Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d0/b196c659fa4c9bea394833fcf1e9ff92a941d59474374e3cbda0ba548d2b/ruff-0.11.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:520f6ade25cea98b2e5cb29eb0906f6a0339c6b8e28a024583b867f48295f1ed", size = 10235125, upload-time = "2025-04-03T13:19:24.251Z" }, + { url = "https://files.pythonhosted.org/packages/31/27/8010ce0b5dae8ad994635c2b112df76f10e9747802ac417a68a06349971f/ruff-0.11.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ca4405a93ebbc05e924358f872efceb1498c3d52a989ddf9476712a5480b16", size = 10398941, upload-time = "2025-04-03T13:19:26.308Z" }, + { url = "https://files.pythonhosted.org/packages/ed/82/0e6eba1371cc221d5a7255a144dc5ab05f13d2aba46224f38b6628781647/ruff-0.11.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4341d38775a6be605ce7cd50e951b89de65cbd40acb0399f95b8e1524d604c8", size = 9946629, upload-time = "2025-04-03T13:19:28.411Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9d/8c03b84476187d48eae3ba5f3b7d550da9b5947ab967d47f832e6141c1b2/ruff-0.11.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72bf5b49e4b546f4bea6c05448ab71919b09cf75363adf5e3bf5276124afd31c", size = 11551896, upload-time = "2025-04-03T13:19:30.868Z" }, + { url = "https://files.pythonhosted.org/packages/a8/63/cf7915adf71d72ccc95b24f9ea3637311f8efe8221a24400d823607e998a/ruff-0.11.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9fa791ee6c3629ba7f9ba2c8f2e76178b03f3eaefb920e426302115259819237", size = 12210030, upload-time = "2025-04-03T13:19:33.027Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b3/2bbfd8aee10de3eed807c9c3d5b48f927efbdada8c0e87a20073f1eb2537/ruff-0.11.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c81d3fe718f4d303aaa4ccdcd0f43e23bb2127da3353635f718394ca9b26721", size = 11643431, upload-time = "2025-04-03T13:19:35.32Z" }, + { url = "https://files.pythonhosted.org/packages/5b/00/0343bec91e505be5f6ac1db13ffca0afe691789e1dc263a05a72b931570f/ruff-0.11.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4c38e9b6c01caaba46b6d8e732791f4c78389a9923319991d55b298017ce02", size = 13834449, upload-time = "2025-04-03T13:19:37.929Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d1/95ef70afe169400d1878e69ed4fa8b8361e3c5d0a25d2d3d5c25e6347590/ruff-0.11.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9686f5d1a2b4c918b5a6e9876bfe7f47498a990076624d41f57d17aadd02a4dd", size = 11356995, upload-time = "2025-04-03T13:19:40.246Z" }, + { url = "https://files.pythonhosted.org/packages/92/fa/a1d68e12c9a2cb25bf8eef099381ca42ea3c8ed589fc4f04004466f4d19f/ruff-0.11.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4800ddc4764d42d8961ce4cb972bcf5cc2730d11cca3f11f240d9f7360460408", size = 10287108, upload-time = "2025-04-03T13:19:42.392Z" }, + { url = "https://files.pythonhosted.org/packages/3c/31/711a3f2c0972f44e3770951a19a1b6ea551b9b7c08f257518c35a46666bd/ruff-0.11.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e63a2808879361aa9597d88d86380d8fb934953ef91f5ff3dafe18d9cb0b1e14", size = 9933317, upload-time = "2025-04-03T13:19:45.053Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/8c8dd6ec903f29a4bd1bd4510d1c9ba1a955cd792601ac3822764c7397d8/ruff-0.11.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8f8b1c4ae62638cc220df440140c21469232d8f2cb7f5059f395f7f48dcdb59e", size = 10966227, upload-time = "2025-04-03T13:19:47.284Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7c/ba479eb45803165dd3dc8accf32c7d52769f9011df958f983f2bcd40566f/ruff-0.11.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3ea2026be50f6b1fbedd2d1757d004e1e58bd0f414efa2a6fa01235468d4c82a", size = 11412919, upload-time = "2025-04-03T13:19:49.504Z" }, + { url = "https://files.pythonhosted.org/packages/51/a2/6878e74efef39cb0996342c48918aff9a9f5632d8d40c307610688d382ae/ruff-0.11.3-py3-none-win32.whl", hash = "sha256:73d8b90d12674a0c6e98cd9e235f2dcad09d1a80e559a585eac994bb536917a3", size = 10306265, upload-time = "2025-04-03T13:19:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/95/95/30646e735a201266ec93504a8640190e4a47a9efb10990cb095bf1111c3a/ruff-0.11.3-py3-none-win_amd64.whl", hash = "sha256:faf1bfb0a51fb3a82aa1112cb03658796acef978e37c7f807d3ecc50b52ecbf6", size = 11403990, upload-time = "2025-04-03T13:19:54.643Z" }, + { url = "https://files.pythonhosted.org/packages/cd/2e/d04d606d0b13c2c8188111a4ff9a99811c40fe170e1523e20f13cf85235e/ruff-0.11.3-py3-none-win_arm64.whl", hash = "sha256:67f8b68d7ab909f08af1fb601696925a89d65083ae2bb3ab286e572b5dc456aa", size = 10525855, upload-time = "2025-04-03T13:19:57.103Z" }, +] + +[[package]] +name = "s3transfer" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/74/8d69dcb7a9efe8baa2046891735e5dfe433ad558ae23d9e3c14c633d1d58/s3transfer-0.14.0.tar.gz", hash = "sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125", size = 151547, upload-time = "2025-09-09T19:23:31.089Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/f0/ae7ca09223a81a1d890b2557186ea015f6e0502e9b8cb8e1813f1d8cfa4e/s3transfer-0.14.0-py3-none-any.whl", hash = "sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456", size = 85712, upload-time = "2025-09-09T19:23:30.041Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967, upload-time = "2025-09-09T08:20:32.421Z" }, + { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645, upload-time = "2025-09-09T08:20:34.436Z" }, + { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424, upload-time = "2025-09-09T08:20:36.776Z" }, + { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234, upload-time = "2025-09-09T08:20:38.957Z" }, + { url = "https://files.pythonhosted.org/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", size = 8894244, upload-time = "2025-09-09T08:20:41.166Z" }, + { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, + { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload-time = "2025-09-09T08:20:50.366Z" }, + { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload-time = "2025-09-09T08:20:52.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload-time = "2025-09-09T08:20:54.731Z" }, + { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload-time = "2025-09-09T08:20:57.313Z" }, + { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload-time = "2025-09-09T08:20:59.671Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload-time = "2025-09-09T08:21:01.71Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload-time = "2025-09-09T08:21:04.234Z" }, + { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload-time = "2025-09-09T08:21:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload-time = "2025-09-09T08:21:08.628Z" }, + { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload-time = "2025-09-09T08:21:11.486Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload-time = "2025-09-09T08:21:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload-time = "2025-09-09T08:21:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload-time = "2025-09-09T08:21:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload-time = "2025-09-09T08:21:20.695Z" }, + { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload-time = "2025-09-09T08:21:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload-time = "2025-09-09T08:21:24.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, +] + +[[package]] +name = "scipy" +version = "1.16.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/5f/6f37d7439de1455ce9c5a556b8d1db0979f03a796c030bafdf08d35b7bf9/scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97", size = 36630881, upload-time = "2025-10-28T17:31:47.104Z" }, + { url = "https://files.pythonhosted.org/packages/7c/89/d70e9f628749b7e4db2aa4cd89735502ff3f08f7b9b27d2e799485987cd9/scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511", size = 28941012, upload-time = "2025-10-28T17:31:53.411Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a8/0e7a9a6872a923505dbdf6bb93451edcac120363131c19013044a1e7cb0c/scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005", size = 20931935, upload-time = "2025-10-28T17:31:57.361Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c7/020fb72bd79ad798e4dbe53938543ecb96b3a9ac3fe274b7189e23e27353/scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb", size = 23534466, upload-time = "2025-10-28T17:32:01.875Z" }, + { url = "https://files.pythonhosted.org/packages/be/a0/668c4609ce6dbf2f948e167836ccaf897f95fb63fa231c87da7558a374cd/scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876", size = 33593618, upload-time = "2025-10-28T17:32:06.902Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6e/8942461cf2636cdae083e3eb72622a7fbbfa5cf559c7d13ab250a5dbdc01/scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2", size = 35899798, upload-time = "2025-10-28T17:32:12.665Z" }, + { url = "https://files.pythonhosted.org/packages/79/e8/d0f33590364cdbd67f28ce79368b373889faa4ee959588beddf6daef9abe/scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e", size = 36226154, upload-time = "2025-10-28T17:32:17.961Z" }, + { url = "https://files.pythonhosted.org/packages/39/c1/1903de608c0c924a1749c590064e65810f8046e437aba6be365abc4f7557/scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733", size = 38878540, upload-time = "2025-10-28T17:32:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d0/22ec7036ba0b0a35bccb7f25ab407382ed34af0b111475eb301c16f8a2e5/scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78", size = 38722107, upload-time = "2025-10-28T17:32:29.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/60/8a00e5a524bb3bf8898db1650d350f50e6cffb9d7a491c561dc9826c7515/scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184", size = 25506272, upload-time = "2025-10-28T17:32:34.577Z" }, + { url = "https://files.pythonhosted.org/packages/40/41/5bf55c3f386b1643812f3a5674edf74b26184378ef0f3e7c7a09a7e2ca7f/scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6", size = 36659043, upload-time = "2025-10-28T17:32:40.285Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0f/65582071948cfc45d43e9870bf7ca5f0e0684e165d7c9ef4e50d783073eb/scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07", size = 28898986, upload-time = "2025-10-28T17:32:45.325Z" }, + { url = "https://files.pythonhosted.org/packages/96/5e/36bf3f0ac298187d1ceadde9051177d6a4fe4d507e8f59067dc9dd39e650/scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9", size = 20889814, upload-time = "2025-10-28T17:32:49.277Z" }, + { url = "https://files.pythonhosted.org/packages/80/35/178d9d0c35394d5d5211bbff7ac4f2986c5488b59506fef9e1de13ea28d3/scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686", size = 23565795, upload-time = "2025-10-28T17:32:53.337Z" }, + { url = "https://files.pythonhosted.org/packages/fa/46/d1146ff536d034d02f83c8afc3c4bab2eddb634624d6529a8512f3afc9da/scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203", size = 33349476, upload-time = "2025-10-28T17:32:58.353Z" }, + { url = "https://files.pythonhosted.org/packages/79/2e/415119c9ab3e62249e18c2b082c07aff907a273741b3f8160414b0e9193c/scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1", size = 35676692, upload-time = "2025-10-28T17:33:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/27/82/df26e44da78bf8d2aeaf7566082260cfa15955a5a6e96e6a29935b64132f/scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe", size = 36019345, upload-time = "2025-10-28T17:33:09.773Z" }, + { url = "https://files.pythonhosted.org/packages/82/31/006cbb4b648ba379a95c87262c2855cd0d09453e500937f78b30f02fa1cd/scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70", size = 38678975, upload-time = "2025-10-28T17:33:15.809Z" }, + { url = "https://files.pythonhosted.org/packages/c2/7f/acbd28c97e990b421af7d6d6cd416358c9c293fc958b8529e0bd5d2a2a19/scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc", size = 38555926, upload-time = "2025-10-28T17:33:21.388Z" }, + { url = "https://files.pythonhosted.org/packages/ce/69/c5c7807fd007dad4f48e0a5f2153038dc96e8725d3345b9ee31b2b7bed46/scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2", size = 25463014, upload-time = "2025-10-28T17:33:25.975Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/57e8327ab1508272029e27eeef34f2302ffc156b69e7e233e906c2a5c379/scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c", size = 36617856, upload-time = "2025-10-28T17:33:31.375Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/7e63cfba8a7452eb756306aa2fd9b37a29a323b672b964b4fdeded9a3f21/scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d", size = 28874306, upload-time = "2025-10-28T17:33:36.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/65/3a9400efd0228a176e6ec3454b1fa998fbbb5a8defa1672c3f65706987db/scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9", size = 20865371, upload-time = "2025-10-28T17:33:42.094Z" }, + { url = "https://files.pythonhosted.org/packages/33/d7/eda09adf009a9fb81827194d4dd02d2e4bc752cef16737cc4ef065234031/scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4", size = 23524877, upload-time = "2025-10-28T17:33:48.483Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/3f911e1ebc364cb81320223a3422aab7d26c9c7973109a9cd0f27c64c6c0/scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959", size = 33342103, upload-time = "2025-10-28T17:33:56.495Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/4bfb5695d8941e5c570a04d9fcd0d36bce7511b7d78e6e75c8f9791f82d0/scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88", size = 35697297, upload-time = "2025-10-28T17:34:04.722Z" }, + { url = "https://files.pythonhosted.org/packages/04/e1/6496dadbc80d8d896ff72511ecfe2316b50313bfc3ebf07a3f580f08bd8c/scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234", size = 36021756, upload-time = "2025-10-28T17:34:13.482Z" }, + { url = "https://files.pythonhosted.org/packages/fe/bd/a8c7799e0136b987bda3e1b23d155bcb31aec68a4a472554df5f0937eef7/scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d", size = 38696566, upload-time = "2025-10-28T17:34:22.384Z" }, + { url = "https://files.pythonhosted.org/packages/cd/01/1204382461fcbfeb05b6161b594f4007e78b6eba9b375382f79153172b4d/scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304", size = 38529877, upload-time = "2025-10-28T17:35:51.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/14/9d9fbcaa1260a94f4bb5b64ba9213ceb5d03cd88841fe9fd1ffd47a45b73/scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2", size = 25455366, upload-time = "2025-10-28T17:35:59.014Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a3/9ec205bd49f42d45d77f1730dbad9ccf146244c1647605cf834b3a8c4f36/scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b", size = 37027931, upload-time = "2025-10-28T17:34:31.451Z" }, + { url = "https://files.pythonhosted.org/packages/25/06/ca9fd1f3a4589cbd825b1447e5db3a8ebb969c1eaf22c8579bd286f51b6d/scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079", size = 29400081, upload-time = "2025-10-28T17:34:39.087Z" }, + { url = "https://files.pythonhosted.org/packages/6a/56/933e68210d92657d93fb0e381683bc0e53a965048d7358ff5fbf9e6a1b17/scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a", size = 21391244, upload-time = "2025-10-28T17:34:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7e/779845db03dc1418e215726329674b40576879b91814568757ff0014ad65/scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119", size = 23929753, upload-time = "2025-10-28T17:34:51.793Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4b/f756cf8161d5365dcdef9e5f460ab226c068211030a175d2fc7f3f41ca64/scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c", size = 33496912, upload-time = "2025-10-28T17:34:59.8Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/222b1e49a58668f23839ca1542a6322bb095ab8d6590d4f71723869a6c2c/scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e", size = 35802371, upload-time = "2025-10-28T17:35:08.173Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8d/5964ef68bb31829bde27611f8c9deeac13764589fe74a75390242b64ca44/scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135", size = 36190477, upload-time = "2025-10-28T17:35:16.7Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f2/b31d75cb9b5fa4dd39a0a931ee9b33e7f6f36f23be5ef560bf72e0f92f32/scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6", size = 38796678, upload-time = "2025-10-28T17:35:26.354Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1e/b3723d8ff64ab548c38d87055483714fefe6ee20e0189b62352b5e015bb1/scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc", size = 38640178, upload-time = "2025-10-28T17:35:35.304Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f3/d854ff38789aca9b0cc23008d607ced9de4f7ab14fa1ca4329f86b3758ca/scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a", size = 25803246, upload-time = "2025-10-28T17:35:42.155Z" }, + { url = "https://files.pythonhosted.org/packages/99/f6/99b10fd70f2d864c1e29a28bbcaa0c6340f9d8518396542d9ea3b4aaae15/scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6", size = 36606469, upload-time = "2025-10-28T17:36:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/043b54f2319f48ea940dd025779fa28ee360e6b95acb7cd188fad4391c6b/scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657", size = 28872043, upload-time = "2025-10-28T17:36:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e1/24b7e50cc1c4ee6ffbcb1f27fe9f4c8b40e7911675f6d2d20955f41c6348/scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26", size = 20862952, upload-time = "2025-10-28T17:36:22.966Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3a/3e8c01a4d742b730df368e063787c6808597ccb38636ed821d10b39ca51b/scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc", size = 23508512, upload-time = "2025-10-28T17:36:29.731Z" }, + { url = "https://files.pythonhosted.org/packages/1f/60/c45a12b98ad591536bfe5330cb3cfe1850d7570259303563b1721564d458/scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22", size = 33413639, upload-time = "2025-10-28T17:36:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/35957d88645476307e4839712642896689df442f3e53b0fa016ecf8a3357/scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc", size = 35704729, upload-time = "2025-10-28T17:36:46.547Z" }, + { url = "https://files.pythonhosted.org/packages/3b/15/89105e659041b1ca11c386e9995aefacd513a78493656e57789f9d9eab61/scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0", size = 36086251, upload-time = "2025-10-28T17:36:55.161Z" }, + { url = "https://files.pythonhosted.org/packages/1a/87/c0ea673ac9c6cc50b3da2196d860273bc7389aa69b64efa8493bdd25b093/scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800", size = 38716681, upload-time = "2025-10-28T17:37:04.1Z" }, + { url = "https://files.pythonhosted.org/packages/91/06/837893227b043fb9b0d13e4bd7586982d8136cb249ffb3492930dab905b8/scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d", size = 39358423, upload-time = "2025-10-28T17:38:20.005Z" }, + { url = "https://files.pythonhosted.org/packages/95/03/28bce0355e4d34a7c034727505a02d19548549e190bedd13a721e35380b7/scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f", size = 26135027, upload-time = "2025-10-28T17:38:24.966Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6f/69f1e2b682efe9de8fe9f91040f0cd32f13cfccba690512ba4c582b0bc29/scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c", size = 37028379, upload-time = "2025-10-28T17:37:14.061Z" }, + { url = "https://files.pythonhosted.org/packages/7c/2d/e826f31624a5ebbab1cd93d30fd74349914753076ed0593e1d56a98c4fb4/scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40", size = 29400052, upload-time = "2025-10-28T17:37:21.709Z" }, + { url = "https://files.pythonhosted.org/packages/69/27/d24feb80155f41fd1f156bf144e7e049b4e2b9dd06261a242905e3bc7a03/scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d", size = 21391183, upload-time = "2025-10-28T17:37:29.559Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d3/1b229e433074c5738a24277eca520a2319aac7465eea7310ea6ae0e98ae2/scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa", size = 23930174, upload-time = "2025-10-28T17:37:36.306Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/d9e148b0ec680c0f042581a2be79a28a7ab66c0c4946697f9e7553ead337/scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8", size = 33497852, upload-time = "2025-10-28T17:37:42.228Z" }, + { url = "https://files.pythonhosted.org/packages/2f/22/4e5f7561e4f98b7bea63cf3fd7934bff1e3182e9f1626b089a679914d5c8/scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353", size = 35798595, upload-time = "2025-10-28T17:37:48.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/42/6644d714c179429fc7196857866f219fef25238319b650bb32dde7bf7a48/scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146", size = 36186269, upload-time = "2025-10-28T17:37:53.72Z" }, + { url = "https://files.pythonhosted.org/packages/ac/70/64b4d7ca92f9cf2e6fc6aaa2eecf80bb9b6b985043a9583f32f8177ea122/scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d", size = 38802779, upload-time = "2025-10-28T17:37:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/8d0e39f62764cce5ffd5284131e109f07cf8955aef9ab8ed4e3aa5e30539/scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7", size = 39471128, upload-time = "2025-10-28T17:38:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/64/47/a494741db7280eae6dc033510c319e34d42dd41b7ac0c7ead39354d1a2b5/scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562", size = 26464127, upload-time = "2025-10-28T17:38:11.34Z" }, +] + +[[package]] +name = "seqr-loading-pipeline" +source = { virtual = "." } +dependencies = [ + { name = "aiofiles" }, + { name = "clickhouse-driver" }, + { name = "gnomad" }, + { name = "gnomad-qc" }, + { name = "google-api-python-client" }, + { name = "google-cloud-bigquery" }, + { name = "google-cloud-dataproc" }, + { name = "hail" }, + { name = "ipykernel" }, + { name = "jupyter-console" }, + { name = "luigi" }, + { name = "onnxconverter-common" }, + { name = "pip" }, + { name = "pydantic" }, + { name = "qtconsole" }, + { name = "slacker" }, +] + +[package.dev-dependencies] +dev = [ + { name = "coverage" }, + { name = "django" }, + { name = "django-clickhouse-backend" }, + { name = "pyarrow" }, + { name = "pysam" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-django" }, + { name = "responses" }, + { name = "ruff" }, + { name = "shellcheck-py" }, +] +prod = [ + { name = "sqlalchemy" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiofiles", specifier = "==24.1.0" }, + { name = "clickhouse-driver", specifier = "==0.2.10" }, + { name = "gnomad", specifier = "==0.8.0" }, + { name = "gnomad-qc", git = "https://github.com/broadinstitute/gnomad_qc.git?rev=v4.1" }, + { name = "google-api-python-client", specifier = "==2.159.0" }, + { name = "google-cloud-bigquery", specifier = "==3.29.0" }, + { name = "google-cloud-dataproc", specifier = "==5.16.0" }, + { name = "hail", specifier = "==0.2.138" }, + { name = "ipykernel", specifier = "==6.29.2" }, + { name = "jupyter-console", specifier = "==6.6.3" }, + { name = "luigi", specifier = "==3.5.2" }, + { name = "onnxconverter-common", git = "https://github.com/microsoft/onnxconverter-common.git?rev=f7a8eb699caa6f6a78d3bdfbcaf5dfbd43569ebd" }, + { name = "pip", specifier = "==23.2.1" }, + { name = "pydantic", specifier = "==2.8.2" }, + { name = "qtconsole", specifier = "==5.6.1" }, + { name = "slacker", specifier = "==0.14.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "coverage", specifier = ">=7.2.2" }, + { name = "django", specifier = "==4.2.30" }, + { name = "django-clickhouse-backend", specifier = "==1.6" }, + { name = "pyarrow" }, + { name = "pysam" }, + { name = "pytest", specifier = ">=7.0.0" }, + { name = "pytest-cov", specifier = ">=4.0.0" }, + { name = "pytest-django", specifier = ">=4.8.0" }, + { name = "responses", specifier = ">=0.23.1" }, + { name = "ruff", specifier = "==0.11.3" }, + { name = "shellcheck-py", specifier = ">=0.10.0" }, +] +prod = [{ name = "sqlalchemy", specifier = "<2.0.0" }] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + +[[package]] +name = "shellcheck-py" +version = "0.11.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/55/455b097417b3df3d330eff029c72c32f08b25739e3010acb30ad06d268ef/shellcheck_py-0.11.0.1.tar.gz", hash = "sha256:5c620c88901e8f1d3be5934b31ea99e3310065e1245253741eafd0a275c8c9cc", size = 3139, upload-time = "2025-08-09T17:53:42.492Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/27/d75b03e5458cefdb6d3b674566cd20476c3e4d3fe6cc9d68b7e3b854b296/shellcheck_py-0.11.0.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:b6a3fee28efda2e16e38d6e6d59faf7224300256456639727370d404730849e8", size = 6774472, upload-time = "2025-08-09T17:53:34.573Z" }, + { url = "https://files.pythonhosted.org/packages/61/ac/2a84c37171c0cf5a10ea4b0a27d43eb0a1d29bd98b49c2c5ffe17ad24bbe/shellcheck_py-0.11.0.1-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:6b88d0a244c82ed07e06a53e444da841f69330ca59ae15d4a66c391655dae7a0", size = 11381835, upload-time = "2025-08-09T17:53:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/96/55/250e0e3367613a5c22bd82e33b16b889287d81ab0f7dda67e6514a4cccf4/shellcheck_py-0.11.0.1-py2.py3-none-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1b274df81de5b000ff78db433e7328b87e52e3c38481c60f8e488c3095beef05", size = 3800600, upload-time = "2025-08-09T17:53:38.643Z" }, + { url = "https://files.pythonhosted.org/packages/15/5b/bb14c0a7474463b1aa3c09e866cb172dffc66ed2993b7ea8f1db581e86ee/shellcheck_py-0.11.0.1-py2.py3-none-win_amd64.whl", hash = "sha256:784156289ecb17e91c692cd783ab5152333309588cabb10032a047331c63e759", size = 8027541, upload-time = "2025-08-09T17:53:40.889Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "skl2onnx" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "onnx" }, + { name = "scikit-learn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/59/3f4d82eb96d8a80fd80325fc658d20e772ee6ac1c6f5cc85dd6aaaf7ccff/skl2onnx-1.19.1.tar.gz", hash = "sha256:0c105f2a3b87a624dd218d1fb98fdd19cf1bf6217190d25ce7e15484127d0e5d", size = 948919, upload-time = "2025-05-28T17:37:02.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/ec/9a0d709217aa385d87b3eadcf19e2ae32eca097077fa2236312d5fc8f656/skl2onnx-1.19.1-py3-none-any.whl", hash = "sha256:fddf2f49e3ffc355f332e676b43c6fec5e63797627925b279d9f5b2c4d0c81a7", size = 315511, upload-time = "2025-05-28T17:37:00.61Z" }, +] + +[[package]] +name = "slackclient" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/1e/48d7268513dc7528364a3a1c677f8b35b2f6108524f7a096143a9e51bcb3/slackclient-2.5.0.tar.gz", hash = "sha256:d37e4f91be9cf9d5c1a1698f44a37671fc92823ff01146cd827415f35fabe636", size = 49814, upload-time = "2019-12-10T00:40:56.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/01/5877fa0be43651bb0087388c5ee4a5bcedebc4d8c895fa63c80b74c2c611/slackclient-2.5.0-py2.py3-none-any.whl", hash = "sha256:16ebbfa1c34374fa8c508d0c8e5c670e41bba4a3f62c469ab1ee1b8225a939fa", size = 54300, upload-time = "2019-12-10T00:40:55.085Z" }, +] + +[[package]] +name = "slacker" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/e5/ea90f49e6d0905dcb2d0ab47e068b8f28f87dd97bd2e599164c693a52691/slacker-0.14.0.tar.gz", hash = "sha256:1ae7c597025c114e202b5c880345f150f795665bfc638010cac614ede4ed5108", size = 10116, upload-time = "2020-02-15T09:06:13.629Z" } + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.54" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/af/20290b55d469e873cba9d41c0206ab5461ff49d759989b3fe65010f9d265/sqlalchemy-1.4.54.tar.gz", hash = "sha256:4470fbed088c35dc20b78a39aaf4ae54fe81790c783b3264872a0224f437c31a", size = 8470350, upload-time = "2024-09-05T15:54:10.398Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/49/fb98983b5568e93696a25fd5bec1b789095b79a72d5f57c6effddaa81d0a/SQLAlchemy-1.4.54-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b05e0626ec1c391432eabb47a8abd3bf199fb74bfde7cc44a26d2b1b352c2c6e", size = 1589301, upload-time = "2024-09-05T19:22:42.197Z" }, + { url = "https://files.pythonhosted.org/packages/03/98/5a81430bbd646991346cb088a2bdc84d1bcd3dbe6b0cfc1aaa898370e5c7/SQLAlchemy-1.4.54-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13e91d6892b5fcb94a36ba061fb7a1f03d0185ed9d8a77c84ba389e5bb05e936", size = 1629553, upload-time = "2024-09-05T17:49:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/14e35db2b0d6deaa27691d014addbb0dd6f7e044f7ee465446a3c0c71404/SQLAlchemy-1.4.54-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb59a11689ff3c58e7652260127f9e34f7f45478a2f3ef831ab6db7bcd72108f", size = 1627640, upload-time = "2024-09-05T17:48:01.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/62/335006a8f2c98f704f391e1a0cc01446d1b1b9c198f579f03599f55bd860/SQLAlchemy-1.4.54-cp311-cp311-win32.whl", hash = "sha256:1390ca2d301a2708fd4425c6d75528d22f26b8f5cbc9faba1ddca136671432bc", size = 1591723, upload-time = "2024-09-05T17:53:17.486Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/6b4b8c07082920f5445ec65c221fa33baab102aced5dcc2d87a15d3f8db4/SQLAlchemy-1.4.54-cp311-cp311-win_amd64.whl", hash = "sha256:2b37931eac4b837c45e2522066bda221ac6d80e78922fb77c75eb12e4dbcdee5", size = 1593511, upload-time = "2024-09-05T17:51:50.947Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1b/aa9b99be95d1615f058b5827447c18505b7b3f1dfcbd6ce1b331c2107152/SQLAlchemy-1.4.54-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3f01c2629a7d6b30d8afe0326b8c649b74825a0e1ebdcb01e8ffd1c920deb07d", size = 1589983, upload-time = "2024-09-05T17:39:02.132Z" }, + { url = "https://files.pythonhosted.org/packages/59/47/cb0fc64e5344f0a3d02216796c342525ab283f8f052d1c31a1d487d08aa0/SQLAlchemy-1.4.54-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c24dd161c06992ed16c5e528a75878edbaeced5660c3db88c820f1f0d3fe1f4", size = 1630158, upload-time = "2024-09-05T17:50:13.255Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8b/f45dd378f6c97e8ff9332ff3d03ecb0b8c491be5bb7a698783b5a2f358ec/SQLAlchemy-1.4.54-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5e0d47d619c739bdc636bbe007da4519fc953393304a5943e0b5aec96c9877c", size = 1629232, upload-time = "2024-09-05T17:48:15.514Z" }, + { url = "https://files.pythonhosted.org/packages/0d/3c/884fe389f5bec86a310b81e79abaa1e26e5d78dc10a84d544a6822833e47/SQLAlchemy-1.4.54-cp312-cp312-win32.whl", hash = "sha256:12bc0141b245918b80d9d17eca94663dbd3f5266ac77a0be60750f36102bbb0f", size = 1592027, upload-time = "2024-09-05T17:54:02.253Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/c690d037be57efd3a69cde16a2ef1bd2a905dafe869434d33836de0983d0/SQLAlchemy-1.4.54-cp312-cp312-win_amd64.whl", hash = "sha256:f941aaf15f47f316123e1933f9ea91a6efda73a161a6ab6046d1cde37be62c88", size = 1593827, upload-time = "2024-09-05T17:52:07.454Z" }, +] + +[[package]] +name = "sqlparse" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/40/edede8dd6977b0d3da179a342c198ed100dd2aba4be081861ee5911e4da4/sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272", size = 84999, upload-time = "2024-12-10T12:05:30.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415, upload-time = "2024-12-10T12:05:27.824Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "statsmodels" +version = "0.14.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "patsy" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/cc/8c1bf59bf8203dea1bf2ea811cfe667d7bcc6909c83d8afb02b08e30f50b/statsmodels-0.14.5.tar.gz", hash = "sha256:de260e58cccfd2ceddf835b55a357233d6ca853a1aa4f90f7553a52cc71c6ddf", size = 20525016, upload-time = "2025-07-07T12:14:23.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/30/fd49902b30416b828de763e161c0d6e2cc04d119ae4fbdd3f3b43dc8f1be/statsmodels-0.14.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b7091a8442076c708c926de3603653a160955e80a2b6d931475b7bb8ddc02e5", size = 10053330, upload-time = "2025-07-07T12:07:39.689Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c1/2654541ff6f5790d01d1e5ba36405fde873f4a854f473e90b4fe56b37333/statsmodels-0.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:128872be8f3208f4446d91ea9e4261823902fc7997fee7e1a983eb62fd3b7c6e", size = 9735555, upload-time = "2025-07-07T12:13:28.935Z" }, + { url = "https://files.pythonhosted.org/packages/ce/da/6ebb64d0db4e86c0d2d9cde89e03247702da0ab191789f7813d4f9a348da/statsmodels-0.14.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ad5aee04ae7196c429df2174df232c057e478c5fa63193d01c8ec9aae04d31", size = 10307522, upload-time = "2025-07-07T14:22:32.853Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/ac803ca093ec3845184a752a91cd84511245e1f97103b15cfe32794a3bb0/statsmodels-0.14.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f402fc793458dd6d96e099acb44cd1de1428565bf7ef3030878a8daff091f08a", size = 10474665, upload-time = "2025-07-07T14:22:46.011Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c8/ae82feb00582f4814fac5d2cb3ec32f93866b413cf5878b2fe93688ec63c/statsmodels-0.14.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26c028832730aebfbfd4e7501694e1f9ad31ec8536e776716673f4e7afd4059a", size = 10713120, upload-time = "2025-07-07T14:23:00.067Z" }, + { url = "https://files.pythonhosted.org/packages/05/ac/4276459ea71aa46e2967ea283fc88ee5631c11f29a06787e16cf4aece1b8/statsmodels-0.14.5-cp311-cp311-win_amd64.whl", hash = "sha256:ec56f771d9529cdc17ed2fb2a950d100b6e83a7c5372aae8ac5bb065c474b856", size = 9640980, upload-time = "2025-07-07T12:05:33.085Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a5/fcc4f5f16355660ce7a1742e28a43e3a9391b492fc4ff29fdd6893e81c05/statsmodels-0.14.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:37e7364a39f9aa3b51d15a208c2868b90aadb8412f868530f5cba9197cb00eaa", size = 10042891, upload-time = "2025-07-07T12:13:41.671Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6f/db0cf5efa48277ac6218d9b981c8fd5e63c4c43e0d9d65015fdc38eed0ef/statsmodels-0.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4263d7f4d0f1d5ac6eb4db22e1ee34264a14d634b9332c975c9d9109b6b46e12", size = 9698912, upload-time = "2025-07-07T12:07:54.674Z" }, + { url = "https://files.pythonhosted.org/packages/4a/93/4ddc3bc4a59c51e6a57c49df1b889882c40d9e141e855b3517f6a8de3232/statsmodels-0.14.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86224f6e36f38486e471e75759d241fe2912d8bc25ab157d54ee074c6aedbf45", size = 10237801, upload-time = "2025-07-07T14:23:12.593Z" }, + { url = "https://files.pythonhosted.org/packages/66/de/dc6bf2f6e8c8eb4c5815560ebdbdf2d69a767bc0f65fde34bc086cf5b36d/statsmodels-0.14.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3dd760a6fa80cd5e0371685c697bb9c2c0e6e1f394d975e596a1e6d0bbb9372", size = 10424154, upload-time = "2025-07-07T14:23:25.365Z" }, + { url = "https://files.pythonhosted.org/packages/16/4f/2d5a8d14bebdf2b03b3ea89b8c6a2c837bb406ba5b7a41add8bd303bce29/statsmodels-0.14.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6264fb00e02f858b86bd01ef2dc05055a71d4a0cc7551b9976b07b0f0e6cf24f", size = 10652915, upload-time = "2025-07-07T14:23:39.337Z" }, + { url = "https://files.pythonhosted.org/packages/df/4c/2feda3a9f0e17444a84ba5398ada6a4d2e1b8f832760048f04e2b8ea0c41/statsmodels-0.14.5-cp312-cp312-win_amd64.whl", hash = "sha256:b2ed065bfbaf8bb214c7201656df840457c2c8c65e1689e3eb09dc7440f9c61c", size = 9611236, upload-time = "2025-07-07T12:08:06.794Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/4c374108cf108b3130240a5b45847a61f70ddf973429044a81a05189b046/statsmodels-0.14.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:906263134dd1a640e55ecb01fda4a9be7b9e08558dba9e4c4943a486fdb0c9c8", size = 10013958, upload-time = "2025-07-07T14:35:01.04Z" }, + { url = "https://files.pythonhosted.org/packages/5a/36/bf3d7f0e36acd3ba9ec0babd79ace25506b6872780cbd710fb7cd31f0fa2/statsmodels-0.14.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9118f76344f77cffbb3a9cbcff8682b325be5eed54a4b3253e09da77a74263d3", size = 9674243, upload-time = "2025-07-07T12:08:22.571Z" }, + { url = "https://files.pythonhosted.org/packages/90/ce/a55a6f37b5277683ceccd965a5828b24672bbc427db6b3969ae0b0fc29fb/statsmodels-0.14.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dc4ee159070557c9a6c000625d85f653de437772fe7086857cff68f501afe45", size = 10219521, upload-time = "2025-07-07T14:23:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/973da1ee8bc0743519759e74c3615b39acdc3faf00e0a0710f8c856d8c9d/statsmodels-0.14.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a085d47c8ef5387279a991633883d0e700de2b0acc812d7032d165888627bef", size = 10453538, upload-time = "2025-07-07T14:24:06.959Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d6/18903fb707afd31cf1edaec5201964dbdacb2bfae9a22558274647a7c88f/statsmodels-0.14.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f866b2ebb2904b47c342d00def83c526ef2eb1df6a9a3c94ba5fe63d0005aec", size = 10681584, upload-time = "2025-07-07T14:24:21.038Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/80df1bbbfcdc50bff4152f43274420fa9856d56e234d160d6206eb1f5827/statsmodels-0.14.5-cp313-cp313-win_amd64.whl", hash = "sha256:2a06bca03b7a492f88c8106103ab75f1a5ced25de90103a89f3a287518017939", size = 9604641, upload-time = "2025-07-07T12:08:36.23Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6c/0fb40a89d715412160097c6f3387049ed88c9bd866c8838a8852c705ae2f/statsmodels-0.14.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:07c4dad25bbb15864a31b4917a820f6d104bdc24e5ddadcda59027390c3bed9e", size = 10211256, upload-time = "2025-10-30T13:46:58.591Z" }, + { url = "https://files.pythonhosted.org/packages/88/4a/e36fe8b19270ab3e80df357da924c6c029cab0fb9a0fbd28aaf49341707d/statsmodels-0.14.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:babb067c852e966c2c933b79dbb5d0240919d861941a2ef6c0e13321c255528d", size = 10110933, upload-time = "2025-10-30T13:47:11.774Z" }, + { url = "https://files.pythonhosted.org/packages/8a/bf/1b7e7b1a6c09a88a9c5c9e60622c050dfd08af11c2e6d4a42dbc71b32ee1/statsmodels-0.14.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110194b137286173cc676d7bad0119a197778de6478fc6cbdc3b33571165ac1e", size = 10253981, upload-time = "2025-10-30T16:32:22.399Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d0/f95da95524bdd99613923ca61a3036d1308cee1290e5e8acb89f51736a8c/statsmodels-0.14.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c8a9c384a60c80731b278e7fd18764364c8817f4995b13a175d636f967823d1", size = 10460450, upload-time = "2025-10-30T16:32:44.985Z" }, + { url = "https://files.pythonhosted.org/packages/28/bb/59e7be0271be264b7b541baf3973f97747740950bfd5115de731f63da8ab/statsmodels-0.14.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:557df3a870a57248df744fdfcc444ecbc5bdbf1c042b8a8b5d8e3e797830dc2a", size = 10694060, upload-time = "2025-10-30T16:33:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c0/b28d0fd0347ea38d3610052f479e4b922eb33bb8790817f93cd89e6e08ba/statsmodels-0.14.5-cp314-cp314-win_amd64.whl", hash = "sha256:95af7a9c4689d514f4341478b891f867766f3da297f514b8c4adf08f4fa61d03", size = 9648961, upload-time = "2025-10-30T13:47:24.303Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "tenacity" +version = "8.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/4d/6a19536c50b849338fcbe9290d562b52cbdcf30d8963d3588a68a4107df1/tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78", size = 47309, upload-time = "2024-07-05T07:25:31.836Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/3f/8ba87d9e287b9d385a02a7114ddcef61b26f86411e121c9003eb509a1773/tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687", size = 28165, upload-time = "2024-07-05T07:25:29.591Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821, upload-time = "2025-08-08T18:27:00.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563, upload-time = "2025-08-08T18:26:42.945Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729, upload-time = "2025-08-08T18:26:44.473Z" }, + { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295, upload-time = "2025-08-08T18:26:46.021Z" }, + { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644, upload-time = "2025-08-08T18:26:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878, upload-time = "2025-08-08T18:26:50.599Z" }, + { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549, upload-time = "2025-08-08T18:26:51.864Z" }, + { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973, upload-time = "2025-08-08T18:26:53.625Z" }, + { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954, upload-time = "2025-08-08T18:26:55.072Z" }, + { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023, upload-time = "2025-08-08T18:26:56.677Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427, upload-time = "2025-08-08T18:26:57.91Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456, upload-time = "2025-08-08T18:26:59.207Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "typer" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/28/7c85c8032b91dbe79725b6f17d2fffc595dff06a35c7a30a37bef73a1ab4/typer-0.20.0.tar.gz", hash = "sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37", size = 106492, upload-time = "2025-10-20T17:03:49.445Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/64/7713ffe4b5983314e9d436a90d5bd4f63b6054e2aca783a3cfc44cb95bbf/typer-0.20.0-py3-none-any.whl", hash = "sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a", size = 47028, upload-time = "2025-10-20T17:03:47.617Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, +] + +[[package]] +name = "uritemplate" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload-time = "2024-10-14T23:38:35.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload-time = "2024-10-14T23:37:33.612Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload-time = "2024-10-14T23:37:36.11Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload-time = "2024-10-14T23:37:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload-time = "2024-10-14T23:37:40.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload-time = "2024-10-14T23:37:42.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload-time = "2024-10-14T23:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload-time = "2024-10-14T23:37:47.833Z" }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload-time = "2024-10-14T23:37:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload-time = "2024-10-14T23:37:51.703Z" }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload-time = "2024-10-14T23:37:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload-time = "2024-10-14T23:37:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload-time = "2024-10-14T23:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload-time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload-time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload-time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload-time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload-time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload-time = "2024-10-14T23:38:10.888Z" }, +] + +[[package]] +name = "w3lib" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/7d/1172cfaa1e29beb9bf938e484c122b3bdc82e8e37b17a4f753ba6d6e009f/w3lib-2.3.1.tar.gz", hash = "sha256:5c8ac02a3027576174c2b61eb9a2170ba1b197cae767080771b6f1febda249a4", size = 49531, upload-time = "2025-01-27T14:22:10.453Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/dd/56f0d8af71e475ed194d702f8b4cf9cea812c95e82ad823d239023c6558c/w3lib-2.3.1-py3-none-any.whl", hash = "sha256:9ccd2ae10c8c41c7279cd8ad4fe65f834be894fe7bfdd7304b991fd69325847b", size = 21751, upload-time = "2025-01-27T14:22:09.421Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] + +[[package]] +name = "wrapt" +version = "1.17.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/db/00e2a219213856074a213503fdac0511203dceefff26e1daa15250cc01a0/wrapt-1.17.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:273a736c4645e63ac582c60a56b0acb529ef07f78e08dc6bfadf6a46b19c0da7", size = 53482, upload-time = "2025-08-12T05:51:45.79Z" }, + { url = "https://files.pythonhosted.org/packages/5e/30/ca3c4a5eba478408572096fe9ce36e6e915994dd26a4e9e98b4f729c06d9/wrapt-1.17.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5531d911795e3f935a9c23eb1c8c03c211661a5060aab167065896bbf62a5f85", size = 38674, upload-time = "2025-08-12T05:51:34.629Z" }, + { url = "https://files.pythonhosted.org/packages/31/25/3e8cc2c46b5329c5957cec959cb76a10718e1a513309c31399a4dad07eb3/wrapt-1.17.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0610b46293c59a3adbae3dee552b648b984176f8562ee0dba099a56cfbe4df1f", size = 38959, upload-time = "2025-08-12T05:51:56.074Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8f/a32a99fc03e4b37e31b57cb9cefc65050ea08147a8ce12f288616b05ef54/wrapt-1.17.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b32888aad8b6e68f83a8fdccbf3165f5469702a7544472bdf41f582970ed3311", size = 82376, upload-time = "2025-08-12T05:52:32.134Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/4930cb8d9d70d59c27ee1332a318c20291749b4fba31f113c2f8ac49a72e/wrapt-1.17.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cccf4f81371f257440c88faed6b74f1053eef90807b77e31ca057b2db74edb1", size = 83604, upload-time = "2025-08-12T05:52:11.663Z" }, + { url = "https://files.pythonhosted.org/packages/a8/f3/1afd48de81d63dd66e01b263a6fbb86e1b5053b419b9b33d13e1f6d0f7d0/wrapt-1.17.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8a210b158a34164de8bb68b0e7780041a903d7b00c87e906fb69928bf7890d5", size = 82782, upload-time = "2025-08-12T05:52:12.626Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d7/4ad5327612173b144998232f98a85bb24b60c352afb73bc48e3e0d2bdc4e/wrapt-1.17.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:79573c24a46ce11aab457b472efd8d125e5a51da2d1d24387666cd85f54c05b2", size = 82076, upload-time = "2025-08-12T05:52:33.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/59/e0adfc831674a65694f18ea6dc821f9fcb9ec82c2ce7e3d73a88ba2e8718/wrapt-1.17.3-cp311-cp311-win32.whl", hash = "sha256:c31eebe420a9a5d2887b13000b043ff6ca27c452a9a22fa71f35f118e8d4bf89", size = 36457, upload-time = "2025-08-12T05:53:03.936Z" }, + { url = "https://files.pythonhosted.org/packages/83/88/16b7231ba49861b6f75fc309b11012ede4d6b0a9c90969d9e0db8d991aeb/wrapt-1.17.3-cp311-cp311-win_amd64.whl", hash = "sha256:0b1831115c97f0663cb77aa27d381237e73ad4f721391a9bfb2fe8bc25fa6e77", size = 38745, upload-time = "2025-08-12T05:53:02.885Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1e/c4d4f3398ec073012c51d1c8d87f715f56765444e1a4b11e5180577b7e6e/wrapt-1.17.3-cp311-cp311-win_arm64.whl", hash = "sha256:5a7b3c1ee8265eb4c8f1b7d29943f195c00673f5ab60c192eba2d4a7eae5f46a", size = 36806, upload-time = "2025-08-12T05:52:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/9f/41/cad1aba93e752f1f9268c77270da3c469883d56e2798e7df6240dcb2287b/wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0", size = 53998, upload-time = "2025-08-12T05:51:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/096a7cc13097a1869fe44efe68dace40d2a16ecb853141394047f0780b96/wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba", size = 39020, upload-time = "2025-08-12T05:51:35.906Z" }, + { url = "https://files.pythonhosted.org/packages/33/df/bdf864b8997aab4febb96a9ae5c124f700a5abd9b5e13d2a3214ec4be705/wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd", size = 39098, upload-time = "2025-08-12T05:51:57.474Z" }, + { url = "https://files.pythonhosted.org/packages/9f/81/5d931d78d0eb732b95dc3ddaeeb71c8bb572fb01356e9133916cd729ecdd/wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828", size = 88036, upload-time = "2025-08-12T05:52:34.784Z" }, + { url = "https://files.pythonhosted.org/packages/ca/38/2e1785df03b3d72d34fc6252d91d9d12dc27a5c89caef3335a1bbb8908ca/wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9", size = 88156, upload-time = "2025-08-12T05:52:13.599Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8b/48cdb60fe0603e34e05cffda0b2a4adab81fd43718e11111a4b0100fd7c1/wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396", size = 87102, upload-time = "2025-08-12T05:52:14.56Z" }, + { url = "https://files.pythonhosted.org/packages/3c/51/d81abca783b58f40a154f1b2c56db1d2d9e0d04fa2d4224e357529f57a57/wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc", size = 87732, upload-time = "2025-08-12T05:52:36.165Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b1/43b286ca1392a006d5336412d41663eeef1ad57485f3e52c767376ba7e5a/wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe", size = 36705, upload-time = "2025-08-12T05:53:07.123Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/49493f962bd3c586ab4b88066e967aa2e0703d6ef2c43aa28cb83bf7b507/wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c", size = 38877, upload-time = "2025-08-12T05:53:05.436Z" }, + { url = "https://files.pythonhosted.org/packages/f1/48/0f7102fe9cb1e8a5a77f80d4f0956d62d97034bbe88d33e94699f99d181d/wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6", size = 36885, upload-time = "2025-08-12T05:52:54.367Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, + { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, + { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711, upload-time = "2025-08-12T05:53:10.074Z" }, + { url = "https://files.pythonhosted.org/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885, upload-time = "2025-08-12T05:53:08.695Z" }, + { url = "https://files.pythonhosted.org/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896, upload-time = "2025-08-12T05:52:55.34Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/cd864b2a14f20d14f4c496fab97802001560f9f41554eef6df201cd7f76c/wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39", size = 54132, upload-time = "2025-08-12T05:51:49.864Z" }, + { url = "https://files.pythonhosted.org/packages/d5/46/d011725b0c89e853dc44cceb738a307cde5d240d023d6d40a82d1b4e1182/wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235", size = 39091, upload-time = "2025-08-12T05:51:38.935Z" }, + { url = "https://files.pythonhosted.org/packages/2e/9e/3ad852d77c35aae7ddebdbc3b6d35ec8013af7d7dddad0ad911f3d891dae/wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c", size = 39172, upload-time = "2025-08-12T05:51:59.365Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f7/c983d2762bcce2326c317c26a6a1e7016f7eb039c27cdf5c4e30f4160f31/wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b", size = 87163, upload-time = "2025-08-12T05:52:40.965Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/f673f75d489c7f22d17fe0193e84b41540d962f75fce579cf6873167c29b/wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa", size = 87963, upload-time = "2025-08-12T05:52:20.326Z" }, + { url = "https://files.pythonhosted.org/packages/df/61/515ad6caca68995da2fac7a6af97faab8f78ebe3bf4f761e1b77efbc47b5/wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7", size = 86945, upload-time = "2025-08-12T05:52:21.581Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bd/4e70162ce398462a467bc09e768bee112f1412e563620adc353de9055d33/wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4", size = 86857, upload-time = "2025-08-12T05:52:43.043Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/da8560695e9284810b8d3df8a19396a6e40e7518059584a1a394a2b35e0a/wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10", size = 37178, upload-time = "2025-08-12T05:53:12.605Z" }, + { url = "https://files.pythonhosted.org/packages/db/c8/b71eeb192c440d67a5a0449aaee2310a1a1e8eca41676046f99ed2487e9f/wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6", size = 39310, upload-time = "2025-08-12T05:53:11.106Z" }, + { url = "https://files.pythonhosted.org/packages/45/20/2cda20fd4865fa40f86f6c46ed37a2a8356a7a2fde0773269311f2af56c7/wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58", size = 37266, upload-time = "2025-08-12T05:52:56.531Z" }, + { url = "https://files.pythonhosted.org/packages/77/ed/dd5cf21aec36c80443c6f900449260b80e2a65cf963668eaef3b9accce36/wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a", size = 56544, upload-time = "2025-08-12T05:51:51.109Z" }, + { url = "https://files.pythonhosted.org/packages/8d/96/450c651cc753877ad100c7949ab4d2e2ecc4d97157e00fa8f45df682456a/wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067", size = 40283, upload-time = "2025-08-12T05:51:39.912Z" }, + { url = "https://files.pythonhosted.org/packages/d1/86/2fcad95994d9b572db57632acb6f900695a648c3e063f2cd344b3f5c5a37/wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454", size = 40366, upload-time = "2025-08-12T05:52:00.693Z" }, + { url = "https://files.pythonhosted.org/packages/64/0e/f4472f2fdde2d4617975144311f8800ef73677a159be7fe61fa50997d6c0/wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e", size = 108571, upload-time = "2025-08-12T05:52:44.521Z" }, + { url = "https://files.pythonhosted.org/packages/cc/01/9b85a99996b0a97c8a17484684f206cbb6ba73c1ce6890ac668bcf3838fb/wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f", size = 113094, upload-time = "2025-08-12T05:52:22.618Z" }, + { url = "https://files.pythonhosted.org/packages/25/02/78926c1efddcc7b3aa0bc3d6b33a822f7d898059f7cd9ace8c8318e559ef/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056", size = 110659, upload-time = "2025-08-12T05:52:24.057Z" }, + { url = "https://files.pythonhosted.org/packages/dc/ee/c414501ad518ac3e6fe184753632fe5e5ecacdcf0effc23f31c1e4f7bfcf/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804", size = 106946, upload-time = "2025-08-12T05:52:45.976Z" }, + { url = "https://files.pythonhosted.org/packages/be/44/a1bd64b723d13bb151d6cc91b986146a1952385e0392a78567e12149c7b4/wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977", size = 38717, upload-time = "2025-08-12T05:53:15.214Z" }, + { url = "https://files.pythonhosted.org/packages/79/d9/7cfd5a312760ac4dd8bf0184a6ee9e43c33e47f3dadc303032ce012b8fa3/wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116", size = 41334, upload-time = "2025-08-12T05:53:14.178Z" }, + { url = "https://files.pythonhosted.org/packages/46/78/10ad9781128ed2f99dbc474f43283b13fea8ba58723e98844367531c18e9/wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6", size = 38471, upload-time = "2025-08-12T05:52:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, +] + +[[package]] +name = "xyzservices" +version = "2025.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/2b/58b3db8814e39277dd6c34aa206f7d0231ff0406284e18e03d4920a4bc78/xyzservices-2025.10.0.tar.gz", hash = "sha256:c6b7648276c98e8222fbec84d9c763128cf3653705017a4d6c4c3652480ee144", size = 1135110, upload-time = "2025-10-30T14:46:36.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/8f/447cc9cb57456d786204af0f450ffb920039104c5eff6626337c9f403bd1/xyzservices-2025.10.0-py3-none-any.whl", hash = "sha256:cfd6423367c7bc717ed5824d4dd7de2c91486886c1c193db9d8f0fa7fd43bc1b", size = 92737, upload-time = "2025-10-30T14:46:34.923Z" }, +] + +[[package]] +name = "yarl" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, + { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, + { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, + { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, + { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, + { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, + { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, + { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804, upload-time = "2025-10-06T14:09:39.359Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858, upload-time = "2025-10-06T14:09:41.068Z" }, + { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637, upload-time = "2025-10-06T14:09:42.712Z" }, + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, + { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, + { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, + { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, + { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, + { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, + { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, +] + +[[package]] +name = "yoyo-migrations" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata" }, + { name = "sqlparse" }, + { name = "tabulate" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/5d/9ef7f808ea955eca9f08043c65bdc81a4694e784c978b24ad72022974a97/yoyo_migrations-9.0.0-py3-none-any.whl", hash = "sha256:fc65d3a6d9449c1c54d64ff2ff98e32a27da356057c60e3471010bfb19ede081", size = 49002, upload-time = "2024-08-10T09:43:50.388Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] diff --git a/loading_pipeline/var/__init__.py b/loading_pipeline/var/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/clickhouse_config/test-clickhouse.xml b/loading_pipeline/var/clickhouse_config/test-clickhouse.xml new file mode 100644 index 0000000000..27dd142879 --- /dev/null +++ b/loading_pipeline/var/clickhouse_config/test-clickhouse.xml @@ -0,0 +1,76 @@ + + / + + + + + 0 + 1 + + + 300000000000 + 300000000000 + + + 1 + + + 0.1 + 0.1 + + + 1 + + + 1 + + + 0 + + + + + + default_password + + ::/0 + + + default + default + + 1 + 1 + + + + + + trace + true + json + + + 8123 + 9000 + 9004 + 9005 + ./ + + true + + + + + + system + query_log
+ Engine = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + INTERVAL 30 day + 7500 + 1048576 + 8192 + 524288 + false +
+ +
diff --git a/loading_pipeline/var/liftover/__init__.py b/loading_pipeline/var/liftover/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/liftover/grch37_to_grch38.over.chain.gz b/loading_pipeline/var/liftover/grch37_to_grch38.over.chain.gz new file mode 100644 index 0000000000..534942192c Binary files /dev/null and b/loading_pipeline/var/liftover/grch37_to_grch38.over.chain.gz differ diff --git a/loading_pipeline/var/liftover/grch38_to_grch37.over.chain.gz b/loading_pipeline/var/liftover/grch38_to_grch37.over.chain.gz new file mode 100644 index 0000000000..d66b55957e Binary files /dev/null and b/loading_pipeline/var/liftover/grch38_to_grch37.over.chain.gz differ diff --git a/loading_pipeline/var/spark_config/spark-defaults.conf b/loading_pipeline/var/spark_config/spark-defaults.conf new file mode 100644 index 0000000000..84a0d088f5 --- /dev/null +++ b/loading_pipeline/var/spark_config/spark-defaults.conf @@ -0,0 +1,9 @@ +spark.driver.memory 10G +spark.master local[*] +spark.driver.extraJavaOptions -Xss4M +spark.executor.extraJavaOptions -Xss4M +spark.executor.memoryOverhead 4g +spark.driver.maxResultSize 30g +spark.kryoserializer.buffer.max 1g +spark.memory.fraction 0.1 +spark.default.parallelism 1 diff --git a/loading_pipeline/var/test/ancestry_imputation_model.onnx b/loading_pipeline/var/test/ancestry_imputation_model.onnx new file mode 100644 index 0000000000..b6c9cd7bb1 Binary files /dev/null and b/loading_pipeline/var/test/ancestry_imputation_model.onnx differ diff --git a/loading_pipeline/var/test/callsets/1kg_30variants.vcf b/loading_pipeline/var/test/callsets/1kg_30variants.vcf new file mode 100644 index 0000000000..3f558cb346 --- /dev/null +++ b/loading_pipeline/var/test/callsets/1kg_30variants.vcf @@ -0,0 +1,157 @@ +##fileformat=VCFv4.2 +##hailversion=0.2.8-70304a52d33d +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00731 HG00732 HG00733 NA19675 NA19678 NA19679 NA20870 NA20872 NA20874 NA20875 NA20876 NA20877 NA20878 NA20881 NA20885 NA20888 +1 871269 . A C 368.47 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-1.74060e+01;DP=351;Dels=0.00000e+00;FS=9.28030e+01;HaplotypeScore=5.13800e-01;InbreedingCoeff=-3.32000e-02;MQ=5.93000e+01;MQ0=0;MQRankSum=2.37300e+00;QD=4.80000e-01;ReadPosRankSum=-1.17980e+01;SNPEFF_AMINO_ACID_CHANGE=R141;SNPEFF_CODON_CHANGE=cgA/cgC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_871152_871276;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-8.16700e-01;culprit=QD;CSQ=C|ENSG00000187634|ENST00000455979|Transcript|upstream_gene_variant|||||||1|3386|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000420190|Transcript|synonymous_variant|512|423|141|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C|||5/7|||ENST00000420190.1:c.423N>C|ENST00000420190.1:c.423N>C(p.%3D)|||||||||||||||POSITION:0.787709497206704||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000268179|ENST00000598827|Transcript|upstream_gene_variant|||||||1|4824|-1|AL645608.1|Clone_based_ensembl_gene||protein_coding|YES|||ENSP00000471152||M0R0C9_HUMAN|UPI0000D61E05||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000437963|Transcript|downstream_gene_variant|||||||1|96|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000393181||Q5SV95_HUMAN&I7FV93_HUMAN|UPI000155D47B||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000478729|Transcript|upstream_gene_variant|||||||1|4457|1|SAMD11|HGNC|28706|processed_transcript||||||||||||||||||||||||||||||||||||||,C|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|506|423|141|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||5/14|||ENST00000342066.3:c.423N>C|ENST00000342066.3:c.423N>C(p.%3D)|||||||||||||||POSITION:0.206744868035191||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|194|195|65|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||3/12|||ENST00000341065.4:c.194N>C|ENST00000341065.4:c.194N>C(p.%3D)|||||||||||||||POSITION:0.110231769361221||NON_CAN_SPLICE_SURR|||||||,C||ENSR00000528855|RegulatoryFeature|regulatory_region_variant|||||||1||||||regulatory_region|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:34,0:34:99:0,102,1073 0/0:34,0:34:99:0,102,1064 0/0:37,0:37:99:0,108,1155 0/0:8,3:11:24:0,24,226 0/1:11,4:16:32:32,0,300 0/0:10,0:10:30:0,30,306 0/0:13,0:13:39:0,39,410 0/0:11,0:11:33:0,33,323 0/0:21,3:23:12:0,12,434 0/0:19,0:19:57:0,57,581 0/0:25,4:28:27:0,27,553 0/0:17,1:18:51:0,51,524 0/0:25,0:25:75:0,75,759 0/0:21,0:21:63:0,63,687 0/0:23,4:27:69:0,69,709 0/0:22,2:24:60:0,60,562 +1 874734 rs145967298 C T 2645.29 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-7.95400e+00;DB;DP=484;Dels=0.00000e+00;FS=7.13100e+00;HaplotypeScore=3.21100e-01;InbreedingCoeff=-6.80000e-03;MQ=5.85800e+01;MQ0=1;MQRankSum=7.38500e+00;QD=1.23600e+01;ReadPosRankSum=-7.54000e-01;SNPEFF_AMINO_ACID_CHANGE=S200;SNPEFF_CODON_CHANGE=agC/agT;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_874655_874840;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=5.39000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs145967298|1|63|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|683|600|200|S|agC/agT|rs145967298|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||7/14|||ENST00000342066.3:c.600N>T|ENST00000342066.3:c.600N>T(p.%3D)|T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||POSITION:0.293255131964809||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs145967298|1|4850|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000464948|Transcript|upstream_gene_variant||||||rs145967298|1|2812|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000466827|Transcript|upstream_gene_variant||||||rs145967298|1|2749|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000474461|Transcript|upstream_gene_variant||||||rs145967298|1|1722|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs145967298|1|4850|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|synonymous_variant|80|81|27|S|agC/agT|rs145967298|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||1/7|||ENST00000455979.1:c.80N>T|ENST00000455979.1:c.80N>T(p.%3D)|T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||POSITION:0.0498461538461538||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000187634|ENST00000437963|Transcript|downstream_gene_variant||||||rs145967298|1|3561|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000393181||Q5SV95_HUMAN&I7FV93_HUMAN|UPI000155D47B||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000478729|Transcript|upstream_gene_variant||||||rs145967298|1|992|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs145967298|1|4851|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|371|372|124|S|agC/agT|rs145967298|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||5/12|||ENST00000341065.4:c.371N>T|ENST00000341065.4:c.371N>T(p.%3D)|T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||POSITION:0.210288298473714||NON_CAN_SPLICE_SURR|||||||,T||ENSR00001516735|RegulatoryFeature|regulatory_region_variant||||||rs145967298|1||||||regulatory_region|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||||||||| GT:AD:DP:GQ:PL 0/0:37,0:37:99:0,111,1368 0/0:24,0:24:66:0,66,870 0/0:32,0:32:96:0,96,1183 0/0:8,0:8:24:0,24,245 0/0:8,0:8:24:0,24,267 0/0:9,0:9:27:0,27,318 0/0:26,0:26:75:0,75,879 0/0:31,0:31:93:0,93,1120 0/0:39,0:39:99:0,117,1375 0/0:56,0:56:99:0,169,2023 0/1:21,22:42:99:519,0,613 0/0:29,0:29:87:0,87,1048 0/0:43,0:43:99:0,129,1556 0/0:20,0:20:60:0,60,741 0/0:45,0:45:99:0,135,1586 0/0:35,0:35:99:0,105,1239 +1 876499 rs4372192 A G 212847.01 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=2.42570e+01;DB;DP=122;Dels=1.00000e-02;FS=9.96800e+00;HaplotypeScore=2.51500e-01;InbreedingCoeff=4.11000e-02;MQ=5.91300e+01;MQ0=0;MQRankSum=7.64000e-01;QD=3.03200e+01;ReadPosRankSum=2.13900e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=4.70000e+00;culprit=MQ;CSQ=G|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs4372192|1|1828|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs4372192|1|4200|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000342066|Transcript|intron_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||7/13||ENST00000342066.3:c.707-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||INTRON_SIZE:1683||NON_CAN_SPLICE&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs4372192|1|3085|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000187634|ENST00000464948|Transcript|upstream_gene_variant||||||rs4372192|1|1047|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000466827|Transcript|upstream_gene_variant||||||rs4372192|1|984|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000474461|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|44|||||rs4372192|1||1|SAMD11|HGNC|28706|retained_intron||||||||||1/4|||ENST00000474461.1:n.44N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000455979|Transcript|intron_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||1/6||ENST00000455979.1:c.187-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||INTRON_SIZE:1683||NON_CAN_SPLICE&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs4372192|1|3085|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000478729|Transcript|intron_variant&non_coding_transcript_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|processed_transcript|||||||||||1/2||ENST00000478729.1:n.118-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs4372192|1|3086|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000341065|Transcript|intron_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||5/11||ENST00000341065.4:c.430-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||INTRON_SIZE:1731||NON_CAN_SPLICE&ANC_ALLELE|||||||,G||ENSR00000528857|RegulatoryFeature|regulatory_region_variant||||||rs4372192|1||||||regulatory_region|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,7:7:21:253,21,0 1/1:0,8:8:24:296,24,0 1/1:0,4:4:12:148,12,0 1/1:0,5:5:15:184,15,0 1/1:0,1:1:3:39,3,0 1/1:0,5:5:15:176,15,0 1/1:0,9:9:27:316,27,0 1/1:0,11:11:33:397,33,0 1/1:0,7:7:18:212,18,0 1/1:0,11:11:27:369,27,0 1/1:0,13:13:39:492,39,0 0/1:7,9:15:99:235,0,158 1/1:0,7:7:18:231,18,0 1/1:0,4:4:12:154,12,0 1/1:0,8:8:24:296,24,0 1/1:0,7:7:21:270,21,0 +1 878314 rs142558220 G C 2808.55 VQSRTrancheSNP99.00to99.90 AC=3;AF=9.40000e-02;AN=32;BaseQRankSum=1.88800e+00;DB;DP=117;Dels=0.00000e+00;FS=1.06220e+01;HaplotypeScore=2.21900e-01;InbreedingCoeff=3.64000e-02;MQ=5.94000e+01;MQ0=1;MQRankSum=1.65200e+00;QD=9.46000e+00;ReadPosRankSum=-3.88300e+00;SNPEFF_AMINO_ACID_CHANGE=G480;SNPEFF_CODON_CHANGE=ggG/ggC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_877939_878438;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=6.85000e+00;culprit=QD;CSQ=C|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|3643|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|2385|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|1523|1440|480|G|ggG/ggC|rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||11/14|||ENST00000342066.3:c.1440N>C|ENST00000342066.3:c.1440N>C(p.%3D)|C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||POSITION:0.703812316715543||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|1270|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|42|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|132|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000474461|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|802|||||rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|retained_intron||||||||||4/4|||ENST00000474461.1:n.802N>C||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000455979|Transcript|synonymous_variant|920|921|307|G|ggG/ggC|rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||5/7|||ENST00000455979.1:c.920N>C|ENST00000455979.1:c.920N>C(p.%3D)|C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||POSITION:0.566769230769231||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|1270|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|761|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|1271|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|1163|1164|388|G|ggG/ggC|rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||9/12|||ENST00000341065.4:c.1163N>C|ENST00000341065.4:c.1163N>C(p.%3D)|C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||POSITION:0.65799886941775||NON_CAN_SPLICE_SURR|||||||,C||ENSR00000528857|RegulatoryFeature|regulatory_region_variant||||||rs142558220&COSM426784|1||||||regulatory_region|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||||||||||| GT:AD:DP:GQ:PL 0/1:2,1:3:30:30,0,67 0/0:2,0:2:6:0,6,82 0/1:2,3:5:61:93,0,61 0/0:2,0:2:6:0,6,72 0/0:1,0:1:3:0,3,37 0/1:2,3:5:54:93,0,54 0/0:16,0:16:45:0,45,560 0/0:5,0:5:15:0,15,188 0/0:12,0:12:33:0,33,414 0/0:10,0:10:30:0,30,393 0/0:16,0:16:48:0,48,617 0/0:5,0:5:15:0,15,181 0/0:5,0:5:15:0,15,193 0/0:13,0:13:36:0,36,439 0/0:9,0:9:24:0,24,317 0/0:8,0:8:21:0,21,276 +1 878809 rs191952374 C T 1761.84 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-7.95300e+00;DB;DP=453;Dels=0.00000e+00;FS=1.68300e+00;HaplotypeScore=2.28500e-01;InbreedingCoeff=-3.10000e-03;MQ=5.91000e+01;MQ0=0;MQRankSum=1.29700e+00;QD=1.36600e+01;ReadPosRankSum=-8.52000e-01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=9.25000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs191952374|1|4138|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs191952374|1|1890|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000342066|Transcript|intron_variant||||||rs191952374|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||12/13||ENST00000342066.3:c.1689+52N>T||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||INTRON_SIZE:320||NON_CAN_SPLICE|||||||,T|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs191952374|1|775|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs191952374|1|537|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs191952374|1|627|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs191952374|1|435|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|intron_variant||||||rs191952374|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||6/6||ENST00000455979.1:c.1169+52N>T||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||INTRON_SIZE:320||NON_CAN_SPLICE|||||||,T|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs191952374|1|775|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs191952374|1|1256|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs191952374|1|776|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|intron_variant||||||rs191952374|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||10/11||ENST00000341065.4:c.1412+52N>T||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||INTRON_SIZE:320||NON_CAN_SPLICE|||||||,T||ENSR00000528858|RegulatoryFeature|regulatory_region_variant||||||rs191952374|1||||||regulatory_region|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||||||||||| GT:AD:DP:GQ:PL 0/0:35,0:35:99:0,105,1323 0/0:24,0:24:72:0,72,960 0/0:31,0:31:93:0,93,1172 0/0:10,0:10:30:0,30,376 0/0:10,0:10:30:0,30,370 0/0:12,0:12:36:0,36,453 0/0:35,0:35:99:0,105,1376 0/0:33,0:33:99:0,99,1273 0/0:31,0:31:93:0,93,1240 0/0:33,0:33:96:0,96,1192 0/0:33,0:33:99:0,99,1281 0/0:25,0:25:75:0,75,983 0/1:18,16:33:99:488,0,504 0/0:33,0:33:99:0,99,1273 0/0:44,0:44:99:0,132,1698 0/0:31,0:31:90:0,90,1198 +1 879576 rs115979567 C T 18648.64 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-2.26830e+01;DB;DP=839;Dels=0.00000e+00;FS=2.49350e+01;HaplotypeScore=4.12600e-01;InbreedingCoeff=-2.18000e-02;MQ=5.92100e+01;MQ0=1;MQRankSum=1.02100e+00;QD=1.36100e+01;ReadPosRankSum=7.91400e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=4.39000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs115979567|1|4905|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs115979567|1|1123|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000342066|Transcript|3_prime_UTR_variant|2172|||||rs115979567|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||14/14|||ENST00000342066.3:c.*43N>T||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs115979567|1|8|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs115979567|1|1304|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs115979567|1|1394|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs115979567|1|1202|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|3_prime_UTR_variant|1668|||||rs115979567|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||7/7|||ENST00000455979.1:c.*43N>T||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs115979567|1|8|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs115979567|1|2023|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs115979567|1|9|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|3_prime_UTR_variant|1812|||||rs115979567|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||12/12|||ENST00000341065.4:c.*43N>T||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||NON_CAN_SPLICE_SURR||||||| GT:AD:DP:GQ:PL 0/0:66,0:66:99:0,199,2441 0/1:25,28:51:99:767,0,834 0/0:55,0:55:99:0,166,2079 0/0:11,0:11:33:0,33,392 0/0:15,0:15:45:0,45,554 0/0:17,0:17:51:0,51,622 0/0:50,0:50:99:0,150,1966 0/0:65,0:65:99:0,196,2507 0/0:60,0:60:99:0,181,2268 0/0:70,0:70:99:0,211,2589 0/0:64,0:64:99:0,193,2452 0/0:65,0:65:99:0,196,2507 0/0:56,0:56:99:0,169,2117 0/0:60,0:60:99:0,181,2359 0/0:79,0:79:99:0,238,2986 0/0:55,0:55:99:0,165,2099 +1 881070 rs41285794 G A 20769.13 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-9.52200e+00;DB;DP=1185;Dels=0.00000e+00;FS=1.15500e+01;HaplotypeScore=1.69500e-01;InbreedingCoeff=-1.83000e-02;MQ=5.90700e+01;MQ0=0;MQRankSum=1.85940e+01;QD=1.31500e+01;ReadPosRankSum=-8.90700e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=4.22000e+00;culprit=InbreedingCoeff;CSQ=A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs41285794|1|128|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs41285794|1|1115|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs41285794|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||16/18||ENST00000327044.6:c.1918-37N>T||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||INTRON_SIZE:519||NON_CAN_SPLICE|||||||,A|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs41285794|1|2798|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs41285794|1|2888|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs41285794|1|2696|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs41285794|1|1431|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000483767|Transcript|intron_variant&non_coding_transcript_variant||||||rs41285794|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||2/4||ENST00000483767.1:n.774-37N>T||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs41285794|1|3517|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs41285794|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||14/16||ENST00000477976.1:n.3365-37N>T||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs41285794|1|1115|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:78,0:78:99:0,235,2947 0/0:66,0:66:99:0,199,2595 0/0:59,0:59:99:0,178,2182 0/0:37,0:37:99:0,111,1365 0/0:36,0:36:99:0,108,1331 0/0:33,0:33:99:0,99,1192 0/0:69,0:69:99:0,208,2662 0/0:88,0:88:99:0,265,3395 0/0:98,0:98:99:0,295,3781 0/1:36,31:64:99:982,0,1021 0/0:86,0:86:99:0,259,3318 0/0:93,0:93:99:0,280,3588 0/0:92,0:92:99:0,277,3549 0/0:102,0:102:99:0,307,3935 0/0:89,0:89:99:0,268,3433 0/0:95,0:95:99:0,286,3665 +1 881627 rs2272757 G A 411792.28 PASS AC=22;AF=6.88000e-01;AN=32;BaseQRankSum=-3.32930e+01;DB;DP=644;Dels=0.00000e+00;FS=2.51600e+00;HaplotypeScore=5.86200e-01;InbreedingCoeff=3.09600e-01;MQ=5.88200e+01;MQ0=7;MQRankSum=6.81600e+00;QD=2.28900e+01;ReadPosRankSum=1.01500e+00;SNPEFF_AMINO_ACID_CHANGE=L615;SNPEFF_CODON_CHANGE=Ctg/Ttg;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_881553_881666;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=4.35000e+00;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs2272757&COSM1344685|1|685|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|1672|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|synonymous_variant|1893|1843|615|L|Ctg/Ttg|rs2272757&COSM1344685|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|||16/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1843N>T|ENST00000327044.6:c.1843N>T(p.%3D)|A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||POSITION:0.819111111111111||NON_CAN_SPLICE_SURR|||||||,A|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|3355|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|3445|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|3253|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|1988|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000483767|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|699|||||rs2272757&COSM1344685|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||2/5|||ENST00000483767.1:n.699N>T||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|4074|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|3290|||||rs2272757&COSM1344685|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||14/17|||ENST00000477976.1:n.3290N>T||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|1672|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 1/1:0,39:38:99:1384,111,0 0/0:61,0:61:99:0,184,2353 0/1:24,17:38:99:494,0,613 1/1:0,16:16:48:550,48,0 1/1:0,18:18:54:649,54,0 1/1:0,25:25:66:826,66,0 1/1:0,51:51:99:1886,153,0 0/1:25,23:46:99:661,0,639 1/1:0,33:33:99:1220,99,0 1/1:0,52:52:99:1879,156,0 1/1:0,45:45:99:1701,135,0 0/0:58,0:58:99:0,175,2237 0/1:17,18:34:99:523,0,478 1/1:0,44:44:99:1627,132,0 0/1:20,25:41:99:674,0,488 0/0:44,1:44:99:0,120,1521 +1 881918 rs35471880 G A 26418.87 PASS AC=5;AF=1.56000e-01;AN=32;BaseQRankSum=6.25300e+00;DB;DP=1040;Dels=0.00000e+00;FS=2.27620e+01;HaplotypeScore=2.29500e-01;InbreedingCoeff=-2.81000e-02;MQ=5.57400e+01;MQ0=40;MQRankSum=1.69390e+01;QD=1.18200e+01;ReadPosRankSum=-6.75000e-01;SNPEFF_AMINO_ACID_CHANGE=S556L;SNPEFF_CODON_CHANGE=tCg/tTg;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_881782_881925;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=1.82000e+00;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs35471880|1|976|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs35471880|1|1963|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|missense_variant|1717|1667|556|S/L|tCg/tTg|rs35471880|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|deleterious(0.03)|benign(0.311)|15/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1667N>T|ENSP00000317992.6:p.Ser556Leu|A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||POSITION:0.740888888888889||NON_CAN_SPLICE_SURR||B%3BB%3BB|16.43|D|T|D|T,A|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs35471880|1|3646|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs35471880|1|3736|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs35471880|1|3544|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs35471880|1|2279|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000483767|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|523|||||rs35471880|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||1/5|||ENST00000483767.1:n.523N>T||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs35471880|1|4365|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|3114|||||rs35471880|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||13/17|||ENST00000477976.1:n.3114N>T||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs35471880|1|1963|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:73,0:73:99:0,220,2699 0/0:70,0:70:99:0,211,2589 0/0:66,0:66:99:0,199,2385 0/1:12,18:29:99:475,0,278 0/0:28,0:28:78:0,78,843 0/1:18,10:27:99:271,0,511 0/1:34,36:67:99:876,0,921 0/1:37,38:74:99:966,0,944 0/0:69,0:69:99:0,208,2493 0/0:93,0:93:99:0,280,3279 0/1:41,32:70:99:777,0,1118 0/0:76,0:76:99:0,229,2746 0/0:73,0:73:99:0,220,2573 0/0:69,0:69:99:0,208,2493 0/0:82,0:82:99:0,247,2963 0/0:74,0:74:99:0,223,2609 +1 883485 . C T 81.94 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-3.68100e+00;DP=94;Dels=0.00000e+00;FS=0.00000e+00;HaplotypeScore=1.64200e-01;InbreedingCoeff=-2.46000e-02;MQ=5.53400e+01;MQ0=0;MQRankSum=3.55900e+00;QD=3.03000e+00;ReadPosRankSum=-1.07900e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-3.92700e-01;culprit=MQ;CSQ=T|ENSG00000188976|ENST00000483767|Transcript|upstream_gene_variant||||||rs374301410|1|1045|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||T:0|T:0.000117|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs374301410|1|3846|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||||||||||||T:0|T:0.000117||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs374301410|1|2543|-1|NOC2L|HGNC|24517|processed_transcript||||||||||||||||||||T:0|T:0.000117|||||||||||||||||,T|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs374301410|1|3530|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||||||||||||T:0|T:0.000117||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs374301410|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||14/18||ENST00000327044.6:c.1659+26N>A|||||||T:0|T:0.000117||||||||INTRON_SIZE:1585||NON_CAN_SPLICE|||||||,T|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs374301410|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||12/16||ENST00000477976.1:n.3106+26N>A|||||||T:0|T:0.000117|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs374301410|1|3530|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||||||||||||T:0|T:0.000117||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:8,0:8:24:0,24,304 0/0:3,0:3:9:0,9,118 0/0:5,0:5:15:0,15,178 0/0:5,0:5:15:0,15,181 0/0:2,0:2:6:0,6,69 0/0:4,0:5:12:0,12,145 0/0:6,0:6:18:0,18,217 0/0:10,0:10:30:0,30,378 0/0:11,0:11:33:0,33,411 0/1:5,1:6:14:14,0,181 0/0:10,0:10:30:0,30,373 0/0:4,0:4:9:0,9,114 0/0:5,0:5:15:0,15,193 0/0:4,0:4:12:0,12,157 0/0:6,0:6:18:0,18,229 0/0:3,0:4:9:0,9,122 +1 883625 rs4970378 A G 232503.78 PASS AC=30;AF=1.00000e+00;AN=30;DB;DP=117;Dels=0.00000e+00;FS=0.00000e+00;HaplotypeScore=1.37000e-01;InbreedingCoeff=-1.43000e-02;MQ=5.74300e+01;MQ0=0;QD=3.66300e+01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-2.60400e-01;culprit=MQ;CSQ=G|ENSG00000188976|ENST00000483767|Transcript|upstream_gene_variant||||||rs4970378|1|1185|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0000|||||G:0.999543||||||||||||||||||,G|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs4970378|1|3986|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0000|||||G:0.999543|||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs4970378|1|2683|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0000|||||G:0.999543||||||||||||||||||,G|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs4970378|1|3670|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0000|||||G:0.999543|||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs4970378|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||13/18||ENST00000327044.6:c.1558-13N>C||A:0.0000|||||G:0.999543|||||||||INTRON_SIZE:257||NON_CAN_SPLICE&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs4970378|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||11/16||ENST00000477976.1:n.3005-13N>C||A:0.0000|||||G:0.999543||||||||||||||||||,G|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs4970378|1|3670|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0000|||||G:0.999543|||||||||||EXON_INTRON_UNDEF&ANC_ALLELE||||||| GT:AD:DP:GQ:PL 1/1:0,4:4:12:151,12,0 1/1:0,3:3:9:118,9,0 1/1:0,6:6:18:212,18,0 1/1:0,5:5:15:185,15,0 ./.:.:.:.:. 1/1:0,4:4:12:142,12,0 1/1:0,13:13:39:501,39,0 1/1:0,8:8:21:276,21,0 1/1:0,19:19:57:718,57,0 1/1:0,9:9:27:340,27,0 1/1:0,12:12:36:454,36,0 1/1:0,4:4:12:151,12,0 1/1:0,5:5:15:198,15,0 1/1:0,16:16:48:605,48,0 1/1:0,3:3:9:119,9,0 1/1:0,5:6:15:191,15,0 +1 883918 rs139116730 G A 4594.12 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=6.89000e+00;DB;DP=1146;Dels=0.00000e+00;FS=4.31330e+01;HaplotypeScore=8.65000e-02;InbreedingCoeff=-4.00000e-03;MQ=5.62500e+01;MQ0=14;MQRankSum=1.10440e+01;QD=1.07800e+01;ReadPosRankSum=-1.97100e+00;SNPEFF_AMINO_ACID_CHANGE=S503;SNPEFF_CODON_CHANGE=tcC/tcT;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_883870_883983;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=5.95000e-01;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000483767|Transcript|upstream_gene_variant||||||rs139116730|1|1478|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488|||||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs139116730|1|4279|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs139116730|1|2976|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488|||||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs139116730|1|3963|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|synonymous_variant|1559|1509|503|S|tcC/tcT|rs139116730|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|||13/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1509N>T|ENST00000327044.6:c.1509N>T(p.%3D)|A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||POSITION:0.670666666666667||NON_CAN_SPLICE_SURR|||||||,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2956|||||rs139116730|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||11/17|||ENST00000477976.1:n.2956N>T||A:0.0005||||A:0.0013|A:0.000227|A:0.003488|||||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs139116730|1|3963|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:76,0:76:99:0,229,2746 0/0:47,0:47:99:0,141,1738 0/0:75,0:75:99:0,226,2710 0/0:36,0:36:99:0,108,1201 0/0:37,0:37:99:0,111,1271 0/0:42,0:42:99:0,126,1443 0/0:74,0:74:99:0,223,2609 0/0:82,0:82:99:0,247,2963 0/0:120,0:120:99:0,361,4336 0/0:96,0:96:99:0,289,3468 0/1:38,33:68:99:823,0,921 0/0:78,0:78:99:0,235,2818 0/0:56,0:56:99:0,169,1974 0/0:92,0:92:99:0,277,3402 0/0:78,0:78:99:0,235,2884 0/0:89,0:89:99:0,268,3216 +1 887560 rs3748595 A C 806833.88 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=5.43470e+01;DB;DP=472;Dels=0.00000e+00;FS=1.69080e+01;HaplotypeScore=2.91900e-01;InbreedingCoeff=7.38000e-02;MQ=5.93900e+01;MQ0=0;MQRankSum=1.20610e+01;QD=3.46800e+01;ReadPosRankSum=7.92100e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000487214;VQSLOD=6.35000e-01;culprit=FS;CSQ=C|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs3748595|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||10/18||ENST00000327044.6:c.1192-41N>G||A:0.1602|C:0.78|C:0.86|C:0.86|C:0.85|C:0.831139|C:0.932674||||||||INTRON_SIZE:272||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs3748595|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||8/16||ENST00000477976.1:n.2639-41N>G||A:0.1602|C:0.78|C:0.86|C:0.86|C:0.85|C:0.831139|C:0.932674|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3748595|1|2246|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.1602|C:0.78|C:0.86|C:0.86|C:0.85|C:0.831139|C:0.932674||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,44:44:99:1706,132,0 1/1:0,43:43:99:1773,129,0 1/1:0,41:41:99:1582,123,0 1/1:0,19:19:54:687,54,0 1/1:0,23:23:69:851,69,0 1/1:0,10:10:30:370,30,0 1/1:0,33:33:99:1320,99,0 1/1:1,25:25:75:1020,75,0 1/1:0,26:26:78:1040,78,0 1/1:0,25:25:75:1000,75,0 1/1:0,36:36:99:1461,108,0 0/1:23,14:36:99:439,0,642 1/1:0,23:23:69:930,69,0 1/1:0,28:28:84:1121,84,0 1/1:0,23:23:69:904,69,0 1/1:0,37:37:99:1420,108,0 +1 887801 rs3828047 A G 1348829.24 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=4.41560e+01;DB;DP=777;Dels=0.00000e+00;FS=8.43510e+01;HaplotypeScore=3.07000e-01;InbreedingCoeff=-1.77000e-02;MQ=5.58800e+01;MQ0=35;MQRankSum=-2.15910e+01;QD=3.44400e+01;ReadPosRankSum=5.44300e+00;SNPEFF_AMINO_ACID_CHANGE=T394;SNPEFF_CODON_CHANGE=acT/acC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_887792_887980;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=-6.22100e-01;culprit=MQ;CSQ=G|ENSG00000188976|ENST00000327044|Transcript|synonymous_variant|1232|1182|394|T|acT/acC|rs3828047&COSM426785|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|||10/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1182N>C|ENST00000327044.6:c.1182N>C(p.%3D)|A:0.0716|G:0.90|G:0.92|G:0.92|G:0.95|G:0.906037|G:0.938372||0&1||||||POSITION:0.525333333333333||NON_CAN_SPLICE_SURR&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2629|||||rs3828047&COSM426785|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||8/17|||ENST00000477976.1:n.2629N>C||A:0.0716|G:0.90|G:0.92|G:0.92|G:0.95|G:0.906037|G:0.938372||0&1|||||||||||||||,G|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3828047&COSM426785|1|2005|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0716|G:0.90|G:0.92|G:0.92|G:0.95|G:0.906037|G:0.938372||0&1||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,42:42:99:1553,126,0 1/1:0,48:48:99:1824,138,0 1/1:0,54:54:99:1997,163,0 1/1:0,17:18:48:615,48,0 1/1:0,33:33:99:1220,99,0 1/1:0,30:30:90:1134,90,0 1/1:0,60:60:99:2315,181,0 1/1:0,44:44:99:1526,120,0 1/1:0,71:71:99:2791,214,0 1/1:0,48:48:99:1887,144,0 1/1:0,61:61:99:2398,184,0 0/1:29,33:59:99:915,0,742 1/1:0,30:30:90:1157,90,0 1/1:0,59:59:99:2321,178,0 1/1:0,55:55:99:2137,166,0 1/1:0,65:65:99:2507,196,0 +1 888529 . G A 1833.13 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-9.33700e+00;DP=387;Dels=0.00000e+00;FS=8.33000e-01;HaplotypeScore=1.94900e-01;InbreedingCoeff=-4.20000e-03;MQ=5.60200e+01;MQ0=0;MQRankSum=5.49600e+00;QD=1.10400e+01;ReadPosRankSum=-2.04000e-01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000487214;VQSLOD=1.38000e+00;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs373469542|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||9/18||ENST00000327044.6:c.1002+26N>T|||||||A:0.000908|A:0||||||||INTRON_SIZE:574||NON_CAN_SPLICE|||||||,A|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs373469542|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||7/16||ENST00000477976.1:n.2449+26N>T|||||||A:0.000908|A:0|||||||||||||||||,A|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs373469542|1|1277|-1|NOC2L|HGNC|24517|processed_transcript||||||||||||||||||||A:0.000908|A:0||||||||||||||||| GT:AD:DP:GQ:PL 0/0:19,0:19:57:0,57,703 0/0:26,0:26:78:0,78,1022 0/0:23,0:23:69:0,69,869 0/0:15,0:15:45:0,45,555 0/0:16,0:16:48:0,48,603 0/0:16,0:16:48:0,48,606 0/0:32,0:32:96:0,96,1258 0/0:26,0:26:72:0,72,944 0/0:24,0:24:69:0,69,898 0/1:12,15:26:99:432,0,321 0/0:31,0:31:93:0,93,1240 0/0:24,0:24:72:0,72,944 0/0:20,0:20:60:0,60,756 0/0:27,0:27:78:0,78,1029 0/0:36,0:36:99:0,108,1415 0/0:26,0:26:78:0,78,1022 +1 888659 rs3748597 T C 907727.36 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=4.09230e+01;DB;DP=542;Dels=0.00000e+00;FS=4.67910e+01;HaplotypeScore=2.81100e-01;InbreedingCoeff=-1.65000e-02;MQ=5.48600e+01;MQ0=44;MQRankSum=-2.23740e+01;QD=3.38200e+01;ReadPosRankSum=8.50400e+00;SNPEFF_AMINO_ACID_CHANGE=I300V;SNPEFF_CODON_CHANGE=Atc/Gtc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_888555_888668;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=-6.49600e-01;culprit=MQ;CSQ=C|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs3748597|1|4967|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|missense_variant|948|898|300|I/V|Atc/Gtc|rs3748597|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|tolerated(0.98)|benign(0)|9/19||Superfamily_domains:SSF48371|ENST00000327044.6:c.898N>G|ENSP00000317992.6:p.Ile300Val|T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372||||||||POSITION:0.399111111111111||NON_CAN_SPLICE_SURR&ANC_ALLELE||B|0.940|P|T|T|T,C|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2345|||||rs3748597|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||7/17|||ENST00000477976.1:n.2345N>G||T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3748597|1|1147|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,33:33:96:1198,96,0 1/1:0,29:29:87:1140,87,0 1/1:0,27:27:81:998,81,0 1/1:0,27:27:81:962,81,0 1/1:0,19:19:57:686,57,0 1/1:0,22:22:63:796,63,0 1/1:0,39:39:99:1474,117,0 1/1:0,39:39:99:1504,117,0 1/1:0,32:32:96:1183,96,0 1/1:0,44:44:99:1654,129,0 1/1:0,55:55:99:2079,166,0 0/1:17,21:36:99:502,0,410 1/1:0,37:37:99:1398,111,0 1/1:0,44:44:99:1697,132,0 1/1:0,32:32:96:1209,96,0 1/1:0,27:27:81:1016,81,0 +1 889158 rs56262069 G C 909575.03 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=3.68810e+01;DB;DP=579;Dels=0.00000e+00;FS=2.80669e+02;HaplotypeScore=5.39300e-01;InbreedingCoeff=7.80000e-02;MQ=5.90100e+01;MQ0=0;MQRankSum=-1.97700e+00;QD=3.19700e+01;ReadPosRankSum=8.43100e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000469563;VQSLOD=9.10000e-02;culprit=MQRankSum;CSQ=C|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs13303056|1|4468|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.1529|||||||||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|splice_region_variant&intron_variant||||||rs13303056|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||8/18||ENST00000327044.6:c.888+4N>G||G:0.1529||||||||||||||INTRON_SIZE:493||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|splice_region_variant&intron_variant&non_coding_transcript_variant||||||rs13303056|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||6/16||ENST00000477976.1:n.2335+4N>G||G:0.1529|||||||||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs13303056|1|648|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||G:0.1529||||||||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,45:45:99:1664,135,0 1/1:0,21:21:63:810,63,0 1/1:0,27:27:81:975,81,0 1/1:0,19:18:51:638,51,0 1/1:0,20:20:60:700,60,0 1/1:0,18:18:54:635,54,0 1/1:0,40:40:99:1512,120,0 1/1:0,34:34:99:1312,102,0 1/1:0,45:45:99:1615,132,0 1/1:0,40:40:99:1543,120,0 1/1:0,62:62:99:2392,187,0 0/1:23,19:40:99:499,0,598 1/1:0,45:45:99:1664,135,0 1/1:0,48:48:99:1814,144,0 1/1:0,39:39:99:1503,117,0 1/1:0,37:37:99:1398,111,0 +1 889159 rs13302945 A C 937927.21 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=5.17190e+01;DB;DP=586;Dels=0.00000e+00;FS=2.49622e+02;HaplotypeScore=5.35000e-01;InbreedingCoeff=7.77000e-02;MQ=5.90200e+01;MQ0=0;MQRankSum=1.48040e+01;QD=3.22600e+01;ReadPosRankSum=8.79200e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000469563;VQSLOD=1.40000e-01;culprit=MQ;CSQ=C|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs13302945|1|4467|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|splice_region_variant&intron_variant||||||rs13302945|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||8/18||ENST00000327044.6:c.888+3N>G||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294||||||||INTRON_SIZE:493||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|splice_region_variant&intron_variant&non_coding_transcript_variant||||||rs13302945|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||6/16||ENST00000477976.1:n.2335+3N>G||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs13302945|1|647|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,44:44:99:1663,132,0 1/1:0,21:21:63:794,63,0 1/1:0,28:28:84:1058,84,0 1/1:0,19:18:51:634,51,0 1/1:0,21:21:63:782,63,0 1/1:0,18:18:54:650,54,0 1/1:0,42:42:99:1587,126,0 1/1:0,34:34:99:1312,102,0 1/1:0,45:45:99:1657,132,0 1/1:0,41:41:99:1582,123,0 1/1:0,61:61:99:2353,184,0 0/1:24,19:41:99:482,0,633 1/1:0,43:43:99:1625,129,0 1/1:0,52:52:99:1965,156,0 1/1:0,42:42:99:1557,123,0 1/1:0,35:35:99:1323,105,0 +1 889238 rs3828049 G A 52801.55 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-4.91500e+00;DB;DP=911;Dels=0.00000e+00;FS=4.16200e+01;HaplotypeScore=2.87900e-01;InbreedingCoeff=3.34000e-02;MQ=5.93400e+01;MQ0=1;MQRankSum=3.62800e+00;QD=1.41200e+01;ReadPosRankSum=-2.71000e+00;SNPEFF_AMINO_ACID_CHANGE=A271V;SNPEFF_CODON_CHANGE=gCg/gTg;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_889162_889272;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=5.38000e+00;culprit=MQRankSum;CSQ=A|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs3828049&COSM1602748|1|4388|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1|||||||||||||||,A|ENSG00000188976|ENST00000327044|Transcript|missense_variant|862|812|271|A/V|gCg/gTg|rs3828049&COSM1602748|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|deleterious(0.04)|benign(0.034)|8/19||Superfamily_domains:SSF48371|ENST00000327044.6:c.812N>T|ENSP00000317992.6:p.Ala271Val|A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1||||||POSITION:0.360888888888889||NON_CAN_SPLICE_SURR||D%3BP%3BP|21.3|N|T|D|T,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2259|||||rs3828049&COSM1602748|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||6/17|||ENST00000477976.1:n.2259N>T||A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1|||||||||||||||,A|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3828049&COSM1602748|1|568|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1||||||||||||||| GT:AD:DP:GQ:PL 0/0:53,0:53:99:0,159,1960 0/0:56,0:56:99:0,169,2071 0/0:42,0:42:99:0,126,1517 0/0:23,0:23:69:0,69,763 0/0:31,0:31:93:0,93,1007 0/0:26,0:26:69:0,69,754 0/0:55,0:55:99:0,166,1987 0/0:59,0:59:99:0,178,2132 0/0:67,0:67:99:0,202,2362 0/0:79,0:79:99:0,238,2854 0/0:82,0:82:99:0,247,2963 0/1:32,31:62:99:888,0,808 0/0:75,0:75:99:0,226,2644 0/0:66,0:66:99:0,199,2385 0/0:68,0:68:99:0,205,2397 0/0:67,0:67:99:0,202,2362 +1 894573 rs13303010 G A 310883.38 PASS AC=30;AF=9.38000e-01;AN=32;BaseQRankSum=1.22670e+01;DB;DP=304;Dels=0.00000e+00;FS=2.34720e+01;HaplotypeScore=3.24800e-01;InbreedingCoeff=4.23300e-01;MQ=5.89800e+01;MQ0=0;MQRankSum=1.80380e+01;QD=2.67400e+01;ReadPosRankSum=2.89300e+00;SNPEFF_EFFECT=INTRON;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=1.10000e+00;culprit=MQ;CSQ=A|ENSG00000187961|ENST00000466300|Transcript|upstream_gene_variant||||||rs13303010|1|3534|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs13303010|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||1/18||ENST00000327044.6:c.26+22N>T||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942||||||||INTRON_SIZE:133||NON_CAN_SPLICE|||||||,A|ENSG00000187961|ENST00000338591|Transcript|upstream_gene_variant||||||rs13303010|1|1394|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|upstream_gene_variant||||||rs13303010|1|2256|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000469563|Transcript|intron_variant&non_coding_transcript_variant||||||rs13303010|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||1/1||ENST00000469563.1:n.42+22N>T||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs13303010|1|735|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs13303010|1|4359|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000487214|Transcript|intron_variant&non_coding_transcript_variant||||||rs13303010|1||-1|NOC2L|HGNC|24517|processed_transcript|||||||||||1/6||ENST00000487214.1:n.95+22N>T||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A||ENSR00000528861|RegulatoryFeature|regulatory_region_variant||||||rs13303010|1||||||regulatory_region|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,24:24:72:898,72,0 0/1:10,8:17:99:196,0,291 1/1:0,13:12:36:454,36,0 1/1:0,7:7:21:254,21,0 1/1:0,5:5:15:181,15,0 1/1:0,13:13:36:428,36,0 1/1:0,31:31:93:1120,93,0 1/1:0,24:24:72:867,72,0 1/1:0,26:26:78:924,78,0 1/1:0,26:26:78:958,78,0 1/1:0,19:19:57:670,57,0 0/1:17,6:22:99:127,0,513 1/1:0,20:20:60:723,60,0 1/1:0,23:23:69:869,69,0 1/1:0,19:19:57:686,57,0 1/1:0,16:16:48:505,48,0 +1 896922 . C T 1253.52 PASS AC=2;AF=6.30000e-02;AN=32;BaseQRankSum=-8.14600e+00;DP=943;Dels=0.00000e+00;FS=5.89500e+00;HaplotypeScore=1.37200e-01;InbreedingCoeff=-1.30000e-03;MQ=5.92800e+01;MQ0=0;MQRankSum=1.05600e+00;QD=1.01100e+01;ReadPosRankSum=-1.19000e+00;SNPEFF_AMINO_ACID_CHANGE=A119;SNPEFF_CODON_CHANGE=gcC/gcT;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_896673_896932;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=8.89000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187961|ENST00000466300|Transcript|upstream_gene_variant|||||||1|1185|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E|||||||||||||||||||||||||||||||,T|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant|||||||1|2252|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000338591|Transcript|synonymous_variant|464|357|119|A|gcC/gcT||1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0|||2/12||Pfam_domain:PF00651&PROSITE_profiles:PS50097&SMART_domains:SM00225&Superfamily_domains:SSF54695&PIRSF_domain:PIRSF037037|ENST00000338591.3:c.357N>T|ENST00000338591.3:c.357N>T(p.%3D)|||||||||||||||POSITION:0.1850699844479||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant|||||||1|4960|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000463212|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|94||||||1||1|KLHL17|HGNC|24023|retained_intron||||||||||1/2|||ENST00000463212.1:n.94N>T|||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant|||||||1|4960|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant|||||||1|2286|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant|||||||1|4955|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant|||||||1|3084|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant|||||||1|2010|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant|||||||1|2233|-1|NOC2L|HGNC|24517|processed_transcript||||||||||||||||||||||||||||||||||||||,T||ENSR00000528861|RegulatoryFeature|regulatory_region_variant|||||||1||||||regulatory_region|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:71,0:71:99:0,214,2684 0/0:69,0:69:99:0,208,2713 0/0:68,0:68:99:0,205,2515 0/0:20,0:20:57:0,57,722 0/0:29,0:29:87:0,87,1096 0/0:36,0:36:99:0,99,1225 0/0:61,0:61:99:0,184,2353 0/0:58,0:58:99:0,175,2192 0/0:68,0:68:99:0,205,2673 0/1:41,25:63:99:678,0,1190 0/0:87,0:87:99:0,262,3356 0/0:52,0:52:99:0,157,2006 0/1:35,23:55:99:651,0,922 0/0:79,0:79:99:0,238,3048 0/0:73,0:73:99:0,220,2816 0/0:54,0:54:99:0,163,2045 +1 897325 rs4970441 G C 2226684.78 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=3.69960e+01;DB;DP=1475;Dels=0.00000e+00;FS=1.12830e+01;HaplotypeScore=4.66400e-01;InbreedingCoeff=1.15000e-01;MQ=5.95500e+01;MQ0=1;MQRankSum=2.60000e-02;QD=3.33700e+01;ReadPosRankSum=6.38900e+00;SNPEFF_AMINO_ACID_CHANGE=A203;SNPEFF_CODON_CHANGE=gcG/gcC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_897206_897427;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=5.29000e+00;culprit=ReadPosRankSum;CSQ=C|ENSG00000187961|ENST00000466300|Transcript|upstream_gene_variant||||||rs4970441|1|782|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs4970441|1|2655|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000338591|Transcript|synonymous_variant|716|609|203|A|gcG/gcC|rs4970441|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0|||4/12||Pfam_domain:PF07707&SMART_domains:SM00875&PIRSF_domain:PIRSF037037|ENST00000338591.3:c.609N>C|ENST00000338591.3:c.609N>C(p.%3D)|G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||POSITION:0.315707620528771||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs4970441|1|4557|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|422|||||rs4970441|1||1|KLHL17|HGNC|24023|retained_intron||||||||||2/2|||ENST00000463212.1:n.422N>C||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs4970441|1|4557|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs4970441|1|2689|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs4970441|1|4552|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs4970441|1|3487|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs4970441|1|1607|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs4970441|1|2636|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,94:94:99:3476,283,0 1/1:0,87:87:99:3356,262,0 1/1:0,108:108:99:3994,325,0 1/1:0,56:56:99:2023,169,0 1/1:0,59:59:99:2182,178,0 1/1:0,46:46:99:1701,138,0 1/1:0,100:100:99:3780,301,0 1/1:0,127:127:99:4800,382,0 1/1:0,127:127:99:4899,382,0 1/1:0,127:127:99:4800,382,0 1/1:0,117:117:99:4422,352,0 0/1:42,33:71:99:891,0,1116 1/1:0,78:78:99:2948,235,0 1/1:0,107:107:99:4128,322,0 1/1:0,95:95:99:3665,286,0 1/1:0,76:76:99:2873,229,0 +1 898313 . C T 4423.71 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=1.00100e+01;DP=235;Dels=0.00000e+00;FS=6.83200e+00;HaplotypeScore=5.07500e-01;InbreedingCoeff=9.84000e-02;MQ=5.92600e+01;MQ0=0;MQRankSum=-5.62000e-01;QD=1.22500e+01;ReadPosRankSum=-4.59200e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;VQSLOD=3.67000e+00;culprit=MQRankSum;CSQ=T|ENSG00000187961|ENST00000466300|Transcript|intron_variant&NMD_transcript_variant||||||rs375277853|1||1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||1/5||ENST00000466300.1:c.191+16N>T|||||||||||||||||||||||||,T|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs375277853|1|3643|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||rs375277853|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||6/11||ENST00000338591.3:c.1042+16N>T||||||||||||||||INTRON_SIZE:191||NON_CAN_SPLICE|||||||,T|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs375277853|1|3569|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs375277853|1|455|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs375277853|1|3569|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs375277853|1|3677|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs375277853|1|3564|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs375277853|1|4475|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs375277853|1|619|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs375277853|1|3624|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:19,0:19:57:0,57,653 0/0:12,0:12:36:0,36,423 0/0:21,0:21:63:0,63,740 0/0:6,0:6:15:0,15,157 0/0:2,0:2:6:0,6,63 0/0:6,0:6:15:0,15,159 0/0:14,0:14:42:0,42,455 0/0:18,0:18:54:0,54,624 0/0:14,0:14:39:0,39,447 0/0:25,0:25:72:0,72,805 0/0:16,0:16:48:0,48,564 0/1:13,8:20:99:190,0,314 0/0:21,0:21:63:0,63,702 0/0:17,1:18:18:0,18,560 0/0:11,0:11:30:0,30,342 0/0:12,0:12:36:0,36,393 +1 898323 rs6605071 T C 353673.96 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=1.91890e+01;DB;DP=221;Dels=0.00000e+00;FS=9.64600e+00;HaplotypeScore=4.04000e-01;InbreedingCoeff=-2.15000e-02;MQ=5.91700e+01;MQ0=0;MQRankSum=-4.60000e-02;QD=3.77900e+01;ReadPosRankSum=3.36900e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;VQSLOD=4.11000e+00;culprit=InbreedingCoeff;CSQ=C|ENSG00000187961|ENST00000466300|Transcript|intron_variant&NMD_transcript_variant||||||rs6605071|1||1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||1/5||ENST00000466300.1:c.191+26N>C||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs6605071|1|3653|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||rs6605071|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||6/11||ENST00000338591.3:c.1042+26N>C||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||INTRON_SIZE:191||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs6605071|1|3559|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs6605071|1|465|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs6605071|1|3559|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs6605071|1|3687|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs6605071|1|3554|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs6605071|1|4485|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs6605071|1|609|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs6605071|1|3634|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,18:18:54:688,54,0 1/1:0,8:8:24:315,24,0 1/1:0,15:15:45:579,45,0 1/1:0,7:7:21:262,21,0 1/1:0,3:3:9:111,9,0 1/1:0,4:4:9:122,9,0 1/1:0,20:20:60:786,60,0 1/1:0,16:16:48:641,48,0 1/1:0,13:13:36:457,36,0 1/1:0,27:27:78:1030,78,0 1/1:0,18:18:54:720,54,0 0/1:13,4:17:99:112,0,396 1/1:0,18:18:54:708,54,0 1/1:0,13:13:39:525,39,0 1/1:0,10:10:30:393,30,0 1/1:1,13:14:5:460,5,0 +1 898467 rs41285808 C T 14490.29 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-2.26300e+00;DB;DP=270;Dels=0.00000e+00;FS=1.33000e+00;HaplotypeScore=2.81700e-01;InbreedingCoeff=3.75000e-02;MQ=5.93000e+01;MQ0=0;MQRankSum=3.96000e+00;QD=1.37100e+01;ReadPosRankSum=-1.57400e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;VQSLOD=7.17000e+00;culprit=FS;CSQ=T|ENSG00000187961|ENST00000466300|Transcript|synonymous_variant&NMD_transcript_variant|247|249|83|P|ccC/ccT|rs41285808|1||1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E|||2/6|||ENST00000466300.1:c.247N>T|ENST00000466300.1:c.247N>T(p.%3D)|T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs41285808|1|3797|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||rs41285808|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||6/11||ENST00000338591.3:c.1043-22N>T||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||INTRON_SIZE:191||NON_CAN_SPLICE|||||||,T|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs41285808|1|3415|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs41285808|1|609|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs41285808|1|3415|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs41285808|1|3831|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs41285808|1|3410|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs41285808|1|4629|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs41285808|1|465|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs41285808|1|3778|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||||||||| GT:AD:DP:GQ:PL 0/0:28,0:28:84:0,84,1030 0/0:15,0:15:45:0,45,579 0/0:25,0:25:75:0,75,916 0/0:6,0:6:18:0,18,197 0/0:5,0:5:15:0,15,172 0/0:3,0:3:9:0,9,100 0/0:14,0:14:42:0,42,480 0/0:22,0:22:66:0,66,817 0/0:23,0:23:69:0,69,831 0/0:12,0:12:36:0,36,431 0/0:18,0:18:51:0,51,646 0/1:17,10:26:99:278,0,440 0/0:21,0:21:51:0,51,644 0/0:13,0:13:39:0,39,481 0/0:18,0:18:54:0,54,666 0/0:21,0:21:60:0,60,723 +1 899959 . G GC 2073.57 PASS AC=1;AF=5.00000e-02;AN=20;BaseQRankSum=8.77000e-01;DP=19;FS=1.24470e+02;HaplotypeScore=1.51273e+01;InbreedingCoeff=6.94000e-02;MQ=4.52200e+01;MQ0=0;MQRankSum=-8.47500e+00;QD=1.40100e+01;ReadPosRankSum=4.26000e-01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;CSQ=C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||TMP_ESP_1_899960_899959|1|1922|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|||||||||||||C:0.152075|C:0.090390||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||TMP_ESP_1_899960_899959|1|2101|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||C:0.152075|C:0.090390|||||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||TMP_ESP_1_899960_899959|1|1922|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|||||||||||||C:0.152075|C:0.090390||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||TMP_ESP_1_899960_899959|1|49|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E|||||||||||||C:0.152075|C:0.090390|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||TMP_ESP_1_899960_899959|1|1917|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|||||||||||||C:0.152075|C:0.090390||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||TMP_ESP_1_899960_899959|1|415|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||C:0.152075|C:0.090390|||||||||||||||||,C|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||TMP_ESP_1_899960_899959|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||11/11||ENST00000338591.3:c.1700+49_1700+50insC|||||||C:0.152075|C:0.090390||||||||INTRON_SIZE:432||NON_CAN_SPLICE||||||| GT:AD:DP:GQ:PL ./.:.:.:.:. ./.:.:.:.:. 0/0:3,0:3:9:0,9,136 0/0:1,0:1:3:0,3,45 0/0:1,0:1:3:0,3,45 0/0:2,0:2:6:0,6,91 0/1:3,1:4:28:28,0,124 0/0:2,0:2:6:0,6,74 0/0:2,0:2:6:0,6,91 0/0:2,0:2:6:0,6,91 ./.:.:.:.:. ./.:.:.:.:. ./.:.:.:.:. 0/0:1,0:1:3:0,3,45 ./.:.:.:.:. 0/0:1,0:1:3:0,3,45 +1 900505 rs28705211 G C 222602.28 PASS AC=8;AF=2.50000e-01;AN=32;BaseQRankSum=6.97200e+00;DB;DP=885;Dels=0.00000e+00;FS=4.61940e+01;HaplotypeScore=1.18840e+00;InbreedingCoeff=1.98200e-01;MQ=5.92300e+01;MQ0=0;MQRankSum=1.76580e+01;QD=1.80400e+01;ReadPosRankSum=1.01980e+01;SNPEFF_AMINO_ACID_CHANGE=V497;SNPEFF_CODON_CHANGE=gtG/gtC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_900343_901094;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000455747;VQSLOD=1.37000e+00;culprit=HaplotypeScore;CSQ=C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs28705211&COSM426805|1|1377|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs28705211&COSM426805|1|2647|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs28705211&COSM426805|1|1377|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs28705211&COSM426805|1|595|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs28705211&COSM426805|1|1372|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs28705211&COSM426805|1|961|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081||||||||||||||,C|ENSG00000187961|ENST00000338591|Transcript|synonymous_variant|1970|1863|621|V|gtG/gtC|rs28705211&COSM426805|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0|||12/12||SMART_domains:SM00612&Superfamily_domains:SSF117281&PIRSF_domain:PIRSF037037|ENST00000338591.3:c.1863N>C|ENST00000338591.3:c.1863N>C(p.%3D)|C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||POSITION:0.965785381026439||END_TRUNC&NON_CAN_SPLICE_SURR||||||| GT:AD:DP:GQ:PL 0/0:87,0:87:99:0,262,3217 0/1:43,24:61:99:697,0,1146 0/1:35,29:60:99:812,0,913 0/0:23,0:23:69:0,69,851 0/0:22,0:22:66:0,66,788 0/0:33,1:34:96:0,96,1150 0/0:54,0:54:99:0,162,1973 0/1:32,27:56:99:720,0,880 0/0:79,0:79:99:0,235,2850 0/0:74,0:74:99:0,214,2587 0/0:65,0:65:99:0,196,2354 0/1:24,26:48:99:738,0,687 0/1:27,28:54:99:795,0,709 0/0:58,0:58:99:0,175,2173 0/1:28,27:54:99:805,0,735 1/1:0,56:56:99:2066,169,0 +1 902024 rs181910588 G A 406.47 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-3.35500e+00;DB;DP=225;Dels=0.00000e+00;FS=1.03150e+01;HaplotypeScore=3.56800e-01;InbreedingCoeff=-1.33000e-02;MQ=5.93500e+01;MQ0=0;MQRankSum=1.21200e+00;QD=1.09900e+01;ReadPosRankSum=-1.50700e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=6.64000e+00;culprit=InbreedingCoeff;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs181910588|1|4231|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs181910588|1|2114|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs181910588|1|929|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0023|A:0.01||||A:0.001842|A:0||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs181910588|1|4166|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|intron_variant||||||rs181910588|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||1/14||ENST00000379409.2:c.83+30N>A||A:0.0023|A:0.01||||A:0.001842|A:0||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,A|ENSG00000187583|ENST00000379407|Transcript|intron_variant||||||rs181910588|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||1/14||ENST00000379407.3:c.83+30N>A||A:0.0023|A:0.01||||A:0.001842|A:0||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs181910588|1|2480|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|intron_variant||||||rs181910588|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||1/15||ENST00000379410.3:c.83+30N>A||A:0.0023|A:0.01||||A:0.001842|A:0||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs181910588|1||||||regulatory_region|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0||||||||||||||||| GT:AD:DP:GQ:PL 0/0:18,0:18:54:0,54,689 0/0:21,0:21:63:0,63,797 0/0:17,0:17:48:0,48,608 0/0:5,0:5:15:0,15,182 0/0:9,0:9:27:0,27,333 0/0:7,0:7:21:0,21,253 0/0:18,0:18:54:0,54,680 0/0:7,0:7:21:0,21,259 0/0:17,0:17:51:0,51,614 0/0:19,0:19:54:0,54,647 0/0:20,0:20:60:0,60,756 0/0:14,0:14:42:0,42,518 0/0:13,0:13:36:0,36,466 0/0:14,0:14:42:0,42,535 0/1:9,1:11:4:4,0,296 0/0:15,0:15:45:0,45,551 +1 902069 rs116147894 T C 13024.04 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=2.08840e+01;DB;DP=157;Dels=0.00000e+00;FS=3.07700e+00;HaplotypeScore=2.10500e-01;InbreedingCoeff=1.00200e-01;MQ=5.91800e+01;MQ0=0;MQRankSum=7.75000e-01;QD=1.56200e+01;ReadPosRankSum=-5.68400e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=7.17000e+00;culprit=MQ;CSQ=C|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs116147894|1|4186|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs116147894|1|2159|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs116147894|1|974|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs116147894|1|4211|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187583|ENST00000379409|Transcript|intron_variant||||||rs116147894|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||1/14||ENST00000379409.2:c.84-15N>C||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,C|ENSG00000187583|ENST00000379407|Transcript|intron_variant||||||rs116147894|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||1/14||ENST00000379407.3:c.84-15N>C||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,C|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs116147894|1|2525|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|intron_variant||||||rs116147894|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||1/15||ENST00000379410.3:c.84-15N>C||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,C||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs116147894|1||||||regulatory_region|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||||||||||| GT:AD:DP:GQ:PL 0/0:10,0:10:30:0,30,367 0/1:12,2:13:3:3,0,418 0/0:14,0:14:42:0,42,514 0/0:4,0:4:12:0,12,144 0/0:5,0:5:15:0,15,176 0/0:4,0:4:12:0,12,145 0/0:17,0:17:48:0,48,603 0/0:6,0:6:18:0,18,227 0/0:10,0:10:30:0,30,361 0/0:10,0:10:30:0,30,372 0/0:12,0:12:36:0,36,434 0/0:7,0:7:21:0,21,259 0/0:7,0:7:21:0,21,255 0/0:11,0:11:30:0,30,375 0/0:12,0:12:36:0,36,426 0/0:15,0:15:45:0,45,530 +1 902088 . G A 324.34 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-5.34900e+00;DP=133;Dels=0.00000e+00;FS=7.94000e-01;HaplotypeScore=1.50400e-01;InbreedingCoeff=3.03000e-02;MQ=5.93200e+01;MQ0=0;MQRankSum=2.32200e+00;QD=7.91000e+00;ReadPosRankSum=-2.12100e+00;SNPEFF_AMINO_ACID_CHANGE=D30N;SNPEFF_CODON_CHANGE=Gac/Aac;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_902084_902183;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=PLEKHN1;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000379407;VQSLOD=5.23000e+00;culprit=QD;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs201730138|1|4167|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs201730138|1|2178|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs201730138|1|993|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs201730138|1|4230|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|tolerated(0.26)|benign(0.034)|2/15|||ENST00000379409.2:c.88N>A|ENSP00000368719.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0441767068273092||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187583|ENST00000379407|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|tolerated(0.25)|benign(0.072)|2/15|||ENST00000379407.3:c.88N>A|ENSP00000368717.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0508376660889659||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs201730138|1|2544|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|missense_variant|123|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|tolerated(0.25)|benign(0.072)|2/16|||ENST00000379410.3:c.88N>A|ENSP00000368720.3:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0479302832244009||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs201730138|1||||||regulatory_region|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||||||||| GT:AD:DP:GQ:PL 0/1:10,1:11:1:1,0,264 0/0:13,0:13:33:0,33,447 0/0:10,0:10:30:0,30,371 0/0:4,0:4:12:0,12,141 0/0:1,0:1:3:0,3,39 0/0:4,0:4:12:0,12,145 0/0:18,0:18:51:0,51,665 0/0:4,0:4:12:0,12,148 0/0:5,0:5:15:0,15,193 0/0:9,0:9:24:0,24,320 0/0:10,0:10:30:0,30,378 0/0:4,0:4:12:0,12,160 0/0:10,0:10:30:0,30,387 0/0:7,0:7:21:0,21,247 0/0:9,0:9:27:0,27,350 0/0:14,0:14:42:0,42,540 +1 902088 . G ACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACTACT 324.34 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-5.34900e+00;DP=133;Dels=0.00000e+00;FS=7.94000e-01;HaplotypeScore=1.50400e-01;InbreedingCoeff=3.03000e-02;MQ=5.93200e+01;MQ0=0;MQRankSum=2.32200e+00;QD=7.91000e+00;ReadPosRankSum=-2.12100e+00;SNPEFF_AMINO_ACID_CHANGE=D30N;SNPEFF_CODON_CHANGE=Gac/Aac;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_902084_902183;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=PLEKHN1;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000379407;VQSLOD=5.23000e+00;culprit=QD;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs201730138|1|4167|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs201730138|1|2178|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs201730138|1|993|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs201730138|1|4230|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|tolerated(0.26)|benign(0.034)|2/15|||ENST00000379409.2:c.88N>A|ENSP00000368719.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0441767068273092||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187583|ENST00000379407|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|tolerated(0.25)|benign(0.072)|2/15|||ENST00000379407.3:c.88N>A|ENSP00000368717.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0508376660889659||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs201730138|1|2544|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|missense_variant|123|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|tolerated(0.25)|benign(0.072)|2/16|||ENST00000379410.3:c.88N>A|ENSP00000368720.3:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0479302832244009||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs201730138|1||||||regulatory_region|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||||||||| GT:AD:DP:GQ:PL 0/1:10,1:11:1:1,0,264 0/0:13,0:13:33:0,33,447 0/0:10,0:10:30:0,30,371 0/0:4,0:4:12:0,12,141 0/0:1,0:1:3:0,3,39 0/0:4,0:4:12:0,12,145 0/0:18,0:18:51:0,51,665 0/0:4,0:4:12:0,12,148 0/0:5,0:5:15:0,15,193 0/0:9,0:9:24:0,24,320 0/0:10,0:10:30:0,30,378 0/0:4,0:4:12:0,12,160 0/0:10,0:10:30:0,30,387 0/0:7,0:7:21:0,21,247 0/0:9,0:9:27:0,27,350 0/0:14,0:14:42:0,42,540 diff --git a/loading_pipeline/var/test/callsets/1kg_corrupt.vcf.gz b/loading_pipeline/var/test/callsets/1kg_corrupt.vcf.gz new file mode 100644 index 0000000000..c175f00b6a Binary files /dev/null and b/loading_pipeline/var/test/callsets/1kg_corrupt.vcf.gz differ diff --git a/loading_pipeline/var/test/callsets/gcnv_1.tsv b/loading_pipeline/var/test/callsets/gcnv_1.tsv new file mode 100644 index 0000000000..2247b96f40 --- /dev/null +++ b/loading_pipeline/var/test/callsets/gcnv_1.tsv @@ -0,0 +1,6 @@ +chr start end name sample sample_fix svtype GT CN NP QA QS QSE QSS ploidy strand variant_name ID rmsstd defragmented sf sc lt100_raw_calls lt10_highQS_rare_calls PASS_SAMPLE PASS_FREQ PASS_QS HIGH_QUALITY genes_any_overlap genes_any_overlap_exonsPerGene genes_any_overlap_totalExons genes_strict_overlap genes_strict_overlap_exonsPerGene genes_strict_overlap_totalExons genes_CG genes_LOF genes_any_overlap_Ensemble_ID genes_LOF_Ensemble_ID genes_CG_Ensemble_ID var_source callset_ovl identical_ovl partial_0_5_ovl any_ovl no_ovl strvctvre_score is_latest sample_cram_basename +chr1 100006937 100007881 COHORT_1_Y_cnv_16326 RP-2037_RGP_164_1_v1_Exome_GCP RGP_164_1 DEL 1 1 1 4 4 4 4 2 - suffix_16456 115884 0 FALSE 4.401408e-05 1 TRUE TRUE TRUE TRUE FALSE FALSE AC118553.2,SLC35A3 1,1 2 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG00000117620.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_6_CASE_cnv_74577 cluster_6_CASE_cnv_74577 cluster_6_CASE_cnv_74577 FALSE 0.583 FALSE RGP_164_1 +chr1 100017585 100023213 COHORT_13_Y_cnv_13436 C1981_RGP_164_2_v2_Exome_GCP RGP_164_2 DEL 1 1 2 4 5 5 4 2 - suffix_16456 115888 0 FALSE 8.802817e-05 2 FALSE FALSE FALSE TRUE FALSE FALSE AC118553.2,SLC35A3 1,2 3 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG00000117620.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_9_CASE_cnv_52542 cluster_9_CASE_cnv_52542 cluster_9_CASE_cnv_52542 FALSE 0.507 TRUE RGP_164_2 +chr1 100017585 100023213 CASE_10_X_cnv_38690 C1992_RGP_164_3_v1_Exome_GCP RGP_164_3 DEL 1 0 2 20 30 30 20 2 - suffix_16456 115887 0 FALSE 8.802817e-05 2 FALSE FALSE FALSE TRUE FALSE FALSE AC118553.2,SLC35A3 1,2 3 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG00000117620.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 FALSE 0.507 FALSE RGP_164_3 +chr1 100017586 100023212 CASE_10_X_cnv_38690 C1992_RGP_164_4_v1_Exome_C1992 RGP_164_4 DEL 1 0 2 20 30 30 20 2 - suffix_16456 115887 0 FALSE 8.802817E-05 2 FALSE FALSE FALSE TRUE FALSE FALSE AC118553.2,SLC35A3 1,2 2 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG22222222222.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 FALSE 0.507 FALSE RGP_164_4 +chr1 100017586 100023212 CASE_10_X_cnv_38690 C1992_RGP_164_3_v1_Exome_C1992 RGP_164_3 DEL 1 0 2 20 30 30 20 2 - suffix_16457 115887 0 FALSE 8.802817E-05 2 FALSE FALSE FALSE TRUE FALSE FALSE AC118553.2,SLC35A3 1,2 2 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG22222222222.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 FALSE 0.507 FALSE RGP_164_3 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/gcnv_2.tsv b/loading_pipeline/var/test/callsets/gcnv_2.tsv new file mode 100644 index 0000000000..415b97a203 --- /dev/null +++ b/loading_pipeline/var/test/callsets/gcnv_2.tsv @@ -0,0 +1,4 @@ +chr start end name sample sample_fix svtype GT CN NP QA QS QSE QSS ploidy strand variant_name ID rmsstd defragmented sf sc lt100_raw_calls lt10_highQS_rare_calls PASS_SAMPLE PASS_FREQ PASS_QS HIGH_QUALITY genes_any_overlap genes_any_overlap_exonsPerGene genes_any_overlap_totalExons genes_strict_overlap genes_strict_overlap_exonsPerGene genes_strict_overlap_totalExons genes_CG genes_LOF genes_any_overlap_Ensemble_ID genes_LOF_Ensemble_ID genes_CG_Ensemble_ID var_source callset_ovl identical_ovl partial_0_5_ovl any_ovl no_ovl strvctvre_score is_latest sample_cram_basename +chr1 100006937 100007881 COHORT_1_Y_cnv_16326 RP-2037_RGP_999_1_v1_Exome_GCP RGP_999_1 DEL 1 1 1 4 4 4 4 2 - suffix_16456 115884 0 FALSE 4.401408e-05 1 TRUE TRUE TRUE TRUE FALSE FALSE AC118553.2,SLC35A3 1,1 2 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG00000117620.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_6_CASE_cnv_74577 cluster_6_CASE_cnv_74577 cluster_6_CASE_cnv_74577 FALSE 0.583 FALSE RGP_999_1 +chr1 100017586 100023212 CASE_10_X_cnv_38690 C1992_RGP_999_1_v1_Exome_C1992 RGP_999_1 DEL 1 0 2 20 30 30 20 2 - suffix_16457 115887 0 FALSE 8.111111E-05 3 FALSE FALSE FALSE TRUE FALSE FALSE AC118553.2,SLC35A3 1,2 2 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG22222222222.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 FALSE 0.507 FALSE RGP_999_1 +chr1 100017585 100023213 CASE_10_X_cnv_38690 C1992_RGP_999_1_v1_Exome_GCP RGP_999_1 DEL 1 0 2 20 30 30 20 2 - suffix_99999 115887 0 FALSE 8.802817e-05 2 FALSE FALSE FALSE TRUE FALSE FALSE AC118553.2,SLC35A3 1,2 3 None 0 0 NA AC118553.2,SLC35A3 ENSG00000283761.1,ENSG00000117620.15 ENSG00000283761.1,ENSG00000117620.15 round2 round1 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 cluster_22_COHORT_cnv_56835 FALSE 0.507 FALSE RGP_999_1 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/improperly_formatted.vcf b/loading_pipeline/var/test/callsets/improperly_formatted.vcf new file mode 100644 index 0000000000..3d834dc5ff --- /dev/null +++ b/loading_pipeline/var/test/callsets/improperly_formatted.vcf @@ -0,0 +1,128 @@ +##fileformat=VCFv4.2 +##hailversion=0.2.8-70304a52d33d +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00731 HG00732 HG00733 NA19675 NA19678 NA19679 NA20870 NA20872 NA20874 NA20875 NA20876 NA20877 NA20878 NA20881 NA20885 NA20888 +1 871269 . A C 368.47 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-1.74060e+01;DP=351;Dels=0.00000e+00;FS=9.28030e+01;HaplotypeScore=5.13800e-01;InbreedingCoeff=-3.32000e-02;MQ=5.93000e+01;MQ0=0;MQRankSum=2.37300e+00;QD=4.80000e-01;ReadPosRankSum=-1.17980e+01;SNPEFF_AMINO_ACID_CHANGE=R141;SNPEFF_CODON_CHANGE=cgA/cgC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_871152_871276;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-8.16700e-01;culprit=QD;CSQ=C|ENSG00000187634|ENST00000455979|Transcript|upstream_gene_variant|||||||1|3386|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000420190|Transcript|synonymous_variant|512|423|141|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C|||5/7|||ENST00000420190.1:c.423N>C|ENST00000420190.1:c.423N>C(p.%3D)|||||||||||||||POSITION:0.787709497206704||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000268179|ENST00000598827|Transcript|upstream_gene_variant|||||||1|4824|-1|AL645608.1|Clone_based_ensembl_gene||protein_coding|YES|||ENSP00000471152||M0R0C9_HUMAN|UPI0000D61E05||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000437963|Transcript|downstream_gene_variant|||||||1|96|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000393181||Q5SV95_HUMAN&I7FV93_HUMAN|UPI000155D47B||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000478729|Transcript|upstream_gene_variant|||||||1|4457|1|SAMD11|HGNC|28706|processed_transcript||||||||||||||||||||||||||||||||||||||,C|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|506|423|141|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||5/14|||ENST00000342066.3:c.423N>C|ENST00000342066.3:c.423N>C(p.%3D)|||||||||||||||POSITION:0.206744868035191||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|194|195|65|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||3/12|||ENST00000341065.4:c.194N>C|ENST00000341065.4:c.194N>C(p.%3D)|||||||||||||||POSITION:0.110231769361221||NON_CAN_SPLICE_SURR|||||||,C||ENSR00000528855|RegulatoryFeature|regulatory_region_variant|||||||1||||||regulatory_region|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:34,0:34:99:0,102,1073 0/0:34,0:34:99:0,102,1064 0/0:37,0:37:99:0,108,1155 0/0:8,3:11:24:0,24,226 0/1:11,4:16:32:32,0,300 0/0:10,0:10:30:0,30,306 0/0:13,0:13:39:0,39,410 0/0:11,0:11:33:0,33,323 0/0:21,3:23:12:0,12,434 0/0:19,0:19:57:0,57,581 0/0:25,4:28:27:0,27,553 0/0:17,1:18:51:0,51,524 0/0:25,0:25:75:0,75,759 0/0:21,0:21:63:0,63,687 0/0:23,4:27:69:0,69,709 0/0:22,2:24:60:0,60,NABC diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/.README.txt.crc b/loading_pipeline/var/test/callsets/mito_1.mt/.README.txt.crc new file mode 100644 index 0000000000..d285f2d5cc Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/._SUCCESS.crc b/loading_pipeline/var/test/callsets/mito_1.mt/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/.metadata.json.gz.crc new file mode 100644 index 0000000000..ebaace3b39 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/README.txt b/loading_pipeline/var/test/callsets/mito_1.mt/README.txt new file mode 100644 index 0000000000..781795ef3a --- /dev/null +++ b/loading_pipeline/var/test/callsets/mito_1.mt/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.138-58956ebc28fc + Created at 2026/08/23 19:39:22 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/_SUCCESS b/loading_pipeline/var/test/callsets/mito_1.mt/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/.README.txt.crc b/loading_pipeline/var/test/callsets/mito_1.mt/cols/.README.txt.crc new file mode 100644 index 0000000000..d285f2d5cc Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/._SUCCESS.crc b/loading_pipeline/var/test/callsets/mito_1.mt/cols/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/cols/.metadata.json.gz.crc new file mode 100644 index 0000000000..3223c839ac Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/README.txt b/loading_pipeline/var/test/callsets/mito_1.mt/cols/README.txt new file mode 100644 index 0000000000..781795ef3a --- /dev/null +++ b/loading_pipeline/var/test/callsets/mito_1.mt/cols/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.138-58956ebc28fc + Created at 2026/08/23 19:39:22 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/_SUCCESS b/loading_pipeline/var/test/callsets/mito_1.mt/cols/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/cols/metadata.json.gz new file mode 100644 index 0000000000..59724d70ae Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..b7fd790037 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/metadata.json.gz new file mode 100644 index 0000000000..3375da6708 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/parts/.part-0.crc b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/parts/.part-0.crc new file mode 100644 index 0000000000..bfad4cbe43 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/parts/part-0 b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/parts/part-0 new file mode 100644 index 0000000000..4c2d3a8275 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/cols/rows/parts/part-0 differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/.README.txt.crc b/loading_pipeline/var/test/callsets/mito_1.mt/entries/.README.txt.crc new file mode 100644 index 0000000000..d285f2d5cc Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/._SUCCESS.crc b/loading_pipeline/var/test/callsets/mito_1.mt/entries/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/entries/.metadata.json.gz.crc new file mode 100644 index 0000000000..9a11086649 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/README.txt b/loading_pipeline/var/test/callsets/mito_1.mt/entries/README.txt new file mode 100644 index 0000000000..781795ef3a --- /dev/null +++ b/loading_pipeline/var/test/callsets/mito_1.mt/entries/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.138-58956ebc28fc + Created at 2026/08/23 19:39:22 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/_SUCCESS b/loading_pipeline/var/test/callsets/mito_1.mt/entries/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/entries/metadata.json.gz new file mode 100644 index 0000000000..f3f7833d87 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..f9a0f02f9f Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/metadata.json.gz new file mode 100644 index 0000000000..4a499b30f3 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/parts/.part-0-7b657546-4721-4965-bb6e-8f13ce327d22.crc b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/parts/.part-0-7b657546-4721-4965-bb6e-8f13ce327d22.crc new file mode 100644 index 0000000000..100bea08e5 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/parts/.part-0-7b657546-4721-4965-bb6e-8f13ce327d22.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/parts/part-0-7b657546-4721-4965-bb6e-8f13ce327d22 b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/parts/part-0-7b657546-4721-4965-bb6e-8f13ce327d22 new file mode 100644 index 0000000000..2ddafd9677 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/entries/rows/parts/part-0-7b657546-4721-4965-bb6e-8f13ce327d22 differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/.README.txt.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/.README.txt.crc new file mode 100644 index 0000000000..d285f2d5cc Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/._SUCCESS.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..704541c564 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/README.txt b/loading_pipeline/var/test/callsets/mito_1.mt/globals/README.txt new file mode 100644 index 0000000000..781795ef3a --- /dev/null +++ b/loading_pipeline/var/test/callsets/mito_1.mt/globals/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.138-58956ebc28fc + Created at 2026/08/23 19:39:22 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/_SUCCESS b/loading_pipeline/var/test/callsets/mito_1.mt/globals/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..782d7d3e89 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/metadata.json.gz new file mode 100644 index 0000000000..369b04d91a Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/parts/.part-0.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/parts/.part-0.crc new file mode 100644 index 0000000000..8231b2bcd8 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/parts/part-0 b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/parts/part-0 new file mode 100644 index 0000000000..89e711531d Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/globals/metadata.json.gz new file mode 100644 index 0000000000..2387d389dd Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..b8dc212060 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/metadata.json.gz new file mode 100644 index 0000000000..4c5418b2c6 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/parts/.part-0.crc b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/parts/.part-0.crc new file mode 100644 index 0000000000..89500f18f2 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/parts/part-0 b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/parts/part-0 new file mode 100644 index 0000000000..f764d73fdd Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/globals/rows/parts/part-0 differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/.index.crc b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/.index.crc new file mode 100644 index 0000000000..102cb97c8d Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/.index.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..30d1aee96d Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/index b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/index new file mode 100644 index 0000000000..b6a0ac1aed Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/index differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/metadata.json.gz new file mode 100644 index 0000000000..496d9b03b2 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/index/part-0-7b657546-4721-4965-bb6e-8f13ce327d22.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/metadata.json.gz new file mode 100644 index 0000000000..cfb0ad1439 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/.README.txt.crc b/loading_pipeline/var/test/callsets/mito_1.mt/rows/.README.txt.crc new file mode 100644 index 0000000000..d285f2d5cc Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/._SUCCESS.crc b/loading_pipeline/var/test/callsets/mito_1.mt/rows/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..1a45bc83d3 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/README.txt b/loading_pipeline/var/test/callsets/mito_1.mt/rows/README.txt new file mode 100644 index 0000000000..781795ef3a --- /dev/null +++ b/loading_pipeline/var/test/callsets/mito_1.mt/rows/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.138-58956ebc28fc + Created at 2026/08/23 19:39:22 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/_SUCCESS b/loading_pipeline/var/test/callsets/mito_1.mt/rows/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/rows/metadata.json.gz new file mode 100644 index 0000000000..653b3c8067 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..dced55401a Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/metadata.json.gz new file mode 100644 index 0000000000..c542e93c3e Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/parts/.part-0-7b657546-4721-4965-bb6e-8f13ce327d22.crc b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/parts/.part-0-7b657546-4721-4965-bb6e-8f13ce327d22.crc new file mode 100644 index 0000000000..c5518c4014 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/parts/.part-0-7b657546-4721-4965-bb6e-8f13ce327d22.crc differ diff --git a/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/parts/part-0-7b657546-4721-4965-bb6e-8f13ce327d22 b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/parts/part-0-7b657546-4721-4965-bb6e-8f13ce327d22 new file mode 100644 index 0000000000..cb074562c7 Binary files /dev/null and b/loading_pipeline/var/test/callsets/mito_1.mt/rows/rows/parts/part-0-7b657546-4721-4965-bb6e-8f13ce327d22 differ diff --git a/loading_pipeline/var/test/callsets/multiple_validation_exceptions.vcf b/loading_pipeline/var/test/callsets/multiple_validation_exceptions.vcf new file mode 100644 index 0000000000..2878c1f6b7 --- /dev/null +++ b/loading_pipeline/var/test/callsets/multiple_validation_exceptions.vcf @@ -0,0 +1,159 @@ +##fileformat=VCFv4.2 +##hailversion=0.2.8-70304a52d33d +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00731 HG00732 HG00733 NA19675 NA19678 NA19679 NA20870 NA20872 NA20874 NA20875 NA20876 NA20877 NA20878 NA20881 NA20885 NA20888 +1 871269 . A C 368.47 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-1.74060e+01;DP=351;Dels=0.00000e+00;FS=9.28030e+01;HaplotypeScore=5.13800e-01;InbreedingCoeff=-3.32000e-02;MQ=5.93000e+01;MQ0=0;MQRankSum=2.37300e+00;QD=4.80000e-01;ReadPosRankSum=-1.17980e+01;SNPEFF_AMINO_ACID_CHANGE=R141;SNPEFF_CODON_CHANGE=cgA/cgC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_871152_871276;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-8.16700e-01;culprit=QD;CSQ=C|ENSG00000187634|ENST00000455979|Transcript|upstream_gene_variant|||||||1|3386|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000420190|Transcript|synonymous_variant|512|423|141|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C|||5/7|||ENST00000420190.1:c.423N>C|ENST00000420190.1:c.423N>C(p.%3D)|||||||||||||||POSITION:0.787709497206704||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000268179|ENST00000598827|Transcript|upstream_gene_variant|||||||1|4824|-1|AL645608.1|Clone_based_ensembl_gene||protein_coding|YES|||ENSP00000471152||M0R0C9_HUMAN|UPI0000D61E05||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000437963|Transcript|downstream_gene_variant|||||||1|96|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000393181||Q5SV95_HUMAN&I7FV93_HUMAN|UPI000155D47B||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000478729|Transcript|upstream_gene_variant|||||||1|4457|1|SAMD11|HGNC|28706|processed_transcript||||||||||||||||||||||||||||||||||||||,C|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|506|423|141|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||5/14|||ENST00000342066.3:c.423N>C|ENST00000342066.3:c.423N>C(p.%3D)|||||||||||||||POSITION:0.206744868035191||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|194|195|65|R|cgA/cgC||1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||3/12|||ENST00000341065.4:c.194N>C|ENST00000341065.4:c.194N>C(p.%3D)|||||||||||||||POSITION:0.110231769361221||NON_CAN_SPLICE_SURR|||||||,C||ENSR00000528855|RegulatoryFeature|regulatory_region_variant|||||||1||||||regulatory_region|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:34,0:34:99:0,102,1073 0/0:34,0:34:99:0,102,1064 0/0:37,0:37:99:0,108,1155 0/0:8,3:11:24:0,24,226 0/1:11,4:16:32:32,0,300 0/0:10,0:10:30:0,30,306 0/0:13,0:13:39:0,39,410 0/0:11,0:11:33:0,33,323 0/0:21,3:23:12:0,12,434 0/0:19,0:19:57:0,57,581 0/0:25,4:28:27:0,27,553 0/0:17,1:18:51:0,51,524 0/0:25,0:25:75:0,75,759 0/0:21,0:21:63:0,63,687 0/0:23,4:27:69:0,69,709 0/0:22,2:24:60:0,60,562 +1 874734 rs145967298 C T 2645.29 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-7.95400e+00;DB;DP=484;Dels=0.00000e+00;FS=7.13100e+00;HaplotypeScore=3.21100e-01;InbreedingCoeff=-6.80000e-03;MQ=5.85800e+01;MQ0=1;MQRankSum=7.38500e+00;QD=1.23600e+01;ReadPosRankSum=-7.54000e-01;SNPEFF_AMINO_ACID_CHANGE=S200;SNPEFF_CODON_CHANGE=agC/agT;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_874655_874840;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=5.39000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs145967298|1|63|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|683|600|200|S|agC/agT|rs145967298|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||7/14|||ENST00000342066.3:c.600N>T|ENST00000342066.3:c.600N>T(p.%3D)|T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||POSITION:0.293255131964809||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs145967298|1|4850|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000464948|Transcript|upstream_gene_variant||||||rs145967298|1|2812|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000466827|Transcript|upstream_gene_variant||||||rs145967298|1|2749|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000474461|Transcript|upstream_gene_variant||||||rs145967298|1|1722|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs145967298|1|4850|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|synonymous_variant|80|81|27|S|agC/agT|rs145967298|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||1/7|||ENST00000455979.1:c.80N>T|ENST00000455979.1:c.80N>T(p.%3D)|T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||POSITION:0.0498461538461538||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000187634|ENST00000437963|Transcript|downstream_gene_variant||||||rs145967298|1|3561|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000393181||Q5SV95_HUMAN&I7FV93_HUMAN|UPI000155D47B||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000478729|Transcript|upstream_gene_variant||||||rs145967298|1|992|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs145967298|1|4851|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|371|372|124|S|agC/agT|rs145967298|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||5/12|||ENST00000341065.4:c.371N>T|ENST00000341065.4:c.371N>T(p.%3D)|T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||POSITION:0.210288298473714||NON_CAN_SPLICE_SURR|||||||,T||ENSR00001516735|RegulatoryFeature|regulatory_region_variant||||||rs145967298|1||||||regulatory_region|||||||||||||||T:0.0009||T:0.01|||T:0.000227|T:0.001628||||||||||||||||| GT:AD:DP:GQ:PL 0/0:37,0:37:99:0,111,1368 0/0:24,0:24:66:0,66,870 0/0:32,0:32:96:0,96,1183 0/0:8,0:8:24:0,24,245 0/0:8,0:8:24:0,24,267 0/0:9,0:9:27:0,27,318 0/0:26,0:26:75:0,75,879 0/0:31,0:31:93:0,93,1120 0/0:39,0:39:99:0,117,1375 0/0:56,0:56:99:0,169,2023 0/1:21,22:42:99:519,0,613 0/0:29,0:29:87:0,87,1048 0/0:43,0:43:99:0,129,1556 0/0:20,0:20:60:0,60,741 0/0:45,0:45:99:0,135,1586 0/0:35,0:35:99:0,105,1239 +1 876499 rs4372192 A G 212847.01 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=2.42570e+01;DB;DP=122;Dels=1.00000e-02;FS=9.96800e+00;HaplotypeScore=2.51500e-01;InbreedingCoeff=4.11000e-02;MQ=5.91300e+01;MQ0=0;MQRankSum=7.64000e-01;QD=3.03200e+01;ReadPosRankSum=2.13900e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=4.70000e+00;culprit=MQ;CSQ=G|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs4372192|1|1828|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs4372192|1|4200|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000342066|Transcript|intron_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||7/13||ENST00000342066.3:c.707-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||INTRON_SIZE:1683||NON_CAN_SPLICE&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs4372192|1|3085|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000187634|ENST00000464948|Transcript|upstream_gene_variant||||||rs4372192|1|1047|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000466827|Transcript|upstream_gene_variant||||||rs4372192|1|984|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000474461|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|44|||||rs4372192|1||1|SAMD11|HGNC|28706|retained_intron||||||||||1/4|||ENST00000474461.1:n.44N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000455979|Transcript|intron_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||1/6||ENST00000455979.1:c.187-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||INTRON_SIZE:1683||NON_CAN_SPLICE&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs4372192|1|3085|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000478729|Transcript|intron_variant&non_coding_transcript_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|processed_transcript|||||||||||1/2||ENST00000478729.1:n.118-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs4372192|1|3086|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676|||||||||||||||||,G|ENSG00000187634|ENST00000341065|Transcript|intron_variant||||||rs4372192|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||5/11||ENST00000341065.4:c.430-25N>G||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||INTRON_SIZE:1731||NON_CAN_SPLICE&ANC_ALLELE|||||||,G||ENSR00000528857|RegulatoryFeature|regulatory_region_variant||||||rs4372192|1||||||regulatory_region|||||||||||||||A:0.0822|G:0.86|G:0.92|G:0.92|G:0.95|G:0.883310|G:0.937676||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,7:7:21:253,21,0 1/1:0,8:8:24:296,24,0 1/1:0,4:4:12:148,12,0 1/1:0,5:5:15:184,15,0 1/1:0,1:1:3:39,3,0 1/1:0,5:5:15:176,15,0 1/1:0,9:9:27:316,27,0 1/1:0,11:11:33:397,33,0 1/1:0,7:7:18:212,18,0 1/1:0,11:11:27:369,27,0 1/1:0,13:13:39:492,39,0 0/1:7,9:15:99:235,0,158 1/1:0,7:7:18:231,18,0 1/1:0,4:4:12:154,12,0 1/1:0,8:8:24:296,24,0 1/1:0,7:7:21:270,21,0 +1 878314 rs142558220 G C 2808.55 PASS AC=3;AF=9.40000e-02;AN=32;BaseQRankSum=1.88800e+00;DB;DP=117;Dels=0.00000e+00;FS=1.06220e+01;HaplotypeScore=2.21900e-01;InbreedingCoeff=3.64000e-02;MQ=5.94000e+01;MQ0=1;MQRankSum=1.65200e+00;QD=9.46000e+00;ReadPosRankSum=-3.88300e+00;SNPEFF_AMINO_ACID_CHANGE=G480;SNPEFF_CODON_CHANGE=ggG/ggC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_877939_878438;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=6.85000e+00;culprit=QD;CSQ=C|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|3643|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|2385|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000342066|Transcript|synonymous_variant|1523|1440|480|G|ggG/ggC|rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||11/14|||ENST00000342066.3:c.1440N>C|ENST00000342066.3:c.1440N>C(p.%3D)|C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||POSITION:0.703812316715543||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|1270|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|42|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|132|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000474461|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|802|||||rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|retained_intron||||||||||4/4|||ENST00000474461.1:n.802N>C||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000455979|Transcript|synonymous_variant|920|921|307|G|ggG/ggC|rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||5/7|||ENST00000455979.1:c.920N>C|ENST00000455979.1:c.920N>C(p.%3D)|C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||POSITION:0.566769230769231||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|1270|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|761|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs142558220&COSM426784|1|1271|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1|||||||||||||||,C|ENSG00000187634|ENST00000341065|Transcript|synonymous_variant|1163|1164|388|G|ggG/ggC|rs142558220&COSM426784|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||9/12|||ENST00000341065.4:c.1163N>C|ENST00000341065.4:c.1163N>C(p.%3D)|C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||POSITION:0.65799886941775||NON_CAN_SPLICE_SURR|||||||,C||ENSR00000528857|RegulatoryFeature|regulatory_region_variant||||||rs142558220&COSM426784|1||||||regulatory_region|||||||||||||||C:0.0482|C:0.01|C:0.06||C:0.10|C:0.013449|C:0.066877||0&1||||||||||||||| GT:AD:DP:GQ:PL 0/1:2,1:3:30:30,0,67 0/0:2,0:2:6:0,6,82 0/1:2,3:5:61:93,0,61 0/0:2,0:2:6:0,6,72 0/0:1,0:1:3:0,3,37 0/1:2,3:5:54:93,0,54 0/0:16,0:16:45:0,45,560 0/0:5,0:5:15:0,15,188 0/0:12,0:12:33:0,33,414 0/0:10,0:10:30:0,30,393 0/0:16,0:16:48:0,48,617 0/0:5,0:5:15:0,15,181 0/0:5,0:5:15:0,15,193 0/0:13,0:13:36:0,36,439 0/0:9,0:9:24:0,24,317 0/0:8,0:8:21:0,21,276 +1 878809 rs191952374 C T 1761.84 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-7.95300e+00;DB;DP=453;Dels=0.00000e+00;FS=1.68300e+00;HaplotypeScore=2.28500e-01;InbreedingCoeff=-3.10000e-03;MQ=5.91000e+01;MQ0=0;MQRankSum=1.29700e+00;QD=1.36600e+01;ReadPosRankSum=-8.52000e-01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=9.25000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs191952374|1|4138|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs191952374|1|1890|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000342066|Transcript|intron_variant||||||rs191952374|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||12/13||ENST00000342066.3:c.1689+52N>T||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||INTRON_SIZE:320||NON_CAN_SPLICE|||||||,T|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs191952374|1|775|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs191952374|1|537|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs191952374|1|627|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs191952374|1|435|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|intron_variant||||||rs191952374|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||6/6||ENST00000455979.1:c.1169+52N>T||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||INTRON_SIZE:320||NON_CAN_SPLICE|||||||,T|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs191952374|1|775|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs191952374|1|1256|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs191952374|1|776|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|intron_variant||||||rs191952374|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||10/11||ENST00000341065.4:c.1412+52N>T||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||INTRON_SIZE:320||NON_CAN_SPLICE|||||||,T||ENSR00000528858|RegulatoryFeature|regulatory_region_variant||||||rs191952374|1||||||regulatory_region|||||||||||||||T:0.0046||T:0.01||T:0.01|T:0.000398|T:0.008636||||||||||||||||| GT:AD:DP:GQ:PL 0/0:35,0:35:99:0,105,1323 0/0:24,0:24:72:0,72,960 0/0:31,0:31:93:0,93,1172 0/0:10,0:10:30:0,30,376 0/0:10,0:10:30:0,30,370 0/0:12,0:12:36:0,36,453 0/0:35,0:35:99:0,105,1376 0/0:33,0:33:99:0,99,1273 0/0:31,0:31:93:0,93,1240 0/0:33,0:33:96:0,96,1192 0/0:33,0:33:99:0,99,1281 0/0:25,0:25:75:0,75,983 0/1:18,16:33:99:488,0,504 0/0:33,0:33:99:0,99,1273 0/0:44,0:44:99:0,132,1698 0/0:31,0:31:90:0,90,1198 +1 879576 rs115979567 C T 18648.64 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-2.26830e+01;DB;DP=839;Dels=0.00000e+00;FS=2.49350e+01;HaplotypeScore=4.12600e-01;InbreedingCoeff=-2.18000e-02;MQ=5.92100e+01;MQ0=1;MQRankSum=1.02100e+00;QD=1.36100e+01;ReadPosRankSum=7.91400e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=4.39000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187634|ENST00000420190|Transcript|downstream_gene_variant||||||rs115979567|1|4905|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000411579||Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI000155D47C||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000496938|Transcript|downstream_gene_variant||||||rs115979567|1|1123|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000342066|Transcript|3_prime_UTR_variant|2172|||||rs115979567|1||1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||14/14|||ENST00000342066.3:c.*43N>T||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000188976|ENST00000327044|Transcript|downstream_gene_variant||||||rs115979567|1|8|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs115979567|1|1304|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs115979567|1|1394|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs115979567|1|1202|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|3_prime_UTR_variant|1668|||||rs115979567|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||7/7|||ENST00000455979.1:c.*43N>T||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000188976|ENST00000483767|Transcript|downstream_gene_variant||||||rs115979567|1|8|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs115979567|1|2023|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000188976|ENST00000477976|Transcript|downstream_gene_variant||||||rs115979567|1|9|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|3_prime_UTR_variant|1812|||||rs115979567|1||1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||12/12|||ENST00000341065.4:c.*43N>T||T:0.0266|T:0.11|T:0.01||T:0.0013|T:0.061404|T:0.000120||||||||||NON_CAN_SPLICE_SURR||||||| GT:AD:DP:GQ:PL 0/0:66,0:66:99:0,199,2441 0/1:25,28:51:99:767,0,834 0/0:55,0:55:99:0,166,2079 0/0:11,0:11:33:0,33,392 0/0:15,0:15:45:0,45,554 0/0:17,0:17:51:0,51,622 0/0:50,0:50:99:0,150,1966 0/0:65,0:65:99:0,196,2507 0/0:60,0:60:99:0,181,2268 0/0:70,0:70:99:0,211,2589 0/0:64,0:64:99:0,193,2452 0/0:65,0:65:99:0,196,2507 0/0:56,0:56:99:0,169,2117 0/0:60,0:60:99:0,181,2359 0/0:79,0:79:99:0,238,2986 0/0:55,0:55:99:0,165,2099 +1 881070 rs41285794 G A 20769.13 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-9.52200e+00;DB;DP=1185;Dels=0.00000e+00;FS=1.15500e+01;HaplotypeScore=1.69500e-01;InbreedingCoeff=-1.83000e-02;MQ=5.90700e+01;MQ0=0;MQRankSum=1.85940e+01;QD=1.31500e+01;ReadPosRankSum=-8.90700e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=4.22000e+00;culprit=InbreedingCoeff;CSQ=A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs41285794|1|128|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs41285794|1|1115|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs41285794|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||16/18||ENST00000327044.6:c.1918-37N>T||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||INTRON_SIZE:519||NON_CAN_SPLICE|||||||,A|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs41285794|1|2798|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs41285794|1|2888|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs41285794|1|2696|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs41285794|1|1431|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000483767|Transcript|intron_variant&non_coding_transcript_variant||||||rs41285794|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||2/4||ENST00000483767.1:n.774-37N>T||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs41285794|1|3517|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs41285794|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||14/16||ENST00000477976.1:n.3365-37N>T||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651|||||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs41285794|1|1115|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0051|A:0.0020|A:0.01||A:0.01|A:0.002497|A:0.009651||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:78,0:78:99:0,235,2947 0/0:66,0:66:99:0,199,2595 0/0:59,0:59:99:0,178,2182 0/0:37,0:37:99:0,111,1365 0/0:36,0:36:99:0,108,1331 0/0:33,0:33:99:0,99,1192 0/0:69,0:69:99:0,208,2662 0/0:88,0:88:99:0,265,3395 0/0:98,0:98:99:0,295,3781 0/1:36,31:64:99:982,0,1021 0/0:86,0:86:99:0,259,3318 0/0:93,0:93:99:0,280,3588 0/0:92,0:92:99:0,277,3549 0/0:102,0:102:99:0,307,3935 0/0:89,0:89:99:0,268,3433 0/0:95,0:95:99:0,286,3665 +1 881627 rs2272757 G A 411792.28 PASS AC=22;AF=6.88000e-01;AN=32;BaseQRankSum=-3.32930e+01;DB;DP=644;Dels=0.00000e+00;FS=2.51600e+00;HaplotypeScore=5.86200e-01;InbreedingCoeff=3.09600e-01;MQ=5.88200e+01;MQ0=7;MQRankSum=6.81600e+00;QD=2.28900e+01;ReadPosRankSum=1.01500e+00;SNPEFF_AMINO_ACID_CHANGE=L615;SNPEFF_CODON_CHANGE=Ctg/Ttg;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_881553_881666;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=4.35000e+00;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs2272757&COSM1344685|1|685|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|1672|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|synonymous_variant|1893|1843|615|L|Ctg/Ttg|rs2272757&COSM1344685|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|||16/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1843N>T|ENST00000327044.6:c.1843N>T(p.%3D)|A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||POSITION:0.819111111111111||NON_CAN_SPLICE_SURR|||||||,A|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|3355|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|3445|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|3253|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|1988|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000483767|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|699|||||rs2272757&COSM1344685|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||2/5|||ENST00000483767.1:n.699N>T||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|4074|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|3290|||||rs2272757&COSM1344685|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||14/17|||ENST00000477976.1:n.3290N>T||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1|||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs2272757&COSM1344685|1|1672|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.4743|A:0.08|A:0.46|A:0.61|A:0.63|A:0.156222|A:0.637907||0&1||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 1/1:0,39:38:99:1384,111,0 0/0:61,0:61:99:0,184,2353 0/1:24,17:38:99:494,0,613 1/1:0,16:16:48:550,48,0 1/1:0,18:18:54:649,54,0 1/1:0,25:25:66:826,66,0 1/1:0,51:51:99:1886,153,0 0/1:25,23:46:99:661,0,639 1/1:0,33:33:99:1220,99,0 1/1:0,52:52:99:1879,156,0 1/1:0,45:45:99:1701,135,0 0/0:58,0:58:99:0,175,2237 0/1:17,18:34:99:523,0,478 1/1:0,44:44:99:1627,132,0 0/1:20,25:41:99:674,0,488 0/0:44,1:44:99:0,120,1521 +1 881918 rs35471880 G A 26418.87 PASS AC=5;AF=1.56000e-01;AN=32;BaseQRankSum=6.25300e+00;DB;DP=1040;Dels=0.00000e+00;FS=2.27620e+01;HaplotypeScore=2.29500e-01;InbreedingCoeff=-2.81000e-02;MQ=5.57400e+01;MQ0=40;MQRankSum=1.69390e+01;QD=1.18200e+01;ReadPosRankSum=-6.75000e-01;SNPEFF_AMINO_ACID_CHANGE=S556L;SNPEFF_CODON_CHANGE=tCg/tTg;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_881782_881925;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=1.82000e+00;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs35471880|1|976|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs35471880|1|1963|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|missense_variant|1717|1667|556|S/L|tCg/tTg|rs35471880|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|deleterious(0.03)|benign(0.311)|15/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1667N>T|ENSP00000317992.6:p.Ser556Leu|A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||POSITION:0.740888888888889||NON_CAN_SPLICE_SURR||B%3BB%3BB|16.43|D|T|D|T,A|ENSG00000187634|ENST00000464948|Transcript|downstream_gene_variant||||||rs35471880|1|3646|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000466827|Transcript|downstream_gene_variant||||||rs35471880|1|3736|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000474461|Transcript|downstream_gene_variant||||||rs35471880|1|3544|1|SAMD11|HGNC|28706|retained_intron|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs35471880|1|2279|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000483767|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|523|||||rs35471880|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||1/5|||ENST00000483767.1:n.523N>T||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000478729|Transcript|downstream_gene_variant||||||rs35471880|1|4365|1|SAMD11|HGNC|28706|processed_transcript|||||||||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|3114|||||rs35471880|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||13/17|||ENST00000477976.1:n.3114N>T||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628|||||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs35471880|1|1963|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0257|A:0.01|A:0.03||A:0.06|A:0.014980|A:0.061628||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:73,0:73:99:0,220,2699 0/0:70,0:70:99:0,211,2589 0/0:66,0:66:99:0,199,2385 0/1:12,18:29:99:475,0,278 0/0:28,0:28:78:0,78,843 0/1:18,10:27:99:271,0,511 0/1:34,36:67:99:876,0,921 0/1:37,38:74:99:966,0,944 0/0:69,0:69:99:0,208,2493 0/0:93,0:93:99:0,280,3279 0/1:41,32:70:99:777,0,1118 0/0:76,0:76:99:0,229,2746 0/0:73,0:73:99:0,220,2573 0/0:69,0:69:99:0,208,2493 0/0:82,0:82:99:0,247,2963 0/0:74,0:74:99:0,223,2609 +1 883485 . C T 81.94 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-3.68100e+00;DP=94;Dels=0.00000e+00;FS=0.00000e+00;HaplotypeScore=1.64200e-01;InbreedingCoeff=-2.46000e-02;MQ=5.53400e+01;MQ0=0;MQRankSum=3.55900e+00;QD=3.03000e+00;ReadPosRankSum=-1.07900e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-3.92700e-01;culprit=MQ;CSQ=T|ENSG00000188976|ENST00000483767|Transcript|upstream_gene_variant||||||rs374301410|1|1045|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||T:0|T:0.000117|||||||||||||||||,T|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs374301410|1|3846|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479|||||||||||||T:0|T:0.000117||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs374301410|1|2543|-1|NOC2L|HGNC|24517|processed_transcript||||||||||||||||||||T:0|T:0.000117|||||||||||||||||,T|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs374301410|1|3530|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04|||||||||||||T:0|T:0.000117||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs374301410|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||14/18||ENST00000327044.6:c.1659+26N>A|||||||T:0|T:0.000117||||||||INTRON_SIZE:1585||NON_CAN_SPLICE|||||||,T|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs374301410|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||12/16||ENST00000477976.1:n.3106+26N>A|||||||T:0|T:0.000117|||||||||||||||||,T|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs374301410|1|3530|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A|||||||||||||T:0|T:0.000117||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:8,0:8:24:0,24,304 0/0:3,0:3:9:0,9,118 0/0:5,0:5:15:0,15,178 0/0:5,0:5:15:0,15,181 0/0:2,0:2:6:0,6,69 0/0:4,0:5:12:0,12,145 0/0:6,0:6:18:0,18,217 0/0:10,0:10:30:0,30,378 0/0:11,0:11:33:0,33,411 0/1:5,1:6:14:14,0,181 0/0:10,0:10:30:0,30,373 0/0:4,0:4:9:0,9,114 0/0:5,0:5:15:0,15,193 0/0:4,0:4:12:0,12,157 0/0:6,0:6:18:0,18,229 0/0:3,0:4:9:0,9,122 +1 883625 rs4970378 A G 232503.78 PASS AC=30;AF=1.00000e+00;AN=30;DB;DP=117;Dels=0.00000e+00;FS=0.00000e+00;HaplotypeScore=1.37000e-01;InbreedingCoeff=-1.43000e-02;MQ=5.74300e+01;MQ0=0;QD=3.66300e+01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=SAMD11;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000342066;VQSLOD=-2.60400e-01;culprit=MQ;CSQ=G|ENSG00000188976|ENST00000483767|Transcript|upstream_gene_variant||||||rs4970378|1|1185|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0000|||||G:0.999543||||||||||||||||||,G|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs4970378|1|3986|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0000|||||G:0.999543|||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs4970378|1|2683|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0000|||||G:0.999543||||||||||||||||||,G|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs4970378|1|3670|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0000|||||G:0.999543|||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs4970378|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||13/18||ENST00000327044.6:c.1558-13N>C||A:0.0000|||||G:0.999543|||||||||INTRON_SIZE:257||NON_CAN_SPLICE&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs4970378|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||11/16||ENST00000477976.1:n.3005-13N>C||A:0.0000|||||G:0.999543||||||||||||||||||,G|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs4970378|1|3670|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0000|||||G:0.999543|||||||||||EXON_INTRON_UNDEF&ANC_ALLELE||||||| GT:AD:DP:GQ:PL 1/1:0,4:4:12:151,12,0 1/1:0,3:3:9:118,9,0 1/1:0,6:6:18:212,18,0 1/1:0,5:5:15:185,15,0 ./.:.:.:.:. 1/1:0,4:4:12:142,12,0 1/1:0,13:13:39:501,39,0 1/1:0,8:8:21:276,21,0 1/1:0,19:19:57:718,57,0 1/1:0,9:9:27:340,27,0 1/1:0,12:12:36:454,36,0 1/1:0,4:4:12:151,12,0 1/1:0,5:5:15:198,15,0 1/1:0,16:16:48:605,48,0 1/1:0,3:3:9:119,9,0 1/1:0,5:6:15:191,15,0 +1 883918 rs139116730 G A 4594.12 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=6.89000e+00;DB;DP=1146;Dels=0.00000e+00;FS=4.31330e+01;HaplotypeScore=8.65000e-02;InbreedingCoeff=-4.00000e-03;MQ=5.62500e+01;MQ0=14;MQRankSum=1.10440e+01;QD=1.07800e+01;ReadPosRankSum=-1.97100e+00;SNPEFF_AMINO_ACID_CHANGE=S503;SNPEFF_CODON_CHANGE=tcC/tcT;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_883870_883983;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=5.95000e-01;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000483767|Transcript|upstream_gene_variant||||||rs139116730|1|1478|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488|||||||||||||||||,A|ENSG00000187634|ENST00000455979|Transcript|downstream_gene_variant||||||rs139116730|1|4279|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000412228|||UPI000155D479||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000496938|Transcript|upstream_gene_variant||||||rs139116730|1|2976|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488|||||||||||||||||,A|ENSG00000187634|ENST00000342066|Transcript|downstream_gene_variant||||||rs139116730|1|3963|1|SAMD11|HGNC|28706|protein_coding|YES||CCDS2.2|ENSP00000342313|SAM11_HUMAN|Q5SV95_HUMAN&I7FV93_HUMAN&A6PWC8_HUMAN|UPI0000D61E04||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000188976|ENST00000327044|Transcript|synonymous_variant|1559|1509|503|S|tcC/tcT|rs139116730|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|||13/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1509N>T|ENST00000327044.6:c.1509N>T(p.%3D)|A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||POSITION:0.670666666666667||NON_CAN_SPLICE_SURR|||||||,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2956|||||rs139116730|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||11/17|||ENST00000477976.1:n.2956N>T||A:0.0005||||A:0.0013|A:0.000227|A:0.003488|||||||||||||||||,A|ENSG00000187634|ENST00000341065|Transcript|downstream_gene_variant||||||rs139116730|1|3963|1|SAMD11|HGNC|28706|protein_coding||||ENSP00000349216|||UPI000155D47A||||||||A:0.0005||||A:0.0013|A:0.000227|A:0.003488||||||||||EXON_INTRON_UNDEF||||||| GT:AD:DP:GQ:PL 0/0:76,0:76:99:0,229,2746 0/0:47,0:47:99:0,141,1738 0/0:75,0:75:99:0,226,2710 0/0:36,0:36:99:0,108,1201 0/0:37,0:37:99:0,111,1271 0/0:42,0:42:99:0,126,1443 0/0:74,0:74:99:0,223,2609 0/0:82,0:82:99:0,247,2963 0/0:120,0:120:99:0,361,4336 0/0:96,0:96:99:0,289,3468 0/1:38,33:68:99:823,0,921 0/0:78,0:78:99:0,235,2818 0/0:56,0:56:99:0,169,1974 0/0:92,0:92:99:0,277,3402 0/0:78,0:78:99:0,235,2884 0/0:89,0:89:99:0,268,3216 +1 887560 rs3748595 A C 806833.88 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=5.43470e+01;DB;DP=472;Dels=0.00000e+00;FS=1.69080e+01;HaplotypeScore=2.91900e-01;InbreedingCoeff=7.38000e-02;MQ=5.93900e+01;MQ0=0;MQRankSum=1.20610e+01;QD=3.46800e+01;ReadPosRankSum=7.92100e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000487214;VQSLOD=6.35000e-01;culprit=FS;CSQ=C|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs3748595|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||10/18||ENST00000327044.6:c.1192-41N>G||A:0.1602|C:0.78|C:0.86|C:0.86|C:0.85|C:0.831139|C:0.932674||||||||INTRON_SIZE:272||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs3748595|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||8/16||ENST00000477976.1:n.2639-41N>G||A:0.1602|C:0.78|C:0.86|C:0.86|C:0.85|C:0.831139|C:0.932674|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3748595|1|2246|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.1602|C:0.78|C:0.86|C:0.86|C:0.85|C:0.831139|C:0.932674||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,44:44:99:1706,132,0 1/1:0,43:43:99:1773,129,0 1/1:0,41:41:99:1582,123,0 1/1:0,19:19:54:687,54,0 1/1:0,23:23:69:851,69,0 1/1:0,10:10:30:370,30,0 1/1:0,33:33:99:1320,99,0 1/1:1,25:25:75:1020,75,0 1/1:0,26:26:78:1040,78,0 1/1:0,25:25:75:1000,75,0 1/1:0,36:36:99:1461,108,0 0/1:23,14:36:99:439,0,642 1/1:0,23:23:69:930,69,0 1/1:0,28:28:84:1121,84,0 1/1:0,23:23:69:904,69,0 1/1:0,37:37:99:1420,108,0 +1 887801 rs3828047 A G 1348829.24 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=4.41560e+01;DB;DP=777;Dels=0.00000e+00;FS=8.43510e+01;HaplotypeScore=3.07000e-01;InbreedingCoeff=-1.77000e-02;MQ=5.58800e+01;MQ0=35;MQRankSum=-2.15910e+01;QD=3.44400e+01;ReadPosRankSum=5.44300e+00;SNPEFF_AMINO_ACID_CHANGE=T394;SNPEFF_CODON_CHANGE=acT/acC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_887792_887980;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=-6.22100e-01;culprit=MQ;CSQ=G|ENSG00000188976|ENST00000327044|Transcript|synonymous_variant|1232|1182|394|T|acT/acC|rs3828047&COSM426785|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|||10/19||Pfam_domain:PF03715&Superfamily_domains:SSF48371|ENST00000327044.6:c.1182N>C|ENST00000327044.6:c.1182N>C(p.%3D)|A:0.0716|G:0.90|G:0.92|G:0.92|G:0.95|G:0.906037|G:0.938372||0&1||||||POSITION:0.525333333333333||NON_CAN_SPLICE_SURR&ANC_ALLELE|||||||,G|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2629|||||rs3828047&COSM426785|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||8/17|||ENST00000477976.1:n.2629N>C||A:0.0716|G:0.90|G:0.92|G:0.92|G:0.95|G:0.906037|G:0.938372||0&1|||||||||||||||,G|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3828047&COSM426785|1|2005|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0716|G:0.90|G:0.92|G:0.92|G:0.95|G:0.906037|G:0.938372||0&1||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,42:42:99:1553,126,0 1/1:0,48:48:99:1824,138,0 1/1:0,54:54:99:1997,163,0 1/1:0,17:18:48:615,48,0 1/1:0,33:33:99:1220,99,0 1/1:0,30:30:90:1134,90,0 1/1:0,60:60:99:2315,181,0 1/1:0,44:44:99:1526,120,0 1/1:0,71:71:99:2791,214,0 1/1:0,48:48:99:1887,144,0 1/1:0,61:61:99:2398,184,0 0/1:29,33:59:99:915,0,742 1/1:0,30:30:90:1157,90,0 1/1:0,59:59:99:2321,178,0 1/1:0,55:55:99:2137,166,0 1/1:0,65:65:99:2507,196,0 +1 888529 . G A 1833.13 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-9.33700e+00;DP=387;Dels=0.00000e+00;FS=8.33000e-01;HaplotypeScore=1.94900e-01;InbreedingCoeff=-4.20000e-03;MQ=5.60200e+01;MQ0=0;MQRankSum=5.49600e+00;QD=1.10400e+01;ReadPosRankSum=-2.04000e-01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000487214;VQSLOD=1.38000e+00;culprit=MQ;CSQ=A|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs373469542|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||9/18||ENST00000327044.6:c.1002+26N>T|||||||A:0.000908|A:0||||||||INTRON_SIZE:574||NON_CAN_SPLICE|||||||,A|ENSG00000188976|ENST00000477976|Transcript|intron_variant&non_coding_transcript_variant||||||rs373469542|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||7/16||ENST00000477976.1:n.2449+26N>T|||||||A:0.000908|A:0|||||||||||||||||,A|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs373469542|1|1277|-1|NOC2L|HGNC|24517|processed_transcript||||||||||||||||||||A:0.000908|A:0||||||||||||||||| GT:AD:DP:GQ:PL 0/0:19,0:19:57:0,57,703 0/0:26,0:26:78:0,78,1022 0/0:23,0:23:69:0,69,869 0/0:15,0:15:45:0,45,555 0/0:16,0:16:48:0,48,603 0/0:16,0:16:48:0,48,606 0/0:32,0:32:96:0,96,1258 0/0:26,0:26:72:0,72,944 0/0:24,0:24:69:0,69,898 0/1:12,15:26:99:432,0,321 0/0:31,0:31:93:0,93,1240 0/0:24,0:24:72:0,72,944 0/0:20,0:20:60:0,60,756 0/0:27,0:27:78:0,78,1029 0/0:36,0:36:99:0,108,1415 0/0:26,0:26:78:0,78,1022 +1 888659 rs3748597 T C 907727.36 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=4.09230e+01;DB;DP=542;Dels=0.00000e+00;FS=4.67910e+01;HaplotypeScore=2.81100e-01;InbreedingCoeff=-1.65000e-02;MQ=5.48600e+01;MQ0=44;MQRankSum=-2.23740e+01;QD=3.38200e+01;ReadPosRankSum=8.50400e+00;SNPEFF_AMINO_ACID_CHANGE=I300V;SNPEFF_CODON_CHANGE=Atc/Gtc;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_888555_888668;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=-6.49600e-01;culprit=MQ;CSQ=C|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs3748597|1|4967|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|missense_variant|948|898|300|I/V|Atc/Gtc|rs3748597|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|tolerated(0.98)|benign(0)|9/19||Superfamily_domains:SSF48371|ENST00000327044.6:c.898N>G|ENSP00000317992.6:p.Ile300Val|T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372||||||||POSITION:0.399111111111111||NON_CAN_SPLICE_SURR&ANC_ALLELE||B|0.940|P|T|T|T,C|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2345|||||rs3748597|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||7/17|||ENST00000477976.1:n.2345N>G||T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3748597|1|1147|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0716|C:0.90|C:0.92|C:0.92|C:0.95|C:0.905767|C:0.938372||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,33:33:96:1198,96,0 1/1:0,29:29:87:1140,87,0 1/1:0,27:27:81:998,81,0 1/1:0,27:27:81:962,81,0 1/1:0,19:19:57:686,57,0 1/1:0,22:22:63:796,63,0 1/1:0,39:39:99:1474,117,0 1/1:0,39:39:99:1504,117,0 1/1:0,32:32:96:1183,96,0 1/1:0,44:44:99:1654,129,0 1/1:0,55:55:99:2079,166,0 0/1:17,21:36:99:502,0,410 1/1:0,37:37:99:1398,111,0 1/1:0,44:44:99:1697,132,0 1/1:0,32:32:96:1209,96,0 1/1:0,27:27:81:1016,81,0 +1 889158 rs56262069 G C 909575.03 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=3.68810e+01;DB;DP=579;Dels=0.00000e+00;FS=2.80669e+02;HaplotypeScore=5.39300e-01;InbreedingCoeff=7.80000e-02;MQ=5.90100e+01;MQ0=0;MQRankSum=-1.97700e+00;QD=3.19700e+01;ReadPosRankSum=8.43100e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000469563;VQSLOD=9.10000e-02;culprit=MQRankSum;CSQ=C|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs13303056|1|4468|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.1529|||||||||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|splice_region_variant&intron_variant||||||rs13303056|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||8/18||ENST00000327044.6:c.888+4N>G||G:0.1529||||||||||||||INTRON_SIZE:493||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|splice_region_variant&intron_variant&non_coding_transcript_variant||||||rs13303056|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||6/16||ENST00000477976.1:n.2335+4N>G||G:0.1529|||||||||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs13303056|1|648|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||G:0.1529||||||||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,45:45:99:1664,135,0 1/1:0,21:21:63:810,63,0 1/1:0,27:27:81:975,81,0 1/1:0,19:18:51:638,51,0 1/1:0,20:20:60:700,60,0 1/1:0,18:18:54:635,54,0 1/1:0,40:40:99:1512,120,0 1/1:0,34:34:99:1312,102,0 1/1:0,45:45:99:1615,132,0 1/1:0,40:40:99:1543,120,0 1/1:0,62:62:99:2392,187,0 0/1:23,19:40:99:499,0,598 1/1:0,45:45:99:1664,135,0 1/1:0,48:48:99:1814,144,0 1/1:0,39:39:99:1503,117,0 1/1:0,37:37:99:1398,111,0 +1 889159 rs13302945 A C 937927.21 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=5.17190e+01;DB;DP=586;Dels=0.00000e+00;FS=2.49622e+02;HaplotypeScore=5.35000e-01;InbreedingCoeff=7.77000e-02;MQ=5.90200e+01;MQ0=0;MQRankSum=1.48040e+01;QD=3.22600e+01;ReadPosRankSum=8.79200e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000469563;VQSLOD=1.40000e-01;culprit=MQ;CSQ=C|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs13302945|1|4467|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|splice_region_variant&intron_variant||||||rs13302945|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||8/18||ENST00000327044.6:c.888+3N>G||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294||||||||INTRON_SIZE:493||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|splice_region_variant&intron_variant&non_coding_transcript_variant||||||rs13302945|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||6/16||ENST00000477976.1:n.2335+3N>G||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs13302945|1|647|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.1538|C:0.79|C:0.87|C:0.88|C:0.85|C:0.823342|C:0.932294||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,44:44:99:1663,132,0 1/1:0,21:21:63:794,63,0 1/1:0,28:28:84:1058,84,0 1/1:0,19:18:51:634,51,0 1/1:0,21:21:63:782,63,0 1/1:0,18:18:54:650,54,0 1/1:0,42:42:99:1587,126,0 1/1:0,34:34:99:1312,102,0 1/1:0,45:45:99:1657,132,0 1/1:0,41:41:99:1582,123,0 1/1:0,61:61:99:2353,184,0 0/1:24,19:41:99:482,0,633 1/1:0,43:43:99:1625,129,0 1/1:0,52:52:99:1965,156,0 1/1:0,42:42:99:1557,123,0 1/1:0,35:35:99:1323,105,0 +1 889238 rs3828049 G A 52801.55 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-4.91500e+00;DB;DP=911;Dels=0.00000e+00;FS=4.16200e+01;HaplotypeScore=2.87900e-01;InbreedingCoeff=3.34000e-02;MQ=5.93400e+01;MQ0=1;MQRankSum=3.62800e+00;QD=1.41200e+01;ReadPosRankSum=-2.71000e+00;SNPEFF_AMINO_ACID_CHANGE=A271V;SNPEFF_CODON_CHANGE=gCg/gTg;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_889162_889272;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=5.38000e+00;culprit=MQRankSum;CSQ=A|ENSG00000188976|ENST00000469563|Transcript|downstream_gene_variant||||||rs3828049&COSM1602748|1|4388|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1|||||||||||||||,A|ENSG00000188976|ENST00000327044|Transcript|missense_variant|862|812|271|A/V|gCg/gTg|rs3828049&COSM1602748|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C|deleterious(0.04)|benign(0.034)|8/19||Superfamily_domains:SSF48371|ENST00000327044.6:c.812N>T|ENSP00000317992.6:p.Ala271Val|A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1||||||POSITION:0.360888888888889||NON_CAN_SPLICE_SURR||D%3BP%3BP|21.3|N|T|D|T,A|ENSG00000188976|ENST00000477976|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|2259|||||rs3828049&COSM1602748|1||-1|NOC2L|HGNC|24517|retained_intron||||||||||6/17|||ENST00000477976.1:n.2259N>T||A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1|||||||||||||||,A|ENSG00000188976|ENST00000487214|Transcript|downstream_gene_variant||||||rs3828049&COSM1602748|1|568|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||A:0.0537|A:0.02|A:0.08|A:0.08|A:0.05|A:0.021562|A:0.060363||0&1||||||||||||||| GT:AD:DP:GQ:PL 0/0:53,0:53:99:0,159,1960 0/0:56,0:56:99:0,169,2071 0/0:42,0:42:99:0,126,1517 0/0:23,0:23:69:0,69,763 0/0:31,0:31:93:0,93,1007 0/0:26,0:26:69:0,69,754 0/0:55,0:55:99:0,166,1987 0/0:59,0:59:99:0,178,2132 0/0:67,0:67:99:0,202,2362 0/0:79,0:79:99:0,238,2854 0/0:82,0:82:99:0,247,2963 0/1:32,31:62:99:888,0,808 0/0:75,0:75:99:0,226,2644 0/0:66,0:66:99:0,199,2385 0/0:68,0:68:99:0,205,2397 0/0:67,0:67:99:0,202,2362 +1 894573 rs13303010 G A 310883.38 PASS AC=30;AF=9.38000e-01;AN=32;BaseQRankSum=1.22670e+01;DB;DP=304;Dels=0.00000e+00;FS=2.34720e+01;HaplotypeScore=3.24800e-01;InbreedingCoeff=4.23300e-01;MQ=5.89800e+01;MQ0=0;MQRankSum=1.80380e+01;QD=2.67400e+01;ReadPosRankSum=2.89300e+00;SNPEFF_EFFECT=INTRON;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=processed_transcript;SNPEFF_GENE_NAME=NOC2L;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000327044;VQSLOD=1.10000e+00;culprit=MQ;CSQ=A|ENSG00000187961|ENST00000466300|Transcript|upstream_gene_variant||||||rs13303010|1|3534|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000327044|Transcript|intron_variant||||||rs13303010|1||-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||1/18||ENST00000327044.6:c.26+22N>T||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942||||||||INTRON_SIZE:133||NON_CAN_SPLICE|||||||,A|ENSG00000187961|ENST00000338591|Transcript|upstream_gene_variant||||||rs13303010|1|1394|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|upstream_gene_variant||||||rs13303010|1|2256|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000469563|Transcript|intron_variant&non_coding_transcript_variant||||||rs13303010|1||-1|NOC2L|HGNC|24517|retained_intron|||||||||||1/1||ENST00000469563.1:n.42+22N>T||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs13303010|1|735|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs13303010|1|4359|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A|ENSG00000188976|ENST00000487214|Transcript|intron_variant&non_coding_transcript_variant||||||rs13303010|1||-1|NOC2L|HGNC|24517|processed_transcript|||||||||||1/6||ENST00000487214.1:n.95+22N>T||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942|||||||||||||||||,A||ENSR00000528861|RegulatoryFeature|regulatory_region_variant||||||rs13303010|1||||||regulatory_region|||||||||||||||G:0.3480|A:0.18|A:0.71|A:0.69|A:0.90|A:0.284570|A:0.896942||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,24:24:72:898,72,0 0/1:10,8:17:99:196,0,291 1/1:0,13:12:36:454,36,0 1/1:0,7:7:21:254,21,0 1/1:0,5:5:15:181,15,0 1/1:0,13:13:36:428,36,0 1/1:0,31:31:93:1120,93,0 1/1:0,24:24:72:867,72,0 1/1:0,26:26:78:924,78,0 1/1:0,26:26:78:958,78,0 1/1:0,19:19:57:670,57,0 0/1:17,6:22:99:127,0,513 1/1:0,20:20:60:723,60,0 1/1:0,23:23:69:869,69,0 1/1:0,19:19:57:686,57,0 1/1:0,16:16:48:505,48,0 +1 896922 . C T 1253.52 PASS AC=2;AF=6.30000e-02;AN=32;BaseQRankSum=-8.14600e+00;DP=943;Dels=0.00000e+00;FS=5.89500e+00;HaplotypeScore=1.37200e-01;InbreedingCoeff=-1.30000e-03;MQ=5.92800e+01;MQ0=0;MQRankSum=1.05600e+00;QD=1.01100e+01;ReadPosRankSum=-1.19000e+00;SNPEFF_AMINO_ACID_CHANGE=A119;SNPEFF_CODON_CHANGE=gcC/gcT;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_896673_896932;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=8.89000e+00;culprit=InbreedingCoeff;CSQ=T|ENSG00000187961|ENST00000466300|Transcript|upstream_gene_variant|||||||1|1185|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E|||||||||||||||||||||||||||||||,T|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant|||||||1|2252|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000338591|Transcript|synonymous_variant|464|357|119|A|gcC/gcT||1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0|||2/12||Pfam_domain:PF00651&PROSITE_profiles:PS50097&SMART_domains:SM00225&Superfamily_domains:SSF54695&PIRSF_domain:PIRSF037037|ENST00000338591.3:c.357N>T|ENST00000338591.3:c.357N>T(p.%3D)|||||||||||||||POSITION:0.1850699844479||NON_CAN_SPLICE_SURR|||||||,T|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant|||||||1|4960|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000463212|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|94||||||1||1|KLHL17|HGNC|24023|retained_intron||||||||||1/2|||ENST00000463212.1:n.94N>T|||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant|||||||1|4960|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant|||||||1|2286|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant|||||||1|4955|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant|||||||1|3084|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant|||||||1|2010|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant|||||||1|2233|-1|NOC2L|HGNC|24517|processed_transcript||||||||||||||||||||||||||||||||||||||,T||ENSR00000528861|RegulatoryFeature|regulatory_region_variant|||||||1||||||regulatory_region|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:71,0:71:99:0,214,2684 0/0:69,0:69:99:0,208,2713 0/0:68,0:68:99:0,205,2515 0/0:20,0:20:57:0,57,722 0/0:29,0:29:87:0,87,1096 0/0:36,0:36:99:0,99,1225 0/0:61,0:61:99:0,184,2353 0/0:58,0:58:99:0,175,2192 0/0:68,0:68:99:0,205,2673 0/1:41,25:63:99:678,0,1190 0/0:87,0:87:99:0,262,3356 0/0:52,0:52:99:0,157,2006 0/1:35,23:55:99:651,0,922 0/0:79,0:79:99:0,238,3048 0/0:73,0:73:99:0,220,2816 0/0:54,0:54:99:0,163,2045 +1 897325 rs4970441 G C 2226684.78 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=3.69960e+01;DB;DP=1475;Dels=0.00000e+00;FS=1.12830e+01;HaplotypeScore=4.66400e-01;InbreedingCoeff=1.15000e-01;MQ=5.95500e+01;MQ0=1;MQRankSum=2.60000e-02;QD=3.33700e+01;ReadPosRankSum=6.38900e+00;SNPEFF_AMINO_ACID_CHANGE=A203;SNPEFF_CODON_CHANGE=gcG/gcC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_897206_897427;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=5.29000e+00;culprit=ReadPosRankSum;CSQ=C|ENSG00000187961|ENST00000466300|Transcript|upstream_gene_variant||||||rs4970441|1|782|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs4970441|1|2655|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000338591|Transcript|synonymous_variant|716|609|203|A|gcG/gcC|rs4970441|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0|||4/12||Pfam_domain:PF07707&SMART_domains:SM00875&PIRSF_domain:PIRSF037037|ENST00000338591.3:c.609N>C|ENST00000338591.3:c.609N>C(p.%3D)|G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||POSITION:0.315707620528771||NON_CAN_SPLICE_SURR|||||||,C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs4970441|1|4557|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|non_coding_transcript_exon_variant&non_coding_transcript_variant|422|||||rs4970441|1||1|KLHL17|HGNC|24023|retained_intron||||||||||2/2|||ENST00000463212.1:n.422N>C||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs4970441|1|4557|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs4970441|1|2689|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs4970441|1|4552|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs4970441|1|3487|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs4970441|1|1607|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs4970441|1|2636|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||G:0.1276|C:0.71|C:0.88|C:0.92|C:0.94|C:0.727520|C:0.926163||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,94:94:99:3476,283,0 1/1:0,87:87:99:3356,262,0 1/1:0,108:108:99:3994,325,0 1/1:0,56:56:99:2023,169,0 1/1:0,59:59:99:2182,178,0 1/1:0,46:46:99:1701,138,0 1/1:0,100:100:99:3780,301,0 1/1:0,127:127:99:4800,382,0 1/1:0,127:127:99:4899,382,0 1/1:0,127:127:99:4800,382,0 1/1:0,117:117:99:4422,352,0 0/1:42,33:71:99:891,0,1116 1/1:0,78:78:99:2948,235,0 1/1:0,107:107:99:4128,322,0 1/1:0,95:95:99:3665,286,0 1/1:0,76:76:99:2873,229,0 +1 898313 . C T 4423.71 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=1.00100e+01;DP=235;Dels=0.00000e+00;FS=6.83200e+00;HaplotypeScore=5.07500e-01;InbreedingCoeff=9.84000e-02;MQ=5.92600e+01;MQ0=0;MQRankSum=-5.62000e-01;QD=1.22500e+01;ReadPosRankSum=-4.59200e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;VQSLOD=3.67000e+00;culprit=MQRankSum;CSQ=T|ENSG00000187961|ENST00000466300|Transcript|intron_variant&NMD_transcript_variant||||||rs375277853|1||1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||1/5||ENST00000466300.1:c.191+16N>T|||||||||||||||||||||||||,T|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs375277853|1|3643|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||rs375277853|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||6/11||ENST00000338591.3:c.1042+16N>T||||||||||||||||INTRON_SIZE:191||NON_CAN_SPLICE|||||||,T|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs375277853|1|3569|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs375277853|1|455|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs375277853|1|3569|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs375277853|1|3677|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs375277853|1|3564|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||||||||||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs375277853|1|4475|-1|NOC2L|HGNC|24517|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs375277853|1|619|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||||||||||||||||||||,T|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs375277853|1|3624|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||||||||||||||||||||||||| GT:AD:DP:GQ:PL 0/0:19,0:19:57:0,57,653 0/0:12,0:12:36:0,36,423 0/0:21,0:21:63:0,63,740 0/0:6,0:6:15:0,15,157 0/0:2,0:2:6:0,6,63 0/0:6,0:6:15:0,15,159 0/0:14,0:14:42:0,42,455 0/0:18,0:18:54:0,54,624 0/0:14,0:14:39:0,39,447 0/0:25,0:25:72:0,72,805 0/0:16,0:16:48:0,48,564 0/1:13,8:20:99:190,0,314 0/0:21,0:21:63:0,63,702 0/0:17,1:18:18:0,18,560 0/0:11,0:11:30:0,30,342 0/0:12,0:12:36:0,36,393 +1 898323 rs6605071 T C 353673.96 PASS AC=31;AF=9.69000e-01;AN=32;BaseQRankSum=1.91890e+01;DB;DP=221;Dels=0.00000e+00;FS=9.64600e+00;HaplotypeScore=4.04000e-01;InbreedingCoeff=-2.15000e-02;MQ=5.91700e+01;MQ0=0;MQRankSum=-4.60000e-02;QD=3.77900e+01;ReadPosRankSum=3.36900e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;VQSLOD=4.11000e+00;culprit=InbreedingCoeff;CSQ=C|ENSG00000187961|ENST00000466300|Transcript|intron_variant&NMD_transcript_variant||||||rs6605071|1||1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||1/5||ENST00000466300.1:c.191+26N>C||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs6605071|1|3653|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||rs6605071|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||6/11||ENST00000338591.3:c.1042+26N>C||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||INTRON_SIZE:191||NON_CAN_SPLICE&ANC_ALLELE|||||||,C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs6605071|1|3559|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs6605071|1|465|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs6605071|1|3559|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs6605071|1|3687|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs6605071|1|3554|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||EXON_INTRON_UNDEF&ANC_ALLELE|||||||,C|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs6605071|1|4485|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs6605071|1|609|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859|||||||||||||||||,C|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs6605071|1|3634|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0725|C:0.92|C:0.91|C:0.92|C:0.95|C:0.926218|C:0.940859||||||||||||||||| GT:AD:DP:GQ:PL 1/1:0,18:18:54:688,54,0 1/1:0,8:8:24:315,24,0 1/1:0,15:15:45:579,45,0 1/1:0,7:7:21:262,21,0 1/1:0,3:3:9:111,9,0 1/1:0,4:4:9:122,9,0 1/1:0,20:20:60:786,60,0 1/1:0,16:16:48:641,48,0 1/1:0,13:13:36:457,36,0 1/1:0,27:27:78:1030,78,0 1/1:0,18:18:54:720,54,0 0/1:13,4:17:99:112,0,396 1/1:0,18:18:54:708,54,0 1/1:0,13:13:39:525,39,0 1/1:0,10:10:30:393,30,0 1/1:1,13:14:5:460,5,0 +1 898467 rs41285808 C T 14490.29 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-2.26300e+00;DB;DP=270;Dels=0.00000e+00;FS=1.33000e+00;HaplotypeScore=2.81700e-01;InbreedingCoeff=3.75000e-02;MQ=5.93000e+01;MQ0=0;MQRankSum=3.96000e+00;QD=1.37100e+01;ReadPosRankSum=-1.57400e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;VQSLOD=7.17000e+00;culprit=FS;CSQ=T|ENSG00000187961|ENST00000466300|Transcript|synonymous_variant&NMD_transcript_variant|247|249|83|P|ccC/ccT|rs41285808|1||1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E|||2/6|||ENST00000466300.1:c.247N>T|ENST00000466300.1:c.247N>T(p.%3D)|T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000188976|ENST00000327044|Transcript|upstream_gene_variant||||||rs41285808|1|3797|-1|NOC2L|HGNC|24517|protein_coding|YES||CCDS3.1|ENSP00000317992|NOC2L_HUMAN||UPI000041820C||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||rs41285808|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||6/11||ENST00000338591.3:c.1043-22N>T||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||INTRON_SIZE:191||NON_CAN_SPLICE|||||||,T|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs41285808|1|3415|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs41285808|1|609|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs41285808|1|3415|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000469563|Transcript|upstream_gene_variant||||||rs41285808|1|3831|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs41285808|1|3410|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||EXON_INTRON_UNDEF|||||||,T|ENSG00000188976|ENST00000477976|Transcript|upstream_gene_variant||||||rs41285808|1|4629|-1|NOC2L|HGNC|24517|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000187961|ENST00000481067|Transcript|upstream_gene_variant||||||rs41285808|1|465|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672|||||||||||||||||,T|ENSG00000188976|ENST00000487214|Transcript|upstream_gene_variant||||||rs41285808|1|3778|-1|NOC2L|HGNC|24517|processed_transcript|||||||||||||||T:0.0500|T:0.0020|T:0.08|T:0.08|T:0.05|T:0.010512|T:0.056672||||||||||||||||| GT:AD:DP:GQ:PL 0/0:28,0:28:84:0,84,1030 0/0:15,0:15:45:0,45,579 0/0:25,0:25:75:0,75,916 0/0:6,0:6:18:0,18,197 0/0:5,0:5:15:0,15,172 0/0:3,0:3:9:0,9,100 0/0:14,0:14:42:0,42,480 0/0:22,0:22:66:0,66,817 0/0:23,0:23:69:0,69,831 0/0:12,0:12:36:0,36,431 0/0:18,0:18:51:0,51,646 0/1:17,10:26:99:278,0,440 0/0:21,0:21:51:0,51,644 0/0:13,0:13:39:0,39,481 0/0:18,0:18:54:0,54,666 0/0:21,0:21:60:0,60,723 +1 899959 . G GC 2073.57 PASS AC=1;AF=5.00000e-02;AN=20;BaseQRankSum=8.77000e-01;DP=19;FS=1.24470e+02;HaplotypeScore=1.51273e+01;InbreedingCoeff=6.94000e-02;MQ=4.52200e+01;MQ0=0;MQRankSum=-8.47500e+00;QD=1.40100e+01;ReadPosRankSum=4.26000e-01;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000463212;CSQ=C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||TMP_ESP_1_899960_899959|1|1922|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|||||||||||||C:0.152075|C:0.090390||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||TMP_ESP_1_899960_899959|1|2101|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||C:0.152075|C:0.090390|||||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||TMP_ESP_1_899960_899959|1|1922|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|||||||||||||C:0.152075|C:0.090390||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||TMP_ESP_1_899960_899959|1|49|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E|||||||||||||C:0.152075|C:0.090390|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||TMP_ESP_1_899960_899959|1|1917|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|||||||||||||C:0.152075|C:0.090390||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||TMP_ESP_1_899960_899959|1|415|1|KLHL17|HGNC|24023|retained_intron||||||||||||||||||||C:0.152075|C:0.090390|||||||||||||||||,C|ENSG00000187961|ENST00000338591|Transcript|intron_variant||||||TMP_ESP_1_899960_899959|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||11/11||ENST00000338591.3:c.1700+49_1700+50insC|||||||C:0.152075|C:0.090390||||||||INTRON_SIZE:432||NON_CAN_SPLICE||||||| GT:AD:DP:GQ:PL ./.:.:.:.:. ./.:.:.:.:. 0/0:3,0:3:9:0,9,136 0/0:1,0:1:3:0,3,45 0/0:1,0:1:3:0,3,45 0/0:2,0:2:6:0,6,91 0/1:3,1:4:28:28,0,124 0/0:2,0:2:6:0,6,74 0/0:2,0:2:6:0,6,91 0/0:2,0:2:6:0,6,91 ./.:.:.:.:. ./.:.:.:.:. ./.:.:.:.:. 0/0:1,0:1:3:0,3,45 ./.:.:.:.:. 0/0:1,0:1:3:0,3,45 +1 900505 rs28705211 G C 222602.28 PASS AC=8;AF=2.50000e-01;AN=32;BaseQRankSum=6.97200e+00;DB;DP=885;Dels=0.00000e+00;FS=4.61940e+01;HaplotypeScore=1.18840e+00;InbreedingCoeff=1.98200e-01;MQ=5.92300e+01;MQ0=0;MQRankSum=1.76580e+01;QD=1.80400e+01;ReadPosRankSum=1.01980e+01;SNPEFF_AMINO_ACID_CHANGE=V497;SNPEFF_CODON_CHANGE=gtG/gtC;SNPEFF_EFFECT=SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_900343_901094;SNPEFF_FUNCTIONAL_CLASS=SILENT;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=LOW;SNPEFF_TRANSCRIPT_ID=ENST00000455747;VQSLOD=1.37000e+00;culprit=HaplotypeScore;CSQ=C|ENSG00000187583|ENST00000379409|Transcript|upstream_gene_variant||||||rs28705211&COSM426805|1|1377|1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs28705211&COSM426805|1|2647|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081||||||||||||||,C|ENSG00000187583|ENST00000379407|Transcript|upstream_gene_variant||||||rs28705211&COSM426805|1|1377|1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs28705211&COSM426805|1|595|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|upstream_gene_variant||||||rs28705211&COSM426805|1|1372|1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs28705211&COSM426805|1|961|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081||||||||||||||,C|ENSG00000187961|ENST00000338591|Transcript|synonymous_variant|1970|1863|621|V|gtG/gtC|rs28705211&COSM426805|1||1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0|||12/12||SMART_domains:SM00612&Superfamily_domains:SSF117281&PIRSF_domain:PIRSF037037|ENST00000338591.3:c.1863N>C|ENST00000338591.3:c.1863N>C(p.%3D)|C:0.1648|C:0.02|C:0.22|C:0.09|C:0.28||||0&1|20637081|||||POSITION:0.965785381026439||END_TRUNC&NON_CAN_SPLICE_SURR||||||| GT:AD:DP:GQ:PL 0/0:87,0:87:99:0,262,3217 0/1:43,24:61:99:697,0,1146 0/1:35,29:60:99:812,0,913 0/0:23,0:23:69:0,69,851 0/0:22,0:22:66:0,66,788 0/0:33,1:34:96:0,96,1150 0/0:54,0:54:99:0,162,1973 0/1:32,27:56:99:720,0,880 0/0:79,0:79:99:0,235,2850 0/0:74,0:74:99:0,214,2587 0/0:65,0:65:99:0,196,2354 0/1:24,26:48:99:738,0,687 0/1:27,28:54:99:795,0,709 0/0:58,0:58:99:0,175,2173 0/1:28,27:54:99:805,0,735 1/1:0,56:56:99:2066,169,0 +1 902024 rs181910588 G 406.47 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-3.35500e+00;DB;DP=225;Dels=0.00000e+00;FS=1.03150e+01;HaplotypeScore=3.56800e-01;InbreedingCoeff=-1.33000e-02;MQ=5.93500e+01;MQ0=0;MQRankSum=1.21200e+00;QD=1.09900e+01;ReadPosRankSum=-1.50700e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=6.64000e+00;culprit=InbreedingCoeff;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs181910588|1|4231|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs181910588|1|2114|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs181910588|1|929|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0023|A:0.01||||A:0.001842|A:0||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs181910588|1|4166|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|intron_variant||||||rs181910588|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||1/14||ENST00000379409.2:c.83+30N>A||A:0.0023|A:0.01||||A:0.001842|A:0||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,A|ENSG00000187583|ENST00000379407|Transcript|intron_variant||||||rs181910588|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||1/14||ENST00000379407.3:c.83+30N>A||A:0.0023|A:0.01||||A:0.001842|A:0||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs181910588|1|2480|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|intron_variant||||||rs181910588|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||1/15||ENST00000379410.3:c.83+30N>A||A:0.0023|A:0.01||||A:0.001842|A:0||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs181910588|1||||||regulatory_region|||||||||||||||A:0.0023|A:0.01||||A:0.001842|A:0||||||||||||||||| GT:AD:DP:GQ:PL 0/0:18,0:18:54:0,54,689 0/0:21,0:21:63:0,63,797 0/0:17,0:17:48:0,48,608 0/0:5,0:5:15:0,15,182 0/0:9,0:9:27:0,27,333 0/0:7,0:7:21:0,21,253 0/0:18,0:18:54:0,54,680 0/0:7,0:7:21:0,21,259 0/0:17,0:17:51:0,51,614 0/0:19,0:19:54:0,54,647 0/0:20,0:20:60:0,60,756 0/0:14,0:14:42:0,42,518 0/0:13,0:13:36:0,36,466 0/0:14,0:14:42:0,42,535 0/1:9,1:11:4:4,0,296 0/0:15,0:15:45:0,45,551 +1 902069 rs116147894 T C 13024.04 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=2.08840e+01;DB;DP=157;Dels=0.00000e+00;FS=3.07700e+00;HaplotypeScore=2.10500e-01;InbreedingCoeff=1.00200e-01;MQ=5.91800e+01;MQ0=0;MQRankSum=7.75000e-01;QD=1.56200e+01;ReadPosRankSum=-5.68400e+00;SNPEFF_EFFECT=DOWNSTREAM;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=KLHL17;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000338591;VQSLOD=7.17000e+00;culprit=MQ;CSQ=C|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs116147894|1|4186|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs116147894|1|2159|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs116147894|1|974|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||||EXON_INTRON_UNDEF|||||||,C|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs116147894|1|4211|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187583|ENST00000379409|Transcript|intron_variant||||||rs116147894|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06||||1/14||ENST00000379409.2:c.84-15N>C||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,C|ENSG00000187583|ENST00000379407|Transcript|intron_variant||||||rs116147894|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF||||1/14||ENST00000379407.3:c.84-15N>C||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,C|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs116147894|1|2525|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163|||||||||||||||||,C|ENSG00000187583|ENST00000379410|Transcript|intron_variant||||||rs116147894|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8||||1/15||ENST00000379410.3:c.84-15N>C||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||INTRON_SIZE:89||NON_CAN_SPLICE|||||||,C||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs116147894|1||||||regulatory_region|||||||||||||||C:0.0808|C:0.17|C:0.07|C:0.07|C:0.03|C:0.112713|C:0.017163||||||||||||||||| GT:AD:DP:GQ:PL 0/0:10,0:10:30:0,30,367 0/1:12,2:13:3:3,0,418 0/0:14,0:14:42:0,42,514 0/0:4,0:4:12:0,12,144 0/0:5,0:5:15:0,15,176 0/0:4,0:4:12:0,12,145 0/0:17,0:17:48:0,48,603 0/0:6,0:6:18:0,18,227 0/0:10,0:10:30:0,30,361 0/0:10,0:10:30:0,30,372 0/0:12,0:12:36:0,36,434 0/0:7,0:7:21:0,21,259 0/0:7,0:7:21:0,21,255 0/0:11,0:11:30:0,30,375 0/0:12,0:12:36:0,36,426 0/0:15,0:15:45:0,45,530 +1 902088 . G A 324.34 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-5.34900e+00;DP=133;Dels=0.00000e+00;FS=7.94000e-01;HaplotypeScore=1.50400e-01;InbreedingCoeff=3.03000e-02;MQ=5.93200e+01;MQ0=0;MQRankSum=2.32200e+00;QD=7.91000e+00;ReadPosRankSum=-2.12100e+00;SNPEFF_AMINO_ACID_CHANGE=D30N;SNPEFF_CODON_CHANGE=Gac/Aac;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_902084_902183;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=PLEKHN1;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000379407;VQSLOD=5.23000e+00;culprit=QD;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs201730138|1|4167|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs201730138|1|2178|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs201730138|1|993|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs201730138|1|4230|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|tolerated(0.26)|benign(0.034)|2/15|||ENST00000379409.2:c.88N>A|ENSP00000368719.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0441767068273092||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187583|ENST00000379407|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|tolerated(0.25)|benign(0.072)|2/15|||ENST00000379407.3:c.88N>A|ENSP00000368717.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0508376660889659||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs201730138|1|2544|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|missense_variant|123|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|tolerated(0.25)|benign(0.072)|2/16|||ENST00000379410.3:c.88N>A|ENSP00000368720.3:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0479302832244009||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs201730138|1||||||regulatory_region|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||||||||| GT:AD:DP:GQ:PL 0/1:10,1:11:1:1,0,264 0/0:13,0:13:33:0,33,447 0/0:10,0:10:30:0,30,371 0/0:4,0:4:12:0,12,141 0/0:1,0:1:3:0,3,39 0/0:4,0:4:12:0,12,145 0/0:18,0:18:51:0,51,665 0/0:4,0:4:12:0,12,148 0/0:5,0:5:15:0,15,193 0/0:9,0:9:24:0,24,320 0/0:10,0:10:30:0,30,378 0/0:4,0:4:12:0,12,160 0/0:10,0:10:30:0,30,387 0/0:7,0:7:21:0,21,247 0/0:9,0:9:27:0,27,350 0/0:14,0:14:42:0,42,540 +1 902088 . G A 111 - AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-5.34900e+00;DP=133;Dels=0.00000e+00;FS=7.94000e-01;HaplotypeScore=1.50400e-01;InbreedingCoeff=3.03000e-02;MQ=5.93200e+01;MQ0=0;MQRankSum=2.32200e+00;QD=7.91000e+00;ReadPosRankSum=-2.12100e+00;SNPEFF_AMINO_ACID_CHANGE=D30N;SNPEFF_CODON_CHANGE=Gac/Aac;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_902084_902183;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=PLEKHN1;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000379407;VQSLOD=5.23000e+00;culprit=QD;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs201730138|1|4167|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs201730138|1|2178|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs201730138|1|993|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs201730138|1|4230|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|tolerated(0.26)|benign(0.034)|2/15|||ENST00000379409.2:c.88N>A|ENSP00000368719.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0441767068273092||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187583|ENST00000379407|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|tolerated(0.25)|benign(0.072)|2/15|||ENST00000379407.3:c.88N>A|ENSP00000368717.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0508376660889659||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs201730138|1|2544|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|missense_variant|123|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|tolerated(0.25)|benign(0.072)|2/16|||ENST00000379410.3:c.88N>A|ENSP00000368720.3:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0479302832244009||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs201730138|1||||||regulatory_region|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||||||||| GT:AD:DP:GQ:PL 0/1:10,1:11:1:1,0,264 0/0:13,0:13:33:0,33,447 0/0:10,0:10:30:0,30,371 0/0:4,0:4:12:0,12,141 0/0:1,0:1:3:0,3,39 0/0:4,0:4:12:0,12,145 0/0:18,0:18:51:0,51,665 0/0:4,0:4:12:0,12,148 0/0:5,0:5:15:0,15,193 0/0:9,0:9:24:0,24,320 0/0:10,0:10:30:0,30,378 0/0:4,0:4:12:0,12,160 0/0:10,0:10:30:0,30,387 0/0:7,0:7:21:0,21,247 0/0:9,0:9:27:0,27,350 0/0:14,0:14:42:0,42,540 +GL000207.1 1 . G A 324.34 PASS AC=1;AF=3.10000e-02;AN=32;BaseQRankSum=-5.34900e+00;DP=133;Dels=0.00000e+00;FS=7.94000e-01;HaplotypeScore=1.50400e-01;InbreedingCoeff=3.03000e-02;MQ=5.93200e+01;MQ0=0;MQRankSum=2.32200e+00;QD=7.91000e+00;ReadPosRankSum=-2.12100e+00;SNPEFF_AMINO_ACID_CHANGE=D30N;SNPEFF_CODON_CHANGE=Gac/Aac;SNPEFF_EFFECT=NON_SYNONYMOUS_CODING;SNPEFF_EXON_ID=exon_1_902084_902183;SNPEFF_FUNCTIONAL_CLASS=MISSENSE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=PLEKHN1;SNPEFF_IMPACT=MODERATE;SNPEFF_TRANSCRIPT_ID=ENST00000379407;VQSLOD=5.23000e+00;culprit=QD;CSQ=A|ENSG00000187583|ENST00000480267|Transcript|upstream_gene_variant||||||rs201730138|1|4167|1|PLEKHN1|HGNC|25284|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000466300|Transcript|downstream_gene_variant||||||rs201730138|1|2178|1|KLHL17|HGNC|24023|nonsense_mediated_decay||||ENSP00000463694|||UPI000268AE1E||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187961|ENST00000338591|Transcript|downstream_gene_variant||||||rs201730138|1|993|1|KLHL17|HGNC|24023|protein_coding|YES||CCDS30550.1|ENSP00000343930|KLH17_HUMAN|Q0VGE6_HUMAN&B3KXL7_HUMAN|UPI00001DFBF0||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||EXON_INTRON_UNDEF|||||||,A|ENSG00000187961|ENST00000463212|Transcript|downstream_gene_variant||||||rs201730138|1|4230|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379409|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding||||ENSP00000368719|PKHN1_HUMAN|J3KSM5_HUMAN|UPI0000D61E06|tolerated(0.26)|benign(0.034)|2/15|||ENST00000379409.2:c.88N>A|ENSP00000368719.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0441767068273092||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187583|ENST00000379407|Transcript|missense_variant|118|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|||CCDS53256.1|ENSP00000368717|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00005764FF|tolerated(0.25)|benign(0.072)|2/15|||ENST00000379407.3:c.88N>A|ENSP00000368717.2:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0508376660889659||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A|ENSG00000187961|ENST00000481067|Transcript|downstream_gene_variant||||||rs201730138|1|2544|1|KLHL17|HGNC|24023|retained_intron|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600|||||||||||||||||,A|ENSG00000187583|ENST00000379410|Transcript|missense_variant|123|88|30|D/N|Gac/Aac|rs201730138|1||1|PLEKHN1|HGNC|25284|protein_coding|YES||CCDS4.1|ENSP00000368720|PKHN1_HUMAN|J3KSM5_HUMAN|UPI00001416D8|tolerated(0.25)|benign(0.072)|2/16|||ENST00000379410.3:c.88N>A|ENSP00000368720.3:p.Asp30Asn|A:0.0005||A:0.0028|||A:0|A:0.000600||||||||POSITION:0.0479302832244009||NON_CAN_SPLICE_SURR||B%3BB%3BB|15.10|D|T|T%3BT%3BT|T%3BT%3BT,A||ENSR00000528862|RegulatoryFeature|regulatory_region_variant||||||rs201730138|1||||||regulatory_region|||||||||||||||A:0.0005||A:0.0028|||A:0|A:0.000600||||||||||||||||| GT:AD:DP:GQ:PL 0/1:10,1:11:1:1,0,264 0/0:13,0:13:33:0,33,447 0/0:10,0:10:30:0,30,371 0/0:4,0:4:12:0,12,141 0/0:1,0:1:3:0,3,39 0/0:4,0:4:12:0,12,145 0/0:18,0:18:51:0,51,665 0/0:4,0:4:12:0,12,148 0/0:5,0:5:15:0,15,193 0/0:9,0:9:24:0,24,320 0/0:10,0:10:30:0,30,378 0/0:4,0:4:12:0,12,160 0/0:10,0:10:30:0,30,387 0/0:7,0:7:21:0,21,247 0/0:9,0:9:27:0,27,350 0/0:14,0:14:42:0,42,540 diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/.README.txt.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/.README.txt.crc new file mode 100644 index 0000000000..6ceb835d00 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/._SUCCESS.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/.metadata.json.gz.crc new file mode 100644 index 0000000000..0dea8ca9b8 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/README.txt b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/README.txt new file mode 100644 index 0000000000..cde487379e --- /dev/null +++ b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/07/01 14:46:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/_SUCCESS b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/.README.txt.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/.README.txt.crc new file mode 100644 index 0000000000..6ceb835d00 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/._SUCCESS.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/.metadata.json.gz.crc new file mode 100644 index 0000000000..d26d3689e0 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/README.txt b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/README.txt new file mode 100644 index 0000000000..cde487379e --- /dev/null +++ b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/07/01 14:46:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/_SUCCESS b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/metadata.json.gz new file mode 100644 index 0000000000..25577417da Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..04c3a6a71a Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/metadata.json.gz new file mode 100644 index 0000000000..fda3adc5f7 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/parts/.part-0.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/parts/.part-0.crc new file mode 100644 index 0000000000..2d5a374cfa Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/parts/part-0 b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/parts/part-0 new file mode 100644 index 0000000000..ef2510f800 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/cols/rows/parts/part-0 differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/.README.txt.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/.README.txt.crc new file mode 100644 index 0000000000..6ceb835d00 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/._SUCCESS.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/.metadata.json.gz.crc new file mode 100644 index 0000000000..8519d6445b Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/README.txt b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/README.txt new file mode 100644 index 0000000000..cde487379e --- /dev/null +++ b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/07/01 14:46:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/_SUCCESS b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/metadata.json.gz new file mode 100644 index 0000000000..612d7f203d Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb7122ff6f Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/metadata.json.gz new file mode 100644 index 0000000000..945cec08f8 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/parts/.part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/parts/.part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.crc new file mode 100644 index 0000000000..4d639e7d00 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/parts/.part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/parts/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/parts/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e new file mode 100644 index 0000000000..b59b036501 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/entries/rows/parts/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/.README.txt.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/.README.txt.crc new file mode 100644 index 0000000000..6ceb835d00 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/._SUCCESS.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..0391e39570 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/README.txt b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/README.txt new file mode 100644 index 0000000000..cde487379e --- /dev/null +++ b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/07/01 14:46:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/_SUCCESS b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..782d7d3e89 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/metadata.json.gz new file mode 100644 index 0000000000..369b04d91a Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/parts/.part-0.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/parts/.part-0.crc new file mode 100644 index 0000000000..8231b2bcd8 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/parts/part-0 b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/parts/part-0 new file mode 100644 index 0000000000..89e711531d Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/metadata.json.gz new file mode 100644 index 0000000000..f83c4b6730 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..6c5b6cb280 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/metadata.json.gz new file mode 100644 index 0000000000..b326d8a777 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/parts/.part-0.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/parts/.part-0.crc new file mode 100644 index 0000000000..c4fb574d07 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/parts/part-0 b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/parts/part-0 new file mode 100644 index 0000000000..0e8cf49e9e Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/globals/rows/parts/part-0 differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/.index.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/.index.crc new file mode 100644 index 0000000000..b0717f3980 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/.index.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..b05744c689 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/index b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/index new file mode 100644 index 0000000000..5ae66fe44f Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/index differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/metadata.json.gz new file mode 100644 index 0000000000..2531ef81cd Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/index/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/metadata.json.gz new file mode 100644 index 0000000000..4f5fc98c6c Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/.README.txt.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/.README.txt.crc new file mode 100644 index 0000000000..6ceb835d00 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/.README.txt.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/._SUCCESS.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..1d7a32585e Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/README.txt b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/README.txt new file mode 100644 index 0000000000..cde487379e --- /dev/null +++ b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/07/01 14:46:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/_SUCCESS b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/metadata.json.gz new file mode 100644 index 0000000000..5795f6af17 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..9bf7a6f45b Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/metadata.json.gz b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/metadata.json.gz new file mode 100644 index 0000000000..54e90291f1 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/parts/.part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.crc b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/parts/.part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.crc new file mode 100644 index 0000000000..5ba7871856 Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/parts/.part-0-e9d9e112-b40b-4f08-855c-1fa13605159e.crc differ diff --git a/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/parts/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/parts/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e new file mode 100644 index 0000000000..673c510bcc Binary files /dev/null and b/loading_pipeline/var/test/callsets/sex_and_relatedness_1.mt/rows/rows/parts/part-0-e9d9e112-b40b-4f08-855c-1fa13605159e differ diff --git a/loading_pipeline/var/test/callsets/sv_1.vcf b/loading_pipeline/var/test/callsets/sv_1.vcf new file mode 100644 index 0000000000..5f11091702 --- /dev/null +++ b/loading_pipeline/var/test/callsets/sv_1.vcf @@ -0,0 +1,93 @@ +##fileformat=VCFv4.2 +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT RGP_164_1 RGP_164_2 RGP_164_3 RGP_164_4 RGP_164_5 +chr1 180928 BND_chr1_6 N 657 HIGH_SR_BACKGROUND;UNRESOLVED ALGORITHMS=manta;CHR2=chr5;END=180928;END2=20404;EVIDENCE=PE,SR;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=OR4F5,PLEKHG4B;PREDICTED_NONCODING_BREAKPOINT=DNase;STRANDS=+-;SVLEN=-1;SVTYPE=BND;UNRESOLVED_TYPE=SINGLE_ENDER_+-;AN=8;AC=1;AF=0.04775;N_BI_GENOS=2911;N_HOMREF=2633;N_HET=278;N_HOMALT=0;FREQ_HOMREF=0.9045;FREQ_HET=0.0954998;FREQ_HOMALT=0;MALE_AN=2894;MALE_AC=137;MALE_AF=0.047339;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1310;MALE_N_HET=137;MALE_N_HOMALT=0;MALE_FREQ_HOMREF=0.905321;MALE_FREQ_HET=0.0946786;MALE_FREQ_HOMALT=0;FEMALE_AN=2906;FEMALE_AC=139;FEMALE_AF=0.047832;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1314;FEMALE_N_HET=139;FEMALE_N_HOMALT=0;FEMALE_FREQ_HOMREF=0.904336;FEMALE_FREQ_HET=0.0956641;FEMALE_FREQ_HOMALT=0;SEQR_INTERNAL_TRUTH_VID=BND_chr1_6 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:2:0 0/1:SR:31:99:0:31:1 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:2:0 0/0:PE,SR:99:99:0:2:0 +chr1 257666 DUP_chr1_5 N 999 PASS ALGORITHMS=depth;CHR2=chr1;END=263666;EVIDENCE=BAF,RD;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=OR4F29;SVLEN=6000;SVTYPE=DUP;AN=8;AC=1;AF=0.115596;N_BI_GENOS=2911;N_HOMREF=2348;N_HET=453;N_HOMALT=110;FREQ_HOMREF=0.806596;FREQ_HET=0.155617;FREQ_HOMALT=0.0377877;MALE_AN=2894;MALE_AC=339;MALE_AF=0.117139;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1163;MALE_N_HET=229;MALE_N_HOMALT=55;MALE_FREQ_HOMREF=0.803732;MALE_FREQ_HET=0.158258;MALE_FREQ_HOMALT=0.0380097;FEMALE_AN=2906;FEMALE_AC=330;FEMALE_AF=0.113558;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1178;FEMALE_N_HET=220;FEMALE_N_HOMALT=55;FEMALE_FREQ_HOMREF=0.810736;FEMALE_FREQ_HET=0.151411;FEMALE_FREQ_HOMALT=0.0378527;SEQR_INTERNAL_TRUTH_VID=DUP_chr1_5 GT:EV:GQ:RD_CN:RD_GQ 0/0:RD:99:2:99 0/0:RD:99:2:99 0/1:RD:8:3:8 0/0:RD:13:1:13 0/0:RD:13:1:13 +chr1 413968 DEL_chr1_12 N 999 PASS ALGORITHMS=depth;CHR2=chr1;END=428500;EVIDENCE=RD;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=OR4F29;SVLEN=14532;SVTYPE=DEL;AN=8;AC=1;AF=0.064926;N_BI_GENOS=2911;N_HOMREF=2538;N_HET=368;N_HOMALT=5;FREQ_HOMREF=0.871865;FREQ_HET=0.126417;FREQ_HOMALT=0.00171762;MALE_AN=2894;MALE_AC=172;MALE_AF=0.059433;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1278;MALE_N_HET=166;MALE_N_HOMALT=3;MALE_FREQ_HOMREF=0.883207;MALE_FREQ_HET=0.11472;MALE_FREQ_HOMALT=0.00207325;FEMALE_AN=2906;FEMALE_AC=205;FEMALE_AF=0.070544;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1250;FEMALE_N_HET=201;FEMALE_N_HOMALT=2;FEMALE_FREQ_HOMREF=0.860289;FEMALE_FREQ_HET=0.138334;FEMALE_FREQ_HOMALT=0.00137646;SEQR_INTERNAL_TRUTH_VID=DEL_chr1_12 GT:EV:GQ:RD_CN:RD_GQ 0/0:RD:12:2:12 0/0:RD:0:2:0 0/1:RD:99:1:99 0/0:RD:2:2:2 0/0:RD:2:2:2 +chr1 789481 BND_chr1_9 N 999 PESR_GT_OVERDISPERSION;UNRESOLVED ALGORITHMS=manta;CHR2=chr1;END=789481;EVIDENCE=PE;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=FBXO28,OR4F16;PREDICTED_NONCODING_BREAKPOINT=DNase,Tommerup_TADanno;STRANDS=-+;SVLEN=223225007;SVTYPE=BND;UNRESOLVED_TYPE=SINGLE_ENDER_-+;AN=8;AC=7;AF=0.910684;N_BI_GENOS=2911;N_HOMREF=0;N_HET=520;N_HOMALT=2391;FREQ_HOMREF=0;FREQ_HET=0.178633;FREQ_HOMALT=0.821367;MALE_AN=2894;MALE_AC=2639;MALE_AF=0.911887;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=0;MALE_N_HET=255;MALE_N_HOMALT=1192;MALE_FREQ_HOMREF=0;MALE_FREQ_HET=0.176227;MALE_FREQ_HOMALT=0.823773;FEMALE_AN=2906;FEMALE_AC=2643;FEMALE_AF=0.909498;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=0;FEMALE_N_HET=263;FEMALE_N_HOMALT=1190;FEMALE_FREQ_HOMREF=0;FEMALE_FREQ_HET=0.181005;FEMALE_FREQ_HOMALT=0.818995;SEQR_INTERNAL_TRUTH_VID=BND_chr1_9 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 1/1:PE:59:59:2:99:0 1/1:PE:26:26:2:99:0 1/1:PE:39:39:2:99:0 0/1:PE:19:19:1:99:0 0/1:PE:19:19:1:99:0 +chr1 4228405 INS_chr1_65 N 605 HIGH_SR_BACKGROUND ALGORITHMS=manta,melt;CHR2=chr1;END=4228448;EVIDENCE=SR;gnomAD_V2_SVID=gnomAD-SV_v2.1_INS_chr1_65;GNOMAD_V4.1_TRUTH_VID=gnomAD-SV_v3_BND_chr1_0001f5b7;gnomAD_V2_AF=0.068962998688221;gnomAD_V2_AC=224;gnomAD_V2_AN=3247;StrVCTVRE=0.1255;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=C1orf174;SVLEN=298;SVTYPE=INS;AN=8;AC=1;AF=0.10237;N_BI_GENOS=2911;N_HOMREF=2318;N_HET=590;N_HOMALT=3;FREQ_HOMREF=0.79629;FREQ_HET=0.202679;FREQ_HOMALT=0.00103057;MALE_AN=2894;MALE_AC=293;MALE_AF=0.101244;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1156;MALE_N_HET=289;MALE_N_HOMALT=2;MALE_FREQ_HOMREF=0.798894;MALE_FREQ_HET=0.199724;MALE_FREQ_HOMALT=0.00138217;FEMALE_AN=2906;FEMALE_AC=302;FEMALE_AF=0.103923;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1152;FEMALE_N_HET=300;FEMALE_N_HOMALT=1;FEMALE_FREQ_HOMREF=0.792842;FEMALE_FREQ_HET=0.206469;FEMALE_FREQ_HOMALT=0.000688231;SEQR_INTERNAL_TRUTH_VID=INS_chr1_65 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/1:SR:62:99:0:62:1 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 +chr1 6558902 CPX_chr1_22 N 644 HIGH_SR_BACKGROUND ALGORITHMS=manta;BOTHSIDES_SUPPORT;CHR2=chr1;CPX_INTERVALS=INV_chr1:6558902-6559723,DUP_chr1:6559655-6559723;CPX_TYPE=INVdup;END=6559723;EVIDENCE=PE,SR;PREDICTED_INTRONIC=TAS1R1;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;PREDICTED_NONCODING_SPAN=DNase;SVLEN=821;SVTYPE=CPX;AN=8;AC=2;AF=0.169873;N_BI_GENOS=2911;N_HOMREF=1925;N_HET=983;N_HOMALT=3;FREQ_HOMREF=0.661285;FREQ_HET=0.337685;FREQ_HOMALT=0.00103057;MALE_AN=2894;MALE_AC=497;MALE_AF=0.171735;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=950;MALE_N_HET=497;MALE_N_HOMALT=0;MALE_FREQ_HOMREF=0.656531;MALE_FREQ_HET=0.343469;MALE_FREQ_HOMALT=0;FEMALE_AN=2906;FEMALE_AC=488;FEMALE_AF=0.167928;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=968;FEMALE_N_HET=482;FEMALE_N_HOMALT=3;FEMALE_FREQ_HOMREF=0.666208;FEMALE_FREQ_HET=0.331727;FEMALE_FREQ_HOMALT=0.00206469;SEQR_INTERNAL_TRUTH_VID=CPX_chr1_22 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT:RD_CN:CONC_ST 0/0:PE,SR:99:99:0:99:0:2:EMPTY 0/1:PE,SR:57:0:0:57:1:2:TN,TP 0/1:PE,SR:0:0:1:99:0:2:FP,TN 0/0:PE,SR:99:99:0:0:0:3:FN 1/1:PE,SR:99:99:0:0:0:1:FP,TP +chr1 16088760 CPX_chr1_41 N 684 PASS ALGORITHMS=manta;CHR2=chr1;CPX_INTERVALS=DUP_chr1:16088760-16088835,INV_chr1:16088760-16089601;CPX_TYPE=dupINV;END=16089601;EVIDENCE=PE,SR;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=FAM131C;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;PREDICTED_NONCODING_SPAN=DNase;SVLEN=841;SVTYPE=CPX;AN=8;AC=2;AF=0.218138;N_BI_GENOS=2911;N_HOMREF=1659;N_HET=1234;N_HOMALT=18;FREQ_HOMREF=0.569907;FREQ_HET=0.423909;FREQ_HOMALT=0.00618344;MALE_AN=2894;MALE_AC=635;MALE_AF=0.219419;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=818;MALE_N_HET=623;MALE_N_HOMALT=6;MALE_FREQ_HOMREF=0.565308;MALE_FREQ_HET=0.430546;MALE_FREQ_HOMALT=0.00414651;FEMALE_AN=2906;FEMALE_AC=629;FEMALE_AF=0.216449;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=836;FEMALE_N_HET=605;FEMALE_N_HOMALT=12;FEMALE_FREQ_HOMREF=0.575361;FEMALE_FREQ_HET=0.41638;FEMALE_FREQ_HOMALT=0.00825877;SEQR_INTERNAL_TRUTH_VID=CPX_chr1_41 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/1:SR:52:0:0:52:1 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 0/1:SR:62:0:0:62:1 0/1:SR:62:0:0:62:1 +chr1 17465707 INS_chr1_268 N 263 HIGH_SR_BACKGROUND ALGORITHMS=melt;CHR2=chr1;END=17465723;EVIDENCE=SR;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=RCC2;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;SVLEN=955;SVTYPE=INS;AN=8;AC=1;AF=0.004466;N_BI_GENOS=2911;N_HOMREF=2885;N_HET=26;N_HOMALT=0;FREQ_HOMREF=0.991068;FREQ_HET=0.00893164;FREQ_HOMALT=0;MALE_AN=2894;MALE_AC=14;MALE_AF=0.004838;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1433;MALE_N_HET=14;MALE_N_HOMALT=0;MALE_FREQ_HOMREF=0.990325;MALE_FREQ_HET=0.00967519;MALE_FREQ_HOMALT=0;FEMALE_AN=2906;FEMALE_AC=11;FEMALE_AF=0.003785;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1442;FEMALE_N_HET=11;FEMALE_N_HOMALT=0;FEMALE_FREQ_HOMREF=0.992429;FEMALE_FREQ_HET=0.00757054;FEMALE_FREQ_HOMALT=0;SEQR_INTERNAL_TRUTH_VID=INS_chr1_268 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 0/1:SR:0:99:0:0:1 0/0:PE,SR:99:99:0:2:0 0/0:PE,SR:99:99:0:2:0 +chr1 21427498 CPX_chr1_54 N 733 PASS ALGORITHMS=manta;CHR2=chr1;CPX_INTERVALS=DUP_chr1:21427498-21427959,INV_chr1:21427498-21480073,DEL_chr1:21480073-21480419;CPX_TYPE=dupINVdel;END=21480419;EVIDENCE=PE;PREDICTED_LOF=NBPF3;PREDICTED_NONCODING_BREAKPOINT=DNase,Tommerup_TADanno;PREDICTED_NONCODING_SPAN=DNase;SVLEN=52921;SVTYPE=CPX;AN=8;AC=4;AF=0.499656;N_BI_GENOS=2911;N_HOMREF=51;N_HET=2811;N_HOMALT=49;FREQ_HOMREF=0.0175198;FREQ_HET=0.965648;FREQ_HOMALT=0.0168327;MALE_AN=2894;MALE_AC=1453;MALE_AF=0.502073;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=19;MALE_N_HET=1403;MALE_N_HOMALT=25;MALE_FREQ_HOMREF=0.0131306;MALE_FREQ_HET=0.969592;MALE_FREQ_HOMALT=0.0172771;FEMALE_AN=2906;FEMALE_AC=1445;FEMALE_AF=0.497247;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=32;FEMALE_N_HET=1397;FEMALE_N_HOMALT=24;FEMALE_FREQ_HOMREF=0.0220234;FEMALE_FREQ_HET=0.961459;FEMALE_FREQ_HOMALT=0.0165175;SEQR_INTERNAL_TRUTH_VID=CPX_chr1_54 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/1:PE:93:93:1:99:0 0/1:PE:79:79:1:99:0 0/1:PE:33:33:1:6:0 0/1:PE,SR:39:39:1:99:0 0/1:PE,SR:39:39:1:99:0 +chr1 48963084 INS_chr1_688 N 526 HIGH_SR_BACKGROUND ALGORITHMS=melt;CHR2=chr1;END=48963135;EVIDENCE=SR;PREDICTED_INTRONIC=AGBL4;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;SVLEN=5520;SVTYPE=INS;AN=8;AC=1;AF=0.06338;N_BI_GENOS=2911;N_HOMREF=2544;N_HET=365;N_HOMALT=2;FREQ_HOMREF=0.873926;FREQ_HET=0.125386;FREQ_HOMALT=0.000687049;MALE_AN=2894;MALE_AC=177;MALE_AF=0.061161;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1271;MALE_N_HET=175;MALE_N_HOMALT=1;MALE_FREQ_HOMREF=0.878369;MALE_FREQ_HET=0.12094;MALE_FREQ_HOMALT=0.000691085;FEMALE_AN=2906;FEMALE_AC=192;FEMALE_AF=0.06607;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1262;FEMALE_N_HET=190;FEMALE_N_HOMALT=1;FEMALE_FREQ_HOMREF=0.868548;FEMALE_FREQ_HET=0.130764;FEMALE_FREQ_HOMALT=0.000688231;SEQR_INTERNAL_TRUTH_VID=INS_chr1_688 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 0/1:SR:0:99:0:0:1 0/1:SR:0:99:0:0:1 +chr1 180540234 CPX_chr1_251 N 999 UNRESOLVED ALGORITHMS=manta;CHR2=chr1;CPX_INTERVALS=DEL_chr1:180540234-181074767,INV_chr1:181074767-181074938;CPX_TYPE=delINV;END=181074952;EVIDENCE=PE,SR;PREDICTED_LOF=KIAA1614,MR1,STX6,XPR1;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;PREDICTED_NONCODING_SPAN=DNase,Enhancer;SVLEN=534718;SVTYPE=CPX;UNRESOLVED_TYPE=POSTHOC_RD_GT_REJECTION;AN=8;AC=3;AF=0.251804;N_BI_GENOS=2911;N_HOMREF=1559;N_HET=1238;N_HOMALT=114;FREQ_HOMREF=0.535555;FREQ_HET=0.425283;FREQ_HOMALT=0.0391618;MALE_AN=2894;MALE_AC=724;MALE_AF=0.250173;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=784;MALE_N_HET=602;MALE_N_HOMALT=61;MALE_FREQ_HOMREF=0.541811;MALE_FREQ_HET=0.416033;MALE_FREQ_HOMALT=0.0421562;FEMALE_AN=2906;FEMALE_AC=736;FEMALE_AF=0.253269;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=770;FEMALE_N_HET=630;FEMALE_N_HOMALT=53;FEMALE_FREQ_HOMREF=0.529938;FEMALE_FREQ_HET=0.433586;FEMALE_FREQ_HOMALT=0.0364763;SEQR_INTERNAL_TRUTH_VID=CPX_chr1_251 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:99:0 0/1:PE,SR:41:26:1:41:1 1/1:PE,SR:89:33:1:89:2 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 +chrX 3 CPX_chrX_251 N 999 UNRESOLVED ALGORITHMS=manta;CPX_INTERVALS=DEL_chr1:180540234-181074767,INV_chr1:181074767-181074938;CPX_TYPE=delINV;END=2781000;EVIDENCE=PE,SR;PREDICTED_LOF=KIAA1614,MR1,STX6,XPR1;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;PREDICTED_NONCODING_SPAN=DNase,Enhancer;SVLEN=534718;SVTYPE=CPX;UNRESOLVED_TYPE=POSTHOC_RD_GT_REJECTION;AN=8;AC=3;AF=0.251804;N_BI_GENOS=2911;N_HOMREF=1559;N_HET=1238;N_HOMALT=114;FREQ_HOMREF=0.535555;FREQ_HET=0.425283;FREQ_HOMALT=0.0391618;MALE_AN=2894;MALE_AC=724;MALE_AF=0.250173;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=784;MALE_N_HET=602;MALE_N_HOMALT=61;MALE_FREQ_HOMREF=0.541811;MALE_FREQ_HET=0.416033;MALE_FREQ_HOMALT=0.0421562;FEMALE_AN=2906;FEMALE_AC=736;FEMALE_AF=0.253269;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=770;FEMALE_N_HET=630;FEMALE_N_HOMALT=53;FEMALE_FREQ_HOMREF=0.529938;FEMALE_FREQ_HET=0.433586;FEMALE_FREQ_HOMALT=0.0364763;SEQR_INTERNAL_TRUTH_VID=CPX_chrX_251 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:99:0 0/1:PE,SR:41:26:1:41:1 1/1:PE,SR:89:33:1:89:2 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 +chrX 2781700 CPX_chrX_252 N 999 UNRESOLVED ALGORITHMS=manta;CPX_INTERVALS=DEL_chr1:180540234-181074767,INV_chr1:181074767-181074938;CPX_TYPE=delINV;END=2781900;EVIDENCE=PE,SR;PREDICTED_LOF=KIAA1614,MR1,STX6,XPR1;PREDICTED_NONCODING_BREAKPOINT=Tommerup_TADanno;PREDICTED_NONCODING_SPAN=DNase,Enhancer;SVLEN=534718;SVTYPE=CPX;UNRESOLVED_TYPE=POSTHOC_RD_GT_REJECTION;AN=8;AC=3;AF=0.251804;N_BI_GENOS=2911;N_HOMREF=1559;N_HET=1238;N_HOMALT=114;FREQ_HOMREF=0.535555;FREQ_HET=0.425283;FREQ_HOMALT=0.0391618;MALE_AN=2894;MALE_AC=724;MALE_AF=0.250173;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=784;MALE_N_HET=602;MALE_N_HOMALT=61;MALE_FREQ_HOMREF=0.541811;MALE_FREQ_HET=0.416033;MALE_FREQ_HOMALT=0.0421562;FEMALE_AN=2906;FEMALE_AC=736;FEMALE_AF=0.253269;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=770;FEMALE_N_HET=630;FEMALE_N_HOMALT=53;FEMALE_FREQ_HOMREF=0.529938;FEMALE_FREQ_HET=0.433586;FEMALE_FREQ_HOMALT=0.0364763;SEQR_INTERNAL_TRUTH_VID=CPX_chrX_252 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:99:0 0/1:PE,SR:41:26:1:41:1 1/1:PE,SR:89:33:1:89:2 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:99:0 diff --git a/loading_pipeline/var/test/callsets/sv_2.vcf b/loading_pipeline/var/test/callsets/sv_2.vcf new file mode 100644 index 0000000000..12f65690ed --- /dev/null +++ b/loading_pipeline/var/test/callsets/sv_2.vcf @@ -0,0 +1,82 @@ +##fileformat=VCFv4.2 +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT RGP_164_1 RGP_164_2 RGP_164_3 RGP_164_4 RGP_164_5 +chr1 180929 new_variant1 N 657 HIGH_SR_BACKGROUND;UNRESOLVED ALGORITHMS=manta;CHR2=chr5;END=180928;END2=20404;EVIDENCE=PE,SR;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=OR4F5,PLEKHG4B;PREDICTED_NONCODING_BREAKPOINT=DNase;STRANDS=+-;SVLEN=-1;SVTYPE=BND;UNRESOLVED_TYPE=SINGLE_ENDER_+-;AN=8;AC=1;AF=0.04775;N_BI_GENOS=2911;N_HOMREF=2633;N_HET=278;N_HOMALT=0;FREQ_HOMREF=0.9045;FREQ_HET=0.0954998;FREQ_HOMALT=0;MALE_AN=2894;MALE_AC=137;MALE_AF=0.047339;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1310;MALE_N_HET=137;MALE_N_HOMALT=0;MALE_FREQ_HOMREF=0.905321;MALE_FREQ_HET=0.0946786;MALE_FREQ_HOMALT=0;FEMALE_AN=2906;FEMALE_AC=139;FEMALE_AF=0.047832;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1314;FEMALE_N_HET=139;FEMALE_N_HOMALT=0;FEMALE_FREQ_HOMREF=0.904336;FEMALE_FREQ_HET=0.0956641;FEMALE_FREQ_HOMALT=0;SEQR_INTERNAL_TRUTH_VID=BND_chr1_6 GT:EV:GQ:PE_GQ:PE_GT:SR_GQ:SR_GT 0/0:PE,SR:99:99:0:2:0 0/1:SR:31:99:0:31:1 0/0:PE,SR:99:99:0:99:0 0/0:PE,SR:99:99:0:2:0 0/0:PE,SR:99:99:0:2:0 +chr1 257667 new_variant2 N 999 PASS ALGORITHMS=depth;CHR2=chr1;END=263666;EVIDENCE=BAF,RD;PREDICTED_INTERGENIC;PREDICTED_NEAREST_TSS=OR4F29;SVLEN=6000;SVTYPE=DUP;AN=8;AC=1;AF=0.115596;N_BI_GENOS=2911;N_HOMREF=2348;N_HET=453;N_HOMALT=110;FREQ_HOMREF=0.806596;FREQ_HET=0.155617;FREQ_HOMALT=0.0377877;MALE_AN=2894;MALE_AC=339;MALE_AF=0.117139;MALE_N_BI_GENOS=1447;MALE_N_HOMREF=1163;MALE_N_HET=229;MALE_N_HOMALT=55;MALE_FREQ_HOMREF=0.803732;MALE_FREQ_HET=0.158258;MALE_FREQ_HOMALT=0.0380097;FEMALE_AN=2906;FEMALE_AC=330;FEMALE_AF=0.113558;FEMALE_N_BI_GENOS=1453;FEMALE_N_HOMREF=1178;FEMALE_N_HET=220;FEMALE_N_HOMALT=55;FEMALE_FREQ_HOMREF=0.810736;FEMALE_FREQ_HET=0.151411;FEMALE_FREQ_HOMALT=0.0378527 GT:EV:GQ:RD_CN:RD_GQ 0/0:RD:99:2:99 0/0:RD:99:2:99 0/1:RD:8:3:8 0/0:RD:13:1:13 0/0:RD:13:1:13 \ No newline at end of file diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/.README.txt.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/.README.txt.crc new file mode 100644 index 0000000000..c1cb9e1cab Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/._SUCCESS.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..27052adc06 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/README.txt b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/README.txt new file mode 100644 index 0000000000..445c1e13a8 --- /dev/null +++ b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2025/05/04 18:49:34 \ No newline at end of file diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/_SUCCESS b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..f7194790a0 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..350a11747e Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..6541f64d2c Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/parts/part-0 b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/parts/part-0 new file mode 100644 index 0000000000..85ab02b24c Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/.index.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/.index.crc new file mode 100644 index 0000000000..cf0257b60e Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/.index.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..751197244d Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/index b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/index new file mode 100644 index 0000000000..4ae215d83b Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/index differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/metadata.json.gz new file mode 100644 index 0000000000..6cdddecc83 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/index/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/metadata.json.gz new file mode 100644 index 0000000000..ad1fd002ca Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..47a0a0400d Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..3a2611398e Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/parts/.part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.crc b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/parts/.part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.crc new file mode 100644 index 0000000000..f0eb4939d9 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/parts/.part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/parts/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4 b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/parts/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4 new file mode 100644 index 0000000000..7317a0e86c Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh37/SNV_INDEL/annotations.ht/rows/parts/part-0-ca83e9ef-60f3-4c8e-8ae5-b90998d2d0e4 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/.README.txt.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/.README.txt.crc new file mode 100644 index 0000000000..b526a400e7 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/._SUCCESS.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..7f9ac55b1c Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/README.txt b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/README.txt new file mode 100644 index 0000000000..b21756d31f --- /dev/null +++ b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.138-58956ebc28fc + Created at 2026/08/31 15:16:33 \ No newline at end of file diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/_SUCCESS b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..d32224cc70 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..71ed56d7d0 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..069033b303 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/parts/part-0 b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/parts/part-0 new file mode 100644 index 0000000000..42f8330474 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/.index.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/.index.crc new file mode 100644 index 0000000000..e19c12a25f Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/.index.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..c6dd44de18 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/index b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/index new file mode 100644 index 0000000000..51ccd1400a Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/index differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/metadata.json.gz new file mode 100644 index 0000000000..4b1dbbea7f Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/index/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/metadata.json.gz new file mode 100644 index 0000000000..55fa46f67a Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..8365580fed Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..ce0edcfee1 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/parts/.part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.crc b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/parts/.part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.crc new file mode 100644 index 0000000000..9915be5e9c Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/parts/.part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/parts/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/parts/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a new file mode 100644 index 0000000000..3770a52d06 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/GCNV/annotations.ht/rows/parts/part-0-3a8ac5d5-4931-4758-a2e3-cb3c64f3022a differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/.README.txt.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/.README.txt.crc new file mode 100644 index 0000000000..a50e10d673 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/._SUCCESS.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..9299c4d4af Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/README.txt b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/README.txt new file mode 100644 index 0000000000..1704097d11 --- /dev/null +++ b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.136-c32f88309ab0 + Created at 2026/03/13 08:55:35 \ No newline at end of file diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/_SUCCESS b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..c18613e105 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..0632813948 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..664f2ca5fc Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/parts/part-0 b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/parts/part-0 new file mode 100644 index 0000000000..e7994bfdd3 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/.index.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/.index.crc new file mode 100644 index 0000000000..297939e868 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/.index.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..3ed7199fef Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/index b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/index new file mode 100644 index 0000000000..5a8cd1382d Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/index differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/metadata.json.gz new file mode 100644 index 0000000000..d5cd8343d1 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/index/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/metadata.json.gz new file mode 100644 index 0000000000..0c16c69ed6 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..f7768c9f36 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..a28d74ae7d Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/parts/.part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.crc b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/parts/.part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.crc new file mode 100644 index 0000000000..be20b241bd Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/parts/.part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/parts/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252 b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/parts/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252 new file mode 100644 index 0000000000..fd340a9946 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/MITO/annotations.ht/rows/parts/part-0-fdd371f1-3f3c-4d14-b27b-45c589a0d252 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/.README.txt.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/.README.txt.crc new file mode 100644 index 0000000000..34a9ea1054 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/._SUCCESS.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..918853e3eb Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/README.txt b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/README.txt new file mode 100644 index 0000000000..7e487cd55c --- /dev/null +++ b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.136-c32f88309ab0 + Created at 2026/03/13 08:03:38 \ No newline at end of file diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/_SUCCESS b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..4cb4172d77 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..b6adbc4c02 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1a704f7641 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/parts/part-0 b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/parts/part-0 new file mode 100644 index 0000000000..1426bd5596 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/.index.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/.index.crc new file mode 100644 index 0000000000..8d440a020e Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/.index.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..1ebb404758 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/index b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/index new file mode 100644 index 0000000000..35d8518d2c Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/index differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/metadata.json.gz new file mode 100644 index 0000000000..172607a22a Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-0-80daf29a-0583-42ea-a0e4-575078440689.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/.index.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/.index.crc new file mode 100644 index 0000000000..2584b92900 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/.index.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..1ebb404758 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/index b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/index new file mode 100644 index 0000000000..774b3a1b92 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/index differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/metadata.json.gz new file mode 100644 index 0000000000..172607a22a Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/index/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/metadata.json.gz new file mode 100644 index 0000000000..debd421701 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..62a8486694 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..dcb5493251 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/.part-0-80daf29a-0583-42ea-a0e4-575078440689.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/.part-0-80daf29a-0583-42ea-a0e4-575078440689.crc new file mode 100644 index 0000000000..c9c6edfe21 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/.part-0-80daf29a-0583-42ea-a0e4-575078440689.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/.part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.crc b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/.part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.crc new file mode 100644 index 0000000000..b20a251979 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/.part-1-3e36856d-df74-4a68-bdf2-b90374ab2892.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/part-0-80daf29a-0583-42ea-a0e4-575078440689 b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/part-0-80daf29a-0583-42ea-a0e4-575078440689 new file mode 100644 index 0000000000..f54c612dcc Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/part-0-80daf29a-0583-42ea-a0e4-575078440689 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892 b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892 new file mode 100644 index 0000000000..ab11c2567d Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SNV_INDEL/annotations.ht/rows/parts/part-1-3e36856d-df74-4a68-bdf2-b90374ab2892 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/.README.txt.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/.README.txt.crc new file mode 100644 index 0000000000..92890a206a Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/._SUCCESS.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..a0915445bb Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/README.txt b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/README.txt new file mode 100644 index 0000000000..e7a56c7cfe --- /dev/null +++ b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.136-c32f88309ab0 + Created at 2026/03/13 08:54:11 \ No newline at end of file diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/_SUCCESS b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..69c3b5fd09 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..d94645fc93 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..257499619b Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/parts/part-0 b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/parts/part-0 new file mode 100644 index 0000000000..e37a9f8645 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/.index.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/.index.crc new file mode 100644 index 0000000000..fb3c897421 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/.index.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..3204f12429 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/index b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/index new file mode 100644 index 0000000000..b7ef807b49 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/index differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/metadata.json.gz new file mode 100644 index 0000000000..61b55055d6 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/index/part-0-814fa12d-6ffe-4fd2-b154-492a28802540.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/metadata.json.gz new file mode 100644 index 0000000000..c129dd9967 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..7aee0b013f Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/metadata.json.gz b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..f4813f77ca Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/parts/.part-0-814fa12d-6ffe-4fd2-b154-492a28802540.crc b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/parts/.part-0-814fa12d-6ffe-4fd2-b154-492a28802540.crc new file mode 100644 index 0000000000..8e3043a139 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/parts/.part-0-814fa12d-6ffe-4fd2-b154-492a28802540.crc differ diff --git a/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/parts/part-0-814fa12d-6ffe-4fd2-b154-492a28802540 b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/parts/part-0-814fa12d-6ffe-4fd2-b154-492a28802540 new file mode 100644 index 0000000000..756a9324b9 Binary files /dev/null and b/loading_pipeline/var/test/exports/GRCh38/SV/annotations.ht/rows/parts/part-0-814fa12d-6ffe-4fd2-b154-492a28802540 differ diff --git a/loading_pipeline/var/test/pedigrees/test_mito_export_pedigree.tsv b/loading_pipeline/var/test/pedigrees/test_mito_export_pedigree.tsv new file mode 100644 index 0000000000..475de1f215 --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_mito_export_pedigree.tsv @@ -0,0 +1,2 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0116_test_project3 family_1 family_1 RGP_1270_2 F \ No newline at end of file diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_1.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_1.tsv new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_10.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_10.tsv new file mode 100644 index 0000000000..a3c841dbda --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_10.tsv @@ -0,0 +1,2 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0116_test_project3 family_1 family_1 RGP_164_1 F \ No newline at end of file diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_11.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_11.tsv new file mode 100644 index 0000000000..e8cce7072f --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_11.tsv @@ -0,0 +1,2 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0117_test_project4 family_2 family_2 RGP_164_2 M \ No newline at end of file diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_2.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_2.tsv new file mode 100644 index 0000000000..5fe13d038f --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_2.tsv @@ -0,0 +1,11 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0111_tgg_bblanken_wes BBL_SDS1-000178_1 BBL_SDS1-000178 BBL_SDS1-000178_01_D1 F +R0111_tgg_bblanken_wes BBL_HT-007-5195_1 BBL_HT-007-5195 BBL_HT-007-5195_01_D1 BBL_HT-007-5195_02_D1 BBL_HT-007-5195_03_D1 F +R0111_tgg_bblanken_wes BBL_HT-007-5195_1 BBL_HT-007-5195 BBL_HT-007-5195_02_D1 M +R0111_tgg_bblanken_wes BBL_HT-007-5195_1 BBL_HT-007-5195 BBL_HT-007-5195_03_D1 F +R0111_tgg_bblanken_wes BBL_HT-007-5195_1 BBL_HT-007-5195 BBL_HT-007-5195_04_D1 BBL_HT-007-5195_02_D1 BBL_HT-007-5195_03_D1 M +R0111_tgg_bblanken_wes BBL_HT-007-5195_1 BBL_HT-007-5195 BBL_HT-007-5195_05_D1 BBL_HT-007-5195_02_D1 BBL_HT-007-5195_03_D1 F +R0111_tgg_bblanken_wes BBL_HT-007-5195_1 BBL_HT-007-5195 BBL_HT-007-5195_06_D1 BBL_HT-007-5195_02_D1 BBL_HT-007-5195_03_D1 M +R0111_tgg_bblanken_wes BBL_BC1-000345_1 BBL_BC1-000345 BBL_BC1-000345_01_D1 BBL_BC1-000345_02_D1 BBL_BC1-000345_03_D1 U +R0111_tgg_bblanken_wes BBL_BC1-000345_1 BBL_BC1-000345 BBL_BC1-000345_02_D1 M +R0111_tgg_bblanken_wes BBL_BC1-000345_1 BBL_BC1-000345 BBL_BC1-000345_03_D1 F diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_3_different_families.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_3_different_families.tsv new file mode 100644 index 0000000000..45269b19b7 --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_3_different_families.tsv @@ -0,0 +1,4 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex VCF_ID +R0113_test_project abc_1 abc HG00731_1 F HG00731 +R0113_test_project abc_1 abc HG00733_1 HG00732_1 HG00731_1 F HG00733 +R0113_test_project abc_1 abc HG00733_5 HG00732_6 HG00731_5 F BG00735 diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv new file mode 100644 index 0000000000..db929b85be --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_3_remap.tsv @@ -0,0 +1,4 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex VCF_ID +R0113_test_project abc_1 abc HG00731_1 F HG00731 +R0113_test_project abc_1 abc HG00732_1 M HG00732 +R0113_test_project abc_1 abc HG00733_1 HG00732_1 HG00731_1 F HG00733 diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_4_remap.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_4_remap.tsv new file mode 100644 index 0000000000..41fe3c4072 --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_4_remap.tsv @@ -0,0 +1,14 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex VCF_ID +R0114_project4 123_1 123 NA19675_1 F NA19675 +R0114_project4 234_1 234 NA19678_1 M NA19678 +R0114_project4 345_1 345 NA19679_1 F NA19679 +R0114_project4 456_1 456 NA20870_1 F NA20870 +R0114_project4 567_1 567 NA20872_1 M NA20872 +R0114_project4 678_1 678 NA20874_1 F NA20874 +R0114_project4 789_1 789 NA20875_1 F NA20875 +R0114_project4 890_1 890 NA20876_1 F NA20876 +R0114_project4 901_1 901 NA20877_1 F NA20877 +R0114_project4 bcd_1 bcd NA20878_1 M NA20878 +R0114_project4 cde_1 cde NA20881_1 M NA20881 +R0114_project4 def_1 def NA20885_1 M NA20885 +R0114_project4 efg_1 efg NA20888_1 F NA20888 diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_4_remap_2.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_4_remap_2.tsv new file mode 100644 index 0000000000..7b8cb96150 --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_4_remap_2.tsv @@ -0,0 +1,14 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex VCF_ID +R0114_project4 123_1 123 NA19675_1 F NA19675 +R0114_project4 234_1 234 NA19678_1 M NA19678 +R0114_project4 345_1 345 NA19679_1 F NA19679 +R0114_project4 456_1 456 NA20870_1 F NA20870 +R0114_project4 567_1 567 NA20872_1 M NA20872 +R0114_project4 678_1 678 NA20874_1 F NA20874 +R0114_project4 789_1 789 NA20875_1 F NA20875 +R0114_project4 890_1 890 NA20876_1 F NA20876 +R0114_project4 901_1 901 NA20877_1 F NA20877 +R0114_project4 bcd_1 bcd NA20878_1 M NA20878 +R0114_project4 cde_1 cde NA20881_1 M NA20881 +R0114_project4 def_1 def NA20885_1 M NA20885 +R0114_project4 efg_1 efg NA20888_1 F diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_4_subset.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_4_subset.tsv new file mode 100644 index 0000000000..9762766c2e --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_4_subset.tsv @@ -0,0 +1,4 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex VCF_ID +R0114_project4 123_1 123 NA19675_1 F NA19675 +R0114_project4 234_1 234 NA19678_1 M NA19678 +R0114_project4 234_1 234 NA19678_999 F diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_5.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_5.tsv new file mode 100644 index 0000000000..d1893154d6 --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_5.tsv @@ -0,0 +1,5 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0115_test_project2 family_2_1 family_2 RGP_164_1 F +R0115_test_project2 family_2_1 family_2 RGP_164_2 M +R0115_test_project2 family_2_1 family_2 RGP_164_3 RGP_164_1 RGP_164_2 F +R0115_test_project2 family_2_1 family_2 RGP_164_4 RGP_164_1 RGP_164_2 F \ No newline at end of file diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_6.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_6.tsv new file mode 100644 index 0000000000..bd34dca08d --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_6.tsv @@ -0,0 +1,8 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0116_sex_check_project2 family_1 family_1 ROS_006_18Y03226_D1 F +R0116_sex_check_project2 family_1 family_1 ROS_006_18Y03227_D1 U +R0116_sex_check_project2 family_1 family_1 ROS_006_18Y03228_D1 ROS_006_18Y03226_D1 ROS_006_18Y03227_D1 F +R0116_sex_check_project2 family_2 family_2 ROS_007_19Y05919_D1 F +R0116_sex_check_project2 family_2 family_2 ROS_007_19Y05939_D1 F +R0116_sex_check_project2 family_2 family_2 ROS_007_19Y05987_D1 ROS_007_19Y05919_D1 ROS_007_19Y05939_D1 F +R0116_sex_check_project2 family_2 family_2 ROS_007_19Y05989_D1 ROS_007_19Y05919_D1 ROS_007_19Y05939_D1 XXX diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_7.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_7.tsv new file mode 100644 index 0000000000..88a17601f5 --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_7.tsv @@ -0,0 +1,14 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex VCF_ID +R0114_project4 123_1 123 NA19675_1 M NA19675 +R0114_project4 234_1 234 NA19678_1 F NA19678 +R0114_project4 345_1 345 NA19679_1 M NA19679 +R0114_project4 456_1 456 NA20870_1 M NA20870 +R0114_project4 567_1 567 NA20872_1 F NA20872 +R0114_project4 678_1 678 NA20874_1 M NA20874 +R0114_project4 789_1 789 NA20875_1 M NA20875 +R0114_project4 890_1 890 NA20876_1 M NA20876 +R0114_project4 901_1 901 NA20877_1 M NA20877 +R0114_project4 bcd_1 bcd NA20878_1 F NA20878 +R0114_project4 cde_1 cde NA20881_1 F NA20881 +R0114_project4 def_1 def NA20885_1 M NA20885 +R0114_project4 efg_1 efg NA99999_1 F diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_8.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_8.tsv new file mode 100644 index 0000000000..4bacc615fc --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_8.tsv @@ -0,0 +1,2 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0115_test_project2 family_3_1 family_3 RGP_999_1 F \ No newline at end of file diff --git a/loading_pipeline/var/test/pedigrees/test_pedigree_9.tsv b/loading_pipeline/var/test/pedigrees/test_pedigree_9.tsv new file mode 100644 index 0000000000..65df24fe9b --- /dev/null +++ b/loading_pipeline/var/test/pedigrees/test_pedigree_9.tsv @@ -0,0 +1,5 @@ +Project_GUID Family_GUID Family_ID Individual_ID Paternal_ID Maternal_ID Sex +R0115_test_project2 family_2_1 family_2 RGP_164_1 F +R0115_test_project2 family_2_1 family_2 RGP_164_2 M +R0115_test_project2 family_2_3 family_3 RGP_165_1 F +R0115_test_project2 family_2_1 family_2 RGP_164_4 RGP_164_1 RGP_164_2 F \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..03c8c15088 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..22fc305926 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/README.txt new file mode 100644 index 0000000000..efd0682596 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/12/02 19:45:01 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..80fea7bf62 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..daf7dff37b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/.index.crc new file mode 100644 index 0000000000..0822dac8ba Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..f5eb925f2e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/index new file mode 100644 index 0000000000..73b40e8a52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/metadata.json.gz new file mode 100644 index 0000000000..2d8bd5ec52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-17ec1f5b-2066-40b8-9930-3167230324c6.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/.index.crc new file mode 100644 index 0000000000..0822dac8ba Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..f5eb925f2e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/index new file mode 100644 index 0000000000..73b40e8a52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/metadata.json.gz new file mode 100644 index 0000000000..2d8bd5ec52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/index/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..a38ccf2714 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..11fe3c034e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..593febbb6a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/.part-0-17ec1f5b-2066-40b8-9930-3167230324c6.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/.part-0-17ec1f5b-2066-40b8-9930-3167230324c6.crc new file mode 100644 index 0000000000..80f391d3e5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/.part-0-17ec1f5b-2066-40b8-9930-3167230324c6.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/.part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/.part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.crc new file mode 100644 index 0000000000..80f391d3e5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/.part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/part-0-17ec1f5b-2066-40b8-9930-3167230324c6 b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/part-0-17ec1f5b-2066-40b8-9930-3167230324c6 new file mode 100644 index 0000000000..0e47e70164 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/part-0-17ec1f5b-2066-40b8-9930-3167230324c6 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93 b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93 new file mode 100644 index 0000000000..0e47e70164 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/eigen/1.1.ht/rows/parts/part-0-9b0b4610-b3f6-430a-8835-c9a1e7c20e93 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..210b5569a0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..43f814d05f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/README.txt new file mode 100644 index 0000000000..cf6e4ffb56 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/11/23 20:34:42 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..036f69746b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..40495e5c56 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..5d34707bbe Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..8318eee0b0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/.index.crc new file mode 100644 index 0000000000..13f00a2510 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..d05ce69d6b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/index new file mode 100644 index 0000000000..0a9ded614e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/metadata.json.gz new file mode 100644 index 0000000000..f4cbe64c4c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/index/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..44bf874737 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..f14ed6e1a3 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..4745a0f5d6 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.crc new file mode 100644 index 0000000000..c2966988d7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7 b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7 new file mode 100644 index 0000000000..7e0d00872a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-690f60f1-5897-4a95-9d74-fce92d3e5de7 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..7161b45fdf Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..87b299b998 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/README.txt new file mode 100644 index 0000000000..8ac063914a --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/21 18:22:28 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/.index.crc new file mode 100644 index 0000000000..1d4cef4954 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..f5eb925f2e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/index new file mode 100644 index 0000000000..17abb0bb15 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/metadata.json.gz new file mode 100644 index 0000000000..2d8bd5ec52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/index/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..ef51904e0b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..96657c79c5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..782f0d8ffa Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/parts/.part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/parts/.part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.crc new file mode 100644 index 0000000000..d293389ed1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/parts/.part-0-5419bf36-548c-4524-b44c-cd77ed3f191e.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/parts/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/parts/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e new file mode 100644 index 0000000000..14036f84e1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_exomes/1.0.ht/rows/parts/part-0-5419bf36-548c-4524-b44c-cd77ed3f191e differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..41c7119f59 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..87b299b998 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/README.txt new file mode 100644 index 0000000000..c67c418925 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/21 18:24:04 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/.index.crc new file mode 100644 index 0000000000..3dfccd27db Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..f5eb925f2e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/index new file mode 100644 index 0000000000..e543726c14 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/metadata.json.gz new file mode 100644 index 0000000000..2d8bd5ec52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/index/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..ef51904e0b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..73b9be35b6 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..d6d0a81ca6 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/parts/.part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/parts/.part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.crc new file mode 100644 index 0000000000..c068935851 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/parts/.part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/parts/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8 b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/parts/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8 new file mode 100644 index 0000000000..a0f3274abe Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_genomes/1.0.ht/rows/parts/part-0-ef7f1a2e-5a3b-443d-992c-32cbd5d9ceb8 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..04a6ed182e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..3619124aff Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/README.txt new file mode 100644 index 0000000000..97552d24a4 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/11/23 12:20:19 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..ed78b28926 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..10338f5f25 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/.index.crc new file mode 100644 index 0000000000..748a41603f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..7b9ae4ad7c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/index new file mode 100644 index 0000000000..73ad7946b7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/metadata.json.gz new file mode 100644 index 0000000000..5f7a34128f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/index/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..74c5ccad05 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..2942026699 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..8fbf7562a9 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/parts/.part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/parts/.part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.crc new file mode 100644 index 0000000000..487e14e816 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/parts/.part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/parts/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/parts/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b new file mode 100644 index 0000000000..6b0630803c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/gnomad_qc/1.0.ht/rows/parts/part-0-60dc0150-c0ed-4ee2-aa12-a4459d0ae33b differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..cb2b959a1e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..3f7cea5289 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/README.txt new file mode 100644 index 0000000000..72aa75089a --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/21 18:12:44 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..054449578a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..98990f90ad Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..131000afed Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..8585d729bd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/.index.crc new file mode 100644 index 0000000000..7d6b963748 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..f5eb925f2e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/index new file mode 100644 index 0000000000..c05ecffd0b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/metadata.json.gz new file mode 100644 index 0000000000..2d8bd5ec52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/index/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..71fc4e7653 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..ccd1275314 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..1a0ea5cb8d Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/parts/.part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/parts/.part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.crc new file mode 100644 index 0000000000..412869f0e1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/parts/.part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/parts/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/parts/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e new file mode 100644 index 0000000000..6dc8f7d473 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.0.ht/rows/parts/part-0-592864e3-2b8f-4984-b6ac-79d57ab6be5e differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..7b3d1ce2ec Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..ca05ca1632 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/README.txt new file mode 100644 index 0000000000..47c23f3a04 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/12/02 17:48:09 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..054449578a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..98990f90ad Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..d3749e1e27 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..1bef1bf76a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/.index.crc new file mode 100644 index 0000000000..7d6b963748 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..f5eb925f2e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/index new file mode 100644 index 0000000000..c05ecffd0b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/metadata.json.gz new file mode 100644 index 0000000000..2d8bd5ec52 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/index/part-0-46927365-8d1a-4d88-b4a2-1e357373662f.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..c4e9006fed Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..0a73faf013 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..cf235c69e8 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/parts/.part-0-46927365-8d1a-4d88-b4a2-1e357373662f.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/parts/.part-0-46927365-8d1a-4d88-b4a2-1e357373662f.crc new file mode 100644 index 0000000000..412869f0e1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/parts/.part-0-46927365-8d1a-4d88-b4a2-1e357373662f.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/parts/part-0-46927365-8d1a-4d88-b4a2-1e357373662f b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/parts/part-0-46927365-8d1a-4d88-b4a2-1e357373662f new file mode 100644 index 0000000000..6dc8f7d473 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/splice_ai/1.1.ht/rows/parts/part-0-46927365-8d1a-4d88-b4a2-1e357373662f differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..837f7239eb Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..d8a98289a5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/README.txt new file mode 100644 index 0000000000..be6d0e1184 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/12/02 20:55:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..80fea7bf62 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..daf7dff37b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/.index.crc new file mode 100644 index 0000000000..93f7867efb Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..86fea99366 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/index new file mode 100644 index 0000000000..eed268fe3b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/metadata.json.gz new file mode 100644 index 0000000000..aaacf6d649 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-76dbc801-2c71-4b11-8886-542b96618bef.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/.index.crc new file mode 100644 index 0000000000..93f7867efb Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..86fea99366 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/index new file mode 100644 index 0000000000..eed268fe3b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/metadata.json.gz new file mode 100644 index 0000000000..aaacf6d649 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/index/part-0-c25c5126-9479-4473-8115-ad942f969297.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..60b5433288 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..835a970cad Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..f5a4cde7a9 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/.part-0-76dbc801-2c71-4b11-8886-542b96618bef.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/.part-0-76dbc801-2c71-4b11-8886-542b96618bef.crc new file mode 100644 index 0000000000..2b99657452 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/.part-0-76dbc801-2c71-4b11-8886-542b96618bef.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/.part-0-c25c5126-9479-4473-8115-ad942f969297.crc b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/.part-0-c25c5126-9479-4473-8115-ad942f969297.crc new file mode 100644 index 0000000000..2b99657452 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/.part-0-c25c5126-9479-4473-8115-ad942f969297.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/part-0-76dbc801-2c71-4b11-8886-542b96618bef b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/part-0-76dbc801-2c71-4b11-8886-542b96618bef new file mode 100644 index 0000000000..cbff0bee7d Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/part-0-76dbc801-2c71-4b11-8886-542b96618bef differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/part-0-c25c5126-9479-4473-8115-ad942f969297 b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/part-0-c25c5126-9479-4473-8115-ad942f969297 new file mode 100644 index 0000000000..cbff0bee7d Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh37/topmed/1.1.ht/rows/parts/part-0-c25c5126-9479-4473-8115-ad942f969297 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..dd72fbd4b6 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..f6a7ca741b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/README.txt new file mode 100644 index 0000000000..18fa6db649 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/12/02 19:47:44 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..80fea7bf62 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..daf7dff37b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/index/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..2524a98acf Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..c576fdb36f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..a2476d0e96 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/.part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/.part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.crc new file mode 100644 index 0000000000..541eeefc3a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/.part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/.part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/.part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.crc new file mode 100644 index 0000000000..541eeefc3a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/.part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435 b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435 new file mode 100644 index 0000000000..0ab20ea110 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/part-0-61f1979f-a34b-401f-8b8b-47bb4cee5435 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36 b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36 new file mode 100644 index 0000000000..0ab20ea110 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/eigen/1.1.ht/rows/parts/part-0-ddf51dc0-d3d7-4e99-877a-98e1866bfb36 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..d279734302 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..3b3bb60e5a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/README.txt new file mode 100644 index 0000000000..44c8ac219d --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/25 12:24:35 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..ed78b28926 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..10338f5f25 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/.index.crc new file mode 100644 index 0000000000..f30063af13 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..4b6dcb2c40 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/index new file mode 100644 index 0000000000..b84df444c1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/metadata.json.gz new file mode 100644 index 0000000000..d91c0a311f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-345f1488-be53-4c4b-8207-b052e86084d6.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/.index.crc new file mode 100644 index 0000000000..13f00a2510 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9c040e1020 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/index new file mode 100644 index 0000000000..0a9ded614e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/metadata.json.gz new file mode 100644 index 0000000000..56e0d13b41 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/.index.crc new file mode 100644 index 0000000000..a70bca0af5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..4b6dcb2c40 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/index new file mode 100644 index 0000000000..5eb0a780d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/metadata.json.gz new file mode 100644 index 0000000000..d91c0a311f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/index/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..5d1f2440f7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..08f95ba005 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..a8dd96ccee Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-345f1488-be53-4c4b-8207-b052e86084d6.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-345f1488-be53-4c4b-8207-b052e86084d6.crc new file mode 100644 index 0000000000..a0153e506e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-345f1488-be53-4c4b-8207-b052e86084d6.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.crc new file mode 100644 index 0000000000..c2966988d7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.crc new file mode 100644 index 0000000000..04686cc8c1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/.part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-345f1488-be53-4c4b-8207-b052e86084d6 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-345f1488-be53-4c4b-8207-b052e86084d6 new file mode 100644 index 0000000000..f77fff41b1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-345f1488-be53-4c4b-8207-b052e86084d6 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c new file mode 100644 index 0000000000..7e0d00872a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-0-90a40f33-45f1-4319-b895-a6f9f6f3364c differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07 new file mode 100644 index 0000000000..35ac09dfee Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_coding_and_noncoding/1.0.ht/rows/parts/part-1-f6cdce1a-0e07-4a8e-80de-c0b568f5fa07 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..f4a83594a8 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..b608109630 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/README.txt new file mode 100644 index 0000000000..7f128301c0 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/21 15:48:08 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/index/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..c11d3ce6f5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..ed4ea68e75 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..f4200fcbb2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/parts/.part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/parts/.part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.crc new file mode 100644 index 0000000000..1452464ced Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/parts/.part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/parts/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/parts/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d new file mode 100644 index 0000000000..c3a7b51ead Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_exomes/1.0.ht/rows/parts/part-0-3ff9afe8-37ef-4f6d-a894-cfc7eb27f97d differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..f51ca0ebae Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..b608109630 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/README.txt new file mode 100644 index 0000000000..92e64ba24b --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/21 15:52:38 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/index/part-0-7791073a-d4da-48f7-903f-59f1ac95d459.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..c11d3ce6f5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..e66080c258 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..1d1bed1069 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/parts/.part-0-7791073a-d4da-48f7-903f-59f1ac95d459.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/parts/.part-0-7791073a-d4da-48f7-903f-59f1ac95d459.crc new file mode 100644 index 0000000000..b3dd3cfa7b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/parts/.part-0-7791073a-d4da-48f7-903f-59f1ac95d459.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/parts/part-0-7791073a-d4da-48f7-903f-59f1ac95d459 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/parts/part-0-7791073a-d4da-48f7-903f-59f1ac95d459 new file mode 100644 index 0000000000..9b26dd8f40 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_genomes/1.0.ht/rows/parts/part-0-7791073a-d4da-48f7-903f-59f1ac95d459 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..1601350d23 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..be4fcf6c1b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/README.txt new file mode 100644 index 0000000000..ca607da808 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/11/23 12:20:50 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..ed78b28926 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..10338f5f25 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..1fdaa2e8d4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..b88778abc7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/.index.crc new file mode 100644 index 0000000000..d5055a353b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..5532412215 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/index new file mode 100644 index 0000000000..256ce27b13 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/metadata.json.gz new file mode 100644 index 0000000000..847060b9ae Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/index/part-0-46f30121-756f-4290-b7f1-e0f9993c9593.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..368a7d98d7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..972f882ed1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..b15436a3a1 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/parts/.part-0-46f30121-756f-4290-b7f1-e0f9993c9593.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/parts/.part-0-46f30121-756f-4290-b7f1-e0f9993c9593.crc new file mode 100644 index 0000000000..6d005723cb Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/parts/.part-0-46f30121-756f-4290-b7f1-e0f9993c9593.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/parts/part-0-46f30121-756f-4290-b7f1-e0f9993c9593 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/parts/part-0-46f30121-756f-4290-b7f1-e0f9993c9593 new file mode 100644 index 0000000000..3d67801f4a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_qc/1.0.ht/rows/parts/part-0-46f30121-756f-4290-b7f1-e0f9993c9593 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..970c790df6 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..879f429334 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/README.txt new file mode 100644 index 0000000000..0cc94072a0 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2025/03/24 12:55:15 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..80fea7bf62 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..daf7dff37b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/.index.crc new file mode 100644 index 0000000000..6644e60277 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..7c4edfdb79 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/index new file mode 100644 index 0000000000..adf23a1892 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/metadata.json.gz new file mode 100644 index 0000000000..96b9b1538f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/index/part-0-36781bc7-1dda-4105-be36-b1553f18f076.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..6380e9ae51 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..8f96f9b727 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..c9797a21bd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/parts/.part-0-36781bc7-1dda-4105-be36-b1553f18f076.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/parts/.part-0-36781bc7-1dda-4105-be36-b1553f18f076.crc new file mode 100644 index 0000000000..9cfc403b2c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/parts/.part-0-36781bc7-1dda-4105-be36-b1553f18f076.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/parts/part-0-36781bc7-1dda-4105-be36-b1553f18f076 b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/parts/part-0-36781bc7-1dda-4105-be36-b1553f18f076 new file mode 100644 index 0000000000..ca1ccb2123 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/gnomad_svs/1.1.ht/rows/parts/part-0-36781bc7-1dda-4105-be36-b1553f18f076 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/.README.txt.crc new file mode 100644 index 0000000000..f24ab27570 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..703610216c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/README.txt new file mode 100644 index 0000000000..c2b8762551 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/11/21 12:31:55 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..054449578a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..98990f90ad Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..131000afed Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/parts/part-0 new file mode 100644 index 0000000000..8585d729bd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/index/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/metadata.json.gz new file mode 100644 index 0000000000..3b20644da5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..815f5ba2fd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..fdc97550e7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/parts/.part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/parts/.part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.crc new file mode 100644 index 0000000000..0dcc92f011 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/parts/.part-0-6272a9a2-b08b-4926-9552-feb84ffa2308.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/parts/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308 b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/parts/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308 new file mode 100644 index 0000000000..4304a92fc0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.0.ht/rows/parts/part-0-6272a9a2-b08b-4926-9552-feb84ffa2308 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..eb8758a7c4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..2cbac43df8 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/README.txt new file mode 100644 index 0000000000..71ca03d2c6 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/12/02 17:48:32 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..054449578a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..98990f90ad Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..d3749e1e27 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..1bef1bf76a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/index/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..31e4a1ae79 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..5a64e45753 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..c62c0a9da0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/parts/.part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/parts/.part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.crc new file mode 100644 index 0000000000..0dcc92f011 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/parts/.part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/parts/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799 b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/parts/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799 new file mode 100644 index 0000000000..4304a92fc0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/splice_ai/1.1.ht/rows/parts/part-0-cb7c55a6-6eca-4e04-993b-7d2e8dbfc799 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/.README.txt.crc new file mode 100644 index 0000000000..04e18d94fa Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..029e8df55c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/README.txt b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/README.txt new file mode 100644 index 0000000000..3ff7fe1c0b --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2024/12/02 20:55:13 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..fb5ed3f93c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..c945547ba2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..80fea7bf62 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..daf7dff37b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/.index.crc new file mode 100644 index 0000000000..7cb9c5aafd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..9af5fa9257 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/index b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/index new file mode 100644 index 0000000000..a979d82bf4 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/metadata.json.gz new file mode 100644 index 0000000000..051d3e03d5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/index/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/metadata.json.gz new file mode 100644 index 0000000000..b918946c8f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..bee9a2f13e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..d5ecc5c4cd Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/.part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/.part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.crc new file mode 100644 index 0000000000..a8496fdf06 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/.part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/.part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.crc b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/.part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.crc new file mode 100644 index 0000000000..a8496fdf06 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/.part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c new file mode 100644 index 0000000000..0a289db869 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/part-0-034e458e-9a4c-4ae6-9f7c-3ab3fe19fe7c differ diff --git a/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2 b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2 new file mode 100644 index 0000000000..0a289db869 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/GRCh38/topmed/1.1.ht/rows/parts/part-0-ca4642b9-aefd-4dff-84ba-5c9d07dcc7d2 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/.README.txt.crc new file mode 100644 index 0000000000..202d5a4b2c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..4090709b13 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/README.txt b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/README.txt new file mode 100644 index 0000000000..1359f75dec --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/11/13 15:32:27 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..036f69746b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..40495e5c56 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..e1fd3bdfae Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/parts/part-0 new file mode 100644 index 0000000000..ce85de2333 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/.index.crc new file mode 100644 index 0000000000..210493e1b0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..ca274b3389 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/index b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/index new file mode 100644 index 0000000000..ffb95440bb Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/metadata.json.gz new file mode 100644 index 0000000000..14e2c0d67c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/index/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/metadata.json.gz new file mode 100644 index 0000000000..b2a26b2121 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..3ba9eb28cb Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..07dc2ffd3c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/parts/.part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/parts/.part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.crc new file mode 100644 index 0000000000..3917586c69 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/parts/.part-0-ac88ea82-778e-4722-b4a5-67b02b78322d.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/parts/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/parts/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d new file mode 100644 index 0000000000..b9257c7030 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_37.ht/rows/parts/part-0-ac88ea82-778e-4722-b4a5-67b02b78322d differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/.README.txt.crc new file mode 100644 index 0000000000..8c34199dd9 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..04e94db9f3 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/README.txt b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/README.txt new file mode 100644 index 0000000000..d66e21027b --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/11/13 15:27:31 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..b8ae778a4f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..fd09f8a9e7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..5fd2a8f0f8 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/parts/part-0 new file mode 100644 index 0000000000..daba6ef6d2 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/.index.crc new file mode 100644 index 0000000000..9933a2de56 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..1ebb404758 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/index b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/index new file mode 100644 index 0000000000..b77f409e3e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/metadata.json.gz new file mode 100644 index 0000000000..172607a22a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/index/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/metadata.json.gz new file mode 100644 index 0000000000..f8b50dec6f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..f0334b79ba Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..39e342b07a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/parts/.part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/parts/.part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.crc new file mode 100644 index 0000000000..d7c9e4de7a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/parts/.part-0-90a97bd8-3648-4074-89bd-3a64d58266e2.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/parts/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/parts/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2 new file mode 100644 index 0000000000..1164defaaa Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_exomes_38.ht/rows/parts/part-0-90a97bd8-3648-4074-89bd-3a64d58266e2 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/.README.txt.crc new file mode 100644 index 0000000000..92a8b63a47 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..79fda19623 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/README.txt b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/README.txt new file mode 100644 index 0000000000..59c6895411 --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/11/13 15:44:06 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..036f69746b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..40495e5c56 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..5d34707bbe Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/parts/part-0 new file mode 100644 index 0000000000..8318eee0b0 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/.index.crc new file mode 100644 index 0000000000..00c4847e35 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..7b9ae4ad7c Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/index b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/index new file mode 100644 index 0000000000..a64a36d410 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/metadata.json.gz new file mode 100644 index 0000000000..5f7a34128f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/index/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/metadata.json.gz new file mode 100644 index 0000000000..fad17957bf Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..66088fe5b6 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..edc8483058 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/parts/.part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/parts/.part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.crc new file mode 100644 index 0000000000..d2e431ff7f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/parts/.part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/parts/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/parts/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a new file mode 100644 index 0000000000..38cae4201f Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_37.ht/rows/parts/part-0-deb2219c-0ebe-4343-ba3c-143f95c4b24a differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/.README.txt.crc new file mode 100644 index 0000000000..8d27c2f973 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..7d7e0a3a0d Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/README.txt b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/README.txt new file mode 100644 index 0000000000..36ee163dfc --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.130-bea04d9c79b5 + Created at 2024/11/13 15:48:23 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..ac1c84b663 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..02b9777539 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..66bd45ca4b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/parts/part-0 new file mode 100644 index 0000000000..e79fae86e5 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/.index.crc new file mode 100644 index 0000000000..12a1404915 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..1ebb404758 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/index b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/index new file mode 100644 index 0000000000..1e7534f237 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/metadata.json.gz new file mode 100644 index 0000000000..172607a22a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/index/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/metadata.json.gz new file mode 100644 index 0000000000..8e094fef25 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..d7f4688c75 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..7cd0fb4d3a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/parts/.part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/parts/.part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.crc new file mode 100644 index 0000000000..e32ff1ad17 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/parts/.part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/parts/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/parts/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729 new file mode 100644 index 0000000000..5b6ef8b919 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_genomes_38.ht/rows/parts/part-0-a3c7b21c-f8dd-4d21-948b-3746f5229729 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/.README.txt.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/.README.txt.crc new file mode 100644 index 0000000000..844a375ed8 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/._SUCCESS.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..0e5fd65941 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/README.txt b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/README.txt new file mode 100644 index 0000000000..269755c89f --- /dev/null +++ b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.133-4c60fddb171a + Created at 2025/03/04 14:19:46 \ No newline at end of file diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/_SUCCESS b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..782d7d3e89 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..369b04d91a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..8231b2bcd8 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/parts/part-0 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/parts/part-0 new file mode 100644 index 0000000000..89e711531d Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/.index.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/.index.crc new file mode 100644 index 0000000000..cfe7cc9f0e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/.index.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..e2375a515e Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/index b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/index new file mode 100644 index 0000000000..1d12021303 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/index differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/metadata.json.gz new file mode 100644 index 0000000000..8ca1d35c2a Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/index/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/metadata.json.gz new file mode 100644 index 0000000000..ffb463cc45 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..e1152d2db7 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/metadata.json.gz b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..2165bea208 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/parts/.part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.crc b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/parts/.part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.crc new file mode 100644 index 0000000000..1db011f044 Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/parts/.part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6.crc differ diff --git a/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/parts/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6 b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/parts/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6 new file mode 100644 index 0000000000..1c7396f07b Binary files /dev/null and b/loading_pipeline/var/test/reference_datasets/raw/gnomad_svs_from_vcf.ht/rows/parts/part-0-e3666fa7-5bc8-471d-ab31-f4fad8e9ebb6 differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/.README.txt.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/.README.txt.crc new file mode 100644 index 0000000000..08eb6ef0b8 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/._SUCCESS.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..cd830985e6 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/README.txt b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/README.txt new file mode 100644 index 0000000000..c536e7d616 --- /dev/null +++ b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.114-cc8d36408b36 + Created at 2023/09/19 18:37:02 \ No newline at end of file diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/_SUCCESS b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..365dde7902 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..6552f3d13d Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..fa048e3582 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/parts/part-0 b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..9168f10a03 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/.index.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/.index.crc new file mode 100644 index 0000000000..cdc9b9343d Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/.index.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..7cf7197ad0 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/index b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/index new file mode 100644 index 0000000000..3931ad697a Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/index differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/metadata.json.gz b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/metadata.json.gz new file mode 100644 index 0000000000..f8252b6538 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/index/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/metadata.json.gz b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/metadata.json.gz new file mode 100644 index 0000000000..4c1ec4838e Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..6ba688a446 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..c3a99001ee Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/parts/.part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.crc b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/parts/.part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.crc new file mode 100644 index 0000000000..aafcd654ab Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/parts/.part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825.crc differ diff --git a/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/parts/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825 b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/parts/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825 new file mode 100644 index 0000000000..178d9a28f1 Binary files /dev/null and b/loading_pipeline/var/test/relatedness_check/test_relatedness_check_1.ht/rows/parts/part-0-62944c6d-be72-4bc9-9dd8-d94eea11e825 differ diff --git a/loading_pipeline/var/test/sample_qc_1.json b/loading_pipeline/var/test/sample_qc_1.json new file mode 100644 index 0000000000..2082fb6701 --- /dev/null +++ b/loading_pipeline/var/test/sample_qc_1.json @@ -0,0 +1 @@ +{"HG00731_1": {"filter_flags": ["coverage", "contamination"]}, "HG00732_1": {"filter_flags": ["coverage"]}, "HG00733_1": {"filter_flags": ["contamination"]}, "NA19675_1": {"filter_flags": []}, "NA20888_1": {"filter_flags": ["sample_failed"]}, "NA20888_2": {"filter_flags": ["sample_not_loaded"]}} diff --git a/loading_pipeline/var/test/sex_check/test_imputed_sex.tsv b/loading_pipeline/var/test/sex_check/test_imputed_sex.tsv new file mode 100644 index 0000000000..f0ae98e6c6 --- /dev/null +++ b/loading_pipeline/var/test/sex_check/test_imputed_sex.tsv @@ -0,0 +1,6 @@ +entity:sample_id collaborator_participant_id collaborator_sample_id contamination_rate coverage_region_1_metrics_file crai_path cram_md5_path cram_path datarepo_row_id dragen_version import:snapshot_id import:timestamp mapped_percentage mapping_metrics_file material_type mean_coverage original_material_type participant_id pass_fail_value pdo percent_bases_at_20x percent_callability predicted_sex product receipt_date reported_sex research_project single_sample_vcf_index_path single_sample_vcf_md5_path single_sample_vcf_path total_bases variant_calling_metrics_file +SM-DM66X abc_1 abc_1 0E+00 gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/6f30a41f-1d91-44d1-915c-5c10c6d87fcd/WAL_LIS6100_LIS6101.qc-coverage-region-1_coverage_metrics.csv gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/3e204a66-f044-4bdc-ade4-1671a0269214/WAL_LIS6100_LIS6101.cram.crai gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/a6ed4850-6a69-412e-a071-bf8cce04fca0/WAL_LIS6100_LIS6101.cram.md5sum gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/c51bbfd6-42f0-40ca-aa0c-b5eece935516/WAL_LIS6100_LIS6101.cram 8a07ce00-16a1-40f4-8666-c4cfaad1bbe1 07.021.604.3.7.8 cc9d9ed9-785a-407d-910e-d9bd46936fa6 2024-04-17T14:58:10 98.450000000 gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/9e745b1d-2c00-44ce-bbfb-31c44369f4fe/WAL_LIS6100_LIS6101.mapping_metrics.csv DNA:DNA Genomic 35.730000000 Whole Blood:Whole Blood PT-24FB4 Pass PDO-32851 96.140000000 97.850000000 Male P-WG-0139 2017-03-15 04:00:00 Male RP-3071 gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/360ec721-0af8-4085-a677-38c018069559/WAL_LIS6100_LIS6101.vcf.gz.tbi gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/8da8cda2-497f-4a8b-a642-af4a4ad28aac/WAL_LIS6100_LIS6101.vcf.gz.md5sum gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/0a2d93fb-8837-4b6f-ac68-a6b9701f9a08/WAL_LIS6100_LIS6101.vcf.gz 134324623400.000000000 gs://datarepo-9cafeffd-bucket/f511b131-3f0d-4eb7-a7f0-b2b3d73dca3a/f7b62337-1339-4c2e-8280-281c48604e07/WAL_LIS6100_LIS6101.vc_metrics.csv +SM-DM69X abc_2 abc_2 0E+00 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/c4c07edf-7735-4aa7-9283-7cb2607b60a2/GLE-5774-3-3.qc-coverage-region-1_coverage_metrics.csv gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/dcd4c271-0249-47f1-8e91-81f74735c5a1/GLE-5774-3-3.cram.crai gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/ec41ec06-673f-4fe2-a063-23dc5fe1dcce/GLE-5774-3-3.cram.md5sum gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/aad0e270-2ad5-4f39-b968-9b4beafeb5cc/GLE-5774-3-3.cram a4b04a39-9234-4028-a155-442c4acf12a0 07.021.604.3.7.8 ce74d94c-c33d-49d7-85c9-5f3cbd08aff7 2024-04-17T15:02:46 99.800000000 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/c3a9e6f2-4c68-410b-823d-46ca406e5061/GLE-5774-3-3.mapping_metrics.csv DNA:DNA Genomic 35.300000000 Whole Blood:Whole Blood PT-24OHM Pass PDO-32755 96.320000000 97.340000000 Female P-WG-0139 2017-04-12 04:00:00 Female RP-3061 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/c71cd2a1-c789-4715-9ebc-dbfc40d9f2e2/GLE-5774-3-3.vcf.gz.tbi gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/957a99cb-c9a9-4fc5-a0ec-53f9e461469e/GLE-5774-3-3.vcf.gz.md5sum gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/df520949-5f2b-4976-9d46-80d1cc299813/GLE-5774-3-3.vcf.gz 133253714921.000000000 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/2e98e51b-9394-4e64-977f-e9010a4e16dc/GLE-5774-3-3.vc_metrics.csv +SM-DPB5G abc_3 abc_3 0E+00 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/432f8354-77e0-4381-9bb5-dfdc0633b5b2/PIE_OGI1433_002628_1.qc-coverage-region-1_coverage_metrics.csv gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/3dc623fa-2a45-4b3d-a0f8-fcdec09f9418/PIE_OGI1433_002628_1.cram.crai gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/895966ef-c705-4c18-952d-03863243a184/PIE_OGI1433_002628_1.cram.md5sum gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/96ca6d5f-fb23-4102-bb5e-c7bbfd194e1c/PIE_OGI1433_002628_1.cram ffb50687-165e-425a-a545-c3797d3a28d4 07.021.604.3.7.8 55729ba9-3ce4-47b3-9c3b-1148737ae40f 2024-04-17T15:07:57 99.670000000 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/30f8e208-5d2d-4ce8-b835-695b5ed673f4/PIE_OGI1433_002628_1.mapping_metrics.csv DNA:DNA Genomic 41.910000000 Whole Blood:Whole Blood PT-25BR5 Pass PDO-32756 92.920000000 97.990000000 Unknown P-WG-0139 2017-05-19 04:00:00 Unknown RP-3062 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/1641d1b2-1035-4cc3-9c8b-0c8cb430f56b/PIE_OGI1433_002628_1.vcf.gz.tbi gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/f5ba2708-899e-42e8-b287-fdf72c2e404d/PIE_OGI1433_002628_1.vcf.gz.md5sum gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/e925ee5d-a75e-471f-adfd-2756c8690069/PIE_OGI1433_002628_1.vcf.gz 156149580126.000000000 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/df076bc5-9db8-44f0-a3fe-f693370634cc/PIE_OGI1433_002628_1.vc_metrics.csv +SM-DPB5G abc_4 abc_4 0E+00 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/432f8354-77e0-4381-9bb5-dfdc0633b5b2/PIE_OGI1433_002628_1.qc-coverage-region-1_coverage_metrics.csv gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/3dc623fa-2a45-4b3d-a0f8-fcdec09f9418/PIE_OGI1433_002628_1.cram.crai gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/895966ef-c705-4c18-952d-03863243a184/PIE_OGI1433_002628_1.cram.md5sum gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/96ca6d5f-fb23-4102-bb5e-c7bbfd194e1c/PIE_OGI1433_002628_1.cram ffb50687-165e-425a-a545-c3797d3a28d4 07.021.604.3.7.8 55729ba9-3ce4-47b3-9c3b-1148737ae40f 2024-04-17T15:07:57 99.670000000 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/30f8e208-5d2d-4ce8-b835-695b5ed673f4/PIE_OGI1433_002628_1.mapping_metrics.csv DNA:DNA Genomic 41.910000000 Whole Blood:Whole Blood PT-25BR5 Pass PDO-32756 92.920000000 97.990000000 XYY P-WG-0139 2017-05-19 04:00:00 XYY RP-3062 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/1641d1b2-1035-4cc3-9c8b-0c8cb430f56b/PIE_OGI1433_002628_1.vcf.gz.tbi gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/f5ba2708-899e-42e8-b287-fdf72c2e404d/PIE_OGI1433_002628_1.vcf.gz.md5sum gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/e925ee5d-a75e-471f-adfd-2756c8690069/PIE_OGI1433_002628_1.vcf.gz 156149580126.000000000 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/df076bc5-9db8-44f0-a3fe-f693370634cc/PIE_OGI1433_002628_1.vc_metrics.csv +SM-DPB5G abc_5 abc_5 0E+00 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/432f8354-77e0-4381-9bb5-dfdc0633b5b2/PIE_OGI1433_002628_1.qc-coverage-region-1_coverage_metrics.csv gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/3dc623fa-2a45-4b3d-a0f8-fcdec09f9418/PIE_OGI1433_002628_1.cram.crai gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/895966ef-c705-4c18-952d-03863243a184/PIE_OGI1433_002628_1.cram.md5sum gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/96ca6d5f-fb23-4102-bb5e-c7bbfd194e1c/PIE_OGI1433_002628_1.cram ffb50687-165e-425a-a545-c3797d3a28d4 07.021.604.3.7.8 55729ba9-3ce4-47b3-9c3b-1148737ae40f 2024-04-17T15:07:57 99.670000000 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/30f8e208-5d2d-4ce8-b835-695b5ed673f4/PIE_OGI1433_002628_1.mapping_metrics.csv DNA:DNA Genomic 41.910000000 Whole Blood:Whole Blood PT-25BR5 Pass PDO-32756 92.920000000 97.990000000 P-WG-0139 2017-05-19 04:00:00 RP-3062 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/1641d1b2-1035-4cc3-9c8b-0c8cb430f56b/PIE_OGI1433_002628_1.vcf.gz.tbi gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/f5ba2708-899e-42e8-b287-fdf72c2e404d/PIE_OGI1433_002628_1.vcf.gz.md5sum gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/e925ee5d-a75e-471f-adfd-2756c8690069/PIE_OGI1433_002628_1.vcf.gz 156149580126.000000000 gs://datarepo-c41dc160-bucket/907593be-8862-4945-9e70-f758b6448b8d/df076bc5-9db8-44f0-a3fe-f693370634cc/PIE_OGI1433_002628_1.vc_metrics.csv diff --git a/loading_pipeline/var/test/sex_check/test_imputed_sex_unexpected_value.tsv b/loading_pipeline/var/test/sex_check/test_imputed_sex_unexpected_value.tsv new file mode 100644 index 0000000000..03a5f120e9 --- /dev/null +++ b/loading_pipeline/var/test/sex_check/test_imputed_sex_unexpected_value.tsv @@ -0,0 +1,2 @@ +entity:sample_id collaborator_participant_id collaborator_sample_id contamination_rate coverage_region_1_metrics_file crai_path cram_md5_path cram_path datarepo_row_id dragen_version import:snapshot_id import:timestamp mapped_percentage mapping_metrics_file material_type mean_coverage original_material_type participant_id pass_fail_value pdo percent_bases_at_20x percent_callability predicted_sex product receipt_date reported_sex research_project single_sample_vcf_index_path single_sample_vcf_md5_path single_sample_vcf_path total_bases variant_calling_metrics_file +SM-DM69X abc_2 abc_2 0E+00 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/c4c07edf-7735-4aa7-9283-7cb2607b60a2/GLE-5774-3-3.qc-coverage-region-1_coverage_metrics.csv gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/dcd4c271-0249-47f1-8e91-81f74735c5a1/GLE-5774-3-3.cram.crai gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/ec41ec06-673f-4fe2-a063-23dc5fe1dcce/GLE-5774-3-3.cram.md5sum gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/aad0e270-2ad5-4f39-b968-9b4beafeb5cc/GLE-5774-3-3.cram a4b04a39-9234-4028-a155-442c4acf12a0 07.021.604.3.7.8 ce74d94c-c33d-49d7-85c9-5f3cbd08aff7 2024-04-17T15:02:46 99.800000000 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/c3a9e6f2-4c68-410b-823d-46ca406e5061/GLE-5774-3-3.mapping_metrics.csv DNA:DNA Genomic 35.300000000 Whole Blood:Whole Blood PT-24OHM Pass PDO-32755 96.320000000 97.340000000 UNKNOWN P-WG-0139 2017-04-12 04:00:00 UNKNOWN RP-3061 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/c71cd2a1-c789-4715-9ebc-dbfc40d9f2e2/GLE-5774-3-3.vcf.gz.tbi gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/957a99cb-c9a9-4fc5-a0ec-53f9e461469e/GLE-5774-3-3.vcf.gz.md5sum gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/df520949-5f2b-4976-9d46-80d1cc299813/GLE-5774-3-3.vcf.gz 133253714921.000000000 gs://datarepo-556a9c15-bucket/2a4202b0-93f5-4ebe-8d2b-fd4cfb2b881d/2e98e51b-9394-4e64-977f-e9010a4e16dc/GLE-5774-3-3.vc_metrics.csv diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/.README.txt.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/.README.txt.crc new file mode 100644 index 0000000000..e7956a7a56 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/.README.txt.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/._SUCCESS.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/._SUCCESS.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/.metadata.json.gz.crc new file mode 100644 index 0000000000..fe860bc3c5 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/README.txt b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/README.txt new file mode 100644 index 0000000000..28f928ef9c --- /dev/null +++ b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/README.txt @@ -0,0 +1,3 @@ +This folder comprises a Hail (www.hail.is) native Table or MatrixTable. + Written with version 0.2.132-678e1f52b999 + Created at 2024/10/29 17:04:32 \ No newline at end of file diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/_SUCCESS b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/.metadata.json.gz.crc new file mode 100644 index 0000000000..782d7d3e89 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/metadata.json.gz new file mode 100644 index 0000000000..369b04d91a Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/parts/.part-0.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/parts/.part-0.crc new file mode 100644 index 0000000000..8231b2bcd8 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/parts/.part-0.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/parts/part-0 b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/parts/part-0 new file mode 100644 index 0000000000..89e711531d Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/globals/parts/part-0 differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/.index.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/.index.crc new file mode 100644 index 0000000000..9558e6395d Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/.index.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..295c159a99 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/index b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/index new file mode 100644 index 0000000000..ed76247fdd Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/index differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/metadata.json.gz new file mode 100644 index 0000000000..d5c10e9452 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/.index.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/.index.crc new file mode 100644 index 0000000000..34897d6095 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/.index.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..fcef54af44 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/index b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/index new file mode 100644 index 0000000000..e9e7441f20 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/index differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/metadata.json.gz new file mode 100644 index 0000000000..86e23e4949 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-1-a934bed6-9214-4992-94fd-50997d20ac52.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/.index.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/.index.crc new file mode 100644 index 0000000000..0c292334ed Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/.index.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..fcef54af44 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/index b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/index new file mode 100644 index 0000000000..de4c052450 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/index differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/metadata.json.gz new file mode 100644 index 0000000000..86e23e4949 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/.index.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/.index.crc new file mode 100644 index 0000000000..d455f256dd Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/.index.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..fcef54af44 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/index b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/index new file mode 100644 index 0000000000..5af90d3186 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/index differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/metadata.json.gz new file mode 100644 index 0000000000..86e23e4949 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/.index.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/.index.crc new file mode 100644 index 0000000000..bdfc93614d Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/.index.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/.metadata.json.gz.crc new file mode 100644 index 0000000000..fcef54af44 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/index b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/index new file mode 100644 index 0000000000..0e13e09c51 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/index differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/metadata.json.gz new file mode 100644 index 0000000000..86e23e4949 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/index/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.idx/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/metadata.json.gz new file mode 100644 index 0000000000..16382e776a Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/.metadata.json.gz.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/.metadata.json.gz.crc new file mode 100644 index 0000000000..29c213437c Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/.metadata.json.gz.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/metadata.json.gz b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/metadata.json.gz new file mode 100644 index 0000000000..98501ad4ba Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/metadata.json.gz differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.crc new file mode 100644 index 0000000000..50ea7db3bf Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-1-a934bed6-9214-4992-94fd-50997d20ac52.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-1-a934bed6-9214-4992-94fd-50997d20ac52.crc new file mode 100644 index 0000000000..ad52f024cb Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-1-a934bed6-9214-4992-94fd-50997d20ac52.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.crc new file mode 100644 index 0000000000..1645e4c943 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.crc new file mode 100644 index 0000000000..31c3cd214d Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.crc b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.crc new file mode 100644 index 0000000000..2be13e41e9 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/.part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e.crc differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a new file mode 100644 index 0000000000..d2319f94ef Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-0-e4a8a7e1-9a77-4f4d-8910-2c3cff8c815a differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-1-a934bed6-9214-4992-94fd-50997d20ac52 b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-1-a934bed6-9214-4992-94fd-50997d20ac52 new file mode 100644 index 0000000000..e25c262bab Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-1-a934bed6-9214-4992-94fd-50997d20ac52 differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7 b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7 new file mode 100644 index 0000000000..b9bba437fa Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-2-188ceba1-ffa4-4a20-8c72-f488f4a708b7 differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6 b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6 new file mode 100644 index 0000000000..e4f34ed9d2 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-3-a93b296d-ddf8-430d-84d2-a0749044cdd6 differ diff --git a/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e new file mode 100644 index 0000000000..8730634f87 Binary files /dev/null and b/loading_pipeline/var/test/sex_check/test_sex_check_1.ht/rows/parts/part-4-84c212a9-43d8-4473-a697-6bf50d2d3b0e differ diff --git a/loading_pipeline/var/test/tdr_metrics.tsv b/loading_pipeline/var/test/tdr_metrics.tsv new file mode 100644 index 0000000000..ab30479a8c --- /dev/null +++ b/loading_pipeline/var/test/tdr_metrics.tsv @@ -0,0 +1,5 @@ +collaborator_sample_id predicted_sex contamination_rate percent_bases_at_20x mean_coverage +HG00731 Unknown 5.1 93.69 29.31 +HG00732 Female 5 90 28 +HG00733 Male 6 85 36.4 +NA19675 Male 0 80 30 diff --git a/loading_pipeline/var/test/vep/__init__.py b/loading_pipeline/var/test/vep/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/loading_pipeline/var/test/vep/mock_vep_data.py b/loading_pipeline/var/test/vep/mock_vep_data.py new file mode 100644 index 0000000000..0fa826c36c --- /dev/null +++ b/loading_pipeline/var/test/vep/mock_vep_data.py @@ -0,0 +1,1175 @@ +import hail as hl + +MOCK_37_VEP_DATA = hl.struct( + allele_string='G/A', + ancestral=hl.null('str'), + assembly_name='GRCh37', + colocated_variants=hl.array( + [ + hl.struct( + aa_allele='A', + aa_maf=0.0685, + afr_allele='A', + afr_maf=0.06566, + allele_string='G/A', + amr_allele='A', + amr_maf=0.0038, + clin_sig=hl.null('str'), + ea_allele='A', + ea_maf=0.015, + eas_allele='A', + eas_maf=0.0259, + end=881918, + eur_allele='A', + eur_maf=0.0, + exac_adj_allele='A', + exac_adj_maf=0.02117, + exac_afr_allele='A', + exac_afr_maf=0.046, + exac_allele='A', + exac_amr_allele='A', + exac_amr_maf=0.01143, + exac_eas_allele='A', + exac_eas_maf=0.047, + exac_fin_allele='A', + exac_fin_maf=0.0002325, + exac_maf=0.0616, + exac_nfe_allele='A', + exac_nfe_maf=0.0264, + exac_oth_allele='A', + exac_oth_maf=0.06086, + exac_sas_allele='A', + exac_sas_maf=0.04032, + id='rs35471880', + minor_allele='A', + minor_allele_freq=0.0294, + phenotype_or_disease=hl.null('str'), + pubmed=hl.null('str'), + sas_allele='A', + sas_maf=0.0567, + somatic=hl.null('str'), + start=881918, + strand=1, + ), + ], + ), + context=hl.null('str'), + end=881918, + id='1_881918_G/A', + input='1\t881918\t.\tG\tA\t.\t.\tGT', + intergenic_consequences=hl.null('str'), + most_severe_consequence='missense_variant', + motif_feature_consequences=hl.null('str'), + regulatory_feature_consequences=hl.null('str'), + seq_region_name='1', + start=881918, + strand=1, + transcript_consequences=hl.array( + [ + hl.struct( + allele_num=1, + amino_acids='S/L', + biotype='protein_coding', + canonical=1, + ccds='CCDS3.1', + cdna_end=1717, + cdna_start=1717, + cds_end=1667, + cds_start=1667, + codons='tCg/tTg', + consequence_terms=hl.array(['missense_variant']), + distance=hl.null('int32'), + domains=hl.array( + [ + hl.struct(db='hmmpanther', name='PTHR12687'), + hl.struct(db='hmmpanther', name='PTHR12687'), + hl.struct(db='Pfam_domain', name='PF03715'), + hl.struct( + db='Superfamily_domains', + name='SSF48371', + ), + ], + ), + exon='15/19', + gene_id='ENSG00000188976', + gene_pheno=hl.null('int32'), + gene_symbol='NOC2L', + gene_symbol_source='HGNC', + hgnc_id='24517', + hgvs_offset=hl.null('int32'), + hgvsc='ENST00000327044.6:c.1667C>T', + hgvsp='ENSP00000317992.6:p.Ser556Leu', + impact='MODERATE', + intron=hl.null('str'), + lof='LC', + lof_filter='END_TRUNC,INCOMPLETE_CDS', + lof_flags=hl.null('str'), + lof_info='INTRON_END:881781,EXON_END:881925,EXON_START:881782,DE_NOVO_DONOR_MES:-7.36719797135343,DE_NOVO_DONOR_PROB:0.261170618766552,DE_NOVO_DONOR_POS:-138,INTRON_START:881667,DE_NOVO_DONOR_MES_POS:-138,MUTANT_DONOR_MES:4.93863747168278', + minimised=1, + polyphen_prediction='benign', + polyphen_score=0.311, + protein_end=556, + protein_id='ENSP00000317992', + protein_start=556, + sift_prediction='deleterious', + sift_score=0.01, + strand=-1, + swissprot='Q9Y3T9', + transcript_id='ENST00000327044', + trembl=hl.null('str'), + uniparc='UPI000041820C', + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='protein_coding', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=1963, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id='ENSP00000349216', + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot=hl.null('str'), + transcript_id='ENST00000341065', + trembl=hl.null('str'), + uniparc='UPI000155D47A', + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='protein_coding', + canonical=1, + ccds='CCDS2.2', + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=1963, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id='ENSP00000342313', + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot='Q96NU1', + transcript_id='ENST00000342066', + trembl='Q5SV95,I7FV93,A6PWC8', + uniparc='UPI0000D61E04', + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='protein_coding', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=2279, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id='ENSP00000412228', + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot=hl.null('str'), + transcript_id='ENST00000455979', + trembl=hl.null('str'), + uniparc='UPI000155D479', + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='retained_intron', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=3646, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot=hl.null('str'), + transcript_id='ENST00000464948', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='retained_intron', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=3736, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot=hl.null('str'), + transcript_id='ENST00000466827', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='retained_intron', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=3544, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot=hl.null('str'), + transcript_id='ENST00000474461', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='retained_intron', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=3114, + cdna_start=3114, + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array( + [ + 'non_coding_transcript_exon_variant', + 'non_coding_transcript_variant', + ], + ), + distance=hl.null('int32'), + domains=hl.null('array'), + exon='13/17', + gene_id='ENSG00000188976', + gene_pheno=hl.null('int32'), + gene_symbol='NOC2L', + gene_symbol_source='HGNC', + hgnc_id='24517', + hgvs_offset=hl.null('int32'), + hgvsc='ENST00000477976.1:n.3114C>T', + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=-1, + swissprot=hl.null('str'), + transcript_id='ENST00000477976', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='processed_transcript', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + distance=4365, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000187634', + gene_pheno=hl.null('int32'), + gene_symbol='SAMD11', + gene_symbol_source='HGNC', + hgnc_id='28706', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=1, + swissprot=hl.null('str'), + transcript_id='ENST00000478729', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='retained_intron', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=523, + cdna_start=523, + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array( + [ + 'non_coding_transcript_exon_variant', + 'non_coding_transcript_variant', + ], + ), + distance=hl.null('int32'), + domains=hl.null('array'), + exon='1/5', + gene_id='ENSG00000188976', + gene_pheno=hl.null('int32'), + gene_symbol='NOC2L', + gene_symbol_source='HGNC', + hgnc_id='24517', + hgvs_offset=hl.null('int32'), + hgvsc='ENST00000483767.1:n.523C>T', + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=-1, + swissprot=hl.null('str'), + transcript_id='ENST00000483767', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + hl.struct( + allele_num=1, + amino_acids=hl.null('str'), + biotype='processed_transcript', + canonical=hl.null('int32'), + ccds=hl.null('str'), + cdna_end=hl.null('int32'), + cdna_start=hl.null('int32'), + cds_end=hl.null('int32'), + cds_start=hl.null('int32'), + codons=hl.null('str'), + consequence_terms=hl.array(['upstream_gene_variant']), + distance=976, + domains=hl.null('array'), + exon=hl.null('str'), + gene_id='ENSG00000188976', + gene_pheno=hl.null('int32'), + gene_symbol='NOC2L', + gene_symbol_source='HGNC', + hgnc_id='24517', + hgvs_offset=hl.null('int32'), + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + impact='MODIFIER', + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + minimised=1, + polyphen_prediction=hl.null('str'), + polyphen_score=hl.null('float64'), + protein_end=hl.null('int32'), + protein_id=hl.null('str'), + protein_start=hl.null('int32'), + sift_prediction=hl.null('str'), + sift_score=hl.null('float64'), + strand=-1, + swissprot=hl.null('str'), + transcript_id='ENST00000496938', + trembl=hl.null('str'), + uniparc=hl.null('str'), + variant_allele='A', + ), + ], + ), + variant_class='SNV', +) + +MOCK_38_VEP_DATA = hl.struct( + most_severe_consequence='missense_variant', + check_ref=hl.missing(hl.tstr), + motif_feature_consequences=hl.missing( + hl.tarray( + hl.tstruct(consequence_terms=hl.tarray(hl.tstr), motif_feature_id=hl.tstr), + ), + ), + regulatory_feature_consequences=hl.array( + [ + hl.struct( + biotype='enhancer', + consequence_terms=['regulatory_region_variant'], + regulatory_feature_id='regulatory_1', + ), + hl.struct( + biotype='enhancer', + consequence_terms=['regulatory_region_ablation'], + regulatory_feature_id='regulatory_2', + ), + ], + ), + transcript_consequences=hl.array( + [ + hl.struct( + amino_acids='S/L', + am_pathogenicity=hl.float32(0.1), + biotype='protein_coding', + canonical=1, + check_ref=hl.missing(hl.tstr), + codons='tCg/tTg', + consequence_terms=hl.array(['missense_variant']), + exon='15/19', + gene_id='ENSG00000188976', + hgvsc='ENST00000327044.6:c.1667C>T', + hgvsp='ENSP00000317992.6:p.Ser556Leu', + intron=hl.null('str'), + lof='LC', + lof_filter='END_TRUNC,INCOMPLETE_CDS', + lof_flags=hl.null('str'), + lof_info='INTRON_END:881781,EXON_END:881925,EXON_START:881782,DE_NOVO_DONOR_MES:-7.36719797135343,DE_NOVO_DONOR_PROB:0.261170618766552,DE_NOVO_DONOR_POS:-138,INTRON_START:881667,DE_NOVO_DONOR_MES_POS:-138,MUTANT_DONOR_MES:4.93863747168278', + mane_select='NM_015658.4', + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000327044', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.float32(0.2), + biotype='protein_coding', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000341065', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='protein_coding', + canonical=1, + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000342066', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='protein_coding', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000455979', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='retained_intron', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000464948', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='retained_intron', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000466827', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='retained_intron', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000474461', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.float32(0.97), + biotype='retained_intron', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array( + [ + 'non_coding_transcript_exon_variant', + 'non_coding_transcript_variant', + ], + ), + exon='13/17', + gene_id='ENSG00000188976', + hgvsc='ENST00000477976.1:n.3114C>T', + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000477976', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='processed_transcript', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['downstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000187634', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000478729', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='retained_intron', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array( + [ + 'non_coding_transcript_exon_variant', + 'splice_donor_region_variant', + 'non_coding_transcript_variant', + ], + ), + exon='1/5', + gene_id='ENSG00000188976', + hgvsc='ENST00000483767.1:n.523C>T', + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.array(['extended_intronic_splice_region_variant']), + transcript_id='ENST00000483767', + # UTRAnnotator + existing_inframe_oorfs=0, + existing_outofframe_oorfs=1, + existing_uorfs=0, + fiveutr_consequence='5_prime_UTR_premature_start_codon_loss_variant', + fiveutr_annotation=hl.dict( + { + '1': hl.struct( + type='OutOfFrame_oORF', + KozakContext='TTTATGC', + KozakStrength='Weak', + DistanceToCDS='40', + CapDistanceToStart='20', + DistanceToStop='75', + Evidence='False', + AltStop=hl.missing(hl.tstr), + AltStopDistanceToCDS=hl.missing(hl.tstr), + FrameWithCDS=hl.missing(hl.tstr), + StartDistanceToCDS=hl.missing(hl.tstr), + newSTOPDistanceToCDS=hl.missing(hl.tstr), + alt_type=hl.missing(hl.tstr), + alt_type_length=hl.missing(hl.tstr), + ref_StartDistanceToCDS=hl.missing(hl.tstr), + ref_type=hl.missing(hl.tstr), + ref_type_length=hl.missing(hl.tstr), + ), + }, + ), + ), + hl.struct( + amino_acids=hl.null('str'), + am_pathogenicity=hl.missing(hl.tfloat32), + biotype='processed_transcript', + canonical=hl.null('int32'), + check_ref=hl.missing(hl.tstr), + codons=hl.null('str'), + consequence_terms=hl.array(['upstream_gene_variant']), + exon=hl.null('str'), + gene_id='ENSG00000188976', + hgvsc=hl.null('str'), + hgvsp=hl.null('str'), + intron=hl.null('str'), + lof=hl.null('str'), + lof_filter=hl.null('str'), + lof_flags=hl.null('str'), + lof_info=hl.null('str'), + mane_select=hl.null('str'), + mane_plus_clinical=hl.null('str'), + spliceregion=hl.missing(hl.tarray(hl.tstr)), + transcript_id='ENST00000496938', + # UTRAnnotator + existing_inframe_oorfs=hl.missing(hl.tint32), + existing_outofframe_oorfs=hl.missing(hl.tint32), + existing_uorfs=hl.missing(hl.tint32), + fiveutr_consequence=hl.missing(hl.tstr), + fiveutr_annotation=hl.missing( + hl.tdict( + hl.tstr, + hl.tstruct( + type=hl.tstr, + KozakContext=hl.tstr, + KozakStrength=hl.tstr, + DistanceToCDS=hl.tstr, + CapDistanceToStart=hl.tstr, + DistanceToStop=hl.tstr, + Evidence=hl.tstr, + AltStop=hl.tstr, + AltStopDistanceToCDS=hl.tstr, + FrameWithCDS=hl.tstr, + StartDistanceToCDS=hl.tstr, + newSTOPDistanceToCDS=hl.tstr, + alt_type=hl.tstr, + alt_type_length=hl.tstr, + ref_StartDistanceToCDS=hl.tstr, + ref_type=hl.tstr, + ref_type_length=hl.tstr, + ), + ), + ), + ), + ], + ), +) diff --git a/loading_pipeline/var/vep/GRCh37/vep-GRCh37.json b/loading_pipeline/var/vep/GRCh37/vep-GRCh37.json new file mode 100644 index 0000000000..d3461b9658 --- /dev/null +++ b/loading_pipeline/var/vep/GRCh37/vep-GRCh37.json @@ -0,0 +1,21 @@ +{"command": [ + "/vep", + "GRCh37", + "--warning_file", "STDERR", + "--format", "vcf", + "__OUTPUT_FORMAT_FLAG__", + "--everything", + "--allele_number", + "--no_stats", + "--cache", "--offline", + "--minimal", + "--assembly", "GRCh37", + "--fasta", "/opt/vep/.vep/Homo_sapiens.GRCh37.dna.primary_assembly.fa.gz", + "--plugin", "LoF,human_ancestor_fa:/opt/vep/.vep/loftee_data/GRCh37/human_ancestor.fa.gz,filter_position:0.05,min_intron_size:15,conservation_file:/opt/vep/.vep/loftee_data/GRCh37/phylocsf_gerp.sql,gerp_file:/opt/vep/.vep/loftee_data/GRCh37/GERP_scores.final.sorted.txt.gz", + "-o", "STDOUT" +], + "env": { + "PERL5LIB": "" + }, + "vep_json_schema": "Struct{assembly_name:String,allele_string:String,ancestral:String,colocated_variants:Array[Struct{aa_allele:String,aa_maf:Float64,afr_allele:String,afr_maf:Float64,allele_string:String,amr_allele:String,amr_maf:Float64,clin_sig:Array[String],end:Int32,eas_allele:String,eas_maf:Float64,ea_allele:String,ea_maf:Float64,eur_allele:String,eur_maf:Float64,exac_adj_allele:String,exac_adj_maf:Float64,exac_allele:String,exac_afr_allele:String,exac_afr_maf:Float64,exac_amr_allele:String,exac_amr_maf:Float64,exac_eas_allele:String,exac_eas_maf:Float64,exac_fin_allele:String,exac_fin_maf:Float64,exac_maf:Float64,exac_nfe_allele:String,exac_nfe_maf:Float64,exac_oth_allele:String,exac_oth_maf:Float64,exac_sas_allele:String,exac_sas_maf:Float64,id:String,minor_allele:String,minor_allele_freq:Float64,phenotype_or_disease:Int32,pubmed:Array[Int32],sas_allele:String,sas_maf:Float64,somatic:Int32,start:Int32,strand:Int32}],context:String,end:Int32,id:String,input:String,intergenic_consequences:Array[Struct{allele_num:Int32,consequence_terms:Array[String],impact:String,minimised:Int32,variant_allele:String}],most_severe_consequence:String,motif_feature_consequences:Array[Struct{allele_num:Int32,consequence_terms:Array[String],high_inf_pos:String,impact:String,minimised:Int32,motif_feature_id:String,motif_name:String,motif_pos:Int32,motif_score_change:Float64,strand:Int32,variant_allele:String}],regulatory_feature_consequences:Array[Struct{allele_num:Int32,biotype:String,consequence_terms:Array[String],impact:String,minimised:Int32,regulatory_feature_id:String,variant_allele:String}],seq_region_name:String,start:Int32,strand:Int32,transcript_consequences:Array[Struct{allele_num:Int32,amino_acids:String,biotype:String,canonical:Int32,ccds:String,cdna_start:Int32,cdna_end:Int32,cds_end:Int32,cds_start:Int32,codons:String,consequence_terms:Array[String],distance:Int32,domains:Array[Struct{db:String,name:String}],exon:String,gene_id:String,gene_pheno:Int32,gene_symbol:String,gene_symbol_source:String,hgnc_id:String,hgvsc:String,hgvsp:String,hgvs_offset:Int32,impact:String,intron:String,lof:String,lof_flags:String,lof_filter:String,lof_info:String,minimised:Int32,polyphen_prediction:String,polyphen_score:Float64,protein_end:Int32,protein_start:Int32,protein_id:String,sift_prediction:String,sift_score:Float64,strand:Int32,swissprot:String,transcript_id:String,trembl:String,uniparc:String,variant_allele:String}],variant_class:String}" +} diff --git a/loading_pipeline/var/vep/GRCh38/vep-GRCh38.json b/loading_pipeline/var/vep/GRCh38/vep-GRCh38.json new file mode 100644 index 0000000000..c454c29a25 --- /dev/null +++ b/loading_pipeline/var/vep/GRCh38/vep-GRCh38.json @@ -0,0 +1,11 @@ +{ + "command": [ + "bash", + "-c", + "/vep GRCh38 --warning_file STDERR --format vcf -json --hgvs --biotype --canonical --mane --minimal --numbers --regulatory --allele_number --no_stats --cache --offline --assembly GRCh38 --fasta /opt/vep/.vep/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz --check_ref --dont_skip --plugin LoF,loftee_path:/plugins,gerp_bigwig:/opt/vep/.vep/gerp_conservation_scores.homo_sapiens.GRCh38.bw,human_ancestor_fa:/opt/vep/.vep/human_ancestor.fa.gz,conservation_file:/opt/vep/.vep/loftee.sql --plugin UTRAnnotator,file=/opt/vep/.vep/uORF_5UTR_GRCh38_PUBLIC.txt --plugin SpliceRegion,Extended --plugin AlphaMissense,file=/opt/vep/.vep/AlphaMissense_hg38.tsv.gz --dir_plugins /plugins -o STDOUT | sed s/5utr/fiveutr/g" + ], + "env": { + "PERL5LIB": "/plugins" + }, + "vep_json_schema": "Struct{input:String,check_ref:String,most_severe_consequence:String,motif_feature_consequences:Array[Struct{consequence_terms:Array[String],motif_feature_id:String}],regulatory_feature_consequences:Array[Struct{biotype:String,consequence_terms:Array[String],regulatory_feature_id:String}],transcript_consequences:Array[Struct{amino_acids:String,biotype:String,canonical:Int32,codons:String,consequence_terms:Array[String],exon:String,gene_id:String,hgvsc:String,hgvsp:String,intron:String,mane_select:String,mane_plus_clinical:String,transcript_id:String,lof:String,lof_flags:String,lof_filter:String,lof_info:String,existing_inframe_oorfs:Int32,existing_outofframe_oorfs:Int32,existing_uorfs:Int32,fiveutr_consequence:String,fiveutr_annotation:Dict[String,Struct{type:String,KozakContext:String,KozakStrength:String,DistanceToCDS:String,CapDistanceToStart:String,DistanceToStop:String,Evidence:String,AltStop:String,AltStopDistanceToCDS:String,FrameWithCDS:String,StartDistanceToCDS:String,newSTOPDistanceToCDS:String,alt_type:String,alt_type_length:String,ref_StartDistanceToCDS:String,ref_type:String,ref_type_length:String}],am_pathogenicity:Float32,spliceregion:Array[String]}]}" +} diff --git a/reference_data/models.py b/reference_data/models.py index 9b28505aad..4c68cc23e0 100644 --- a/reference_data/models.py +++ b/reference_data/models.py @@ -12,6 +12,7 @@ from reference_data.utils.dbnsfp_utils import DBNSFP_FIELD_MAP, DBNSFP_EXCLUDE_FIELDS from reference_data.utils.download_utils import download_file from reference_data.utils.gencode_utils import parse_gencode_record, GENCODE_URL_TEMPLATE, GENCODE_FILE_HEADER +from seqr.utils.constants import GENOME_VERSION_GRCh37, GENOME_VERSION_GRCh38 from seqr.views.utils.export_utils import write_multiple_files # Allow adding the custom json_fields and internal_json_fields to the model Meta @@ -20,9 +21,6 @@ logger = logging.getLogger(__name__) -GENOME_VERSION_GRCh37 = "37" -GENOME_VERSION_GRCh38 = "38" - GENOME_VERSION_CHOICES = [ (GENOME_VERSION_GRCh37, "GRCh37"), (GENOME_VERSION_GRCh38, "GRCh38") diff --git a/seqr/models.py b/seqr/models.py index b183d62bd9..478997657f 100644 --- a/seqr/models.py +++ b/seqr/models.py @@ -12,6 +12,9 @@ from guardian.shortcuts import assign_perm +from seqr.utils.constants import SEX_MALE, SEX_FEMALE, SEX_UNKNOWN, FEMALE_ANEUPLOIDIES, MALE_ANEUPLOIDIES, \ + FEMALE_SEXES, MALE_SEXES, AFFECTED_STATUS_AFFECTED, AFFECTED_STATUS_UNAFFECTED, AFFECTED_STATUS_UNKNOWN, \ + SAMPLE_TYPE_WES, SAMPLE_TYPE_WGS, DATASET_TYPE_VARIANT_CALLS, DATASET_TYPE_SV_CALLS, DATASET_TYPE_MITO_CALLS from seqr.utils.logging_utils import log_model_update, log_model_bulk_update, SeqrLogger from seqr.utils.xpos_utils import get_chrom_pos from seqr.views.utils.json_utils import DjangoJSONEncoderWithSets @@ -434,13 +437,13 @@ def __init__(self, *args, **kwargs): class Individual(ModelWithGUID): - SEX_MALE = 'M' - SEX_FEMALE = 'F' - SEX_UNKNOWN = 'U' - FEMALE_ANEUPLOIDIES = ['XXX', 'X0'] - MALE_ANEUPLOIDIES = ['XXY', 'XYY'] - FEMALE_SEXES = [SEX_FEMALE] + FEMALE_ANEUPLOIDIES - MALE_SEXES = [SEX_MALE] + MALE_ANEUPLOIDIES + SEX_MALE = SEX_MALE + SEX_FEMALE = SEX_FEMALE + SEX_UNKNOWN = SEX_UNKNOWN + FEMALE_ANEUPLOIDIES = FEMALE_ANEUPLOIDIES + MALE_ANEUPLOIDIES = MALE_ANEUPLOIDIES + FEMALE_SEXES = FEMALE_SEXES + MALE_SEXES = MALE_SEXES SEX_CHOICES = ( (SEX_MALE, 'Male'), ('F', 'Female'), @@ -449,9 +452,9 @@ class Individual(ModelWithGUID): *[(sex, sex) for sex in FEMALE_ANEUPLOIDIES], ) - AFFECTED_STATUS_AFFECTED = 'A' - AFFECTED_STATUS_UNAFFECTED = 'N' - AFFECTED_STATUS_UNKNOWN = 'U' + AFFECTED_STATUS_AFFECTED = AFFECTED_STATUS_AFFECTED + AFFECTED_STATUS_UNAFFECTED = AFFECTED_STATUS_UNAFFECTED + AFFECTED_STATUS_UNKNOWN = AFFECTED_STATUS_UNKNOWN AFFECTED_STATUS_CHOICES = ( (AFFECTED_STATUS_AFFECTED, 'Affected'), (AFFECTED_STATUS_UNAFFECTED, 'Unaffected'), @@ -681,17 +684,17 @@ class Meta: class Dataset(ModelWithGUID): - SAMPLE_TYPE_WES = 'WES' - SAMPLE_TYPE_WGS = 'WGS' + SAMPLE_TYPE_WES = SAMPLE_TYPE_WES + SAMPLE_TYPE_WGS = SAMPLE_TYPE_WGS SAMPLE_TYPE_CHOICES = ( (SAMPLE_TYPE_WES, 'Exome'), (SAMPLE_TYPE_WGS, 'Whole Genome'), ) SAMPLE_TYPE_LOOKUP = dict(SAMPLE_TYPE_CHOICES) - DATASET_TYPE_VARIANT_CALLS = 'SNV_INDEL' - DATASET_TYPE_SV_CALLS = 'SV' - DATASET_TYPE_MITO_CALLS = 'MITO' + DATASET_TYPE_VARIANT_CALLS = DATASET_TYPE_VARIANT_CALLS + DATASET_TYPE_SV_CALLS = DATASET_TYPE_SV_CALLS + DATASET_TYPE_MITO_CALLS = DATASET_TYPE_MITO_CALLS DATASET_TYPE_CHOICES = ( (DATASET_TYPE_VARIANT_CALLS, 'Variant Calls'), (DATASET_TYPE_SV_CALLS, 'SV Calls'), diff --git a/seqr/utils/constants.py b/seqr/utils/constants.py new file mode 100644 index 0000000000..d747820cad --- /dev/null +++ b/seqr/utils/constants.py @@ -0,0 +1,20 @@ +SEX_MALE = 'M' +SEX_FEMALE = 'F' +SEX_UNKNOWN = 'U' +FEMALE_ANEUPLOIDIES = ['XXX', 'X0'] +MALE_ANEUPLOIDIES = ['XXY', 'XYY'] +FEMALE_SEXES = [SEX_FEMALE, *FEMALE_ANEUPLOIDIES] +MALE_SEXES = [SEX_MALE, *MALE_ANEUPLOIDIES] + +AFFECTED_STATUS_AFFECTED = 'A' +AFFECTED_STATUS_UNAFFECTED = 'N' +AFFECTED_STATUS_UNKNOWN = 'U' + +SAMPLE_TYPE_WES = 'WES' +SAMPLE_TYPE_WGS = 'WGS' +DATASET_TYPE_VARIANT_CALLS = 'SNV_INDEL' +DATASET_TYPE_SV_CALLS = 'SV' +DATASET_TYPE_MITO_CALLS = 'MITO' + +GENOME_VERSION_GRCh37 = '37' +GENOME_VERSION_GRCh38 = '38' diff --git a/ui/package-lock.json b/ui/package-lock.json index 9dccc5c08a..7d75197b8d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -5296,6 +5296,19 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5433,9 +5446,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -5451,11 +5464,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -5625,9 +5640,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001683", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", - "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -5642,7 +5657,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -7208,10 +7224,11 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.64", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz", - "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==", - "dev": true + "version": "1.5.420", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", + "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "0.8.1", @@ -8825,9 +8842,9 @@ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" }, "node_modules/fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", "dev": true, "funding": [ { @@ -8838,7 +8855,8 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.12", @@ -12573,10 +12591,11 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -13867,10 +13886,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-package-data": { "version": "2.4.0", @@ -17908,10 +17931,11 @@ "dev": true }, "node_modules/svgo": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.3.tgz", - "integrity": "sha512-5EZD0pafXX6PphdwOGCiVLDSaV1xyuQao2blHajHLsPxr07q4mmEjdtXEWgG07ae2mIz8Ex2CDXNCTiXhy3Khw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.4.tgz", + "integrity": "sha512-2GJ4h3rl13qYTdwllaK6QlL8tG+UrM8626V2Ylcd/yBUv2Y/EwLsYisVV6UDCRmlk+C74G8nMpxJCk0RWPdDCw==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^7.2.0", "css-select": "^4.1.3", @@ -18737,9 +18761,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", "dev": true, "funding": [ { @@ -18755,9 +18779,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -24105,6 +24130,12 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -24218,15 +24249,16 @@ "dev": true }, "browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" } }, "bser": { @@ -24351,9 +24383,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001683", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", - "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true }, "case-sensitive-paths-webpack-plugin": { @@ -25661,9 +25693,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.64", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz", - "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==", + "version": "1.5.420", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", + "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", "dev": true }, "emittery": { @@ -26982,9 +27014,9 @@ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" }, "fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", "dev": true }, "fastest-levenshtein": { @@ -29922,9 +29954,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -31014,9 +31046,9 @@ "dev": true }, "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", "dev": true }, "normalize-package-data": { @@ -34260,9 +34292,9 @@ "dev": true }, "svgo": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.3.tgz", - "integrity": "sha512-5EZD0pafXX6PphdwOGCiVLDSaV1xyuQao2blHajHLsPxr07q4mmEjdtXEWgG07ae2mIz8Ex2CDXNCTiXhy3Khw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.4.tgz", + "integrity": "sha512-2GJ4h3rl13qYTdwllaK6QlL8tG+UrM8626V2Ylcd/yBUv2Y/EwLsYisVV6UDCRmlk+C74G8nMpxJCk0RWPdDCw==", "dev": true, "requires": { "commander": "^7.2.0", @@ -34895,13 +34927,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", "dev": true, "requires": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" } }, "uri-js": {