From f90b1e2a7ac8a01e140d93a961dff6be9370023c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Irene=20L=C3=B3pez?= Date: Mon, 9 Oct 2023 22:29:07 +0100 Subject: [PATCH] chore: squash commit with main --- .flake8 | 18 - .github/workflows/docs.yaml | 2 +- .github/workflows/pytest.yaml | 10 +- .gitignore | 2 + .pre-commit-config.yaml | 43 +- .python-version | 2 +- .vscode/extensions.json | 12 + .vscode/settings.json | 25 +- Makefile | 214 +- Makefile_deprecated | 186 + README.md | 75 +- config/datasets/gcp.yaml | 34 +- config/session/dataproc.yaml | 1 + config/step/my_finngen.yaml | 9 + config/step/my_gene_index.yaml | 6 + config/step/my_gwas_catalog.yaml | 3 +- config/step/my_l2g.yaml | 21 + config/step/my_ld_index.yaml | 4 +- config/step/my_study_locus_overlap.yaml | 7 + config/step/my_ukbiobank.yaml | 6 + deprecated_tests/test_coloc.py | 424 - deprecated_tests/test_distance.py | 97 - deprecated_tests/test_gwas_process_assoc.py | 286 - deprecated_tests/test_intervals_helpers.py | 119 - deprecated_tests/test_vep.py | 425 - .../overrides/partials/source-file.html | 8 +- docs/assets/stylesheets/extra.css | 5 +- .../dataset/_dataset.md | 0 .../dataset/colocalisation.md | 0 .../dataset/gene_index.md | 0 .../dataset/intervals.md | 0 .../dataset/ld_index.md | 8 +- .../dataset/study_index.md} | 0 .../dataset/study_locus.md} | 0 .../dataset/study_locus_overlap.md | 7 +- docs/components/dataset/summary_statistics.md | 7 + .../dataset/variant_annotation.md | 0 .../dataset/variant_index.md | 0 .../dataset/variant_to_gene.md | 0 .../components/datasource/finngen/_finngen.md | 1 + .../datasource/finngen/study_index.md | 1 + docs/components/datasource/gnomad/_gnomad.md | 1 + .../components/datasource/gnomad/gnomad_ld.md | 1 + .../datasource/gnomad/gnomad_variants.md | 1 + .../datasource/gwas_catalog/_gwas_catalog.md | 1 + .../datasource/gwas_catalog/associations.md | 1 + .../datasource/gwas_catalog/study_index.md | 1 + .../datasource/gwas_catalog/study_splitter.md | 1 + .../gwas_catalog/summary_statistics.md | 1 + .../datasource/intervals/_intervals.md | 1 + .../datasource/intervals/andersson.md | 1 + .../datasource/intervals/javierre.md | 1 + docs/components/datasource/intervals/jung.md | 1 + .../datasource/intervals/thurnman.md | 1 + .../datasource/open_targets/_open_targets.md | 1 + .../datasource/open_targets/target.md | 1 + .../datasource/ukbiobank/_ukbiobank.md | 1 + .../datasource/ukbiobank/study_index.md | 1 + .../method/_method.md | 0 docs/components/method/clumping.md | 8 + .../{reference => components}/method/coloc.md | 0 .../method/ecaviar.md | 0 docs/components/method/ld_annotator.md | 3 + docs/{reference => components}/method/pics.md | 0 .../method/window_based_clumping.md | 3 + docs/{reference => components}/step/_step.md | 0 .../step/colocalisation.md | 0 docs/components/step/finngen.md | 4 + .../step/gene_index.md | 2 +- .../step/gwas_catalog.md | 0 .../step/gwas_catalog_sumstat_preprocess.md | 4 + .../step/ld_index.md | 0 docs/components/step/ukbiobank.md | 4 + .../step/variant_annotation_step.md | 0 .../step/variant_index_step.md | 0 .../step/variant_to_gene_step.md | 0 docs/contributing.md | 71 + docs/index.md | 8 +- .../study_index/study_index_gwas_catalog.md | 1 - .../study_locus/study_locus_gwas_catalog.md | 1 - docs/reference/method/ld_annotator.md | 3 - docs/reference/method/ld_clumping.md | 3 - docs/roadmap.md | 9 + docs/troubleshooting.md | 37 + mkdocs.yml | 11 +- notebooks/pics_benchmark.ipynb | 1704 +- poetry.lock | 7751 ++- pyproject.toml | 69 +- src/airflow/.env | 2 + src/airflow/Dockerfile | 29 + src/airflow/dags/configs/dag.yaml | 18 + src/airflow/dags/genetics_etl_gcp.py | 203 + src/airflow/docker-compose.yaml | 251 + src/airflow/requirements.txt | 1 + src/config/step/locus_to_gene.yaml | 33 - src/conftest.py | 31 +- src/otg/assets/__init__.py | 3 + src/otg/assets/data/__init__.py | 3 + src/otg/assets/data/gwas_pValueText_map.json | 466 + .../data/gwas_population_2_LD_panel_map.json | 20 + .../{dataset => assets}/schemas/__init__.py | 0 .../schemas/andersson2014.json | 0 .../schemas/colocalisation.json | 22 +- .../schemas/gene_index.json} | 18 + .../schemas/intervals.json | 0 .../schemas/l2g_feature.json | 2 +- .../schemas/l2g_feature_matrix.json | 6 + .../schemas/l2g_gold_standard.json | 6 +- .../schemas/l2g_predictions.json | 2 +- src/otg/assets/schemas/ld_index.json | 63 + .../schemas/study_index.json} | 30 +- .../schemas/study_locus.json | 78 +- .../assets/schemas/study_locus_overlap.json | 99 + .../schemas/summary_statistics.json} | 36 +- src/otg/{dataset => assets}/schemas/v2g.json | 0 .../assets/schemas/variant_annotation.json | 199 + .../schemas/variant_index.json | 20 +- src/{ => otg}/cli.py | 6 +- src/otg/colocalisation.py | 17 +- src/otg/common/schemas.py | 47 +- src/otg/common/session.py | 47 +- src/otg/common/spark_helpers.py | 56 + src/otg/common/utils.py | 285 +- src/otg/config.py | 200 +- src/otg/dataset/colocalisation.py | 20 +- src/otg/dataset/dataset.py | 107 +- src/otg/dataset/gene_index.py | 80 +- src/otg/dataset/intervals.py | 442 +- src/otg/dataset/l2g/feature_matrix.py | 52 +- src/otg/dataset/l2g/gold_standard.py | 49 +- src/otg/dataset/l2g/predictions.py | 7 +- src/otg/dataset/ld_index.py | 242 +- src/otg/dataset/schemas/ld_index.json | 53 - .../dataset/schemas/variant_annotation.json | 589 - src/otg/dataset/study_index.py | 431 +- src/otg/dataset/study_locus.py | 1489 +- src/otg/dataset/study_locus_overlap.py | 25 +- src/otg/dataset/summary_statistics.py | 115 + src/otg/dataset/v2g.py | 17 +- src/otg/dataset/variant_annotation.py | 391 +- src/otg/dataset/variant_index.py | 45 +- src/otg/datasource/__init__.py | 3 + src/otg/datasource/finngen/__init__.py | 3 + src/otg/datasource/finngen/study_index.py | 81 + src/otg/datasource/gnomad/__init__.py | 3 + src/otg/datasource/gnomad/ld.py | 259 + src/otg/datasource/gnomad/variants.py | 149 + src/otg/datasource/gwas_catalog/__init__.py | 3 + .../datasource/gwas_catalog/associations.py | 1158 + .../datasource/gwas_catalog/study_index.py | 503 + .../gwas_catalog/study_splitter.py} | 26 +- .../gwas_catalog/summary_statistics.py | 88 + src/otg/datasource/intervals/__init__.py | 3 + src/otg/datasource/intervals/andersson.py | 133 + src/otg/datasource/intervals/javierre.py | 172 + src/otg/datasource/intervals/jung.py | 103 + src/otg/datasource/intervals/thurnman.py | 104 + src/otg/datasource/open_targets/__init__.py | 3 + src/otg/datasource/open_targets/target.py | 65 + src/otg/datasource/ukbiobank/__init__.py | 3 + src/otg/datasource/ukbiobank/study_index.py | 110 + src/otg/finngen.py | 37 + src/otg/gene_index.py | 23 +- src/otg/gwas_catalog.py | 59 +- src/otg/gwas_catalog_sumstat_preprocess.py | 36 + src/otg/l2g.py | 64 +- src/otg/ld_index.py | 60 +- src/otg/method/clump.py | 75 + src/otg/method/colocalisation.py | 80 +- src/otg/method/ld.py | 431 +- src/otg/method/locus_to_gene.py | 21 +- src/otg/method/pics.py | 313 +- src/otg/method/window_based_clumping.py | 333 + src/otg/overlaps.py | 36 + src/otg/ukbiobank.py | 31 + src/otg/v2g.py | 58 +- src/otg/variant_annotation.py | 21 +- src/otg/variant_index.py | 15 +- src/scripts/schemadocs.py | 44 +- tests/airflow/test_dag.py | 48 + tests/common/test_gwas_catalog_splitter.py | 19 - tests/conftest.py | 306 +- tests/data_samples/GCST005523_chr18.parquet | Bin 0 -> 80416 bytes .../data_samples/finngen_studies_sample.json | 212 + .../data_samples/grch37_to_grch38.over.chain | 56001 ++++++++++++++++ .../gwas_summary_stats_sample.tsv.gz | Bin 0 -> 53190 bytes tests/data_samples/javierre_sample.parquet | Bin 0 -> 3066 bytes ...4646-8ed8-733106e3eac6-c000.snappy.parquet | Bin 816650 -> 0 bytes .../neale2_saige_study_manifest.samples.tsv | 11 + tests/dataset/test_gene_index.py | 5 - tests/dataset/test_ld_index.py | 7 - tests/dataset/test_study_index.py | 180 +- tests/dataset/test_study_locus.py | 265 +- tests/dataset/test_study_locus_overlaps.py | 76 + tests/dataset/test_summary_statistics.py | 93 + tests/dataset/test_variant_annotation.py | 43 + tests/dataset/test_variant_index.py | 11 + .../finngen/test_finngen_study_index.py | 23 + tests/datasource/gnomad/test_gnomad_ld.py | 67 + .../test_gwas_catalog_associations.py | 96 + .../test_gwas_catalog_study_index.py | 60 + .../test_gwas_catalog_study_splitter.py | 19 + .../test_gwas_catalog_summary_statistics.py | 17 + tests/datasource/intervals/test_andersson.py | 36 + tests/datasource/intervals/test_javierre.py | 36 + tests/datasource/intervals/test_jung.py | 34 + tests/datasource/intervals/test_thurnman.py | 36 + tests/datasource/open_targets/test_target.py | 12 + .../ukbiobank/test_ukbiobank_study_index.py | 20 + tests/method/test_clump.py | 196 + tests/method/test_ld.py | 140 +- tests/method/test_pics.py | 63 +- tests/method/test_window_based_clumping.py | 97 + tests/test_docs.py | 36 + tests/test_schemas.py | 103 +- tests/test_spark_helpers.py | 40 + utils/install_dependencies.sh | 18 +- ....sh => install_dependencies_on_cluster.sh} | 7 + utils/update_GWAS_Catalog_data.sh | 71 + workflow/__init__.py | 3 + workflow/dag.yaml | 18 + workflow/workflow_template.py | 260 + 222 files changed, 72482 insertions(+), 9246 deletions(-) delete mode 100644 .flake8 create mode 100644 .vscode/extensions.json create mode 100644 Makefile_deprecated create mode 100644 config/step/my_finngen.yaml create mode 100644 config/step/my_gene_index.yaml create mode 100644 config/step/my_l2g.yaml create mode 100644 config/step/my_study_locus_overlap.yaml create mode 100644 config/step/my_ukbiobank.yaml delete mode 100644 deprecated_tests/test_coloc.py delete mode 100644 deprecated_tests/test_distance.py delete mode 100644 deprecated_tests/test_gwas_process_assoc.py delete mode 100644 deprecated_tests/test_intervals_helpers.py delete mode 100644 deprecated_tests/test_vep.py rename docs/{reference => components}/dataset/_dataset.md (100%) rename docs/{reference => components}/dataset/colocalisation.md (100%) rename docs/{reference => components}/dataset/gene_index.md (100%) rename docs/{reference => components}/dataset/intervals.md (100%) rename docs/{reference => components}/dataset/ld_index.md (93%) rename docs/{reference/dataset/study_index/_study_index.md => components/dataset/study_index.md} (100%) rename docs/{reference/dataset/study_locus/_study_locus.md => components/dataset/study_locus.md} (100%) rename docs/{reference => components}/dataset/study_locus_overlap.md (79%) create mode 100644 docs/components/dataset/summary_statistics.md rename docs/{reference => components}/dataset/variant_annotation.md (100%) rename docs/{reference => components}/dataset/variant_index.md (100%) rename docs/{reference => components}/dataset/variant_to_gene.md (100%) create mode 100644 docs/components/datasource/finngen/_finngen.md create mode 100644 docs/components/datasource/finngen/study_index.md create mode 100644 docs/components/datasource/gnomad/_gnomad.md create mode 100644 docs/components/datasource/gnomad/gnomad_ld.md create mode 100644 docs/components/datasource/gnomad/gnomad_variants.md create mode 100644 docs/components/datasource/gwas_catalog/_gwas_catalog.md create mode 100644 docs/components/datasource/gwas_catalog/associations.md create mode 100644 docs/components/datasource/gwas_catalog/study_index.md create mode 100644 docs/components/datasource/gwas_catalog/study_splitter.md create mode 100644 docs/components/datasource/gwas_catalog/summary_statistics.md create mode 100644 docs/components/datasource/intervals/_intervals.md create mode 100644 docs/components/datasource/intervals/andersson.md create mode 100644 docs/components/datasource/intervals/javierre.md create mode 100644 docs/components/datasource/intervals/jung.md create mode 100644 docs/components/datasource/intervals/thurnman.md create mode 100644 docs/components/datasource/open_targets/_open_targets.md create mode 100644 docs/components/datasource/open_targets/target.md create mode 100644 docs/components/datasource/ukbiobank/_ukbiobank.md create mode 100644 docs/components/datasource/ukbiobank/study_index.md rename docs/{reference => components}/method/_method.md (100%) create mode 100644 docs/components/method/clumping.md rename docs/{reference => components}/method/coloc.md (100%) rename docs/{reference => components}/method/ecaviar.md (100%) create mode 100644 docs/components/method/ld_annotator.md rename docs/{reference => components}/method/pics.md (100%) create mode 100644 docs/components/method/window_based_clumping.md rename docs/{reference => components}/step/_step.md (100%) rename docs/{reference => components}/step/colocalisation.md (100%) create mode 100644 docs/components/step/finngen.md rename docs/{reference => components}/step/gene_index.md (59%) rename docs/{reference => components}/step/gwas_catalog.md (100%) create mode 100644 docs/components/step/gwas_catalog_sumstat_preprocess.md rename docs/{reference => components}/step/ld_index.md (100%) create mode 100644 docs/components/step/ukbiobank.md rename docs/{reference => components}/step/variant_annotation_step.md (100%) rename docs/{reference => components}/step/variant_index_step.md (100%) rename docs/{reference => components}/step/variant_to_gene_step.md (100%) create mode 100644 docs/contributing.md delete mode 100644 docs/reference/dataset/study_index/study_index_gwas_catalog.md delete mode 100644 docs/reference/dataset/study_locus/study_locus_gwas_catalog.md delete mode 100644 docs/reference/method/ld_annotator.md delete mode 100644 docs/reference/method/ld_clumping.md create mode 100644 docs/troubleshooting.md create mode 100644 src/airflow/.env create mode 100644 src/airflow/Dockerfile create mode 100644 src/airflow/dags/configs/dag.yaml create mode 100644 src/airflow/dags/genetics_etl_gcp.py create mode 100644 src/airflow/docker-compose.yaml create mode 100644 src/airflow/requirements.txt delete mode 100644 src/config/step/locus_to_gene.yaml create mode 100644 src/otg/assets/__init__.py create mode 100644 src/otg/assets/data/__init__.py create mode 100644 src/otg/assets/data/gwas_pValueText_map.json create mode 100644 src/otg/assets/data/gwas_population_2_LD_panel_map.json rename src/otg/{dataset => assets}/schemas/__init__.py (100%) rename src/otg/{dataset => assets}/schemas/andersson2014.json (100%) rename src/otg/{dataset => assets}/schemas/colocalisation.json (77%) rename src/otg/{dataset/schemas/targets.json => assets/schemas/gene_index.json} (80%) rename src/otg/{dataset => assets}/schemas/intervals.json (100%) rename src/otg/{dataset => assets}/schemas/l2g_feature.json (95%) rename src/otg/{dataset => assets}/schemas/l2g_feature_matrix.json (94%) rename src/otg/{dataset => assets}/schemas/l2g_gold_standard.json (84%) rename src/otg/{dataset => assets}/schemas/l2g_predictions.json (93%) create mode 100644 src/otg/assets/schemas/ld_index.json rename src/otg/{dataset/schemas/studies.json => assets/schemas/study_index.json} (84%) rename src/otg/{dataset => assets}/schemas/study_locus.json (71%) create mode 100644 src/otg/assets/schemas/study_locus_overlap.json rename src/otg/{dataset/schemas/study_locus_overlap.json => assets/schemas/summary_statistics.json} (53%) rename src/otg/{dataset => assets}/schemas/v2g.json (100%) create mode 100644 src/otg/assets/schemas/variant_annotation.json rename src/otg/{dataset => assets}/schemas/variant_index.json (91%) rename src/{ => otg}/cli.py (83%) delete mode 100644 src/otg/dataset/schemas/ld_index.json delete mode 100644 src/otg/dataset/schemas/variant_annotation.json create mode 100644 src/otg/dataset/summary_statistics.py create mode 100644 src/otg/datasource/__init__.py create mode 100644 src/otg/datasource/finngen/__init__.py create mode 100644 src/otg/datasource/finngen/study_index.py create mode 100644 src/otg/datasource/gnomad/__init__.py create mode 100644 src/otg/datasource/gnomad/ld.py create mode 100644 src/otg/datasource/gnomad/variants.py create mode 100644 src/otg/datasource/gwas_catalog/__init__.py create mode 100644 src/otg/datasource/gwas_catalog/associations.py create mode 100644 src/otg/datasource/gwas_catalog/study_index.py rename src/otg/{common/gwas_catalog_splitter.py => datasource/gwas_catalog/study_splitter.py} (83%) create mode 100644 src/otg/datasource/gwas_catalog/summary_statistics.py create mode 100644 src/otg/datasource/intervals/__init__.py create mode 100644 src/otg/datasource/intervals/andersson.py create mode 100644 src/otg/datasource/intervals/javierre.py create mode 100644 src/otg/datasource/intervals/jung.py create mode 100644 src/otg/datasource/intervals/thurnman.py create mode 100644 src/otg/datasource/open_targets/__init__.py create mode 100644 src/otg/datasource/open_targets/target.py create mode 100644 src/otg/datasource/ukbiobank/__init__.py create mode 100644 src/otg/datasource/ukbiobank/study_index.py create mode 100644 src/otg/finngen.py create mode 100644 src/otg/gwas_catalog_sumstat_preprocess.py create mode 100644 src/otg/method/clump.py create mode 100644 src/otg/method/window_based_clumping.py create mode 100644 src/otg/overlaps.py create mode 100644 src/otg/ukbiobank.py create mode 100644 tests/airflow/test_dag.py delete mode 100644 tests/common/test_gwas_catalog_splitter.py create mode 100644 tests/data_samples/GCST005523_chr18.parquet create mode 100644 tests/data_samples/finngen_studies_sample.json create mode 100644 tests/data_samples/grch37_to_grch38.over.chain create mode 100644 tests/data_samples/gwas_summary_stats_sample.tsv.gz create mode 100644 tests/data_samples/javierre_sample.parquet delete mode 100644 tests/data_samples/javierre_sample.parquet/part-00182-eacf2e93-7623-4646-8ed8-733106e3eac6-c000.snappy.parquet create mode 100644 tests/data_samples/neale2_saige_study_manifest.samples.tsv create mode 100644 tests/dataset/test_summary_statistics.py create mode 100644 tests/dataset/test_variant_annotation.py create mode 100644 tests/datasource/finngen/test_finngen_study_index.py create mode 100644 tests/datasource/gnomad/test_gnomad_ld.py create mode 100644 tests/datasource/gwas_catalog/test_gwas_catalog_associations.py create mode 100644 tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py create mode 100644 tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py create mode 100644 tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py create mode 100644 tests/datasource/intervals/test_andersson.py create mode 100644 tests/datasource/intervals/test_javierre.py create mode 100644 tests/datasource/intervals/test_jung.py create mode 100644 tests/datasource/intervals/test_thurnman.py create mode 100644 tests/datasource/open_targets/test_target.py create mode 100644 tests/datasource/ukbiobank/test_ukbiobank_study_index.py create mode 100644 tests/method/test_clump.py create mode 100644 tests/method/test_window_based_clumping.py create mode 100644 tests/test_docs.py rename utils/{initialise_cluster.sh => install_dependencies_on_cluster.sh} (80%) create mode 100755 utils/update_GWAS_Catalog_data.sh create mode 100644 workflow/__init__.py create mode 100644 workflow/dag.yaml create mode 100644 workflow/workflow_template.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 85630682a..000000000 --- a/.flake8 +++ /dev/null @@ -1,18 +0,0 @@ -[flake8] -exclude = - dist -min_python_version = 3.8.0 -max-line-length = 88 -ban-relative-imports = True -format-greedy = 1 -inline-quotes = double -extend-ignore = - # E203: Whitespace before ':' (pycqa/pycodestyle#373) - E203, - # E501: Line too long - E501, - # E800 Found commented out code - E800 -strictness=short -docstring_style=google -docstring-convention=google diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index f3cef939c..90a9b71dd 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -13,7 +13,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8.15 + python-version: 3.10.8 - name: Install and configure Poetry uses: snok/install-poetry@v1 with: diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index 51897a93f..b43bbc997 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -1,5 +1,5 @@ name: tests -on: [pull_request] +on: [push] jobs: test: runs-on: ubuntu-latest @@ -10,7 +10,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8.15 + python-version: 3.10.8 - name: Install and configure Poetry uses: snok/install-poetry@v1 with: @@ -25,11 +25,11 @@ jobs: key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' - run: poetry install --without docs --no-interaction --no-root + run: poetry install --no-interaction --no-root - name: Install library - run: poetry install --no-interaction --without docs + run: poetry install --no-interaction - name: Run tests - run: poetry run pytest --doctest-modules --cov=src/ --cov-report=xml + run: poetry run pytest - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: diff --git a/.gitignore b/.gitignore index 76efe9b2c..130d77e63 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ docs/assets/schemas/ mock_data/ notebooks/wandb/ src/wandb/ +src/airflow/logs/ +site/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7cea5afd5..11abbedf6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -26,34 +26,17 @@ repos: - id: python-use-type-annotations - id: python-check-blanket-noqa - - repo: https://github.com/asottile/yesqa - rev: v1.4.0 - hooks: - - id: yesqa - additional_dependencies: &flake8_deps - - flake8-annotations==2.9.0 - - flake8-broken-line==0.5.0 - - flake8-bugbear==22.7.1 - - flake8-comprehensions==3.10.0 - - flake8-eradicate==1.3.0 - - flake8-quotes==3.3.1 - - flake8-simplify==0.19.3 - - flake8-tidy-imports==4.8.0 - - flake8-type-checking==2.1.2 - - flake8-typing-imports==1.12.0 - - flake8-use-fstring==1.4 - - flake8-class-attributes-order==0.1.3 - - flake8-docstrings - - flake8-pytest-style - - pep8-naming==0.13.1 - - darglint - - repo: https://github.com/hadialqattan/pycln - rev: v2.1.3 + rev: v2.2.2 hooks: - id: pycln args: [--all] + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.0.292 + hooks: + - id: ruff + - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: @@ -62,25 +45,19 @@ repos: - repo: https://github.com/psf/black - rev: 23.1.0 + rev: 23.9.1 hooks: - id: black - - repo: https://github.com/pycqa/flake8 - rev: 5.0.4 - hooks: - - id: flake8 - additional_dependencies: *flake8_deps - - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook - rev: v9.4.0 + rev: v9.5.0 hooks: - id: commitlint additional_dependencies: ['@commitlint/config-conventional'] stages: [commit-msg] - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'v0.991' + rev: 'v1.5.1' hooks: - id: mypy diff --git a/.python-version b/.python-version index 84691ddea..36435ac69 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.8.15 +3.10.8 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..e434673de --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,12 @@ +{ + "recommendations": [ + "charliermarsh.ruff", + "ms-python.isort", + "ms-python.mypy-type-checker", + "ms-python.python", + "ms-python.black-formatter" + ], + "unwantedRecommendations": [ + "ms-python.flake8" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 713c891b7..727b1d959 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,12 @@ { "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter", "editor.formatOnPaste": false, - "editor.formatOnSave": true + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll": false, + "source.organizeImports": true + } }, "python.terminal.launchArgs": [ "-m", @@ -18,18 +23,6 @@ } }, "json.format.keepLines": true, - "python.linting.flake8Enabled": true, - "python.linting.flake8CategorySeverity.F": "Information", - "python.linting.flake8CategorySeverity.E": "Information", - "python.linting.flake8CategorySeverity.W": "Information", - "python.formatting.blackArgs": [], - "python.linting.mypyEnabled": true, - "python.linting.mypyCategorySeverity.error": "Information", - "python.linting.pydocstyleEnabled": true, - "python.linting.pydocstyleArgs": [ - "--convention=google" - ], - "python.formatting.provider": "black", "isort.args": [ "--profile", "black" @@ -42,5 +35,9 @@ ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, - "docwriter.style": "Google" + "mypy-type-checker.severity": { + "error": "Information" + }, + "ruff.fixAll": false, + "ruff.organizeImports": false } diff --git a/Makefile b/Makefile index 29eec710a..49bba7b4a 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ PROJECT_ID ?= open-targets-genetics-dev REGION ?= europe-west1 -CLUSTER_NAME ?= ${USER}-genetics-etl -PROJECT_NUMBER ?= $$(gcloud projects list --filter=${PROJECT_ID} --format="value(PROJECT_NUMBER)") APP_NAME ?= $$(cat pyproject.toml| grep name | cut -d" " -f3 | sed 's/"//g') VERSION_NO ?= $$(poetry version --short) -SRC_WITH_DEPS ?= code_bundle +CLEAN_VERSION_NO := $(shell echo "$(VERSION_NO)" | tr -cd '[:alnum:]') +BUCKET_NAME=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/ +BUCKET_COMPOSER_DAGS=gs://europe-west1-ot-workflows-fe147745-bucket/dags/ .PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST)) @@ -13,174 +13,58 @@ SRC_WITH_DEPS ?= code_bundle help: ## This is help @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) -clean: ## CleanUp Prior to Build +clean: ## Clean up prior to building @rm -Rf ./dist - @rm -Rf ./${SRC_WITH_DEPS} - @rm -f requirements.txt setup-dev: SHELL:=/bin/bash -setup-dev: ## Setup dev environment +setup-dev: ## Setup development environment @. utils/install_dependencies.sh -build: clean ## Build Python Package with Dependencies +check: ## Lint and format code + @echo "Linting..." + @poetry run ruff src/otg . + @echo "Formatting..." + @poetry run black src/otg . + @poetry run isort src/otg . + +test: ## Run tests + @echo "Running Tests..." + @poetry run pytest + +build-documentation: ## Create local server with documentation + @echo "Building Documentation..." + @poetry run mkdocs serve + +create-dev-cluster: ## Spin up a simple dataproc cluster with all dependencies for development purposes + @${MAKE} build + @echo "Creating Dataproc Dev Cluster" + @gcloud config set project ${PROJECT_ID} + @gcloud dataproc clusters create "ot-genetics-dev-${CLEAN_VERSION_NO}" \ + --image-version 2.1 \ + --region ${REGION} \ + --master-machine-type n1-standard-16 \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/install_dependencies_on_cluster.sh \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/otgenetics-${VERSION_NO}-py3-none-any.whl,CONFIGTAR=gs://genetics_etl_python_playground/initialisation/${VERSION_NO}/config.tar.gz" \ + --single-node \ + --enable-component-gateway + +make update-dev-cluster: ## Reinstalls the package on the dev-cluster + @${MAKE} build + @echo "Updating Dataproc Dev Cluster" + @gcloud config set project ${PROJECT_ID} + gcloud dataproc jobs submit pig --cluster="ot-genetics-dev-${CLEAN_VERSION_NO}" \ + --region ${REGION} \ + --jars=${BUCKET_NAME}/install_dependencies_on_cluster.sh \ + -e='sh chmod 750 $${PWD}/install_dependencies_on_cluster.sh; sh $${PWD}/install_dependencies_on_cluster.sh' + +build: clean ## Build Python package with dependencies + @gcloud config set project ${PROJECT_ID} @echo "Packaging Code and Dependencies for ${APP_NAME}-${VERSION_NO}" @rm -rf ./dist @poetry build - @cp ./src/*.py ./dist - # @poetry run python ./utils/configure.py --cfg job > ./dist/config.yaml TODO: define main config file to parametrise the ETL dependencies + @tar -czf dist/config.tar.gz config/ @echo "Uploading to Dataproc" - @gsutil cp ./dist/${APP_NAME}-${VERSION_NO}-py3-none-any.whl gs://genetics_etl_python_playground/initialisation/ - @gsutil cp ./utils/initialise_cluster.sh gs://genetics_etl_python_playground/initialisation/ - -prepare_pics: ## Create cluster for variant annotation: - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-96 \ - --enable-component-gateway \ - --num-master-local-ssds=1 \ - --master-local-ssd-interface=NVME \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_variant_annotation: ## Create cluster for variant annotation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-96 \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_variant_index: ## Create cluster for variant index generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-32 \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --enable-component-gateway \ - --single-node \ - --max-idle=10m - -prepare_v2g: ## Create cluster for variant to gene data generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-64 \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_v2g: ## Create cluster for variant to gene data generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-64 \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_coloc: ## Create cluster for coloc - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-64 \ - --num-master-local-ssds=1 \ - --master-local-ssd-interface=NVME \ - --enable-component-gateway \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --single-node \ - --max-idle=10m - -prepare_gwas: ## Create cluster for gwas data generation - gcloud dataproc clusters create ${CLUSTER_NAME} \ - --image-version=2.0 \ - --project=${PROJECT_ID} \ - --region=${REGION} \ - --master-machine-type=n1-highmem-32 \ - --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ - --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ - --enable-component-gateway \ - --single-node \ - --max-idle=10m - -run_coloc: ## Generate coloc results - gcloud dataproc jobs submit pyspark ./dist/run_coloc.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_v2g: ## Generate V2G dataset - gcloud dataproc jobs submit pyspark ./dist/run_v2g.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_v2g: ## Generate V2G dataset - gcloud dataproc jobs submit pyspark ./dist/run_v2g.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_variant_annotation: ## Generate variant annotation dataset - gcloud dataproc jobs submit pyspark ./dist/run_variant_annotation.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_variant_index: ## Generate variant index dataset - gcloud dataproc jobs submit pyspark ./dist/run_variant_index.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_gwas: ## Ingest gwas dataset on a dataproc cluster - gcloud dataproc jobs submit pyspark ./dist/run_gwas_ingest.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_pics: ## Run pics method - gcloud dataproc jobs submit pyspark ./dist/pics_experiment.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --project=${PROJECT_ID} \ - --region=${REGION} - -run_precompute_ld_index: ## Precompute ld-index information - gcloud dataproc jobs submit pyspark ./dist/run_precompute_ld_indexes.py \ - --cluster=${CLUSTER_NAME} \ - --files=./dist/config.yaml \ - --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ - --project=${PROJECT_ID} \ - --region=${REGION} + @gsutil cp src/otg/cli.py ${BUCKET_NAME} + @gsutil cp ./dist/${APP_NAME}-${VERSION_NO}-py3-none-any.whl ${BUCKET_NAME} + @gsutil cp ./dist/config.tar.gz ${BUCKET_NAME} + @gsutil cp ./utils/install_dependencies_on_cluster.sh ${BUCKET_NAME} diff --git a/Makefile_deprecated b/Makefile_deprecated new file mode 100644 index 000000000..df9617ce9 --- /dev/null +++ b/Makefile_deprecated @@ -0,0 +1,186 @@ +PROJECT_ID ?= open-targets-genetics-dev +REGION ?= europe-west1 +CLUSTER_NAME ?= ${USER}-genetics-etl +PROJECT_NUMBER ?= $$(gcloud projects list --filter=${PROJECT_ID} --format="value(PROJECT_NUMBER)") +APP_NAME ?= $$(cat pyproject.toml| grep name | cut -d" " -f3 | sed 's/"//g') +VERSION_NO ?= $$(poetry version --short) +SRC_WITH_DEPS ?= code_bundle + +.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST)) + +.DEFAULT_GOAL := help + +help: ## This is help + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) + +clean: ## CleanUp Prior to Build + @rm -Rf ./dist + @rm -Rf ./${SRC_WITH_DEPS} + @rm -f requirements.txt + +setup-dev: SHELL:=/bin/bash +setup-dev: ## Setup dev environment + @. utils/install_dependencies.sh + +build: clean ## Build Python Package with Dependencies + @echo "Packaging Code and Dependencies for ${APP_NAME}-${VERSION_NO}" + @rm -rf ./dist + @poetry build + @cp ./src/*.py ./dist + @poetry run python ./utils/configure.py --cfg job > ./dist/config.yaml + @echo "Uploading to Dataproc" + @gsutil cp ./dist/${APP_NAME}-${VERSION_NO}-py3-none-any.whl gs://genetics_etl_python_playground/initialisation/ + @gsutil cp ./utils/initialise_cluster.sh gs://genetics_etl_python_playground/initialisation/ + +prepare_pics: ## Create cluster for variant annotation: + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-96 \ + --enable-component-gateway \ + --num-master-local-ssds=1 \ + --master-local-ssd-interface=NVME \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --single-node \ + --max-idle=10m + +prepare_variant_annotation: ## Create cluster for variant annotation + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-96 \ + --enable-component-gateway \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --single-node \ + --max-idle=10m + +prepare_variant_index: ## Create cluster for variant index generation + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-32 \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --enable-component-gateway \ + --single-node \ + --max-idle=10m + +prepare_v2g: ## Create cluster for variant to gene data generation + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-64 \ + --enable-component-gateway \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --single-node \ + --max-idle=10m + +prepare_v2g: ## Create cluster for variant to gene data generation + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-64 \ + --enable-component-gateway \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --single-node \ + --max-idle=10m + +prepare_coloc: ## Create cluster for coloc + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-64 \ + --num-master-local-ssds=1 \ + --master-local-ssd-interface=NVME \ + --enable-component-gateway \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --single-node \ + --max-idle=10m + +prepare_gwas: ## Create cluster for gwas data generation + gcloud dataproc clusters create ${CLUSTER_NAME} \ + --image-version=2.0 \ + --project=${PROJECT_ID} \ + --region=${REGION} \ + --master-machine-type=n1-highmem-32 \ + --metadata="PACKAGE=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl" \ + --initialization-actions=gs://genetics_etl_python_playground/initialisation/initialise_cluster.sh \ + --enable-component-gateway \ + --single-node \ + --max-idle=10m + +run_coloc: ## Generate coloc results + gcloud dataproc jobs submit pyspark ./dist/run_coloc.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_v2g: ## Generate V2G dataset + gcloud dataproc jobs submit pyspark ./dist/run_v2g.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_v2g: ## Generate V2G dataset + gcloud dataproc jobs submit pyspark ./dist/run_v2g.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_variant_annotation: ## Generate variant annotation dataset + gcloud dataproc jobs submit pyspark ./dist/run_variant_annotation.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_variant_index: ## Generate variant index dataset + gcloud dataproc jobs submit pyspark ./dist/run_variant_index.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_gwas: ## Ingest gwas dataset on a dataproc cluster + gcloud dataproc jobs submit pyspark ./dist/run_gwas_ingest.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ + --py-files=gs://genetics_etl_python_playground/initialisation/${APP_NAME}-${VERSION_NO}-py3-none-any.whl \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_pics: ## Run pics method + gcloud dataproc jobs submit pyspark ./dist/pics_experiment.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ + --project=${PROJECT_ID} \ + --region=${REGION} + +run_precompute_ld_index: ## Precompute ld-index information + gcloud dataproc jobs submit pyspark ./dist/run_precompute_ld_indexes.py \ + --cluster=${CLUSTER_NAME} \ + --files=./dist/config.yaml \ + --properties='spark.jars=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.driver.extraClassPath=/opt/conda/miniconda3/lib/python3.8/site-packages/hail/backend/hail-all-spark.jar,spark.executor.extraClassPath=./hail-all-spark.jar,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.kryo.registrator=is.hail.kryo.HailKryoRegistrator' \ + --project=${PROJECT_ID} \ + --region=${REGION} diff --git a/README.md b/README.md index 9f4570e8a..b1ec5ba19 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,9 @@ [![status: experimental](https://github.com/GIScience/badges/raw/master/status/experimental.svg)](https://github.com/GIScience/badges#experimental) +[![docs](https://github.com/opentargets/genetics_etl_python/actions/workflows/docs.yaml/badge.svg)](https://opentargets.github.io/genetics_etl_python/) +[![codecov](https://codecov.io/gh/opentargets/genetics_etl_python/branch/main/graph/badge.svg?token=5ixzgu8KFP)](https://codecov.io/gh/opentargets/genetics_etl_python) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -[![codecov](https://codecov.io/gh/opentargets/genetics_etl_python/branch/main/graph/badge.svg?token=5ixzgu8KFP)](https://codecov.io/gh/opentargets/genetics_etl_python) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/opentargets/genetics_etl_python/main.svg)](https://results.pre-commit.ci/badge/github/opentargets/genetics_etl_python) -# Genetics Portal Python ETL - -Genetics portal ETL steps (Python) - -### Requirements - -- [pyenv](https://github.com/pyenv/pyenv) -- [Poetry](https://python-poetry.org/docs/) -- gcloud installed and authorised to your GCP Project -- gsutil -- [make](https://www.gnu.org/software/make/) build tool -- OpenBLAS and LAPACK libraries (for scipy). [more info](https://stackoverflow.com/questions/69954587/no-blas-lapack-libraries-found-when-installing-scipy) - -### Setup development environment - -Ensure python version described in `.python-version` is available - -```bash -pyenv versions -``` - -Otherwise, install - -```bash -pyenv install 3.8.15 -``` - -Make sure you are using the local Python version - -``` bash -python -V -poetry env use 3.8.15 -``` - -``` bash -make setup-dev - -#VS-code -code . #...and select interpreter -``` - -### Configuration - -We use [hydra](https://hydra.cc) for managing the ETL configuration. The `configs` directory contains the source YAMLs neccessary to produce an instance of the configuration. To manually run an instance of the configuration run: - -```bash -poetry run python ./utils/configure.py --cfg job # add --resolve to resolve interpolations -``` - -A local instance of the configuration file can be used in `src/config.yaml` for debugging purposes (gitignored). - -Configurations can be modified using hydra options. - -```bash -poetry run python ./utils/configure.py environment=local -``` - -### Build - -Use `make build` to create a bundle that will contain the neccessary code, configuration and dependencies to run the ETL pipeline. The build is stored in `dist/` (gitignored). - -### Development guidelines - -- DataFrame schemas must be validated when reading (`etl.read_parquet`) and writing (`validate_df_schema`). -- ... -### More help - -```bash -make help -``` +# Genetics Portal Data Pipeline (experimental) +- [Documentation](https://opentargets.github.io/genetics_etl_python/) diff --git a/config/datasets/gcp.yaml b/config/datasets/gcp.yaml index 77d596815..e19acda96 100644 --- a/config/datasets/gcp.yaml +++ b/config/datasets/gcp.yaml @@ -7,29 +7,45 @@ outputs: gs://genetics_etl_python_playground/output/python_etl/parquet/${dataset # Input datasets gnomad_gnomes: gs://gcp-public-data--gnomad/release/3.1.2/ht/genomes/gnomad.genomes.v3.1.2.sites.ht chain_hail_38_37: gs://hail-common/references/grch38_to_grch37.over.chain.gz +chain_hail_37_38: gs://hail-common/references/grch37_to_grch38.over.chain.gz chain_37_38: ${datasets.inputs}/v2g_input/grch37_to_grch38.over.chain -gene_index: ${datasets.inputs}/v2g_input/targets_correct_tss +target_index: ${datasets.inputs}/v2g_input/targets_correct_tss vep_consequences: gs://genetics-portal-data/lut/vep_consequences.tsv anderson: gs://genetics-portal-input/v2g_input/andersson2014/enhancer_tss_associations.bed javierre: gs://genetics-portal-input/v2g_input/javierre_2016_preprocessed.parquet jung: gs://genetics-portal-raw/pchic_jung2019/jung2019_pchic_tableS3.csv thrunman: gs://genetics-portal-input/v2g_input/thurman2012/genomewideCorrs_above0.7_promoterPlusMinus500kb_withGeneNames_32celltypeCategories.bed8.gz -catalog_associations: ${dataset.inputs}/v2d/gwas_catalog_v1.0.2-associations_e107_r2022-11-29.tsv -catalog_studies: ${dataset.inputs}/v2d/gwas-catalog-v1.0.3-studies-r2022-11-29.tsv -catalog_ancestries: ${dataset.inputs}/v2d/gwas-catalog-v1.0.3-ancestries-r2022-11-29.tsv -catalog_sumstats_lut: ${dataset.inputs}/v2d/harmonised_list.txt -# templates +catalog_associations: ${datasets.inputs}/v2d/gwas_catalog_v1.0.2-associations_e110_r2023-09-11.tsv +catalog_studies: ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-studies-r2023-09-11.tsv +catalog_ancestries: ${datasets.inputs}/v2d/gwas-catalog-v1.0.3-ancestries-r2023-09-11.tsv +catalog_sumstats_lut: ${datasets.inputs}/v2d/harmonised_list-r2023-09-11.txt +finngen_phenotype_table_url: https://r9.finngen.fi/api/phenos +ukbiobank_manifest: gs://genetics-portal-input/ukb_phenotypes/neale2_saige_study_manifest.190430.tsv +l2g_gold_standard_curation: ${datasets.inputs}/l2g/gold_standard/curation.json +gene_interactions: gs://open-targets-data-releases/23.06/output/etl/parquet/interaction + +# Templates ld_index_raw_template: gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht ld_matrix_template: gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm -#Output datasets +# Output datasets +gene_index: ${datasets.outputs}/gene_index/gene_index variant_annotation: ${datasets.outputs}/variant_annotation variant_index: ${datasets.outputs}/variant_index study_locus: ${datasets.outputs}/study_locus +study_locus_overlap: ${datasets.outputs}/study_locus_overlap colocalisation: ${datasets.outputs}/colocalisation v2g: ${datasets.outputs}/v2g ld_index: ${datasets.outputs}/ld_index catalog_study_index: ${datasets.outputs}/catalog_study_index catalog_study_locus: ${datasets.outputs}/catalog_study_locus -#templates -ld_index_template: ${datasets.outputs}/gnomad_r2.1.1.{POP}.common.ld.variant_indices.parquet +finngen_study_index: ${datasets.outputs}/finngen_study_index +ukbiobank_study_index: ${datasets.outputs}/ukbiobank_study_index +l2g_model: ${datasets.outputs}/l2g_model +l2g_feature_matrix: ${datasets.outputs}/l2g_feature_matrix +l2g_predictions: ${datasets.outputs}/l2g_predictions + +# Constants +finngen_release_prefix: FINNGEN_R9 +finngen_sumstat_url_prefix: https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_ +finngen_sumstat_url_suffix: .gz diff --git a/config/session/dataproc.yaml b/config/session/dataproc.yaml index 03a200868..96b2ff07a 100644 --- a/config/session/dataproc.yaml +++ b/config/session/dataproc.yaml @@ -2,3 +2,4 @@ defaults: - session_config spark_uri: yarn write_mode: overwrite +hail_home: /opt/conda/miniconda3/lib/python3.10/site-packages/hail diff --git a/config/step/my_finngen.yaml b/config/step/my_finngen.yaml new file mode 100644 index 000000000..19b07d366 --- /dev/null +++ b/config/step/my_finngen.yaml @@ -0,0 +1,9 @@ +# Default config +defaults: + - finngen +# Additional config +finngen_phenotype_table_url: ${datasets.finngen_phenotype_table_url} +finngen_release_prefix: ${datasets.finngen_release_prefix} +finngen_sumstat_url_prefix: ${datasets.finngen_sumstat_url_prefix} +finngen_sumstat_url_suffix: ${datasets.finngen_sumstat_url_suffix} +finngen_study_index_out: ${datasets.finngen_study_index} diff --git a/config/step/my_gene_index.yaml b/config/step/my_gene_index.yaml new file mode 100644 index 000000000..20c2bc3b7 --- /dev/null +++ b/config/step/my_gene_index.yaml @@ -0,0 +1,6 @@ +# Default config +defaults: + - gene_index +# Additional config +target_path: ${datasets.target_index} +gene_index_path: ${datasets.gene_index} diff --git a/config/step/my_gwas_catalog.yaml b/config/step/my_gwas_catalog.yaml index 11dde0dea..70fab08d3 100644 --- a/config/step/my_gwas_catalog.yaml +++ b/config/step/my_gwas_catalog.yaml @@ -7,7 +7,6 @@ catalog_ancestry_file: ${datasets.catalog_ancestries} catalog_associations_file: ${datasets.catalog_associations} catalog_sumstats_lut: ${datasets.catalog_sumstats_lut} variant_annotation_path: ${datasets.variant_annotation} +ld_index_path: ${datasets.ld_index} catalog_studies_out: ${datasets.catalog_study_index} catalog_associations_out: ${datasets.catalog_study_locus} -ld_matrix_template: ${datasets.ld_matrix_template} -ld_index_template: ${datasets.ld_index_template} diff --git a/config/step/my_l2g.yaml b/config/step/my_l2g.yaml new file mode 100644 index 000000000..313c640d7 --- /dev/null +++ b/config/step/my_l2g.yaml @@ -0,0 +1,21 @@ +# Default config +defaults: + - l2g +# Additional config +run_mode: ??? +wandb_run_name: null +perform_cross_validation: ??? +model_path: ${datasets.l2g_model} +predictions_path: ${datasets.l2g_predictions} +study_locus_path: ${datasets.study_locus} +variant_gene_path: ${datasets.v2g} +colocalisation_path: ${datasets.colocalisation} +study_index_path: ${datasets.catalog_studies} +study_locus_overlap_path: ${datasets.study_locus_overlap} +gold_standard_curation_path: ${datasets.l2g_gold_standard_curation} +gold_standard_processed_path: ??? +gene_interactions_path: ${datasets.gene_interactions} +feature_matrix_path: ${datasets.l2g_feature_matrix} +hyperparameters: + max_depth: 5 + loss_function: binary:logistic diff --git a/config/step/my_ld_index.yaml b/config/step/my_ld_index.yaml index aa88c6afe..400451194 100644 --- a/config/step/my_ld_index.yaml +++ b/config/step/my_ld_index.yaml @@ -3,5 +3,5 @@ defaults: - ld_index # Additional config grch37_to_grch38_chain_path: ${datasets.chain_hail_37_38} -ld_index_raw_template: ${dataset.ld_index_raw_template} -ld_index_template: ${dataset.ld_index_template} +ld_index_raw_template: ${datasets.ld_index_raw_template} +ld_index_out: ${datasets.ld_index} diff --git a/config/step/my_study_locus_overlap.yaml b/config/step/my_study_locus_overlap.yaml new file mode 100644 index 000000000..d895174df --- /dev/null +++ b/config/step/my_study_locus_overlap.yaml @@ -0,0 +1,7 @@ +# Default config +defaults: + - study_locus_overlap +# Additional config +study_locus_path: ${datasets.outputs}/catalog_study_locus +study_index_path: ${datasets.outputs}/catalog_study_index +overlaps_index_out: ${datasets.outputs}/study_locus_overlap diff --git a/config/step/my_ukbiobank.yaml b/config/step/my_ukbiobank.yaml new file mode 100644 index 000000000..7e8af4723 --- /dev/null +++ b/config/step/my_ukbiobank.yaml @@ -0,0 +1,6 @@ +# Default config +defaults: + - ukbiobank +# Additional config +ukbiobank_manifest: ${datasets.ukbiobank_manifest} +ukbiobank_study_index_out: ${datasets.ukbiobank_study_index} diff --git a/deprecated_tests/test_coloc.py b/deprecated_tests/test_coloc.py deleted file mode 100644 index 3753e45e8..000000000 --- a/deprecated_tests/test_coloc.py +++ /dev/null @@ -1,424 +0,0 @@ -"""Tests on helper functions that find overlapping signals between credible sets.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pyspark.sql.types as t -import pytest -from pandas.testing import assert_frame_equal - -from otg.coloc.coloc import ecaviar_colocalisation -from otg.coloc.overlaps import find_gwas_vs_all_overlapping_peaks -from otg.coloc.utils import _extract_credible_sets - -if TYPE_CHECKING: - from pyspark.sql import SparkSession - - -@pytest.fixture(scope="module") -def gwas_vs_all_overlap_schema() -> t.StructType: - """Schema of the gwas_vs_all overlap output dataframe.""" - return t.StructType( - [ - t.StructField("left_chromosome", t.StringType(), False), - t.StructField("left_studyId", t.StringType(), False), - t.StructField("left_leadVariantId", t.StringType(), False), - t.StructField("left_type", t.StringType(), True), - t.StructField("left_posteriorProbability", t.DoubleType(), False), - t.StructField("right_chromosome", t.StringType(), True), - t.StructField("right_studyId", t.StringType(), True), - t.StructField("right_leadVariantId", t.StringType(), True), - t.StructField("right_type", t.StringType(), True), - t.StructField("right_posteriorProbability", t.DoubleType(), True), - t.StructField("tagVariantId", t.StringType(), True), - ] - ) - - -class TestFindGwasVsAllOverlappingPeaks: - """Tests on find_gwas_vs_all_overlapping_peaks.""" - - test_input = [ - [ - # Overlapping peak between two GWAS - ("22", "GCST90002383", "22_28449893_G_C", "22_28026789_C_T", 0.2, "gwas"), - ("22", "GCST90002310", "22_28690105_C_T", "22_28026789_C_T", 0.1, "gwas"), - ], - [ - # Overlapping peak between a GWAS and a eQTL - ("22", "GCST90002383", "22_28449893_G_C", "22_28026789_C_T", 0.2, "gwas"), - ("22", "eABC123", "22_28690105_C_T", "22_28026789_C_T", 0.3, "eqtl"), - ], - [ - # Overlapping peak between a pQTL and a eQTL - ("22", "pABC123", "22_28449893_G_C", "22_28026789_C_T", 0.4, "pqtl"), - ("22", "eABC123", "22_28690105_C_T", "22_28026789_C_T", 0.3, "eqtl"), - ], - ] - - expected_output = [ - [ - # Overlapping peak between two GWAS - ( - "22", - "GCST90002383", - "22_28449893_G_C", - "gwas", - 0.2, - "22", - "GCST90002310", - "22_28690105_C_T", - "gwas", - 0.1, - "22_28026789_C_T", - ), - ], - [ - # Overlapping peak between a GWAS and a eQTL - ( - "22", - "GCST90002383", - "22_28449893_G_C", - "gwas", - 0.2, - "22", - "eABC123", - "22_28690105_C_T", - "eqtl", - 0.3, - "22_28026789_C_T", - ), - ], - [ - # Overlapping peak between a pQTL and a eQTL should not be returned - ], - ] - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_find_gwas_vs_all_overlapping_peaks( - self: TestFindGwasVsAllOverlappingPeaks, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - gwas_vs_all_overlap_schema: t.StructType, - ) -> None: - """Test that find_gwas_vs_all_overlapping_peaks returns the expected DataFrame.""" - mock_df = spark.createDataFrame( - data=test_input, - schema=[ - "chromosome", - "studyId", - "leadVariantId", - "tagVariantId", - "posteriorProbability", - "type", - ], - ) - test_df = find_gwas_vs_all_overlapping_peaks( - mock_df, causality_statistic="posteriorProbability" - ).toPandas() - expected_df = spark.createDataFrame( - data=expected_output, - schema=gwas_vs_all_overlap_schema, - ).toPandas() - - assert_frame_equal(test_df, expected_df) - - -class TestEcaviarColocalisation: - """Tests on ecaviar_colocalisation.""" - - test_input = [ - # Overlapping peak between two GWAS with a significant CLPP (> 0.001) - [ - ( - "22", - "GCST90002383", - "22_28449893_G_C", - "gwas", - 0.2, - "22", - "GCST90002310", - "22_28690105_C_T", - "gwas", - 0.1, - "22_28026789_C_T", - ) - ], - [ - # Overlapping peak between two GWAS with a subsignificant CLPP (< 0.001) - ( - "22", - "GCST90002383", - "22_28449893_G_C", - "gwas", - 0.02, - "22", - "GCST90002310", - "22_28690105_C_T", - "gwas", - 0.01, - "22_28026789_C_T", - ) - ], - ] - - expected_output = [ - [ - ( - "22", - "GCST90002383", - "22_28449893_G_C", - "gwas", - "22", - "GCST90002310", - "22_28690105_C_T", - "gwas", - 1, - 0.02, - ) - ], - [], - ] - - @pytest.fixture(scope="class") - def ecaviar_coloc_output_schema(self: TestEcaviarColocalisation) -> t.StructType: - """Schema of the gwas_vs_all overlap output dataframe.""" - return t.StructType( - [ - t.StructField("left_chromosome", t.StringType(), False), - t.StructField("left_studyId", t.StringType(), False), - t.StructField("left_leadVariantId", t.StringType(), False), - t.StructField("left_type", t.StringType(), True), - t.StructField("right_chromosome", t.StringType(), True), - t.StructField("right_studyId", t.StringType(), True), - t.StructField("right_leadVariantId", t.StringType(), True), - t.StructField("right_type", t.StringType(), True), - t.StructField("coloc_n_vars", t.LongType(), False), - t.StructField("clpp", t.DoubleType(), True), - ] - ) - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_ecaviar_colocalisation( - self: TestEcaviarColocalisation, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - gwas_vs_all_overlap_schema: t.StructType, - ecaviar_coloc_output_schema: t.StructType, - ) -> None: - """Test that ecaviar_colocalisation returns the expected DataFrame.""" - mock_df = spark.createDataFrame( - data=test_input, - schema=gwas_vs_all_overlap_schema, - ) - test_df = ( - ecaviar_colocalisation(mock_df, clpp_threshold=0.001) - .toPandas() - .dropna(axis=1, how="all") - ) - expected_df = ( - spark.createDataFrame( - data=expected_output, - schema=ecaviar_coloc_output_schema, - ) - .toPandas() - .dropna(axis=1, how="all") - ) - - assert_frame_equal(test_df, expected_df) - - -class TestExtractCredibleSets: - """Tests the function that extracts the credible sets in a study/locus.""" - - test_input = [ - [ - # Example with credible sets from all methods - ( - "10_100346008_G_A", - "7232622490995985132", - [ - { - "method": "conditional", - "credibleSet": [ - { - "is95CredibleSet": True, - "tagVariantId": "10_101278237_A_G", - "logABF": 1.59, - "posteriorProbability": None, - } - ], - }, - { - "method": "SuSIE", - "credibleSet": [ - { - "is95CredibleSet": True, - "tagVariantId": "10_101278237_A_G", - "logABF": None, - "posteriorProbability": 0.001, - } - ], - }, - { - "method": "pics", - "credibleSet": [ - { - "is95CredibleSet": True, - "tagVariantId": "10_101278237_A_G", - "logABF": None, - "posteriorProbability": 0.001, - } - ], - }, - ], - ) - ], - [ - # Example with a not confident enouth credible set - ( - "10_100346008_G_A", - "7232622490995985132", - [ - { - "method": "conditional", - "credibleSet": [ - { - "is95CredibleSet": False, - "tagVariantId": "10_101278237_A_G", - "logABF": 1.59, - "posteriorProbability": None, - } - ], - } - ], - ) - ], - ] - - expected_output = [ - [ - ( - "10_100346008_G_A", - "7232622490995985132", - "10_101278237_A_G", - 1.59, - None, - "10", - "conditional", - ), - ( - "10_100346008_G_A", - "7232622490995985132", - "10_101278237_A_G", - None, - 0.001, - "10", - "SuSIE", - ), - ( - "10_100346008_G_A", - "7232622490995985132", - "10_101278237_A_G", - None, - 0.001, - "10", - "pics", - ), - ], - [ - # Example with a not confident enouth credible set won't be picked up - ], - ] - - @pytest.fixture(scope="class") - def study_locus_schema(self: TestExtractCredibleSets) -> t.StructType: - """Schema of the study_locus dataframe.""" - return t.StructType( - [ - t.StructField("variantId", t.StringType(), True), - t.StructField("studyId", t.StringType(), True), - t.StructField( - "credibleSets", - t.ArrayType( - t.StructType( - [ - t.StructField("method", t.StringType(), True), - t.StructField( - "credibleSet", - t.ArrayType( - t.StructType( - [ - t.StructField( - "is95CredibleSet", - t.BooleanType(), - True, - ), - t.StructField( - "logABF", t.DoubleType(), True - ), - t.StructField( - "posteriorProbability", - t.DoubleType(), - True, - ), - t.StructField( - "tagVariantId", t.StringType(), True - ), - ] - ) - ), - True, - ), - ] - ) - ), - ), - ] - ) - - @pytest.fixture(scope="class") - def credible_sets_schema(self: TestExtractCredibleSets) -> t.StructType: - """Schema of the credible sets df after extracting it from the study locus df.""" - return t.StructType( - [ - t.StructField("leadVariantId", t.StringType(), False), - t.StructField("studyId", t.StringType(), False), - t.StructField("tagVariantId", t.StringType(), False), - t.StructField("logABF", t.DoubleType(), True), - t.StructField("posteriorProbability", t.DoubleType(), True), - t.StructField("chromosome", t.StringType(), False), - t.StructField("method", t.StringType(), False), - ] - ) - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_extract_credible_sets( - self: TestExtractCredibleSets, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - study_locus_schema: t.StructType, - credible_sets_schema: t.StructType, - ) -> None: - """Test that extract_credible_sets returns the expected DataFrame.""" - mock_df = spark.createDataFrame( - data=test_input, - schema=study_locus_schema, - ) - test_df = _extract_credible_sets(mock_df).toPandas().dropna(axis=1, how="all") - expected_df = ( - spark.createDataFrame(data=expected_output, schema=credible_sets_schema) - .toPandas() - .dropna(axis=1, how="all") - ) - - assert_frame_equal(test_df, expected_df) diff --git a/deprecated_tests/test_distance.py b/deprecated_tests/test_distance.py deleted file mode 100644 index cb45ac0ff..000000000 --- a/deprecated_tests/test_distance.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Tests on helper functions that extract V2G assignments based on a variant's distance to a gene's TSS.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pyspark.sql.types as t -import pytest -from pandas.testing import assert_frame_equal - -if TYPE_CHECKING: - from pyspark.sql import DataFrame, SparkSession - -from etl.v2g.distance.distance import get_variant_distance_to_gene - - -class TestGetVariantDistanceToGene: - """Test the get_variant_distance_to_gene util.""" - - test_input = [ - # A variant outside the threshold distance from the gene's TSS in the same chromosome - [("1_3_X_X", "1", 3)], - # A variant outside the threshold distance from the gene's TSS in a different chromosome - [("2_3_X_X", "2", 3)], - # 2 variants inside the threshold distance from the gene's TSS in the same chromosome - [("1_8_X_X", "1", 8), ("1_13_X_X", "1", 13)], - # A variant that is located where the gene's TSS is - [("1_10_X_X", "1", 10)], - ] - - expected_output = [ - [], - [], - [ - ("1_8_X_X", "ENSGXXXXX", 2, "1"), - ("1_13_X_X", "ENSGXXXXX", 3, "1"), - ], - [("1_10_X_X", "ENSGXXXXX", 0, "1")], - ] - - @pytest.fixture(scope="class") - def mock_gene_df( - self: TestGetVariantDistanceToGene, spark: SparkSession - ) -> DataFrame: - """Mock Dataframe for genes.""" - return spark.createDataFrame( - [("ENSGXXXXX", 1, 10)], ["geneId", "chromosome", "tss"] - ) - - @pytest.fixture(scope="module") - def expected_df_schema(self: TestGetVariantDistanceToGene) -> t.StructType: - """Schema of the mock VEP dataframe.""" - return t.StructType( - [ - t.StructField("variantId", t.StringType(), False), - t.StructField("geneId", t.StringType(), False), - t.StructField("distance", t.IntegerType(), True), - t.StructField("chromosome", t.StringType(), True), - ] - ) - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_get_variant_distance_to_gene( - self: TestGetVariantDistanceToGene, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - expected_df_schema: t.StructType, - mock_gene_df: DataFrame, - ) -> None: - """Test the get_variant_distance_to_gene util.""" - distance_window = 5 - mock_df = spark.createDataFrame( - data=test_input, schema=["variantId", "chromosome", "position"] - ) - test_df = mock_df.transform( - lambda df: get_variant_distance_to_gene(mock_gene_df, df, distance_window) - ).toPandas() - expected_df = spark.createDataFrame( - data=expected_output, - schema=expected_df_schema, - ).toPandas() - - assert_frame_equal( - test_df, - expected_df, - check_like=True, - check_dtype=False, - ) - - -# class TestScoreDistance: -# """Test the score_distance util.""" - -# test_input = [(0, 5, 50, 1000)] -# expected_output = [] diff --git a/deprecated_tests/test_gwas_process_assoc.py b/deprecated_tests/test_gwas_process_assoc.py deleted file mode 100644 index 56e1f84a8..000000000 --- a/deprecated_tests/test_gwas_process_assoc.py +++ /dev/null @@ -1,286 +0,0 @@ -"""Tests to assess gwas catalog ingestion.""" - -from __future__ import annotations - -import pytest -from pyspark.sql import DataFrame, SparkSession -from pyspark.sql import functions as f - -from otg.gwas_ingest.process_associations import ( - concordance_filter, - filter_assoc_by_maf, - filter_assoc_by_rsid, -) - - -@pytest.fixture() -def mock_maf_filter_data(spark: SparkSession) -> DataFrame: - """Mock minor allele frequency DataFrame for filtering. - - Args: - spark (SparkSession): Spark session - - Returns: - DataFrame: Mock minor allele frequency DataFrame - """ - return ( - spark.createDataFrame( - [ - # Simple case: - {"aid": 1, "pop1": 0.1, "pop2": 0.4, "keep": True}, - {"aid": 1, "pop1": 0.1, "pop2": 0.2, "keep": False}, - # Flip AF -> MAF required: - {"aid": 2, "pop1": 0.9, "pop2": 0.6, "keep": True}, - {"aid": 2, "pop1": 0.1, "pop2": 0.8, "keep": False}, - # Missing values handled properly: - {"aid": 3, "pop1": None, "pop2": 0.1, "keep": False}, - {"aid": 3, "pop1": 0.1, "pop2": 0.2, "keep": True}, - {"aid": 4, "pop1": None, "pop2": 0.6, "keep": True}, - {"aid": 4, "pop1": 0.1, "pop2": 0.3, "keep": False}, - ] - ) - .select( - f.col("aid").alias("associationId"), - f.struct(f.col("pop1").alias("pop1"), f.col("pop2").alias("pop2")).alias( - "alleleFrequencies" - ), - "keep", - f.monotonically_increasing_id().alias("id"), - ) - .persist() - ) - - -@pytest.fixture() -def call_maf_filter(mock_maf_filter_data: DataFrame) -> DataFrame: - """Test filter association by MAF based on mock DataFrame.""" - return mock_maf_filter_data.transform(filter_assoc_by_maf) - - -@pytest.fixture() -def mock_concordance_filter_data(spark: SparkSession) -> DataFrame: - """Mock DataFrame to assess allele concordance. - - Args: - spark (SparkSession): Spark session - - Returns: - DataFrame: Mock allele concordances - """ - data = [ - ( - 0, - "A", - "A", - "T", - True, - ), # Concordant positive, ref. - ( - 1, - "A", - "G", - "A", - True, - ), # Concordant positive, alt. - ( - 2, - "A", - "T", - "G", - True, - ), # Concordant negative, ref. - ( - 3, - "A", - "G", - "T", - True, - ), # Concordant negative, alt. - ( - 4, - "?", - "G", - "T", - True, - ), # Concordant ambigious. - ( - 5, - "ATCG", - "C", - "T", - False, - ), # discordant. - ] - return spark.createDataFrame( - data, ["id", "riskAllele", "referenceAllele", "alternateAllele", "concordant"] - ) - - -@pytest.fixture() -def call_concordance_filter(mock_concordance_filter_data: DataFrame) -> DataFrame: - """Test allele concordance filter based on mock DataFrame.""" - return mock_concordance_filter_data.transform(concordance_filter) - - -@pytest.fixture() -def call_rsid_filter(mock_rsid_filter: DataFrame) -> DataFrame: - """Test filter association by rsid based on mock DataFrame.""" - return mock_rsid_filter.transform(filter_assoc_by_rsid) - - -@pytest.fixture() -def mock_rsid_filter(spark: SparkSession) -> DataFrame: - """Mock DataFrame to evaluate rsids. - - Args: - spark (SparkSession): Spark session - - Returns: - DataFrame: Configurations of rsids in resources and expected outcomes - """ - data = [ - # Assoc id 1: matching rsId exist: - ( - 1, - ["rs123", "rs523"], - ["rs123"], - True, - False, - ), - ( - 1, - ["rs123", "rs523"], - ["rs12"], - False, - True, - ), - # Assoc id 2: matching rsId exist: - ( - 2, - ["rs523"], - [], - False, - True, - ), - ( - 2, - ["rs523"], - ["rs12", "rs523"], - True, - False, - ), - # Assoc id 3: matching rsId doesn't exists, so keep all: - ( - 3, - ["rs123"], - [], - True, - False, - ), - ( - 3, - ["rs123"], - ["rs643", "rs523"], - True, - False, - ), - # Assoc id 4: two matching rsids exist, keep both: - ( - 4, - ["rs123", "rs523"], - ["rs123"], - True, - False, - ), - ( - 4, - ["rs123", "rs523"], - ["rs523"], - True, - False, - ), - ( - 4, - ["rs123", "rs523"], - ["rs666"], - False, - True, - ), - ] - return spark.createDataFrame( - data, ["associationId", "rsIdsGwasCatalog", "rsIdsGnomad", "retain", "drop"] - ) - - -def test_filter_assoc_by_rsid__all_columns_are_there( - mock_rsid_filter: DataFrame, call_rsid_filter: DataFrame -) -> None: - """Testing if the returned dataframe contains all columns from the source.""" - source_columns = mock_rsid_filter.columns - processed_columns = call_rsid_filter.columns - assert any(column in processed_columns for column in source_columns) - - -def test_filter_assoc_by_rsid__right_rows_are_dropped( - call_rsid_filter: DataFrame, -) -> None: - """Testing if all the retained columns should not be dropped.""" - dropped = call_rsid_filter.transform(filter_assoc_by_rsid).select("drop").collect() - assert not any(d["drop"] for d in dropped) - - -def test_filter_assoc_by_rsid__right_rows_are_kept( - call_rsid_filter: DataFrame, -) -> None: - """Testing if all the retained columns should be kept.""" - kept = call_rsid_filter.transform(filter_assoc_by_rsid).select("retain").collect() - assert all(d["retain"] for d in kept) - - -def test_concordance_filter__type(call_concordance_filter: DataFrame) -> None: - """Testing if the function returns the right type.""" - assert isinstance(call_concordance_filter, DataFrame) - - -def test_concordance_filter__all_columns_returned( - call_concordance_filter: DataFrame, mock_concordance_filter_data: DataFrame -) -> None: - """Testing if the function returns the right type.""" - source_columns = mock_concordance_filter_data.columns - processed_columns = call_concordance_filter.columns - - assert any(column in processed_columns for column in source_columns) - - -def test_concordance_filter__right_rows_retained( - call_concordance_filter: DataFrame, mock_concordance_filter_data: DataFrame -) -> None: - """Testing if the filter generated the expected output.""" - target_ids = [ - row["id"] - for row in ( - mock_concordance_filter_data.filter(f.col("concordant")) - .select("id") - .orderBy("id") - .collect() - ) - ] - filtered_ids = [ - row["id"] - for row in (call_concordance_filter.select("id").orderBy("id").collect()) - ] - - assert filtered_ids == target_ids - - -def test_maf_filter__right_rows_retained( - call_maf_filter: DataFrame, mock_maf_filter_data: DataFrame -) -> None: - """Testing if the filter generated the expected output.""" - target_ids = [ - row["id"] - for row in (mock_maf_filter_data.filter(f.col("keep")).orderBy("id").collect()) - ] - filtered_ids = [row["id"] for row in (call_maf_filter.orderBy("id").collect())] - - assert filtered_ids == target_ids diff --git a/deprecated_tests/test_intervals_helpers.py b/deprecated_tests/test_intervals_helpers.py deleted file mode 100644 index 35d5a1f3e..000000000 --- a/deprecated_tests/test_intervals_helpers.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Tests on helper functions that extract V2G assignments from chromatin interaction experiments.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pytest -from pandas.testing import assert_frame_equal - -from otg.v2g.intervals.helpers import get_variants_in_interval - -if TYPE_CHECKING: - from pyspark.sql import DataFrame, SparkSession - - -@pytest.fixture(scope="class") -def mock_variants_df(spark: SparkSession) -> DataFrame: - """Creates a mock dataframe with a single interval.""" - return spark.createDataFrame( - data=[ - # Variants inside the interval - ("20_5648222_T_C", "20", 5648222), - ("20_5648223_T_C", "20", 5648223), - # Variants outside the interval - ("20_5647944_T_C", "20", 5648300), - ], - schema=["variantId", "chromosome", "position"], - ) - - -class TestGetVariantsInInterval: - """Test the get_variants_in_interval util.""" - - test_input = [ - [ - ( - "20", - 5647945, - 5648249, - "ENSG00000125772", - 0.783, - "andersson2014", - "fantom5", - "24670763", - "aggregate", - ) - ] - ] - - expected_output = [ - [ - ( - "20_5648222_T_C", - "20", - 5648222, - "ENSG00000125772", - 0.783, - "andersson2014", - "fantom5", - "24670763", - "aggregate", - ), - ( - "20_5648223_T_C", - "20", - 5648223, - "ENSG00000125772", - 0.783, - "andersson2014", - "fantom5", - "24670763", - "aggregate", - ), - ] - ] - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_explosion_of_region_into_v2g( - self: TestGetVariantsInInterval, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - mock_variants_df: DataFrame, - ) -> None: - """Tests that a df with data about a region is transformed to a dataframe where all the variants in that region are contained following the V2G model.""" - mock_df = spark.createDataFrame( - data=test_input, - schema=[ - "chromosome", - "start", - "end", - "geneId", - "resourceScore", - "datasourceId", - "datatypeId", - "pmid", - "biofeature", - ], - ) - - test_df = mock_df.transform( - lambda df: get_variants_in_interval(df, mock_variants_df) - ).toPandas() - expected_df = spark.createDataFrame( - data=expected_output, - schema=[ - "variantId", - "chromosome", - "position", - "geneId", - "resourceScore", - "datasourceId", - "datatypeId", - "pmid", - "biofeature", - ], - ).toPandas() - assert_frame_equal(test_df, expected_df, check_like=True) diff --git a/deprecated_tests/test_vep.py b/deprecated_tests/test_vep.py deleted file mode 100644 index 41fa0c70c..000000000 --- a/deprecated_tests/test_vep.py +++ /dev/null @@ -1,425 +0,0 @@ -"""Tests on helper functions that extract V2G assignments from VEP.""" -from __future__ import annotations - -from typing import TYPE_CHECKING - -import pyspark.sql.functions as f -import pyspark.sql.types as t -import pytest -from pandas.testing import assert_frame_equal - -from otg.v2g.functional_predictions.vep import ( - get_plof_flag, - get_polyphen_score, - get_sift_score, - get_variant_consequences, -) - -if TYPE_CHECKING: - from pyspark.sql import DataFrame, SparkSession - - -@pytest.fixture(scope="module") -def variant_df_schema() -> t.StructType: - """Schema of the mock VEP dataframe.""" - return t.StructType( - [ - t.StructField("variantId", t.StringType(), False), - t.StructField("chromosome", t.StringType(), False), - t.StructField("gene_id", t.StringType(), False), - t.StructField("consequence_terms", t.ArrayType(t.StringType()), True), - t.StructField("polyphen_score", t.DoubleType(), True), - t.StructField("polyphen_prediction", t.StringType(), True), - t.StructField("sift_score", t.DoubleType(), True), - t.StructField("sift_prediction", t.StringType(), True), - t.StructField("lof", t.StringType(), True), - ] - ) - - -@pytest.fixture(scope="module") -def v2g_df_schema() -> t.StructType: - """Schema of the V2G dataframe.""" - return t.StructType( - [ - t.StructField("variantId", t.StringType(), False), - t.StructField("chromosome", t.StringType(), False), - t.StructField("geneId", t.StringType(), False), - t.StructField("variantFunctionalConsequenceId", t.StringType(), True), - t.StructField("label", t.StringType(), True), - t.StructField("isHighQualityPlof", t.BooleanType(), True), - t.StructField("score", t.DoubleType(), True), - t.StructField("datatypeId", t.StringType(), True), - t.StructField("datasourceId", t.StringType(), True), - ] - ) - - -class TestGetVariantConsequences: - """Test the get_variant_consequences util.""" - - test_input = [ - [ - # High impact - ( - "1_248441764_C_T", - "1", - "ENSG00000227152", - ["stop_gained"], - None, - None, - None, - None, - None, - ) - ], - [ - # Low impact - ( - "1_248441764_C_T", - "1", - "ENSG00000227152", - ["splice_region_variant", "5_prime_UTR_variant"], - None, - None, - None, - None, - None, - ) - ], - [ - # Unsignificant impact - ( - "1_248441764_C_T", - "1", - "ENSG00000227152", - ["sequence_variant"], - None, - None, - None, - None, - None, - ) - ], - [ - # Unknown impact - ( - "1_248441764_C_T", - "1", - "ENSG00000227152", - ["potential_new_term"], - None, - None, - None, - None, - None, - ) - ], - ] - expected_output = [ - [ - ( - "1_248441764_C_T", - "1", - "ENSG00000227152", - "SO_0001587", - "stop_gained", - None, - 1.0, - "vep", - "variantConsequence", - ) - ], - [ - ( - "1_248441764_C_T", - "1", - "ENSG00000227152", - "SO_0001630", - "splice_region_variant", - None, - 0.33, - "vep", - "variantConsequence", - ) - ], - [], - [], - ] - - @pytest.fixture(scope="class") - def mock_variant_consequence_df( - self: TestGetVariantConsequences, spark: SparkSession - ) -> DataFrame: - """Mock Dataframe of the LUT that contains all possible functional consequences of a variant.""" - return spark.createDataFrame( - data=[ - # High impact term - ("SO_0001587", "stop_gained", 1.0), - # Moderate impact term - ("SO_0001583", "missense_variant", 0.66), - # Low impact term - ( - "SO_0001630", - "splice_region_variant", - 0.33, - ), - # Modifier impact term - ("SO_0001623", "5_prime_UTR_variant", 0.1), - # Unsignificant impact term - ("SO_0001060", "sequence_variant", None), - ], - schema=["variantFunctionalConsequenceId", "label", "score"], - ) - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_coverage_of_consequence_evidence( - self: TestGetVariantConsequences, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - mock_variant_consequence_df: DataFrame, - variant_df_schema: t.StructType, - v2g_df_schema: t.StructType, - ) -> None: - """Test the get_variant_consequences util.""" - mock_df = spark.createDataFrame( - data=test_input, schema=variant_df_schema - ).select( - "variantId", - "chromosome", - f.struct("gene_id", "consequence_terms").alias("transcriptConsequence"), - ) - test_df = ( - mock_df.transform( - lambda df: get_variant_consequences(df, mock_variant_consequence_df) - ) - .toPandas() - .dropna(axis=1, how="all") - ) - expected_df = ( - spark.createDataFrame(data=expected_output, schema=v2g_df_schema) - .toPandas() - .dropna(axis=1, how="all") - ) - assert_frame_equal( - test_df, - expected_df, - check_like=True, - ) - - -class TestGetPolypyhenScoreAndGetSiftScore: - """Test the get_polyphen_scores util.""" - - test_input = [ - [ - ( - # Variant with score info - "19_900951_A_G", - "19", - "ENSG00000198858", - None, - 0.355, - "benign", - 0.91, - "tolerated", - None, - ) - ], - [ - ( - # No score info - "19_900951_A_G", - "19", - "ENSG00000198858", - None, - None, - None, - None, - None, - None, - ) - ], - ] - expected_output = [ - [ - # One V2G evidence per score - ( - "19_900951_A_G", - "19", - "ENSG00000198858", - None, - "benign", - None, - 0.355, - "vep", - "polyphen", - ), - ( - "19_900951_A_G", - "19", - "ENSG00000198858", - None, - "tolerated", - None, - 0.09, - "vep", - "sift", - ), - ], - [], # Empty dataframe - ] - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_coverage_of_score_evidence( - self: TestGetPolypyhenScoreAndGetSiftScore, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - variant_df_schema: t.StructType, - v2g_df_schema: t.StructType, - ) -> None: - """Tests that polyphen and sift scores are correctly retrieved.""" - mock_df = spark.createDataFrame( - data=test_input, schema=variant_df_schema - ).select( - "variantId", - "chromosome", - f.struct( - "gene_id", - "polyphen_score", - "polyphen_prediction", - "sift_score", - "sift_prediction", - ).alias("transcriptConsequence"), - ) - test_df = ( - mock_df.transform(get_polyphen_score) - .unionByName(mock_df.transform(get_sift_score)) - .toPandas() - .dropna(axis=1, how="all") - ) - expected_df = ( - spark.createDataFrame(data=expected_output, schema=v2g_df_schema) - .toPandas() - .dropna(axis=1, how="all") - ) - - assert_frame_equal(test_df, expected_df, check_like=True) - - -class TestGetPlofFlag: - """Test the get_plof_flag util.""" - - test_input = [ - [ - ( - # High confidence pLOF variant - "1_48242556_G_T", - "1", - "ENSG00000117834", - None, - None, - None, - None, - None, - "HC", - ) - ], - [ - ( - # Low confidence pLOF variant - "1_46615007_G_A", - "1", - "ENSG00000142961", - None, - None, - None, - None, - None, - "LC", - ) - ], - [ - ( - # No pLOF flag - "1_48242556_G_T", - "1", - "ENSG00000117834", - None, - None, - None, - None, - None, - None, - ) - ], - ] - - expected_output = [ - [ - ( - "1_48242556_G_T", - "1", - "ENSG00000117834", - None, - None, - True, - 1.0, - "vep", - "loftee", - ) - ], - [ - ( - "1_46615007_G_A", - "1", - "ENSG00000142961", - None, - None, - False, - 0.0, - "vep", - "loftee", - ) - ], - [], - ] - - @pytest.mark.parametrize( - ("test_input", "expected_output"), zip(test_input, expected_output) - ) - def test_coverage_of_plof_evidence( - self: TestGetPlofFlag, - spark: SparkSession, - test_input: list[tuple], - expected_output: list[tuple], - variant_df_schema: t.StructType, - v2g_df_schema: t.StructType, - ) -> None: - """Tests that plof flag is correctly retrieved.""" - mock_df = spark.createDataFrame( - data=test_input, schema=variant_df_schema - ).select( - "variantId", - "chromosome", - f.struct("gene_id", "lof").alias("transcriptConsequence"), - ) - test_df = mock_df.transform(get_plof_flag).toPandas().dropna(axis=1, how="all") - expected_df = ( - spark.createDataFrame(data=expected_output, schema=v2g_df_schema) - .toPandas() - .dropna(axis=1, how="all") - ) - - assert_frame_equal( - test_df, - expected_df, - check_like=True, - check_dtype=False, - ) diff --git a/docs/assets/overrides/partials/source-file.html b/docs/assets/overrides/partials/source-file.html index cae6f7139..fdda516dc 100644 --- a/docs/assets/overrides/partials/source-file.html +++ b/docs/assets/overrides/partials/source-file.html @@ -5,7 +5,7 @@ {% if page.meta.git_creation_date_localized %}
  • - + {% include ".icons/material/clock-plus-outline.svg" %} @@ -16,7 +16,7 @@ {% if page.meta.git_revision_date_localized %}
  • - + {% include ".icons/material/clock-edit-outline.svg" %} @@ -26,8 +26,8 @@ {% endif %}
  • - - {% include ".icons/material/GitHub.svg" %} + + {% include ".icons/material/github.svg" %} Contributors diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css index 2f7b7dd68..1073b23b9 100644 --- a/docs/assets/stylesheets/extra.css +++ b/docs/assets/stylesheets/extra.css @@ -15,6 +15,7 @@ display: flex !important; flex-direction: row; align-items: center; + font-size: 1.2em; } @@ -31,7 +32,7 @@ .metadata.page-metadata li .icon { width: 1.1rem; height: 1.1rem; - margin-right: 5px; + margin-right: 2px; } @@ -54,7 +55,7 @@ } .page-metadata .contributors li { - display: flex; + display: inline-flex; margin: 0 !important; padding: 0 !important; } diff --git a/docs/reference/dataset/_dataset.md b/docs/components/dataset/_dataset.md similarity index 100% rename from docs/reference/dataset/_dataset.md rename to docs/components/dataset/_dataset.md diff --git a/docs/reference/dataset/colocalisation.md b/docs/components/dataset/colocalisation.md similarity index 100% rename from docs/reference/dataset/colocalisation.md rename to docs/components/dataset/colocalisation.md diff --git a/docs/reference/dataset/gene_index.md b/docs/components/dataset/gene_index.md similarity index 100% rename from docs/reference/dataset/gene_index.md rename to docs/components/dataset/gene_index.md diff --git a/docs/reference/dataset/intervals.md b/docs/components/dataset/intervals.md similarity index 100% rename from docs/reference/dataset/intervals.md rename to docs/components/dataset/intervals.md diff --git a/docs/reference/dataset/ld_index.md b/docs/components/dataset/ld_index.md similarity index 93% rename from docs/reference/dataset/ld_index.md rename to docs/components/dataset/ld_index.md index bdef99a12..b0274e0ab 100644 --- a/docs/reference/dataset/ld_index.md +++ b/docs/components/dataset/ld_index.md @@ -1,9 +1,9 @@ # LD index -::: otg.dataset.ld_index.LDIndex - -___ - ## Schema --8<-- "assets/schemas/ld_index.md" + +## API + +::: otg.dataset.ld_index.LDIndex diff --git a/docs/reference/dataset/study_index/_study_index.md b/docs/components/dataset/study_index.md similarity index 100% rename from docs/reference/dataset/study_index/_study_index.md rename to docs/components/dataset/study_index.md diff --git a/docs/reference/dataset/study_locus/_study_locus.md b/docs/components/dataset/study_locus.md similarity index 100% rename from docs/reference/dataset/study_locus/_study_locus.md rename to docs/components/dataset/study_locus.md diff --git a/docs/reference/dataset/study_locus_overlap.md b/docs/components/dataset/study_locus_overlap.md similarity index 79% rename from docs/reference/dataset/study_locus_overlap.md rename to docs/components/dataset/study_locus_overlap.md index 35e4315c1..c2f8cbcd2 100644 --- a/docs/reference/dataset/study_locus_overlap.md +++ b/docs/components/dataset/study_locus_overlap.md @@ -1,7 +1,8 @@ -::: otg.dataset.study_locus_overlap.StudyLocusOverlap - -___ +# Study Locus Overlap ## Schema --8<-- "assets/schemas/study_locus_overlap.md" +## API + +::: otg.dataset.study_locus_overlap.StudyLocusOverlap diff --git a/docs/components/dataset/summary_statistics.md b/docs/components/dataset/summary_statistics.md new file mode 100644 index 000000000..43e0c4b59 --- /dev/null +++ b/docs/components/dataset/summary_statistics.md @@ -0,0 +1,7 @@ +::: otg.dataset.summary_statistics.SummaryStatistics + +___ + +## Schema + +--8<-- "assets/schemas/summary_statistics.md" diff --git a/docs/reference/dataset/variant_annotation.md b/docs/components/dataset/variant_annotation.md similarity index 100% rename from docs/reference/dataset/variant_annotation.md rename to docs/components/dataset/variant_annotation.md diff --git a/docs/reference/dataset/variant_index.md b/docs/components/dataset/variant_index.md similarity index 100% rename from docs/reference/dataset/variant_index.md rename to docs/components/dataset/variant_index.md diff --git a/docs/reference/dataset/variant_to_gene.md b/docs/components/dataset/variant_to_gene.md similarity index 100% rename from docs/reference/dataset/variant_to_gene.md rename to docs/components/dataset/variant_to_gene.md diff --git a/docs/components/datasource/finngen/_finngen.md b/docs/components/datasource/finngen/_finngen.md new file mode 100644 index 000000000..e3017fbec --- /dev/null +++ b/docs/components/datasource/finngen/_finngen.md @@ -0,0 +1 @@ +# FinnGen diff --git a/docs/components/datasource/finngen/study_index.md b/docs/components/datasource/finngen/study_index.md new file mode 100644 index 000000000..165148be3 --- /dev/null +++ b/docs/components/datasource/finngen/study_index.md @@ -0,0 +1 @@ +::: otg.datasource.finngen.study_index.FinnGenStudyIndex diff --git a/docs/components/datasource/gnomad/_gnomad.md b/docs/components/datasource/gnomad/_gnomad.md new file mode 100644 index 000000000..dbfa3a229 --- /dev/null +++ b/docs/components/datasource/gnomad/_gnomad.md @@ -0,0 +1 @@ +# GnomAD diff --git a/docs/components/datasource/gnomad/gnomad_ld.md b/docs/components/datasource/gnomad/gnomad_ld.md new file mode 100644 index 000000000..18304b5c8 --- /dev/null +++ b/docs/components/datasource/gnomad/gnomad_ld.md @@ -0,0 +1 @@ +::: otg.datasource.gnomad.ld.GnomADLDMatrix diff --git a/docs/components/datasource/gnomad/gnomad_variants.md b/docs/components/datasource/gnomad/gnomad_variants.md new file mode 100644 index 000000000..a1ba603b4 --- /dev/null +++ b/docs/components/datasource/gnomad/gnomad_variants.md @@ -0,0 +1 @@ +::: otg.datasource.gnomad.variants.GnomADVariants diff --git a/docs/components/datasource/gwas_catalog/_gwas_catalog.md b/docs/components/datasource/gwas_catalog/_gwas_catalog.md new file mode 100644 index 000000000..00a668fbb --- /dev/null +++ b/docs/components/datasource/gwas_catalog/_gwas_catalog.md @@ -0,0 +1 @@ +# GWAS Catalog diff --git a/docs/components/datasource/gwas_catalog/associations.md b/docs/components/datasource/gwas_catalog/associations.md new file mode 100644 index 000000000..c49f34517 --- /dev/null +++ b/docs/components/datasource/gwas_catalog/associations.md @@ -0,0 +1 @@ +::: otg.datasource.gwas_catalog.associations.GWASCatalogAssociations diff --git a/docs/components/datasource/gwas_catalog/study_index.md b/docs/components/datasource/gwas_catalog/study_index.md new file mode 100644 index 000000000..e42faa6a7 --- /dev/null +++ b/docs/components/datasource/gwas_catalog/study_index.md @@ -0,0 +1 @@ +::: otg.datasource.gwas_catalog.study_index.GWASCatalogStudyIndex diff --git a/docs/components/datasource/gwas_catalog/study_splitter.md b/docs/components/datasource/gwas_catalog/study_splitter.md new file mode 100644 index 000000000..ba8241851 --- /dev/null +++ b/docs/components/datasource/gwas_catalog/study_splitter.md @@ -0,0 +1 @@ +::: otg.datasource.gwas_catalog.study_splitter.GWASCatalogStudySplitter diff --git a/docs/components/datasource/gwas_catalog/summary_statistics.md b/docs/components/datasource/gwas_catalog/summary_statistics.md new file mode 100644 index 000000000..3da1bd129 --- /dev/null +++ b/docs/components/datasource/gwas_catalog/summary_statistics.md @@ -0,0 +1 @@ +:::otg.datasource.gwas_catalog.summary_statistics.GWASCatalogSummaryStatistics diff --git a/docs/components/datasource/intervals/_intervals.md b/docs/components/datasource/intervals/_intervals.md new file mode 100644 index 000000000..b41dee39d --- /dev/null +++ b/docs/components/datasource/intervals/_intervals.md @@ -0,0 +1 @@ +# Chromatin intervals diff --git a/docs/components/datasource/intervals/andersson.md b/docs/components/datasource/intervals/andersson.md new file mode 100644 index 000000000..bc0637335 --- /dev/null +++ b/docs/components/datasource/intervals/andersson.md @@ -0,0 +1 @@ +::: otg.datasource.intervals.andersson.IntervalsAndersson diff --git a/docs/components/datasource/intervals/javierre.md b/docs/components/datasource/intervals/javierre.md new file mode 100644 index 000000000..8a9f0e650 --- /dev/null +++ b/docs/components/datasource/intervals/javierre.md @@ -0,0 +1 @@ +::: otg.datasource.intervals.javierre.IntervalsJavierre diff --git a/docs/components/datasource/intervals/jung.md b/docs/components/datasource/intervals/jung.md new file mode 100644 index 000000000..78eb8e1ba --- /dev/null +++ b/docs/components/datasource/intervals/jung.md @@ -0,0 +1 @@ +::: otg.datasource.intervals.jung.IntervalsJung diff --git a/docs/components/datasource/intervals/thurnman.md b/docs/components/datasource/intervals/thurnman.md new file mode 100644 index 000000000..bc8cab313 --- /dev/null +++ b/docs/components/datasource/intervals/thurnman.md @@ -0,0 +1 @@ +::: otg.datasource.intervals.thurnman.IntervalsThurnman diff --git a/docs/components/datasource/open_targets/_open_targets.md b/docs/components/datasource/open_targets/_open_targets.md new file mode 100644 index 000000000..916b22c92 --- /dev/null +++ b/docs/components/datasource/open_targets/_open_targets.md @@ -0,0 +1 @@ +# Open Targets Platform diff --git a/docs/components/datasource/open_targets/target.md b/docs/components/datasource/open_targets/target.md new file mode 100644 index 000000000..b6dcc93a6 --- /dev/null +++ b/docs/components/datasource/open_targets/target.md @@ -0,0 +1 @@ +::: otg.datasource.open_targets.target.OpenTargetsTarget diff --git a/docs/components/datasource/ukbiobank/_ukbiobank.md b/docs/components/datasource/ukbiobank/_ukbiobank.md new file mode 100644 index 000000000..16c076b4a --- /dev/null +++ b/docs/components/datasource/ukbiobank/_ukbiobank.md @@ -0,0 +1 @@ +# UK Biobank diff --git a/docs/components/datasource/ukbiobank/study_index.md b/docs/components/datasource/ukbiobank/study_index.md new file mode 100644 index 000000000..0cd24cf87 --- /dev/null +++ b/docs/components/datasource/ukbiobank/study_index.md @@ -0,0 +1 @@ +::: otg.datasource.ukbiobank.study_index.UKBiobankStudyIndex diff --git a/docs/reference/method/_method.md b/docs/components/method/_method.md similarity index 100% rename from docs/reference/method/_method.md rename to docs/components/method/_method.md diff --git a/docs/components/method/clumping.md b/docs/components/method/clumping.md new file mode 100644 index 000000000..18895c502 --- /dev/null +++ b/docs/components/method/clumping.md @@ -0,0 +1,8 @@ +# Clumping + +Clumping is a commonly used post-processing method that allows for identification of independent association signals from GWAS summary statistics and curated associations. This process is critical because of the complex linkage disequilibrium (LD) structure in human populations, which can result in multiple statistically significant associations within the same genomic region. Clumping methods help reduce redundancy in GWAS results and ensure that each reported association represents an independent signal. + +We have implemented 2 clumping methods: + +## Clumping based on Linkage Disequilibrium (LD) +::: otg.method.clump.LDclumping diff --git a/docs/reference/method/coloc.md b/docs/components/method/coloc.md similarity index 100% rename from docs/reference/method/coloc.md rename to docs/components/method/coloc.md diff --git a/docs/reference/method/ecaviar.md b/docs/components/method/ecaviar.md similarity index 100% rename from docs/reference/method/ecaviar.md rename to docs/components/method/ecaviar.md diff --git a/docs/components/method/ld_annotator.md b/docs/components/method/ld_annotator.md new file mode 100644 index 000000000..831516a75 --- /dev/null +++ b/docs/components/method/ld_annotator.md @@ -0,0 +1,3 @@ +# LD annotator + +:::otg.method.ld.LDAnnotator diff --git a/docs/reference/method/pics.md b/docs/components/method/pics.md similarity index 100% rename from docs/reference/method/pics.md rename to docs/components/method/pics.md diff --git a/docs/components/method/window_based_clumping.md b/docs/components/method/window_based_clumping.md new file mode 100644 index 000000000..6c4329f8c --- /dev/null +++ b/docs/components/method/window_based_clumping.md @@ -0,0 +1,3 @@ +# Window-based clumping + +:::otg.method.window_based_clumping.WindowBasedClumping diff --git a/docs/reference/step/_step.md b/docs/components/step/_step.md similarity index 100% rename from docs/reference/step/_step.md rename to docs/components/step/_step.md diff --git a/docs/reference/step/colocalisation.md b/docs/components/step/colocalisation.md similarity index 100% rename from docs/reference/step/colocalisation.md rename to docs/components/step/colocalisation.md diff --git a/docs/components/step/finngen.md b/docs/components/step/finngen.md new file mode 100644 index 000000000..a5391601f --- /dev/null +++ b/docs/components/step/finngen.md @@ -0,0 +1,4 @@ +# FinnGen + +::: otg.finngen.FinnGenStep +::: otg.config.FinnGenStepConfig diff --git a/docs/reference/step/gene_index.md b/docs/components/step/gene_index.md similarity index 59% rename from docs/reference/step/gene_index.md rename to docs/components/step/gene_index.md index 6f1690e2d..4a4c73e61 100644 --- a/docs/reference/step/gene_index.md +++ b/docs/components/step/gene_index.md @@ -1,4 +1,4 @@ # Gene index -::: otg.ld_index.GeneIndexStep +::: otg.gene_index.GeneIndexStep ::: otg.config.GeneIndexStepConfig diff --git a/docs/reference/step/gwas_catalog.md b/docs/components/step/gwas_catalog.md similarity index 100% rename from docs/reference/step/gwas_catalog.md rename to docs/components/step/gwas_catalog.md diff --git a/docs/components/step/gwas_catalog_sumstat_preprocess.md b/docs/components/step/gwas_catalog_sumstat_preprocess.md new file mode 100644 index 000000000..413c812ec --- /dev/null +++ b/docs/components/step/gwas_catalog_sumstat_preprocess.md @@ -0,0 +1,4 @@ +# GWAS Catalog sumstat preprocess + +::: otg.gwas_catalog_sumstat_preprocess.GWASCatalogSumstatsPreprocessStep +::: otg.config.GWASCatalogSumstatsPreprocessConfig diff --git a/docs/reference/step/ld_index.md b/docs/components/step/ld_index.md similarity index 100% rename from docs/reference/step/ld_index.md rename to docs/components/step/ld_index.md diff --git a/docs/components/step/ukbiobank.md b/docs/components/step/ukbiobank.md new file mode 100644 index 000000000..4ffddf342 --- /dev/null +++ b/docs/components/step/ukbiobank.md @@ -0,0 +1,4 @@ +# UKBiobank + +::: otg.ukbiobank.UKBiobankStep +::: otg.config.UKBiobankStepConfig diff --git a/docs/reference/step/variant_annotation_step.md b/docs/components/step/variant_annotation_step.md similarity index 100% rename from docs/reference/step/variant_annotation_step.md rename to docs/components/step/variant_annotation_step.md diff --git a/docs/reference/step/variant_index_step.md b/docs/components/step/variant_index_step.md similarity index 100% rename from docs/reference/step/variant_index_step.md rename to docs/components/step/variant_index_step.md diff --git a/docs/reference/step/variant_to_gene_step.md b/docs/components/step/variant_to_gene_step.md similarity index 100% rename from docs/reference/step/variant_to_gene_step.md rename to docs/components/step/variant_to_gene_step.md diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 000000000..52c06078b --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,71 @@ +# Environment configuration and contributing changes + +## One-time configuration +The steps in this section only ever need to be done once on any particular system. + +Google Cloud configuration: +1. Install Google Cloud SDK: https://cloud.google.com/sdk/docs/install. +1. Log in to your work Google Account: run `gcloud auth login` and follow instructions. +1. Obtain Google application credentials: run `gcloud auth application-default login` and follow instructions. + +Check that you have the `make` utility installed, and if not (which is unlikely), install it using your system package manager. + +Check that you have `java` installed. + +## Environment configuration +Run `make setup-dev` to install/update the necessary packages and activate the development environment. You need to do this every time you open a new shell. + +It is recommended to use VS Code as an IDE for development. + +## How to run the code +All pipelines in this repository are intended to be run in Google Dataproc. Running them locally is not currently supported. + +In order to run the code: + +1. Manually edit your local `workflow/dag.yaml` file and comment out the steps you do not want to run. + +2. Manually edit your local `pyproject.toml` file and modify the version of the code. + - This must be different from the version used by any other people working on the repository to avoid any deployment conflicts, so it's a good idea to use your name, for example: `1.2.3+jdoe`. + - You can also add a brief branch description, for example: `1.2.3+jdoe.myfeature`. + - Note that the version must comply with [PEP440 conventions](https://peps.python.org/pep-0440/#normalization), otherwise Poetry will not allow it to be deployed. + - Do not use underscores or hyphens in your version name. When building the WHL file, they will be automatically converted to dots, which means the file name will no longer match the version and the build will fail. Use dots instead. + +3. Run `make build`. + - This will create a bundle containing the neccessary code, configuration and dependencies to run the ETL pipeline, and then upload this bundle to Google Cloud. + - A version specific subpath is used, so uploading the code will not affect any branches but your own. + - If there was already a code bundle uploaded with the same version number, it will be replaced. + +4. Submit the Dataproc job with `poetry run python workflow/workflow_template.py` + - You will need to specify additional parameters, some are mandatory and some are optional. Run with `--help` to see usage. + - The script will provision the cluster and submit the job. + - The cluster will take a few minutes to get provisioned and running, during which the script will not output anything, this is normal. + - Once submitted, you can monitor the progress of your job on this page: https://console.cloud.google.com/dataproc/jobs?project=open-targets-genetics-dev. + - On completion (whether successful or a failure), the cluster will be automatically removed, so you don't have to worry about shutting it down to avoid incurring charges. + +## Contributing checklist +When making changes, and especially when implementing a new module or feature, it's essential to ensure that all relevant sections of the code base are modified. +- [ ] Run `make check`. This will run the linter and formatter to ensure that the code is compliant with the project conventions. +- [ ] Develop unit tests for your code and run `make test`. This will run all unit tests in the repository, including the examples appended in the docstrings of some methods. +- [ ] Update the configuration if necessary. +- [ ] Update the documentation and check it with `run build-documentation`. This will start a local server to browse it (URL will be printed, usually `http://127.0.0.1:8000/`) + +For more details on each of these steps, see the sections below. +### Documentation +* If during development you had a question which wasn't covered in the documentation, and someone explained it to you, add it to the documentation. The same applies if you encountered any instructions in the documentation which were obsolete or incorrect. +* Documentation autogeneration expressions start with `:::`. They will automatically generate sections of the documentation based on class and method docstrings. Be sure to update them for: + + Dataset definitions in `docs/reference/dataset` (example: `docs/reference/dataset/study_index/study_index_finngen.md`) + + Step definitions in `docs/reference/step` (example: `docs/reference/step/finngen.md`) + +### Configuration +* Input and output paths in `config/datasets/gcp.yaml` +* Step configuration in `config/step/my_STEP.yaml` (example: `config/step/my_finngen.yaml`) + +### Classes +* Step configuration class in `src/org/config.py` (example: `FinnGenStepConfig` class in that module) +* Dataset class in `src/org/dataset/` (example: `src/otg/dataset/study_index.py` → `StudyIndexFinnGen`) +* Step main running class in `src/org/STEP.py` (example: `src/org/finngen.py`) + +### Tests +* Test study fixture in `tests/conftest.py` (example: `mock_study_index_finngen` in that module) +* Test sample data in `tests/data_samples` (example: `tests/data_samples/finngen_studies_sample.json`) +* Test definition in `tests/` (example: `tests/dataset/test_study_index.py` → `test_study_index_finngen_creation`) diff --git a/docs/index.md b/docs/index.md index e3aea78a7..697cde46e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,10 +12,16 @@ --- [![status: experimental](https://github.com/GIScience/badges/raw/master/status/experimental.svg)](https://github.com/GIScience/badges#experimental) -[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +![docs](https://github.com/opentargets/genetics_etl_python/actions/workflows/docs.yaml/badge.svg) [![codecov](https://codecov.io/gh/opentargets/genetics_etl_python/branch/main/graph/badge.svg?token=5ixzgu8KFP)](https://codecov.io/gh/opentargets/genetics_etl_python) +[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/opentargets/genetics_etl_python/main.svg)](https://results.pre-commit.ci/badge/github/opentargets/genetics_etl_python) --- Ingestion and analysis of genetic and functional genomic data for the identification and prioritisation of drug targets. + +This project is still in experimental phase. Please refer to the [roadmap section](./roadmap/) for more information. + +For information on how to configure the development environment, run the code, or contribute changes, see the [contributing section](./contributing/). For known technical issues and solutions to them, see the [troubleshooting section](./troubleshooting/). diff --git a/docs/reference/dataset/study_index/study_index_gwas_catalog.md b/docs/reference/dataset/study_index/study_index_gwas_catalog.md deleted file mode 100644 index 0f7ce0736..000000000 --- a/docs/reference/dataset/study_index/study_index_gwas_catalog.md +++ /dev/null @@ -1 +0,0 @@ -::: otg.dataset.study_index.StudyIndexGWASCatalog diff --git a/docs/reference/dataset/study_locus/study_locus_gwas_catalog.md b/docs/reference/dataset/study_locus/study_locus_gwas_catalog.md deleted file mode 100644 index 5a8ae88c9..000000000 --- a/docs/reference/dataset/study_locus/study_locus_gwas_catalog.md +++ /dev/null @@ -1 +0,0 @@ -::: otg.dataset.study_locus.StudyLocusGWASCatalog diff --git a/docs/reference/method/ld_annotator.md b/docs/reference/method/ld_annotator.md deleted file mode 100644 index b04310fb9..000000000 --- a/docs/reference/method/ld_annotator.md +++ /dev/null @@ -1,3 +0,0 @@ -# LD annotator - -:::otg.method.ld.LDAnnotatorGnomad diff --git a/docs/reference/method/ld_clumping.md b/docs/reference/method/ld_clumping.md deleted file mode 100644 index 3e077b4db..000000000 --- a/docs/reference/method/ld_clumping.md +++ /dev/null @@ -1,3 +0,0 @@ -# LD clumping - -::: otg.method.ld.LDclumping diff --git a/docs/roadmap.md b/docs/roadmap.md index 11a430d2c..ff7e99be4 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,6 +1,15 @@ # Roadmap +The Open Targets core team is working on refactoring Open Targets Genetics, aiming to: + +- Re-focus the product around Target ID +- Create a gold standard toolkit for post-GWAS analysis +- Faster/robust addition of new datasets and datatypes +- Reduce computational and financial cost + +See [here](https://github.com/opentargets/issues/issues?q=is%3Aissue+is%3Aopen+label%3AGenetics_ETL_refactoring) for a list of open issues for this project. + Schematic diagram representing the drafted process: diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 000000000..9d1156765 --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,37 @@ +# Troubleshooting + +## BLAS/LAPACK + +If you see errors related to BLAS/LAPACK libraries, see [this StackOverflow post](https://stackoverflow.com/questions/69954587/no-blas-lapack-libraries-found-when-installing-scipy) for guidance. + +## Pyenv and Poetry + +If you see various errors thrown by Pyenv or Poetry, they can be hard to specifically diagnose and resolve. In this case, it often helps to remove those tools from the system completely. Follow these steps: + +1. Close your currently activated environment, if any: `exit` +2. Uninstall Poetry: `curl -sSL https://install.python-poetry.org | python3 - --uninstall` +3. Clear Poetry cache: `rm -rf ~/.cache/pypoetry` +4. Clear pre-commit cache: `rm -rf ~/.cache/pre-commit` +5. Switch to system Python shell: `pyenv shell system` +6. Edit `~/.bashrc` to remove the lines related to Pyenv configuration +7. Remove Pyenv configuration and cache: `rm -rf ~/.pyenv` + +After that, open a fresh shell session and run `make setup-dev` again. + +## Java + +Officially, PySpark requires Java version 8 (a.k.a. 1.8) or above to work. However, if you have a very recent version of Java, you may experience issues, as it may introduce breaking changes that PySpark hasn't had time to integrate. For example, as of May 2023, PySpark did not work with Java 20. + +If you are encountering problems with initialising a Spark session, try using Java 11. + +## Pre-commit + +If you see an error message thrown by pre-commit, which looks like this (`SyntaxError: Unexpected token '?'`), followed by a JavaScript traceback, the issue is likely with your system NodeJS version. + +One solution which can help in this case is to upgrade your system NodeJS version. However, this may not always be possible. For example, Ubuntu repository is several major versions behind the latest version as of July 2023. + +Another solution which helps is to remove Node, NodeJS, and npm from your system entirely. In this case, pre-commit will not try to rely on a system version of NodeJS and will install its own, suitable one. + +On Ubuntu, this can be done using `sudo apt remove node nodejs npm`, followed by `sudo apt autoremove`. But in some cases, depending on your existing installation, you may need to also manually remove some files. See [this StackOverflow answer](https://stackoverflow.com/a/41057802) for guidance. + +After running these commands, you are advised to open a fresh shell, and then also reinstall Pyenv and Poetry to make sure they pick up the changes (see relevant section above). diff --git a/mkdocs.yml b/mkdocs.yml index 3c109fc7b..8e0d41f32 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,10 +21,6 @@ plugins: - exclude: glob: - assets/schemas/* - # trigger scripts (e.g. schema generator) - - mkdocs-simple-hooks: - hooks: - on_pre_build: "scripts.schemadocs:main" # Show git commiters in the footer - git-committers: repository: opentargets/genetics_etl_python @@ -37,6 +33,9 @@ markdown_extensions: - pymdownx.snippets: base_path: "docs" +hooks: + - src/scripts/schemadocs.py + repo_name: opentargets/genetics_etl_python repo_url: https://github.com/opentargets/genetics_etl_python @@ -55,7 +54,7 @@ theme: palette: # Light mode - - media: '(prefers-color-scheme: light)' + - media: "(prefers-color-scheme: light)" scheme: default primary: blue grey accent: light blue @@ -64,7 +63,7 @@ theme: name: Switch to dark mode # Dark mode - - media: '(prefers-color-scheme: dark)' + - media: "(prefers-color-scheme: dark)" scheme: slate primary: blue grey accent: light blue diff --git a/notebooks/pics_benchmark.ipynb b/notebooks/pics_benchmark.ipynb index 47c788923..d8a2f6e83 100644 --- a/notebooks/pics_benchmark.ipynb +++ b/notebooks/pics_benchmark.ipynb @@ -1,904 +1,904 @@ { - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Benchmarking new PICS implementation\n", - "\n", - "The objective of this notebook is to compare the new implementation of PICS estimated on GWAS Catalog associations using gnomAD LD reference, against the previous implementation using 1000 genomes phase III LD reference. \n", - "\n", - "1. Describe the new dataset\n", - " - Number of signals covered.\n", - " - Number of signals dropped.\n", - "2. Copare with old PICS Dataset.\n", - " - Δ number of covered study (not particularly relevant given updates in GWAS Catalog)\n", - " - Δ number of covered peaks from studies found in the old release - might see increased coverage.\n", - " - Δ in the recovered credible set: number of variants, change in posterior probability.\n", - " - Δ in the average number of credible sets.\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import pyspark.sql.functions as f\n", - "import pyspark.sql.types as t\n", - "from pyspark.sql import SparkSession, DataFrame\n", - "from pyspark.sql.window import Window\n", - "\n", - "spark = SparkSession.builder.getOrCreate()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1 Describing the new dataset\n", - "\n", - "1. Study count.\n", - "2. Association count.\n", - "3. Studies split.\n", - "4. Associations not resolved in LD set." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "root\n", - " |-- chromosome: string (nullable = true)\n", - " |-- variantId: string (nullable = true)\n", - " |-- studyId: string (nullable = true)\n", - " |-- position: string (nullable = true)\n", - " |-- referenceAllele: string (nullable = true)\n", - " |-- alternateAllele: string (nullable = true)\n", - " |-- pValueMantissa: float (nullable = true)\n", - " |-- pValueExponent: integer (nullable = true)\n", - " |-- beta: string (nullable = true)\n", - " |-- beta_ci_lower: double (nullable = true)\n", - " |-- beta_ci_upper: double (nullable = true)\n", - " |-- odds_ratio: string (nullable = true)\n", - " |-- odds_ratio_ci_lower: double (nullable = true)\n", - " |-- odds_ratio_ci_upper: double (nullable = true)\n", - " |-- qualityControl: array (nullable = true)\n", - " | |-- element: string (containsNull = true)\n", - " |-- sampleSize: double (nullable = true)\n", - " |-- tagVariantId: string (nullable = true)\n", - " |-- R_overall: double (nullable = true)\n", - " |-- pics_mu: double (nullable = true)\n", - " |-- pics_std: double (nullable = true)\n", - " |-- pics_postprob: double (nullable = true)\n", - " |-- pics_95_perc_credset: boolean (nullable = true)\n", - " |-- pics_99_perc_credset: boolean (nullable = true)\n", - " |-- hasResolvedCredibleSet: boolean (nullable = false)\n", - "\n" - ] + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmarking new PICS implementation\n", + "\n", + "The objective of this notebook is to compare the new implementation of PICS estimated on GWAS Catalog associations using gnomAD LD reference, against the previous implementation using 1000 genomes phase III LD reference. \n", + "\n", + "1. Describe the new dataset\n", + " - Number of signals covered.\n", + " - Number of signals dropped.\n", + "2. Copare with old PICS Dataset.\n", + " - Δ number of covered study (not particularly relevant given updates in GWAS Catalog)\n", + " - Δ number of covered peaks from studies found in the old release - might see increased coverage.\n", + " - Δ in the recovered credible set: number of variants, change in posterior probability.\n", + " - Δ in the average number of credible sets.\n", + "\n", + " " + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 82:> (0 + 1) / 1]\r" - ] + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import pyspark.sql.functions as f\n", + "import pyspark.sql.types as t\n", + "from pyspark.sql import SparkSession, DataFrame\n", + "from pyspark.sql.window import Window\n", + "\n", + "spark = SparkSession.builder.getOrCreate()" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "-RECORD 0------------------------------------------\n", - " chromosome | 6 \n", - " variantId | 6_13215826_A_G \n", - " studyId | GCST000101_1 \n", - " position | 13215826 \n", - " referenceAllele | A \n", - " alternateAllele | G \n", - " pValueMantissa | 3.0 \n", - " pValueExponent | -6 \n", - " beta | null \n", - " beta_ci_lower | null \n", - " beta_ci_upper | null \n", - " odds_ratio | null \n", - " odds_ratio_ci_lower | null \n", - " odds_ratio_ci_upper | null \n", - " qualityControl | [Subsignificant p-value] \n", - " sampleSize | 1094.0 \n", - " tagVariantId | 6_13215826_A_G \n", - " R_overall | 1.0 \n", - " pics_mu | 5.522878745280337 \n", - " pics_std | 0.0 \n", - " pics_postprob | 0.12718888994626093 \n", - " pics_95_perc_credset | true \n", - " pics_99_perc_credset | true \n", - " hasResolvedCredibleSet | true \n", - "only showing top 1 row\n", - "\n" - ] + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 Describing the new dataset\n", + "\n", + "1. Study count.\n", + "2. Association count.\n", + "3. Studies split.\n", + "4. Associations not resolved in LD set." + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "new_study_locus = (\n", - " spark.read.parquet(\"gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/pics_credible_set/\")\n", - " .withColumn('pics_99_perc_credset', f.when(f.col('tagVariantId').isNull(), False).otherwise(f.col('pics_99_perc_credset')))\n", - " .withColumn(\n", - " 'hasResolvedCredibleSet', \n", - " f.when(\n", - " f.array_contains(\n", - " f.collect_set(f.col('pics_99_perc_credset')).over(Window.partitionBy('studyId', 'variantId')), \n", - " True\n", - " ),\n", - " True\n", - " ).otherwise(False)\n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "\n", - "new_study_locus.printSchema()\n", - "new_study_locus.show(1, False, True)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 11:45:49 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - "[Stage 224:============================================> (173 + 16) / 200]\r" - ] + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "root\n", + " |-- chromosome: string (nullable = true)\n", + " |-- variantId: string (nullable = true)\n", + " |-- studyId: string (nullable = true)\n", + " |-- position: string (nullable = true)\n", + " |-- referenceAllele: string (nullable = true)\n", + " |-- alternateAllele: string (nullable = true)\n", + " |-- pValueMantissa: float (nullable = true)\n", + " |-- pValueExponent: integer (nullable = true)\n", + " |-- beta: string (nullable = true)\n", + " |-- beta_ci_lower: double (nullable = true)\n", + " |-- beta_ci_upper: double (nullable = true)\n", + " |-- odds_ratio: string (nullable = true)\n", + " |-- odds_ratio_ci_lower: double (nullable = true)\n", + " |-- odds_ratio_ci_upper: double (nullable = true)\n", + " |-- qualityControl: array (nullable = true)\n", + " | |-- element: string (containsNull = true)\n", + " |-- sampleSize: double (nullable = true)\n", + " |-- tagVariantId: string (nullable = true)\n", + " |-- R_overall: double (nullable = true)\n", + " |-- pics_mu: double (nullable = true)\n", + " |-- pics_std: double (nullable = true)\n", + " |-- pics_postprob: double (nullable = true)\n", + " |-- pics_95_perc_credset: boolean (nullable = true)\n", + " |-- pics_99_perc_credset: boolean (nullable = true)\n", + " |-- hasResolvedCredibleSet: boolean (nullable = false)\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 82:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-RECORD 0------------------------------------------\n", + " chromosome | 6 \n", + " variantId | 6_13215826_A_G \n", + " studyId | GCST000101_1 \n", + " position | 13215826 \n", + " referenceAllele | A \n", + " alternateAllele | G \n", + " pValueMantissa | 3.0 \n", + " pValueExponent | -6 \n", + " beta | null \n", + " beta_ci_lower | null \n", + " beta_ci_upper | null \n", + " odds_ratio | null \n", + " odds_ratio_ci_lower | null \n", + " odds_ratio_ci_upper | null \n", + " qualityControl | [Subsignificant p-value] \n", + " sampleSize | 1094.0 \n", + " tagVariantId | 6_13215826_A_G \n", + " R_overall | 1.0 \n", + " pics_mu | 5.522878745280337 \n", + " pics_std | 0.0 \n", + " pics_postprob | 0.12718888994626093 \n", + " pics_95_perc_credset | true \n", + " pics_99_perc_credset | true \n", + " hasResolvedCredibleSet | true \n", + "only showing top 1 row\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "new_study_locus = (\n", + " spark.read.parquet(\"gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/pics_credible_set/\")\n", + " .withColumn('pics_99_perc_credset', f.when(f.col('tagVariantId').isNull(), False).otherwise(f.col('pics_99_perc_credset')))\n", + " .withColumn(\n", + " 'hasResolvedCredibleSet', \n", + " f.when(\n", + " f.array_contains(\n", + " f.collect_set(f.col('pics_99_perc_credset')).over(Window.partitionBy('studyId', 'variantId')), \n", + " True\n", + " ),\n", + " True\n", + " ).otherwise(False)\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "\n", + "new_study_locus.printSchema()\n", + "new_study_locus.show(1, False, True)" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Study count: 35956\n", - "Association (unique study/variant pairs) count: 433108\n", - "Associations with resolved credible set: 381056 (88.0%)\n", - "Number of good (non-flagged) associations without resolved credible set: 39763 (9.2%)\n", - "Number of good (non-flagged) associations with resolved credible set: 260736 (60.2%)\n" - ] + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 11:45:49 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + "[Stage 224:============================================> (173 + 16) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Study count: 35956\n", + "Association (unique study/variant pairs) count: 433108\n", + "Associations with resolved credible set: 381056 (88.0%)\n", + "Number of good (non-flagged) associations without resolved credible set: 39763 (9.2%)\n", + "Number of good (non-flagged) associations with resolved credible set: 260736 (60.2%)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "study_count = new_study_locus.select('studyId').distinct().count()\n", + "association_count = new_study_locus.select('studyId', 'variantId').distinct().count()\n", + "association_w_credible_set = new_study_locus.filter(f.col('hasResolvedCredibleSet')).persist()\n", + "credible_set_count = association_w_credible_set.select('studyId', 'variantId').distinct().count()\n", + "failed_w_ld = (\n", + " new_study_locus\n", + " # Selecting good associations without credible sets:\n", + " .filter(\n", + " (~f.col('hasResolvedCredibleSet')) & \n", + " (f.size(f.col('qualityControl'))>0)\n", + " )\n", + " # Get associations:\n", + " .select('studyId', 'variantId')\n", + " .distinct()\n", + " .count()\n", + ")\n", + "good_association_count = (\n", + " association_w_credible_set\n", + " # Drop failed associations:\n", + " .filter(f.size(f.col('qualityControl')) == 0)\n", + " .select('studyId', 'variantId')\n", + " .distinct()\n", + " .count()\n", + ")\n", + "\n", + "print(f'Study count: {study_count}')\n", + "print(f'Association (unique study/variant pairs) count: {association_count}')\n", + "print(f'Associations with resolved credible set: {credible_set_count} ({round(credible_set_count/association_count*100, 1)}%)')\n", + "print(f'Number of good (non-flagged) associations without resolved credible set: {failed_w_ld} ({round(failed_w_ld/association_count*100, 1)}%)')\n", + "print(f'Number of good (non-flagged) associations with resolved credible set: {good_association_count} ({round(good_association_count/association_count*100, 1)}%)')\n" + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "study_count = new_study_locus.select('studyId').distinct().count()\n", - "association_count = new_study_locus.select('studyId', 'variantId').distinct().count()\n", - "association_w_credible_set = new_study_locus.filter(f.col('hasResolvedCredibleSet')).persist()\n", - "credible_set_count = association_w_credible_set.select('studyId', 'variantId').distinct().count()\n", - "failed_w_ld = (\n", - " new_study_locus\n", - " # Selecting good associations without credible sets:\n", - " .filter(\n", - " (~f.col('hasResolvedCredibleSet')) & \n", - " (f.size(f.col('qualityControl'))>0)\n", - " )\n", - " # Get associations:\n", - " .select('studyId', 'variantId')\n", - " .distinct()\n", - " .count()\n", - ")\n", - "good_association_count = (\n", - " association_w_credible_set\n", - " # Drop failed associations:\n", - " .filter(f.size(f.col('qualityControl')) == 0)\n", - " .select('studyId', 'variantId')\n", - " .distinct()\n", - " .count()\n", - ")\n", - "\n", - "print(f'Study count: {study_count}')\n", - "print(f'Association (unique study/variant pairs) count: {association_count}')\n", - "print(f'Associations with resolved credible set: {credible_set_count} ({round(credible_set_count/association_count*100, 1)}%)')\n", - "print(f'Number of good (non-flagged) associations without resolved credible set: {failed_w_ld} ({round(failed_w_ld/association_count*100, 1)}%)')\n", - "print(f'Number of good (non-flagged) associations with resolved credible set: {good_association_count} ({round(good_association_count/association_count*100, 1)}%)')\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Focusing only on the actual credible sets." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 11:57:56 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - " \r" - ] + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Focusing only on the actual credible sets." + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of resolved credible sets: 381056\n", - "Studies with resolved credible sets: 33723\n", - "Number of lead/tag pairs: 18722043\n" - ] - } - ], - "source": [ - "# Thu\n", - "credible_sets = new_study_locus.filter(f.col('pics_99_perc_credset')).persist()\n", - "resolved_assoc_count = credible_sets.select('studyId', 'variantId').distinct().count()\n", - "resolved_study_count = credible_sets.select('studyId').distinct().count()\n", - "lead_tag_pair_count = credible_sets.select('studyId', 'variantId', 'tagVariantId').distinct().count()\n", - "\n", - "grouped_credset_pdf = credible_sets.groupBy('studyId', 'variantId').count().toPandas()\n", - "\n", - "print(f'Number of resolved credible sets: {resolved_assoc_count}')\n", - "print(f'Studies with resolved credible sets: {resolved_study_count}')\n", - "print(f'Number of lead/tag pairs: {lead_tag_pair_count}')\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 11:57:56 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of resolved credible sets: 381056\n", + "Studies with resolved credible sets: 33723\n", + "Number of lead/tag pairs: 18722043\n" + ] + } + ], + "source": [ + "# Thu\n", + "credible_sets = new_study_locus.filter(f.col('pics_99_perc_credset')).persist()\n", + "resolved_assoc_count = credible_sets.select('studyId', 'variantId').distinct().count()\n", + "resolved_study_count = credible_sets.select('studyId').distinct().count()\n", + "lead_tag_pair_count = credible_sets.select('studyId', 'variantId', 'tagVariantId').distinct().count()\n", + "\n", + "grouped_credset_pdf = credible_sets.groupBy('studyId', 'variantId').count().toPandas()\n", + "\n", + "print(f'Number of resolved credible sets: {resolved_assoc_count}')\n", + "print(f'Studies with resolved credible sets: {resolved_study_count}')\n", + "print(f'Number of lead/tag pairs: {lead_tag_pair_count}')\n", + "\n" ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" }, { - "data": { - "image/png": "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", - "text/plain": [ - "
    " + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "grouped_credset_pdf.query('count < 500')['count'].hist(bins=100)" ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "grouped_credset_pdf.query('count < 500')['count'].hist(bins=100)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Credible sets with only one variant: 29536 (7.8)%\n", - "Median size of credible sets: 21.0\n" - ] - } - ], - "source": [ - "median_credset_size = grouped_credset_pdf['count'].median()\n", - "credsets_with_single = len(grouped_credset_pdf.query('count == 1'))\n", - "\n", - "print(f'Credible sets with only one variant: {credsets_with_single} ({round(credsets_with_single/len(grouped_credset_pdf)*100, 1)})%')\n", - "print(f'Median size of credible sets: {median_credset_size}')" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 285:====================================> (139 + 8) / 200]\r" - ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+---------------+-----+\n", - "| studyId| variantId|count|\n", - "+------------+---------------+-----+\n", - "|GCST90095125|17_46142465_T_A|11930|\n", - "|GCST90095124|17_46142465_T_A|11221|\n", - "|GCST006483_1|17_45608332_A_G| 9666|\n", - "| GCST011766|17_45846834_C_G| 9566|\n", - "|GCST006481_2|17_45608332_A_G| 9445|\n", - "|GCST006483_1|17_45605039_C_G| 8912|\n", - "|GCST006483_3|17_45605039_C_G| 8602|\n", - "|GCST006481_4|17_45605039_C_G| 8545|\n", - "|GCST006483_1|17_46770468_T_G| 7465|\n", - "|GCST006481_2|17_46770468_T_G| 7396|\n", - "|GCST006483_3|17_46770468_T_G| 7374|\n", - "|GCST006481_4|17_46770468_T_G| 7327|\n", - "|GCST001651_9|17_46257341_G_A| 6926|\n", - "|GCST90134596|17_45707983_T_C| 6748|\n", - "| GCST012099|17_45610951_A_G| 6603|\n", - "|GCST90104034|17_46152620_T_C| 6545|\n", - "| GCST012101|17_45610951_A_G| 6374|\n", - "|GCST90134597|17_45707983_T_C| 6372|\n", - "| GCST007692|17_45846834_C_G| 6331|\n", - "|GCST90013445|17_45996523_A_G| 5668|\n", - "|GCST008675_1|17_45733530_C_T| 5196|\n", - "|GCST004008_1|17_45749271_G_A| 5101|\n", - "|GCST006483_1|17_46785767_T_C| 4913|\n", - "|GCST006481_2|17_46785767_T_C| 4880|\n", - "| GCST007065|11_55736589_G_A| 4071|\n", - "|GCST90100220|10_73256607_T_A| 3897|\n", - "|GCST90095190|17_45913906_A_G| 3858|\n", - "|GCST90095190|17_46055092_G_A| 3855|\n", - "|GCST90095190|17_45609706_G_A| 3764|\n", - "|GCST000996_1|11_55368743_C_T| 3727|\n", - "+------------+---------------+-----+\n", - "only showing top 30 rows\n", - "\n" - ] + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Credible sets with only one variant: 29536 (7.8)%\n", + "Median size of credible sets: 21.0\n" + ] + } + ], + "source": [ + "median_credset_size = grouped_credset_pdf['count'].median()\n", + "credsets_with_single = len(grouped_credset_pdf.query('count == 1'))\n", + "\n", + "print(f'Credible sets with only one variant: {credsets_with_single} ({round(credsets_with_single/len(grouped_credset_pdf)*100, 1)})%')\n", + "print(f'Median size of credible sets: {median_credset_size}')" + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "credible_sets.groupBy('studyId', 'variantId').count().filter(f.col('count') > 1000).orderBy('count', ascending=False).show(30)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparing with old dataset\n", - "\n", - "- Data: `gs://genetics-portal-dev-staging/v2d/220210/ld.parquet`" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 336:===================================================> (16 + 1) / 17]\r" - ] + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 285:====================================> (139 + 8) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------+---------------+-----+\n", + "| studyId| variantId|count|\n", + "+------------+---------------+-----+\n", + "|GCST90095125|17_46142465_T_A|11930|\n", + "|GCST90095124|17_46142465_T_A|11221|\n", + "|GCST006483_1|17_45608332_A_G| 9666|\n", + "| GCST011766|17_45846834_C_G| 9566|\n", + "|GCST006481_2|17_45608332_A_G| 9445|\n", + "|GCST006483_1|17_45605039_C_G| 8912|\n", + "|GCST006483_3|17_45605039_C_G| 8602|\n", + "|GCST006481_4|17_45605039_C_G| 8545|\n", + "|GCST006483_1|17_46770468_T_G| 7465|\n", + "|GCST006481_2|17_46770468_T_G| 7396|\n", + "|GCST006483_3|17_46770468_T_G| 7374|\n", + "|GCST006481_4|17_46770468_T_G| 7327|\n", + "|GCST001651_9|17_46257341_G_A| 6926|\n", + "|GCST90134596|17_45707983_T_C| 6748|\n", + "| GCST012099|17_45610951_A_G| 6603|\n", + "|GCST90104034|17_46152620_T_C| 6545|\n", + "| GCST012101|17_45610951_A_G| 6374|\n", + "|GCST90134597|17_45707983_T_C| 6372|\n", + "| GCST007692|17_45846834_C_G| 6331|\n", + "|GCST90013445|17_45996523_A_G| 5668|\n", + "|GCST008675_1|17_45733530_C_T| 5196|\n", + "|GCST004008_1|17_45749271_G_A| 5101|\n", + "|GCST006483_1|17_46785767_T_C| 4913|\n", + "|GCST006481_2|17_46785767_T_C| 4880|\n", + "| GCST007065|11_55736589_G_A| 4071|\n", + "|GCST90100220|10_73256607_T_A| 3897|\n", + "|GCST90095190|17_45913906_A_G| 3858|\n", + "|GCST90095190|17_46055092_G_A| 3855|\n", + "|GCST90095190|17_45609706_G_A| 3764|\n", + "|GCST000996_1|11_55368743_C_T| 3727|\n", + "+------------+---------------+-----+\n", + "only showing top 30 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "credible_sets.groupBy('studyId', 'variantId').count().filter(f.col('count') > 1000).orderBy('count', ascending=False).show(30)" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of lead/tag count: 19406519\n", - "NUmber of studies covered: 18349\n", - "Number of associations covered: 265715\n" - ] + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparing with old dataset\n", + "\n", + "- Data: `gs://genetics-portal-dev-staging/v2d/220210/ld.parquet`" + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - } - ], - "source": [ - "old_study_locus = (\n", - " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220210/ld.parquet\")\n", - " .select(\n", - " f.col('study_id').alias(\"studyId\"), \n", - " f.concat_ws(\"_\", f.col(\"lead_chrom\"), f.col(\"lead_pos\"), f.col(\"lead_ref\"), f.col(\"lead_alt\")).alias(\"variantId\"), \n", - " f.concat_ws(\"_\", f.col(\"tag_chrom\"), f.col(\"tag_pos\"), f.col(\"tag_ref\"), f.col(\"tag_alt\")).alias(\"tagVariantId\"),\n", - " 'pics_postprob',\n", - " 'pics_95perc_credset',\n", - " 'pics_99perc_credset'\n", - " )\n", - " .distinct()\n", - ")\n", - "lead_tag_pair_count = old_study_locus.count()\n", - "study_count = old_study_locus.select('studyId').distinct().count()\n", - "association_count = old_study_locus.select('studyId', 'variantId').distinct().count()\n", - "\n", - "print(f'Number of lead/tag count: {lead_tag_pair_count}')\n", - "print(f'NUmber of studies covered: {study_count}')\n", - "print(f'Number of associations covered: {association_count}')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 13:53:16 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n" - ] + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 336:===================================================> (16 + 1) / 17]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of lead/tag count: 19406519\n", + "NUmber of studies covered: 18349\n", + "Number of associations covered: 265715\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "old_study_locus = (\n", + " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220210/ld.parquet\")\n", + " .select(\n", + " f.col('study_id').alias(\"studyId\"), \n", + " f.concat_ws(\"_\", f.col(\"lead_chrom\"), f.col(\"lead_pos\"), f.col(\"lead_ref\"), f.col(\"lead_alt\")).alias(\"variantId\"), \n", + " f.concat_ws(\"_\", f.col(\"tag_chrom\"), f.col(\"tag_pos\"), f.col(\"tag_ref\"), f.col(\"tag_alt\")).alias(\"tagVariantId\"),\n", + " 'pics_postprob',\n", + " 'pics_95perc_credset',\n", + " 'pics_99perc_credset'\n", + " )\n", + " .distinct()\n", + ")\n", + "lead_tag_pair_count = old_study_locus.count()\n", + "study_count = old_study_locus.select('studyId').distinct().count()\n", + "association_count = old_study_locus.select('studyId', 'variantId').distinct().count()\n", + "\n", + "print(f'Number of lead/tag count: {lead_tag_pair_count}')\n", + "print(f'NUmber of studies covered: {study_count}')\n", + "print(f'Number of associations covered: {association_count}')\n" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The median number of tag size: 21.0\n", - "Number of associations with single credible set: 9231\n", - "Number of associations with more than 1000 tags set: 441\n", - "+-------------+---------------+-----+\n", - "| studyId| variantId|count|\n", - "+-------------+---------------+-----+\n", - "| GCST001482|17_45900461_C_T| 3685|\n", - "| GCST90018953|17_45856424_G_T| 3684|\n", - "| GCST007692|17_45846834_C_G| 3649|\n", - "| GCST90018960|17_45761354_C_T| 3360|\n", - "| GCST90018996|17_46112544_A_G| 3348|\n", - "| GCST90091060|17_45873075_C_A| 3295|\n", - "| GCST002970|17_45846317_A_G| 3294|\n", - "| GCST001548|17_45846853_T_C| 3294|\n", - "| GCST007328|17_45887201_A_C| 3294|\n", - "| GCST007430|17_45887201_A_C| 3294|\n", - "| GCST010701|17_45855805_C_T| 3294|\n", - "| GCST001126|17_45846317_A_G| 3294|\n", - "| GCST012009|17_45862033_A_C| 3294|\n", - "| GCST006941|17_45841739_C_T| 3293|\n", - "| GCST004601|17_45841730_A_G| 3293|\n", - "| GCST010002|17_45895867_C_T| 3293|\n", - "| GCST90025948|17_45834077_T_C| 3293|\n", - "| GCST008733|17_45834077_T_C| 3293|\n", - "| GCST008734|17_45834077_T_C| 3293|\n", - "|GCST009518_66|17_45841730_A_G| 3293|\n", - "+-------------+---------------+-----+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "tag_count = old_study_locus.groupBy('studyId', 'variantId').count().persist()\n", - "median_tag_count = tag_count.toPandas()['count'].median()\n", - "single_count = tag_count.filter(f.col('count') == 1).count()\n", - "over_1000 = tag_count.filter(f.col('count') >= 1000).count()\n", - "\n", - "print(f'The median number of tag size: {median_credset_size}')\n", - "print(f'Number of associations with single credible set: {single_count}')\n", - "print(f'Number of associations with more than 1000 tags set: {over_1000}')\n", - "\n", - "tag_count.orderBy('count',ascending=False).show(20)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Compare credible sets\n", - "\n", - "To make datasets comparable, both datasets need to updated with `studyAccession`: getting the GWAS Catalog study identifier by removing the suffix." - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1][Stage 1072:========> (9 + 7) / 16]\r" - ] - } - ], - "source": [ - "processed_new = (\n", - " credible_sets\n", - " # Dropping leads with sub-significant p-values:\n", - " .filter(f.size(f.col('qualityControl')) == 0)\n", - " .select(\n", - " f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'),\n", - " 'variantId', \n", - " 'tagVariantId', \n", - " 'pics_mu', \n", - " 'pics_postprob', \n", - " 'pics_95_perc_credset', \n", - " 'pics_99_perc_credset'\n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "processed_old = (\n", - " old_study_locus\n", - " .select(\n", - " f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'),\n", - " 'variantId', \n", - " 'tagVariantId',\n", - " 'pics_postprob',\n", - " 'pics_95perc_credset',\n", - " 'pics_99perc_credset' \n", - " )\n", - " .persist()\n", - ")\n", - "\n", - "processed_old.show(1, False, True)" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - "[Stage 414:> (0 + 1) / 1][Stage 431:============>(187 + 7) / 200]\r" - ] + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 13:53:16 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The median number of tag size: 21.0\n", + "Number of associations with single credible set: 9231\n", + "Number of associations with more than 1000 tags set: 441\n", + "+-------------+---------------+-----+\n", + "| studyId| variantId|count|\n", + "+-------------+---------------+-----+\n", + "| GCST001482|17_45900461_C_T| 3685|\n", + "| GCST90018953|17_45856424_G_T| 3684|\n", + "| GCST007692|17_45846834_C_G| 3649|\n", + "| GCST90018960|17_45761354_C_T| 3360|\n", + "| GCST90018996|17_46112544_A_G| 3348|\n", + "| GCST90091060|17_45873075_C_A| 3295|\n", + "| GCST002970|17_45846317_A_G| 3294|\n", + "| GCST001548|17_45846853_T_C| 3294|\n", + "| GCST007328|17_45887201_A_C| 3294|\n", + "| GCST007430|17_45887201_A_C| 3294|\n", + "| GCST010701|17_45855805_C_T| 3294|\n", + "| GCST001126|17_45846317_A_G| 3294|\n", + "| GCST012009|17_45862033_A_C| 3294|\n", + "| GCST006941|17_45841739_C_T| 3293|\n", + "| GCST004601|17_45841730_A_G| 3293|\n", + "| GCST010002|17_45895867_C_T| 3293|\n", + "| GCST90025948|17_45834077_T_C| 3293|\n", + "| GCST008733|17_45834077_T_C| 3293|\n", + "| GCST008734|17_45834077_T_C| 3293|\n", + "|GCST009518_66|17_45841730_A_G| 3293|\n", + "+-------------+---------------+-----+\n", + "only showing top 20 rows\n", + "\n" + ] + } + ], + "source": [ + "tag_count = old_study_locus.groupBy('studyId', 'variantId').count().persist()\n", + "median_tag_count = tag_count.toPandas()['count'].median()\n", + "single_count = tag_count.filter(f.col('count') == 1).count()\n", + "over_1000 = tag_count.filter(f.col('count') >= 1000).count()\n", + "\n", + "print(f'The median number of tag size: {median_credset_size}')\n", + "print(f'Number of associations with single credible set: {single_count}')\n", + "print(f'Number of associations with more than 1000 tags set: {over_1000}')\n", + "\n", + "tag_count.orderBy('count',ascending=False).show(20)" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------+---------------+---------------------+---------------------+\n", - "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", - "+--------------+---------------+---------------------+---------------------+\n", - "| GCST000114|15_48099968_A_G| 13| 38|\n", - "| GCST000172|3_190632672_A_G| 12| null|\n", - "| GCST000184|18_60217517_G_A| 233| 214|\n", - "| GCST000189|16_81270154_T_C| 6| null|\n", - "| GCST000189|9_105892815_G_T| 26| null|\n", - "| GCST000282|19_11100236_C_T| 34| 69|\n", - "| GCST000425|16_23055939_T_G| 227| null|\n", - "| GCST000452|2_156696348_A_C| 19| null|\n", - "| GCST000679| 10_6056986_C_T| 12| null|\n", - "| GCST000817|9_136220024_G_T| 23| 27|\n", - "| GCST000876|11_18349351_G_C| 2| 6|\n", - "| GCST000943| 20_1960525_G_A| null| 2|\n", - "| GCST000957|22_49692725_G_A| 16| null|\n", - "| GCST000964|13_77957479_G_A| null| 47|\n", - "| GCST000998|10_44280376_C_T| 193| null|\n", - "| GCST000998|21_34226827_C_T| 29| 32|\n", - "| GCST001010| 6_32689801_T_C| 1| 112|\n", - "| GCST001040|17_37738049_G_A| null| 21|\n", - "| GCST001057|13_66393490_A_G| 7| null|\n", - "| GCST001059|2_198123211_C_A| 8| null|\n", - "+--------------+---------------+---------------------+---------------------+\n", - "only showing top 20 rows\n", - "\n" - ] + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compare credible sets\n", + "\n", + "To make datasets comparable, both datasets need to updated with `studyAccession`: getting the GWAS Catalog study identifier by removing the suffix." + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1][Stage 1072:========> (9 + 7) / 16]\r" + ] + } + ], + "source": [ + "processed_new = (\n", + " credible_sets\n", + " # Dropping leads with sub-significant p-values:\n", + " .filter(f.size(f.col('qualityControl')) == 0)\n", + " .select(\n", + " f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'),\n", + " 'variantId', \n", + " 'tagVariantId', \n", + " 'pics_mu', \n", + " 'pics_postprob', \n", + " 'pics_95_perc_credset', \n", + " 'pics_99_perc_credset'\n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "processed_old = (\n", + " old_study_locus\n", + " .select(\n", + " f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'),\n", + " 'variantId', \n", + " 'tagVariantId',\n", + " 'pics_postprob',\n", + " 'pics_95perc_credset',\n", + " 'pics_99perc_credset' \n", + " )\n", + " .persist()\n", + ")\n", + "\n", + "processed_old.show(1, False, True)" + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "aggregated_new = (\n", - " processed_new\n", - " .join(processed_old.select('studyAccession').distinct(), on='studyAccession', how='right')\n", - " .groupBy('studyAccession', 'variantId')\n", - " .agg(f.size(f.collect_list(f.col('tagVariantId'))).alias('new_credible_set_size'))\n", - " .persist()\n", - ")\n", - "\n", - "aggregated_old = (\n", - " processed_old\n", - " .groupBy('studyAccession', 'variantId')\n", - " .agg(f.size(f.collect_list(f.col('tagVariantId'))).alias('old_credible_set_size'))\n", - " .persist()\n", - ")\n", - "\n", - "credset_compare = (\n", - " aggregated_new\n", - " .join(aggregated_old.filter(f.col('studyAccession').startswith('GCST')), on=['studyAccession', 'variantId'], how='outer')\n", - " .persist()\n", - ")\n", - "\n", - "credset_compare.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + "22/12/19 14:19:35 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + "[Stage 414:> (0 + 1) / 1][Stage 431:============>(187 + 7) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------+---------------+---------------------+---------------------+\n", + "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", + "+--------------+---------------+---------------------+---------------------+\n", + "| GCST000114|15_48099968_A_G| 13| 38|\n", + "| GCST000172|3_190632672_A_G| 12| null|\n", + "| GCST000184|18_60217517_G_A| 233| 214|\n", + "| GCST000189|16_81270154_T_C| 6| null|\n", + "| GCST000189|9_105892815_G_T| 26| null|\n", + "| GCST000282|19_11100236_C_T| 34| 69|\n", + "| GCST000425|16_23055939_T_G| 227| null|\n", + "| GCST000452|2_156696348_A_C| 19| null|\n", + "| GCST000679| 10_6056986_C_T| 12| null|\n", + "| GCST000817|9_136220024_G_T| 23| 27|\n", + "| GCST000876|11_18349351_G_C| 2| 6|\n", + "| GCST000943| 20_1960525_G_A| null| 2|\n", + "| GCST000957|22_49692725_G_A| 16| null|\n", + "| GCST000964|13_77957479_G_A| null| 47|\n", + "| GCST000998|10_44280376_C_T| 193| null|\n", + "| GCST000998|21_34226827_C_T| 29| 32|\n", + "| GCST001010| 6_32689801_T_C| 1| 112|\n", + "| GCST001040|17_37738049_G_A| null| 21|\n", + "| GCST001057|13_66393490_A_G| 7| null|\n", + "| GCST001059|2_198123211_C_A| 8| null|\n", + "+--------------+---------------+---------------------+---------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "aggregated_new = (\n", + " processed_new\n", + " .join(processed_old.select('studyAccession').distinct(), on='studyAccession', how='right')\n", + " .groupBy('studyAccession', 'variantId')\n", + " .agg(f.size(f.collect_list(f.col('tagVariantId'))).alias('new_credible_set_size'))\n", + " .persist()\n", + ")\n", + "\n", + "aggregated_old = (\n", + " processed_old\n", + " .groupBy('studyAccession', 'variantId')\n", + " .agg(f.size(f.collect_list(f.col('tagVariantId'))).alias('old_credible_set_size'))\n", + " .persist()\n", + ")\n", + "\n", + "credset_compare = (\n", + " aggregated_new\n", + " .join(aggregated_old.filter(f.col('studyAccession').startswith('GCST')), on=['studyAccession', 'variantId'], how='outer')\n", + " .persist()\n", + ")\n", + "\n", + "credset_compare.show()" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "The number of extra credible sets covered by the new dataset: 104508 (53.0%)\n", - "Number of lost credible sets in the new datasets: 49292 (25.0%)\n", - "The number of extra credible sets with more than 1 tags covered by the new dataset: 94745 (48.1%)\n" - ] + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The number of extra credible sets covered by the new dataset: 104508 (53.0%)\n", + "Number of lost credible sets in the new datasets: 49292 (25.0%)\n", + "The number of extra credible sets with more than 1 tags covered by the new dataset: 94745 (48.1%)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "extra_coverage = credset_compare.filter(f.col('old_credible_set_size').isNull()).count()\n", + "lost_coverage = credset_compare.filter(f.col('new_credible_set_size').isNull()).count()\n", + "old_full_count = aggregated_old.filter(f.col('studyAccession').startswith('GCST')).count()\n", + "\n", + "print(f'The number of extra credible sets covered by the new dataset: {extra_coverage} ({round(extra_coverage/old_full_count * 100, 1)}%)')\n", + "print(f'Number of lost credible sets in the new datasets: {lost_coverage} ({round(lost_coverage/old_full_count*100, 1)}%)')\n", + "\n", + "extra_coverage_more = credset_compare.filter(f.col('old_credible_set_size').isNull() & (f.col('new_credible_set_size')>1)).count()\n", + "\n", + "print(f'The number of extra credible sets with more than 1 tags covered by the new dataset: {extra_coverage_more} ({round(extra_coverage_more/old_full_count * 100, 1)}%)')\n" + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "extra_coverage = credset_compare.filter(f.col('old_credible_set_size').isNull()).count()\n", - "lost_coverage = credset_compare.filter(f.col('new_credible_set_size').isNull()).count()\n", - "old_full_count = aggregated_old.filter(f.col('studyAccession').startswith('GCST')).count()\n", - "\n", - "print(f'The number of extra credible sets covered by the new dataset: {extra_coverage} ({round(extra_coverage/old_full_count * 100, 1)}%)')\n", - "print(f'Number of lost credible sets in the new datasets: {lost_coverage} ({round(lost_coverage/old_full_count*100, 1)}%)')\n", - "\n", - "extra_coverage_more = credset_compare.filter(f.col('old_credible_set_size').isNull() & (f.col('new_credible_set_size')>1)).count()\n", - "\n", - "print(f'The number of extra credible sets with more than 1 tags covered by the new dataset: {extra_coverage_more} ({round(extra_coverage_more/old_full_count * 100, 1)}%)')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------+--------------------+---------------------+---------------------+\n", - "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", - "+--------------+--------------------+---------------------+---------------------+\n", - "| GCST000943| 20_1960525_G_A| null| 2|\n", - "| GCST000964| 13_77957479_G_A| null| 47|\n", - "| GCST001040| 17_37738049_G_A| null| 21|\n", - "| GCST002216| 7_73450539_A_G| null| 94|\n", - "| GCST002221| 9_133372523_G_C| null| 20|\n", - "| GCST002223| 8_19973410_C_T| null| 106|\n", - "| GCST002223| 8_20009083_C_T| null| 98|\n", - "| GCST003043| 16_11271643_C_T| null| 14|\n", - "| GCST003191| 20_22824423_G_A| null| 30|\n", - "| GCST003879| 22_23030688_C_G| null| 104|\n", - "| GCST004132| 16_10871740_T_C| null| 74|\n", - "| GCST004365| 3_186755027_C_T| null| 12|\n", - "| GCST004600| 6_35756341_T_C| null| 17|\n", - "| GCST004601| 11_8721318_TC_T| null| 171|\n", - "| GCST004601| 6_27878966_G_C| null| 267|\n", - "| GCST004603|16_88730362_G_GGG...| null| 10|\n", - "| GCST004603| 4_17777672_A_T| null| 9|\n", - "| GCST004605| 6_28489735_CT_C| null| 1|\n", - "| GCST004607| 20_56413821_A_G| null| 15|\n", - "| GCST004607| 2_218258320_T_A| null| 235|\n", - "+--------------+--------------------+---------------------+---------------------+\n", - "only showing top 20 rows\n", - "\n" - ] + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------+--------------------+---------------------+---------------------+\n", + "|studyAccession| variantId|new_credible_set_size|old_credible_set_size|\n", + "+--------------+--------------------+---------------------+---------------------+\n", + "| GCST000943| 20_1960525_G_A| null| 2|\n", + "| GCST000964| 13_77957479_G_A| null| 47|\n", + "| GCST001040| 17_37738049_G_A| null| 21|\n", + "| GCST002216| 7_73450539_A_G| null| 94|\n", + "| GCST002221| 9_133372523_G_C| null| 20|\n", + "| GCST002223| 8_19973410_C_T| null| 106|\n", + "| GCST002223| 8_20009083_C_T| null| 98|\n", + "| GCST003043| 16_11271643_C_T| null| 14|\n", + "| GCST003191| 20_22824423_G_A| null| 30|\n", + "| GCST003879| 22_23030688_C_G| null| 104|\n", + "| GCST004132| 16_10871740_T_C| null| 74|\n", + "| GCST004365| 3_186755027_C_T| null| 12|\n", + "| GCST004600| 6_35756341_T_C| null| 17|\n", + "| GCST004601| 11_8721318_TC_T| null| 171|\n", + "| GCST004601| 6_27878966_G_C| null| 267|\n", + "| GCST004603|16_88730362_G_GGG...| null| 10|\n", + "| GCST004603| 4_17777672_A_T| null| 9|\n", + "| GCST004605| 6_28489735_CT_C| null| 1|\n", + "| GCST004607| 20_56413821_A_G| null| 15|\n", + "| GCST004607| 2_218258320_T_A| null| 235|\n", + "+--------------+--------------------+---------------------+---------------------+\n", + "only showing top 20 rows\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "credset_compare.filter(f.col('new_credible_set_size').isNull()).show()" + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Conclusion:**\n", + "- The reason of the disagreement is the fact that the old dataset contains data from summary stats finemapping.\n", + "- To resolve this problem, we exclude those studies which have summary stats. These credible sets should be in a better agreement." + ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "credset_compare.filter(f.col('new_credible_set_size').isNull()).show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Conclusion:**\n", - "- The reason of the disagreement is the fact that the old dataset contains data from summary stats finemapping.\n", - "- To resolve this problem, we exclude those studies which have summary stats. These credible sets should be in a better agreement." - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "141" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 414:> (0 + 1) / 1]\r" + ] + } + ], + "source": [ + "(\n", + " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220401/ld.parquet\")\n", + " .filter(f.col('study_id') == 'GCST002223')\n", + " .select('lead_chrom', 'lead_pos', 'lead_ref', 'lead_alt')\n", + " .distinct()\n", + " .count()\n", + ")" + ] }, { - "data": { - "text/plain": [ - "141" + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "22/12/19 15:57:00 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of credible sets in the selected studies (27054): 105658\n", + "The number of extra credible sets covered by the new dataset in the same studies: 73250 (69.3%)\n", + "Number of lost credible sets in the new datasets: 8454 (8.0%)\n", + "The number of extra credible sets with more than 1 tags covered by the new dataset: 67183 (63.6%)\n" + ] + } + ], + "source": [ + "studies_with_no_sumstats = (\n", + " spark.read.parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/gwas_catalog_studies/')\n", + " .filter(~f.col('hasSumstats'))\n", + " .select(f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'))\n", + " .distinct()\n", + ")\n", + "\n", + "# Dropping studies with summary statistics:\n", + "credset_compare_update = credset_compare.join(studies_with_no_sumstats, on='studyAccession', how='inner').distinct().persist()\n", + "\n", + "old_full_count = credset_compare_update.filter(f.col('old_credible_set_size').isNotNull()).count()\n", + "extra_coverage = credset_compare_update.filter(f.col('old_credible_set_size').isNull()).count()\n", + "lost_coverage = credset_compare_update.filter(f.col('new_credible_set_size').isNull()).count()\n", + "\n", + "print(f'Number of credible sets in the selected studies ({studies_with_no_sumstats.count()}): {old_full_count}')\n", + "print(f'The number of extra credible sets covered by the new dataset in the same studies: {extra_coverage} ({round(extra_coverage/old_full_count * 100, 1)}%)')\n", + "print(f'Number of lost credible sets in the new datasets: {lost_coverage} ({round(lost_coverage/old_full_count*100, 1)}%)')\n", + "\n", + "extra_coverage_more = credset_compare_update.filter(f.col('old_credible_set_size').isNull() & (f.col('new_credible_set_size')>1)).count()\n", + "\n", + "print(f'The number of extra credible sets with more than 1 tags covered by the new dataset: {extra_coverage_more} ({round(extra_coverage_more/old_full_count * 100, 1)}%)')" ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 414:> (0 + 1) / 1]\r" - ] - } - ], - "source": [ - "(\n", - " spark.read.parquet(\"gs://genetics-portal-dev-staging/v2d/220401/ld.parquet\")\n", - " .filter(f.col('study_id') == 'GCST002223')\n", - " .select('lead_chrom', 'lead_pos', 'lead_ref', 'lead_alt')\n", - " .distinct()\n", - " .count()\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "22/12/19 15:57:00 WARN org.apache.spark.sql.execution.CacheManager: Asked to cache already cached data.\n", - " \r" - ] + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1+1" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of credible sets in the selected studies (27054): 105658\n", - "The number of extra credible sets covered by the new dataset in the same studies: 73250 (69.3%)\n", - "Number of lost credible sets in the new datasets: 8454 (8.0%)\n", - "The number of extra credible sets with more than 1 tags covered by the new dataset: 67183 (63.6%)\n" - ] + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } - ], - "source": [ - "studies_with_no_sumstats = (\n", - " spark.read.parquet('gs://genetics_etl_python_playground/XX.XX/output/python_etl/parquet/gwas_catalog_studies/')\n", - " .filter(~f.col('hasSumstats'))\n", - " .select(f.split(f.col('studyId'), '_').getItem(0).alias('studyAccession'))\n", - " .distinct()\n", - ")\n", - "\n", - "# Dropping studies with summary statistics:\n", - "credset_compare_update = credset_compare.join(studies_with_no_sumstats, on='studyAccession', how='inner').distinct().persist()\n", - "\n", - "old_full_count = credset_compare_update.filter(f.col('old_credible_set_size').isNotNull()).count()\n", - "extra_coverage = credset_compare_update.filter(f.col('old_credible_set_size').isNull()).count()\n", - "lost_coverage = credset_compare_update.filter(f.col('new_credible_set_size').isNull()).count()\n", - "\n", - "print(f'Number of credible sets in the selected studies ({studies_with_no_sumstats.count()}): {old_full_count}')\n", - "print(f'The number of extra credible sets covered by the new dataset in the same studies: {extra_coverage} ({round(extra_coverage/old_full_count * 100, 1)}%)')\n", - "print(f'Number of lost credible sets in the new datasets: {lost_coverage} ({round(lost_coverage/old_full_count*100, 1)}%)')\n", - "\n", - "extra_coverage_more = credset_compare_update.filter(f.col('old_credible_set_size').isNull() & (f.col('new_credible_set_size')>1)).count()\n", - "\n", - "print(f'The number of extra credible sets with more than 1 tags covered by the new dataset: {extra_coverage_more} ({round(extra_coverage_more/old_full_count * 100, 1)}%)')" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" + ], + "metadata": { + "kernelspec": { + "display_name": "otgenetics-Z1loiStc-py3.8", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.16 (default, Dec 7 2022, 01:39:17) \n[Clang 14.0.0 (clang-1400.0.29.202)]" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "5a448d06c31dd563cc2d2f896cd972f1626bb3e0fbcfc3d2f2ab4cc41131eab9" + } } - ], - "source": [ - "1+1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "otgenetics-Z1loiStc-py3.8", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.16 (default, Dec 7 2022, 01:39:17) \n[Clang 14.0.0 (clang-1400.0.29.202)]" }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "5a448d06c31dd563cc2d2f896cd972f1626bb3e0fbcfc3d2f2ab4cc41131eab9" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/poetry.lock b/poetry.lock index 871be324f..48bbdc640 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,25 @@ +[[package]] +name = "aiodns" +version = "2.0.0" +description = "Simple DNS resolver for asyncio" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycares = ">=3.0.0" + +[[package]] +name = "aiofiles" +version = "23.2.1" +description = "File support for asyncio." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.6" description = "Async http client/server framework (asyncio)" category = "main" optional = false @@ -19,33 +38,39 @@ yarl = ">=1.0,<2.0" speedups = ["Brotli", "aiodns", "cchardet"] [[package]] -name = "aiohttp-session" -version = "2.12.0" -description = "sessions for aiohttp.web" +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" category = "main" optional = false python-versions = ">=3.7" [package.dependencies] -aiohttp = ">=3.8" - -[package.extras] -aiomcache = ["aiomcache (>=0.5.2)"] -aioredis = ["redis (>=4.3.1)"] -pycrypto = ["cryptography"] -pynacl = ["pynacl"] -secure = ["cryptography"] +frozenlist = ">=1.1.0" [[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" +name = "alembic" +version = "1.12.0" +description = "A database migration tool for SQLAlchemy." +category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -frozenlist = ">=1.1.0" +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["python-dateutil"] + +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +category = "dev" +optional = false +python-versions = ">=3.8" [[package]] name = "antlr4-python3-runtime" @@ -55,6 +80,406 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "anyio" +version = "4.0.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] + +[[package]] +name = "apache-airflow" +version = "2.7.1" +description = "Programmatically author, schedule and monitor data pipelines" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +alembic = ">=1.6.3,<2.0" +apache-airflow-providers-common-sql = "*" +apache-airflow-providers-ftp = "*" +apache-airflow-providers-http = "*" +apache-airflow-providers-imap = "*" +apache-airflow-providers-sqlite = "*" +argcomplete = ">=1.10" +asgiref = "*" +attrs = ">=22.1.0" +blinker = "*" +cattrs = ">=22.1.0" +colorlog = ">=4.0.2,<5.0" +configupdater = ">=3.1.1" +connexion = {version = ">=2.10.0", extras = ["flask"]} +cron-descriptor = ">=1.2.24" +croniter = ">=0.3.17" +cryptography = ">=0.9.3" +deprecated = ">=1.2.13" +dill = ">=0.2.2" +flask = ">=2.2,<2.3" +flask-appbuilder = "4.3.6" +flask-caching = ">=1.5.0" +flask-login = ">=0.6.2" +flask-session = ">=0.4.0" +flask-wtf = ">=0.15" +google-re2 = ">=1.0" +graphviz = ">=0.12" +gunicorn = ">=20.1.0" +httpx = "*" +itsdangerous = ">=2.0" +jinja2 = ">=3.0.0" +jsonschema = ">=4.18.0" +lazy-object-proxy = "*" +linkify-it-py = ">=2.0.0" +lockfile = ">=0.12.2" +markdown = ">=3.0" +markdown-it-py = ">=2.1.0" +markupsafe = ">=1.1.1" +marshmallow-oneofschema = ">=2.0.1" +mdit-py-plugins = ">=0.3.0" +opentelemetry-api = ">=1.15.0" +opentelemetry-exporter-otlp = "*" +packaging = ">=14.0" +pathspec = ">=0.9.0" +pendulum = ">=2.0" +pluggy = ">=1.0" +psutil = ">=4.2.0" +pydantic = ">=1.10.0" +pygments = ">=2.0.1" +pyjwt = ">=2.0.0" +python-daemon = ">=3.0.0" +python-dateutil = ">=2.3" +python-nvd3 = ">=0.15.0" +python-slugify = ">=5.0" +rfc3339-validator = ">=0.1.4" +rich = ">=12.4.4" +rich-argparse = ">=1.0.0" +setproctitle = ">=1.1.8" +sqlalchemy = ">=1.4.24,<2.0" +sqlalchemy-jsonfield = ">=1.0" +tabulate = ">=0.7.5" +tenacity = ">=6.2.0,<8.2.0 || >8.2.0" +termcolor = ">=1.1.0" +typing-extensions = ">=4.0.0" +unicodecsv = ">=0.14.1" +werkzeug = ">=2.0" + +[package.extras] +aiobotocore = ["aiobotocore (>=2.1.1)"] +airbyte = ["apache-airflow-providers-airbyte"] +alibaba = ["apache-airflow-providers-alibaba"] +all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "aiobotocore (>=2.1.1)", "aiohttp", "aiohttp (>=3.6.3,<4)", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.4.0)", "apache-airflow (>=2.7.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apache-sqoop", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-common-sql", "apache-airflow-providers-daskexecutor", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-plexus", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "arrow (>=0.16.0)", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=0.0.43,<0.1)", "azure-mgmt-containerinstance (>=1.5.0,<2.0)", "azure-mgmt-datafactory (>=1.0.0,<2.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-common (>=2.1.0)", "azure-storage-file (>=2.1.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "cloudant (>=2.0)", "cloudpickle (>=1.4.1)", "confluent-kafka (>=1.8.2)", "cryptography (>=2.0.0)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "datadog (>=0.14.0)", "distributed (>=2.11.1,!=2023.5.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "elasticsearch (>8,<9)", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "flask-appbuilder[oauth] (==4.3.6)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gevent (>=0.13)", "google-ads (>=21.2.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.11.0)", "google-cloud-bigquery-datatransfer (>=3.11.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.13.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.2)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.4.2)", "google-cloud-dataproc (>=5.4.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.14.1)", "google-cloud-orchestration-airflow (>=1.7.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.15.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "pdpyras (>=4.1.2)", "pinotdb (>0.4.7)", "plyvel", "presto-python-client (>=0.8.2)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive-pure-sasl] (>=0.7.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-toolbelt", "scrapbook[all]", "sendgrid (>=6.0.0)", "sentry-sdk (>=0.8.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.4.1)", "snowflake-sqlalchemy (>=1.1.0)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<2.1.0)", "zenpy (>=2.0.24)"] +all-dbs = ["aiohttp (>=3.6.3,<4)", "apache-airflow (>=2.4.0)", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-arangodb", "apache-airflow-providers-cloudant", "apache-airflow-providers-common-sql (>=1.3.1)", "apache-airflow-providers-common-sql (>=1.5.0)", "apache-airflow-providers-databricks", "apache-airflow-providers-exasol", "apache-airflow-providers-influxdb", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "cassandra-driver (>=3.13.0)", "cloudant (>=2.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "dnspython (>=1.13.0)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "pandas (>=0.17.1)", "pinotdb (>0.4.7)", "presto-python-client (>=0.8.2)", "psycopg2-binary (>=2.8.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pyhive[hive-pure-sasl] (>=0.7.0)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "python-arango (>=7.3.2)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "sqlalchemy-drill (>=1.1.0)", "thrift (>=0.9.2)", "trino (>=0.318.0)", "vertica-python (>=0.5.1)"] +amazon = ["apache-airflow-providers-amazon"] +apache-atlas = ["atlasclient (>=0.1.2)"] +apache-beam = ["apache-airflow-providers-apache-beam"] +apache-cassandra = ["apache-airflow-providers-apache-cassandra"] +apache-drill = ["apache-airflow-providers-apache-drill"] +apache-druid = ["apache-airflow-providers-apache-druid"] +apache-flink = ["apache-airflow-providers-apache-flink"] +apache-hdfs = ["apache-airflow-providers-apache-hdfs"] +apache-hive = ["apache-airflow-providers-apache-hive (>=5.1.0)"] +apache-impala = ["apache-airflow-providers-apache-impala"] +apache-kafka = ["apache-airflow-providers-apache-kafka"] +apache-kylin = ["apache-airflow-providers-apache-kylin"] +apache-livy = ["apache-airflow-providers-apache-livy"] +apache-pig = ["apache-airflow-providers-apache-pig"] +apache-pinot = ["apache-airflow-providers-apache-pinot"] +apache-spark = ["apache-airflow-providers-apache-spark"] +apache-sqoop = ["apache-airflow-providers-apache-sqoop"] +apache-webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] +apprise = ["apache-airflow-providers-apprise"] +arangodb = ["apache-airflow-providers-arangodb"] +asana = ["apache-airflow-providers-asana"] +async = ["eventlet (>=0.33.3)", "gevent (>=0.13)", "greenlet (>=0.4.9)"] +atlas = ["apache-airflow-providers-apache-atlas"] +atlassian-jira = ["apache-airflow-providers-atlassian-jira"] +aws = ["apache-airflow-providers-amazon"] +azure = ["apache-airflow-providers-microsoft-azure"] +cassandra = ["apache-airflow-providers-apache-cassandra"] +celery = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-celery", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "flower (>=1.0.0)"] +cgroups = ["cgroupspy (>=0.2.2)"] +cloudant = ["apache-airflow-providers-cloudant"] +cncf-kubernetes = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] +common-sql = ["apache-airflow-providers-common-sql"] +dask = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-daskexecutor", "cloudpickle (>=1.4.1)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "distributed (>=2.11.1,!=2023.5.0)"] +daskexecutor = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-daskexecutor", "cloudpickle (>=1.4.1)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "distributed (>=2.11.1,!=2023.5.0)"] +databricks = ["apache-airflow-providers-databricks"] +datadog = ["apache-airflow-providers-datadog"] +dbt-cloud = ["apache-airflow-providers-dbt-cloud"] +deprecated-api = ["requests (>=2.26.0)"] +devel = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.4.0)", "apache-airflow-providers-common-sql", "astroid (>=2.12.3)", "aws-xray-sdk", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "docutils (<0.17.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "ipdb", "jsonschema (>=3.0)", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[glue] (>=4.0)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysqlclient (>=1.3.6)", "openapi-spec-validator (>=0.2.8)", "pandas (>=0.17.1)", "pipdeptree", "pre-commit", "pyarrow (>=9.0.0)", "pygithub", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "pywinrm", "requests-mock", "rich-click (>=1.5)", "ruff (>=0.0.219)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] +devel-all = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "aiobotocore (>=2.1.1)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.4.0)", "apache-airflow (>=2.7.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apache-sqoop", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-common-sql", "apache-airflow-providers-daskexecutor", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-plexus", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "arrow (>=0.16.0)", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=0.0.43,<0.1)", "azure-mgmt-containerinstance (>=1.5.0,<2.0)", "azure-mgmt-datafactory (>=1.0.0,<2.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-common (>=2.1.0)", "azure-storage-file (>=2.1.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cloudpickle (>=1.4.1)", "confluent-kafka (>=1.8.2)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "datadog (>=0.14.0)", "distributed (>=2.11.1,!=2023.5.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "elasticsearch (>8,<9)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.6)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gevent (>=0.13)", "gitpython", "google-ads (>=21.2.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.11.0)", "google-cloud-bigquery-datatransfer (>=3.11.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.13.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.2)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.4.2)", "google-cloud-dataproc (>=5.4.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.14.1)", "google-cloud-orchestration-airflow (>=1.7.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.15.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "ipdb", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "jsonschema (>=3.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[glue] (>=4.0)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openapi-spec-validator (>=0.2.8)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "pdpyras (>=4.1.2)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.2)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "pywinrm", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "rich-click (>=1.5)", "ruff (>=0.0.219)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=0.8.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.4.1)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<2.1.0)", "wheel", "yamllint", "zenpy (>=2.0.24)"] +devel-ci = ["PyGithub (!=1.58)", "PyOpenSSL", "adal (>=1.2.7)", "aiobotocore (>=2.1.1)", "aiohttp", "aiohttp (>=3.6.3,<4)", "aioresponses", "alibabacloud-adb20211201 (>=1.0.0)", "alibabacloud-tea-openapi (>=0.3.7)", "amqp", "analytics-python (>=1.2.9)", "apache-airflow (>=2.4.0)", "apache-airflow (>=2.7.0)", "apache-airflow-providers-airbyte", "apache-airflow-providers-alibaba", "apache-airflow-providers-amazon", "apache-airflow-providers-apache-beam", "apache-airflow-providers-apache-cassandra", "apache-airflow-providers-apache-drill", "apache-airflow-providers-apache-druid", "apache-airflow-providers-apache-flink", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-apache-impala", "apache-airflow-providers-apache-kafka", "apache-airflow-providers-apache-kylin", "apache-airflow-providers-apache-livy", "apache-airflow-providers-apache-pig", "apache-airflow-providers-apache-pinot", "apache-airflow-providers-apache-spark", "apache-airflow-providers-apache-sqoop", "apache-airflow-providers-apprise", "apache-airflow-providers-arangodb", "apache-airflow-providers-asana", "apache-airflow-providers-atlassian-jira", "apache-airflow-providers-celery", "apache-airflow-providers-cloudant", "apache-airflow-providers-cncf-kubernetes", "apache-airflow-providers-common-sql", "apache-airflow-providers-daskexecutor", "apache-airflow-providers-databricks", "apache-airflow-providers-datadog", "apache-airflow-providers-dbt-cloud", "apache-airflow-providers-dingding", "apache-airflow-providers-discord", "apache-airflow-providers-docker", "apache-airflow-providers-elasticsearch", "apache-airflow-providers-exasol", "apache-airflow-providers-facebook", "apache-airflow-providers-ftp", "apache-airflow-providers-github", "apache-airflow-providers-google", "apache-airflow-providers-grpc", "apache-airflow-providers-hashicorp", "apache-airflow-providers-http", "apache-airflow-providers-imap", "apache-airflow-providers-influxdb", "apache-airflow-providers-jdbc", "apache-airflow-providers-jenkins", "apache-airflow-providers-microsoft-azure", "apache-airflow-providers-microsoft-mssql", "apache-airflow-providers-microsoft-psrp", "apache-airflow-providers-microsoft-winrm", "apache-airflow-providers-mongo", "apache-airflow-providers-mysql", "apache-airflow-providers-neo4j", "apache-airflow-providers-odbc", "apache-airflow-providers-openfaas", "apache-airflow-providers-openlineage", "apache-airflow-providers-opsgenie", "apache-airflow-providers-oracle", "apache-airflow-providers-pagerduty", "apache-airflow-providers-papermill", "apache-airflow-providers-plexus", "apache-airflow-providers-postgres", "apache-airflow-providers-presto", "apache-airflow-providers-redis", "apache-airflow-providers-salesforce", "apache-airflow-providers-samba", "apache-airflow-providers-segment", "apache-airflow-providers-sendgrid", "apache-airflow-providers-sftp", "apache-airflow-providers-singularity", "apache-airflow-providers-slack", "apache-airflow-providers-smtp", "apache-airflow-providers-snowflake", "apache-airflow-providers-sqlite", "apache-airflow-providers-ssh", "apache-airflow-providers-tableau", "apache-airflow-providers-tabular", "apache-airflow-providers-telegram", "apache-airflow-providers-trino", "apache-airflow-providers-vertica", "apache-airflow-providers-zendesk", "apache-beam (>=2.47.0)", "apprise", "arrow (>=0.16.0)", "asana (>=0.10,<4.0.0)", "asgiref", "asgiref (>=3.5.2)", "astroid (>=2.12.3)", "atlasclient (>=0.1.2)", "atlassian-python-api (>=1.14.2)", "attrs (>=22.2)", "authlib (>=1.0.0)", "aws-xray-sdk", "azure-batch (>=8.0.0)", "azure-cosmos (>=4.0.0)", "azure-datalake-store (>=0.0.45)", "azure-identity (>=1.3.1)", "azure-keyvault-secrets (>=4.1.0)", "azure-kusto-data (>=0.0.43,<0.1)", "azure-mgmt-containerinstance (>=1.5.0,<2.0)", "azure-mgmt-datafactory (>=1.0.0,<2.0)", "azure-mgmt-datalake-store (>=0.5.0)", "azure-mgmt-resource (>=2.2.0)", "azure-servicebus (>=7.6.1)", "azure-storage-blob (>=12.14.0)", "azure-storage-common (>=2.1.0)", "azure-storage-file (>=2.1.0)", "azure-storage-file-datalake (>=12.9.1)", "azure-synapse-spark", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "blinker (>=1.1)", "boto3 (>=1.28.0)", "botocore (>=1.31.0)", "cassandra-driver (>=3.13.0)", "celery (>=5.3.0,!=5.3.2,!=5.3.3,<6)", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "cloudant (>=2.0)", "cloudpickle (>=1.4.1)", "confluent-kafka (>=1.8.2)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "dask (>=2.9.0,!=2022.10.1,!=2023.5.0)", "databricks-sql-connector (>=2.0.0,<3.0.0)", "datadog (>=0.14.0)", "distributed (>=2.11.1,!=2023.5.0)", "dnspython (>=1.13.0)", "docker (>=5.0.3)", "docutils (<0.17.0)", "elasticsearch (>8,<9)", "eralchemy2", "eventlet (>=0.33.3)", "facebook-business (>=6.0.2)", "filelock", "flask-appbuilder[oauth] (==4.3.6)", "flask-bcrypt (>=0.7.1)", "flower (>=1.0.0)", "gcloud-aio-auth (>=4.0.0,<5.0.0)", "gcloud-aio-bigquery (>=6.1.2)", "gcloud-aio-storage", "gevent (>=0.13)", "gitpython", "google-ads (>=21.2.0)", "google-api-core (>=2.11.0)", "google-api-python-client (>=1.6.0)", "google-auth (>=1.0.0)", "google-auth (>=1.0.0,<3.0.0)", "google-auth-httplib2 (>=0.0.1)", "google-cloud-aiplatform (>=1.22.1)", "google-cloud-automl (>=2.11.0)", "google-cloud-bigquery-datatransfer (>=3.11.0)", "google-cloud-bigtable (>=2.17.0)", "google-cloud-build (>=3.13.0)", "google-cloud-compute (>=1.10.0)", "google-cloud-container (>=2.17.4)", "google-cloud-datacatalog (>=3.11.1)", "google-cloud-dataflow-client (>=0.8.2)", "google-cloud-dataform (>=0.5.0)", "google-cloud-dataplex (>=1.4.2)", "google-cloud-dataproc (>=5.4.0)", "google-cloud-dataproc-metastore (>=1.12.0)", "google-cloud-dlp (>=3.12.0)", "google-cloud-kms (>=2.15.0)", "google-cloud-language (>=2.9.0)", "google-cloud-logging (>=3.5.0)", "google-cloud-memcache (>=1.7.0)", "google-cloud-monitoring (>=2.14.1)", "google-cloud-orchestration-airflow (>=1.7.0)", "google-cloud-os-login (>=2.9.1)", "google-cloud-pubsub (>=2.15.0)", "google-cloud-redis (>=2.12.0)", "google-cloud-secret-manager (>=2.16.0)", "google-cloud-spanner (>=3.11.1)", "google-cloud-speech (>=2.18.0)", "google-cloud-storage (>=2.7.0)", "google-cloud-storage-transfer (>=1.4.1)", "google-cloud-tasks (>=2.13.0)", "google-cloud-texttospeech (>=2.14.1)", "google-cloud-translate (>=3.11.0)", "google-cloud-videointelligence (>=2.11.0)", "google-cloud-vision (>=3.4.0)", "google-cloud-workflows (>=1.10.0)", "greenlet (>=0.4.9)", "grpcio (>=1.15.0)", "grpcio-gcp (>=0.2.2)", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "httpx", "hvac (>=0.10)", "impyla (>=0.18.0,<1.0)", "influxdb-client (>=1.19.0)", "ipdb", "jaydebeapi (>=1.1.1)", "json-merge-patch (>=0.2)", "jsonpath-ng (>=1.5.3)", "jsonschema (>=3.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)", "kylinpy (>=2.6)", "ldap3 (>=2.5.1)", "looker-sdk (>=22.2.0)", "mongomock", "moto[glue] (>=4.0)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysqlclient (>=1.3.6)", "neo4j (>=4.2.1)", "openapi-spec-validator (>=0.2.8)", "openlineage-integration-common (>=0.28.0)", "openlineage-python (>=0.28.0)", "opentelemetry-exporter-prometheus", "opsgenie-sdk (>=2.1.5)", "oracledb (>=1.0.0)", "oss2 (>=2.14.0)", "pandas (>=0.17.1)", "pandas-gbq", "papermill[all] (>=1.2.1)", "paramiko (>=2.6.0)", "pdpyras (>=4.1.2)", "pinotdb (>0.4.7)", "pipdeptree", "plyvel", "pre-commit", "presto-python-client (>=0.8.2)", "proto-plus (>=1.19.6)", "psycopg2-binary (>=2.8.0)", "pyarrow (>=9.0.0)", "pydruid (>=0.4.1)", "pyexasol (>=0.5.1)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pykerberos (>=1.1.13)", "pymongo (>=3.6.0)", "pymssql (>=2.1.5)", "pyodbc", "pypsrp (>=0.8.0)", "pyspark", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "python-arango (>=7.3.2)", "python-dotenv (>=0.21.0)", "python-jenkins (>=1.0.0)", "python-ldap", "python-telegram-bot (>=20.0.0)", "pywinrm", "pywinrm (>=0.4)", "redis (>=4.5.2,!=4.5.5,<5.0.0)", "redshift-connector (>=2.0.888)", "requests (>=2.26.0)", "requests (>=2.27,<3)", "requests-kerberos (>=0.10.0)", "requests-mock", "requests-toolbelt", "rich-click (>=1.5)", "ruff (>=0.0.219)", "scrapbook[all]", "semver", "sendgrid (>=6.0.0)", "sentry-sdk (>=0.8.0)", "simple-salesforce (>=1.0.0)", "slack-sdk (>=3.0.0)", "smbprotocol (>=1.5.0)", "snowflake-connector-python (>=2.4.1)", "snowflake-sqlalchemy (>=1.1.0)", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "spython (>=0.0.56)", "sqlalchemy-bigquery (>=1.2.1)", "sqlalchemy-drill (>=1.1.0)", "sqlalchemy-redshift (>=0.8.6)", "sqlalchemy-spanner (>=1.6.2)", "sqlparse (>=0.4.2)", "sshtunnel (>=0.3.2)", "statsd (>=3.3.0)", "tableauserverclient", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "trino (>=0.318.0)", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "vertica-python (>=0.5.1)", "virtualenv", "watchtower (>=2.0.1,<2.1.0)", "wheel", "yamllint", "zenpy (>=2.0.24)"] +devel-hadoop = ["aiobotocore (>=2.1.1)", "aioresponses", "apache-airflow (>=2.4.0)", "apache-airflow-providers-apache-hdfs", "apache-airflow-providers-apache-hive", "apache-airflow-providers-common-sql", "apache-airflow-providers-presto", "apache-airflow-providers-trino", "astroid (>=2.12.3)", "aws-xray-sdk", "bcrypt (>=2.0.0)", "beautifulsoup4 (>=4.7.1)", "black", "blinker", "cgroupspy (>=0.2.2)", "checksumdir", "click (>=8.0)", "click (>=8.0,!=8.1.4,!=8.1.5)", "coverage (>=7.2)", "cryptography (>=2.0.0)", "docutils (<0.17.0)", "eralchemy2", "filelock", "flask-bcrypt (>=0.7.1)", "gitpython", "hdfs[avro,dataframe,kerberos] (>=2.0.4)", "hmsclient (>=0.1.0)", "impyla (>=0.18.0,<1.0)", "ipdb", "jsonschema (>=3.0)", "kubernetes (>=21.7.0,<24)", "mongomock", "moto[glue] (>=4.0)", "mypy (==1.2.0)", "mypy-boto3-appflow (>=1.28.0)", "mypy-boto3-rds (>=1.28.0)", "mypy-boto3-redshift-data (>=1.28.0)", "mypy-boto3-s3 (>=1.28.0)", "mysqlclient (>=1.3.6)", "openapi-spec-validator (>=0.2.8)", "pandas (>=0.17.1)", "pipdeptree", "pre-commit", "presto-python-client (>=0.8.2)", "pyarrow (>=9.0.0)", "pygithub", "pyhive[hive-pure-sasl] (>=0.7.0)", "pykerberos (>=1.1.13)", "pytest", "pytest-asyncio", "pytest-capture-warnings", "pytest-cov", "pytest-httpx", "pytest-instafail", "pytest-mock", "pytest-rerunfailures", "pytest-timeouts", "pytest-xdist", "pywinrm", "requests-kerberos (>=0.10.0)", "requests-mock", "rich-click (>=1.5)", "ruff (>=0.0.219)", "semver", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)", "thrift (>=0.9.2)", "thrift-sasl (>=0.2.0)", "time-machine", "towncrier", "twine", "types-Deprecated", "types-Markdown", "types-PyMySQL", "types-PyYAML", "types-certifi", "types-croniter", "types-docutils", "types-paramiko", "types-protobuf", "types-python-dateutil", "types-python-slugify", "types-pytz", "types-redis", "types-requests", "types-setuptools", "types-tabulate", "types-termcolor", "types-toml", "wheel", "yamllint"] +dingding = ["apache-airflow-providers-dingding"] +discord = ["apache-airflow-providers-discord"] +doc = ["astroid (>=2.12.3)", "checksumdir", "click (>=8.0,!=8.1.4,!=8.1.5)", "docutils (<0.17.0)", "eralchemy2", "sphinx (>=5.2.0)", "sphinx-airflow-theme", "sphinx-argparse (>=0.1.13)", "sphinx-autoapi (>=2.0.0)", "sphinx-copybutton", "sphinx-jinja (>=2.0)", "sphinx-rtd-theme (>=0.1.6)", "sphinxcontrib-httpdomain (>=1.7.0)", "sphinxcontrib-redoc (>=1.6.0)", "sphinxcontrib-spelling (>=7.3)"] +doc-gen = ["eralchemy2"] +docker = ["apache-airflow-providers-docker"] +druid = ["apache-airflow-providers-apache-druid"] +elasticsearch = ["apache-airflow-providers-elasticsearch"] +exasol = ["apache-airflow-providers-exasol"] +facebook = ["apache-airflow-providers-facebook"] +ftp = ["apache-airflow-providers-ftp"] +gcp = ["apache-airflow-providers-google"] +gcp-api = ["apache-airflow-providers-google"] +github = ["apache-airflow-providers-github"] +github-enterprise = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.6)"] +google = ["apache-airflow-providers-google"] +google-auth = ["authlib (>=1.0.0)", "flask-appbuilder[oauth] (==4.3.6)"] +grpc = ["apache-airflow-providers-grpc"] +hashicorp = ["apache-airflow-providers-hashicorp"] +hdfs = ["apache-airflow-providers-apache-hdfs"] +hive = ["apache-airflow-providers-apache-hive"] +http = ["apache-airflow-providers-http"] +imap = ["apache-airflow-providers-imap"] +influxdb = ["apache-airflow-providers-influxdb"] +jdbc = ["apache-airflow-providers-jdbc"] +jenkins = ["apache-airflow-providers-jenkins"] +kerberos = ["pykerberos (>=1.1.13)", "requests-kerberos (>=0.10.0)", "thrift-sasl (>=0.2.0)"] +kubernetes = ["apache-airflow (>=2.4.0)", "apache-airflow-providers-cncf-kubernetes", "asgiref (>=3.5.2)", "cryptography (>=2.0.0)", "kubernetes (>=21.7.0,<24)", "kubernetes-asyncio (>=18.20.1,<25)"] +ldap = ["ldap3 (>=2.5.1)", "python-ldap"] +leveldb = ["plyvel"] +microsoft-azure = ["apache-airflow-providers-microsoft-azure"] +microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] +microsoft-psrp = ["apache-airflow-providers-microsoft-psrp"] +microsoft-winrm = ["apache-airflow-providers-microsoft-winrm"] +mongo = ["apache-airflow-providers-mongo"] +mssql = ["apache-airflow-providers-microsoft-mssql"] +mysql = ["apache-airflow-providers-mysql"] +neo4j = ["apache-airflow-providers-neo4j"] +odbc = ["apache-airflow-providers-odbc"] +openfaas = ["apache-airflow-providers-openfaas"] +openlineage = ["apache-airflow-providers-openlineage"] +opsgenie = ["apache-airflow-providers-opsgenie"] +oracle = ["apache-airflow-providers-oracle"] +otel = ["opentelemetry-exporter-prometheus"] +pagerduty = ["apache-airflow-providers-pagerduty"] +pandas = ["pandas (>=0.17.1)", "pyarrow (>=9.0.0)"] +papermill = ["apache-airflow-providers-papermill"] +password = ["bcrypt (>=2.0.0)", "flask-bcrypt (>=0.7.1)"] +pinot = ["apache-airflow-providers-apache-pinot"] +plexus = ["apache-airflow-providers-plexus"] +postgres = ["apache-airflow-providers-postgres"] +presto = ["apache-airflow-providers-presto"] +qds = ["apache-airflow-providers-qubole"] +rabbitmq = ["amqp"] +redis = ["apache-airflow-providers-redis"] +s3 = ["apache-airflow-providers-amazon"] +salesforce = ["apache-airflow-providers-salesforce"] +samba = ["apache-airflow-providers-samba"] +segment = ["apache-airflow-providers-segment"] +sendgrid = ["apache-airflow-providers-sendgrid"] +sentry = ["blinker (>=1.1)", "sentry-sdk (>=0.8.0)"] +sftp = ["apache-airflow-providers-sftp"] +singularity = ["apache-airflow-providers-singularity"] +slack = ["apache-airflow-providers-slack"] +smtp = ["apache-airflow-providers-smtp"] +snowflake = ["apache-airflow-providers-snowflake"] +spark = ["apache-airflow-providers-apache-spark"] +sqlite = ["apache-airflow-providers-sqlite"] +ssh = ["apache-airflow-providers-ssh"] +statsd = ["statsd (>=3.3.0)"] +tableau = ["apache-airflow-providers-tableau"] +tabular = ["apache-airflow-providers-tabular"] +telegram = ["apache-airflow-providers-telegram"] +trino = ["apache-airflow-providers-trino"] +vertica = ["apache-airflow-providers-vertica"] +virtualenv = ["virtualenv"] +webhdfs = ["hdfs[avro,dataframe,kerberos] (>=2.0.4)"] +winrm = ["apache-airflow-providers-microsoft-winrm"] +zendesk = ["apache-airflow-providers-zendesk"] + +[[package]] +name = "apache-airflow-providers-common-sql" +version = "1.7.2" +description = "Provider for Apache Airflow. Implements apache-airflow-providers-common-sql package" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +apache-airflow = ">=2.4.0" +sqlparse = ">=0.4.2" + +[package.extras] +openlineage = ["apache-airflow-providers-openlineage"] +pandas = ["pandas (>=0.17.1)"] + +[[package]] +name = "apache-airflow-providers-ftp" +version = "3.5.2" +description = "Provider for Apache Airflow. Implements apache-airflow-providers-ftp package" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +apache-airflow = ">=2.4.0" + +[package.extras] +openlineage = ["apache-airflow-providers-openlineage"] + +[[package]] +name = "apache-airflow-providers-google" +version = "10.9.0" +description = "Provider for Apache Airflow. Implements apache-airflow-providers-google package" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +apache-airflow = ">=2.4.0" +apache-airflow-providers-common-sql = ">=1.7.2" +asgiref = ">=3.5.2" +gcloud-aio-auth = ">=4.0.0,<5.0.0" +gcloud-aio-bigquery = ">=6.1.2" +gcloud-aio-storage = "*" +google-ads = ">=21.2.0" +google-api-core = ">=2.11.0" +google-api-python-client = ">=1.6.0" +google-auth = ">=1.0.0" +google-auth-httplib2 = ">=0.0.1" +google-cloud-aiplatform = ">=1.22.1" +google-cloud-automl = ">=2.11.0" +google-cloud-batch = ">=0.13.0" +google-cloud-bigquery-datatransfer = ">=3.11.0" +google-cloud-bigtable = ">=2.17.0" +google-cloud-build = ">=3.13.0" +google-cloud-compute = ">=1.10.0" +google-cloud-container = ">=2.17.4" +google-cloud-datacatalog = ">=3.11.1" +google-cloud-dataflow-client = ">=0.8.2" +google-cloud-dataform = ">=0.5.0" +google-cloud-dataplex = ">=1.4.2" +google-cloud-dataproc = ">=5.4.0" +google-cloud-dataproc-metastore = ">=1.12.0" +google-cloud-dlp = ">=3.12.0" +google-cloud-kms = ">=2.15.0" +google-cloud-language = ">=2.9.0" +google-cloud-logging = ">=3.5.0" +google-cloud-memcache = ">=1.7.0" +google-cloud-monitoring = ">=2.14.1" +google-cloud-orchestration-airflow = ">=1.7.0" +google-cloud-os-login = ">=2.9.1" +google-cloud-pubsub = ">=2.15.0" +google-cloud-redis = ">=2.12.0" +google-cloud-run = ">=0.9.0" +google-cloud-secret-manager = ">=2.16.0" +google-cloud-spanner = ">=3.11.1" +google-cloud-speech = ">=2.18.0" +google-cloud-storage = ">=2.7.0" +google-cloud-storage-transfer = ">=1.4.1" +google-cloud-tasks = ">=2.13.0" +google-cloud-texttospeech = ">=2.14.1" +google-cloud-translate = ">=3.11.0" +google-cloud-videointelligence = ">=2.11.0" +google-cloud-vision = ">=3.4.0" +google-cloud-workflows = ">=1.10.0" +grpcio-gcp = ">=0.2.2" +httpx = "*" +json-merge-patch = ">=0.2" +looker-sdk = ">=22.2.0" +pandas = ">=0.17.1" +pandas-gbq = "*" +proto-plus = ">=1.19.6" +PyOpenSSL = "*" +sqlalchemy-bigquery = ">=1.2.1" +sqlalchemy-spanner = ">=1.6.2" + +[package.extras] +amazon = ["apache-airflow-providers-amazon (>=2.6.0)"] +apache-beam = ["apache-airflow-providers-apache-beam", "apache-beam[gcp]"] +apache-cassandra = ["apache-airflow-providers-apache-cassandra"] +cncf-kubernetes = ["apache-airflow-providers-cncf-kubernetes (>=7.2.0)"] +common-sql = ["apache-airflow-providers-common-sql"] +facebook = ["apache-airflow-providers-facebook (>=2.2.0)"] +leveldb = ["plyvel"] +microsoft-azure = ["apache-airflow-providers-microsoft-azure"] +microsoft-mssql = ["apache-airflow-providers-microsoft-mssql"] +mysql = ["apache-airflow-providers-mysql"] +openlineage = ["apache-airflow-providers-openlineage"] +oracle = ["apache-airflow-providers-oracle (>=3.1.0)"] +postgres = ["apache-airflow-providers-postgres"] +presto = ["apache-airflow-providers-presto"] +salesforce = ["apache-airflow-providers-salesforce"] +sftp = ["apache-airflow-providers-sftp"] +ssh = ["apache-airflow-providers-ssh"] +trino = ["apache-airflow-providers-trino"] + +[[package]] +name = "apache-airflow-providers-http" +version = "4.5.2" +description = "Provider for Apache Airflow. Implements apache-airflow-providers-http package" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +aiohttp = "*" +apache-airflow = ">=2.4.0" +asgiref = "*" +requests = ">=2.26.0" +requests-toolbelt = "*" + +[[package]] +name = "apache-airflow-providers-imap" +version = "3.3.2" +description = "Provider for Apache Airflow. Implements apache-airflow-providers-imap package" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +apache-airflow = ">=2.4.0" + +[[package]] +name = "apache-airflow-providers-sqlite" +version = "3.4.3" +description = "Provider for Apache Airflow. Implements apache-airflow-providers-sqlite package" +category = "dev" +optional = false +python-versions = "~=3.8" + +[package.dependencies] +apache-airflow = ">=2.4.0" +apache-airflow-providers-common-sql = ">=1.3.1" + +[package.extras] +common-sql = ["apache-airflow-providers-common-sql"] + +[[package]] +name = "apispec" +version = "6.3.0" +description = "A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification)." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +packaging = ">=21.3" +PyYAML = {version = ">=3.10", optional = true, markers = "extra == \"yaml\""} + +[package.extras] +dev = ["PyYAML (>=3.10)", "flake8 (==5.0.4)", "flake8-bugbear (==22.9.23)", "marshmallow (>=3.13.0)", "mypy (==0.982)", "openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)", "pre-commit (>=2.4,<3.0)", "pytest", "tox", "types-PyYAML"] +docs = ["marshmallow (>=3.13.0)", "pyyaml (==6.0)", "sphinx (==5.2.3)", "sphinx-issues (==3.0.1)", "sphinx-rtd-theme (==1.0.0)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.9.23)", "mypy (==0.982)", "pre-commit (>=2.4,<3.0)", "types-PyYAML"] +marshmallow = ["marshmallow (>=3.18.0)"] +tests = ["PyYAML (>=3.10)", "marshmallow (>=3.13.0)", "openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)", "pytest"] +validation = ["openapi-spec-validator (<0.5)", "prance[osv] (>=0.11)"] +yaml = ["PyYAML (>=3.10)"] + [[package]] name = "appdirs" version = "1.4.4" @@ -72,34 +497,51 @@ optional = false python-versions = "*" [[package]] -name = "astor" -version = "0.8.1" -description = "Read/rewrite/write Python ASTs" +name = "argcomplete" +version = "3.1.2" +description = "Bash tab completion for argparse" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] + +[[package]] +name = "asgiref" +version = "3.7.2" +description = "ASGI specs, helper code, and adapters" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.0" description = "Annotate AST trees with source code positions" category = "dev" optional = false python-versions = "*" [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] test = ["astroid", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "asyncinit" @@ -114,22 +556,22 @@ dev = ["pylint (>=2.1,<3.0)", "pytest (>=3.6,<4.0)"] [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "avro" -version = "1.11.1" +version = "1.11.3" description = "Avro is a serialization and RPC framework." category = "main" optional = false @@ -139,9 +581,17 @@ python-versions = ">=3.6" snappy = ["python-snappy"] zstandard = ["zstandard"] +[[package]] +name = "azure-common" +version = "1.1.28" +description = "Microsoft Azure Client Library for Python (Common)" +category = "main" +optional = false +python-versions = "*" + [[package]] name = "azure-core" -version = "1.26.3" +version = "1.29.4" description = "Microsoft Azure Core Library for Python" category = "main" optional = false @@ -150,14 +600,14 @@ python-versions = ">=3.7" [package.dependencies] requests = ">=2.18.4" six = ">=1.11.0" -typing-extensions = ">=4.0.1" +typing-extensions = ">=4.6.0" [package.extras] aio = ["aiohttp (>=3.0)"] [[package]] name = "azure-identity" -version = "1.12.0" +version = "1.14.0" description = "Microsoft Azure Identity Library for Python" category = "main" optional = false @@ -166,37 +616,60 @@ python-versions = ">=3.7" [package.dependencies] azure-core = ">=1.11.0,<2.0.0" cryptography = ">=2.5" -msal = ">=1.12.0,<2.0.0" +msal = ">=1.20.0,<2.0.0" msal-extensions = ">=0.3.0,<2.0.0" -six = ">=1.12.0" + +[[package]] +name = "azure-mgmt-core" +version = "1.4.0" +description = "Microsoft Azure Management Core Library for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +azure-core = ">=1.26.2,<2.0.0" + +[[package]] +name = "azure-mgmt-storage" +version = "20.1.0" +description = "Microsoft Azure Storage Management Client Library for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +azure-common = ">=1.1,<2.0" +azure-mgmt-core = ">=1.3.1,<2.0.0" +msrest = ">=0.6.21" [[package]] name = "azure-storage-blob" -version = "12.15.0" +version = "12.18.2" description = "Microsoft Azure Blob Storage Client Library for Python" category = "main" optional = false python-versions = ">=3.7" [package.dependencies] -azure-core = ">=1.26.0,<2.0.0" +azure-core = ">=1.28.0,<2.0.0" cryptography = ">=2.1.4" isodate = ">=0.6.1" -typing-extensions = ">=4.0.1" +typing-extensions = ">=4.3.0" [package.extras] -aio = ["azure-core[aio] (>=1.26.0,<2.0.0)"] +aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] [[package]] -name = "Babel" -version = "2.12.1" +name = "babel" +version = "2.13.0" description = "Internationalization utilities" category = "dev" optional = false python-versions = ">=3.7" -[package.dependencies] -pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "backcall" @@ -206,9 +679,17 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + [[package]] name = "beautifulsoup4" -version = "4.11.2" +version = "4.12.2" description = "Screen-scraping library" category = "dev" optional = false @@ -235,7 +716,6 @@ mypy-extensions = ">=0.4.3" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -243,43 +723,52 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "blinker" +version = "1.6.3" +description = "Fast, simple object-to-object and broadcast signaling" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "bokeh" -version = "1.4.0" +version = "3.2.2" description = "Interactive plots and applications in the browser from Python" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.9" [package.dependencies] -Jinja2 = ">=2.7" -numpy = ">=1.7.1" +contourpy = ">=1" +Jinja2 = ">=2.9" +numpy = ">=1.16" packaging = ">=16.8" -pillow = ">=4.0" -python-dateutil = ">=2.1" +pandas = ">=1.2" +pillow = ">=7.1.0" PyYAML = ">=3.10" -six = ">=1.5.2" -tornado = ">=4.3" +tornado = ">=5.1" +xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.26.88" +version = "1.28.62" description = "The AWS SDK for Python" category = "main" optional = false python-versions = ">= 3.7" [package.dependencies] -botocore = ">=1.29.88,<1.30.0" +botocore = ">=1.31.62,<1.32.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" +s3transfer = ">=0.7.0,<0.8.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.88" +version = "1.31.62" description = "Low-level, data-driven core of boto 3." category = "main" optional = false @@ -288,30 +777,60 @@ python-versions = ">= 3.7" [package.dependencies] jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +urllib3 = {version = ">=1.25.4,<2.1", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.16.9)"] +crt = ["awscrt (==0.16.26)"] [[package]] name = "bracex" -version = "2.3.post1" +version = "2.4" description = "Bash style brace expander." category = "dev" optional = false +python-versions = ">=3.8" + +[[package]] +name = "cachelib" +version = "0.10.2" +description = "A collection of cache libraries in the same API interface." +category = "dev" +optional = false python-versions = ">=3.7" [[package]] name = "cachetools" -version = "5.3.0" +version = "5.3.1" description = "Extensible memoizing collections and decorators" category = "main" optional = false -python-versions = "~=3.7" +python-versions = ">=3.7" + +[[package]] +name = "cattrs" +version = "23.1.2" +description = "Composable complex class support for attrs and dataclasses." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=20" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +bson = ["pymongo (>=4.2.0,<5.0.0)"] +cbor2 = ["cbor2 (>=5.4.6,<6.0.0)"] +msgpack = ["msgpack (>=1.0.2,<2.0.0)"] +orjson = ["orjson (>=3.5.2,<4.0.0)"] +pyyaml = ["PyYAML (>=6.0,<7.0)"] +tomlkit = ["tomlkit (>=0.11.4,<0.12.0)"] +ujson = ["ujson (>=5.4.0,<6.0.0)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false @@ -319,71 +838,96 @@ python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" [package.dependencies] pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +category = "dev" +optional = false +python-versions = ">=3.7" [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false python-versions = ">=3.7.0" [[package]] -name = "classify-imports" -version = "4.2.0" -description = "Utilities for refactoring imports in python-like syntax." -category = "dev" +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=3.7" +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + [[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" +name = "clickclick" +version = "20.10.2" +description = "Click utility functions" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = "*" [package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} +click = ">=4.0" +PyYAML = ">=3.11" [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +[[package]] +name = "colorlog" +version = "4.8.0" +description = "Log formatting with colors!" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + [[package]] name = "comm" -version = "0.1.2" +version = "0.1.4" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] +typing = ["mypy (>=0.990)"] [[package]] name = "commonmark" @@ -397,59 +941,150 @@ python-versions = "*" test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] -name = "coverage" -version = "7.2.1" -description = "Code coverage measurement for Python" +name = "configupdater" +version = "3.1.1" +description = "Parser like ConfigParser but for updating configuration files" category = "dev" optional = false -python-versions = ">=3.7" - -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} +python-versions = ">=3.6" [package.extras] -toml = ["tomli"] +testing = ["flake8", "pytest", "pytest-cov", "pytest-virtualenv", "pytest-xdist", "sphinx"] [[package]] -name = "cryptography" -version = "39.0.2" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" +name = "connexion" +version = "2.14.2" +description = "Connexion - API first applications with OpenAPI/Swagger and Flask" +category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -cffi = ">=1.12" +clickclick = ">=1.2,<21" +flask = ">=1.0.4,<2.3" +inflection = ">=0.3.1,<0.6" +itsdangerous = ">=0.24" +jsonschema = ">=2.5.1,<5" +packaging = ">=20" +PyYAML = ">=5.1,<7" +requests = ">=2.9.1,<3" +werkzeug = ">=1.0,<2.3" [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "check-manifest", "mypy", "ruff", "types-pytz", "types-requests"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist", "pytz"] -test-randomorder = ["pytest-randomly"] -tox = ["tox"] +aiohttp = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)"] +docs = ["sphinx-autoapi (==1.8.1)"] +flask = ["flask (>=1.0.4,<2.3)", "itsdangerous (>=0.24)"] +swagger-ui = ["swagger-ui-bundle (>=0.0.2,<0.1)"] +tests = ["MarkupSafe (>=0.23)", "aiohttp (>=2.3.10,<4)", "aiohttp-jinja2 (>=0.14.0,<2)", "aiohttp-remotes", "decorator (>=5,<6)", "flask (>=1.0.4,<2.3)", "itsdangerous (>=0.24)", "pytest (>=6,<7)", "pytest-aiohttp", "pytest-cov (>=2,<3)", "swagger-ui-bundle (>=0.0.2,<0.1)", "testfixtures (>=6,<7)"] [[package]] -name = "csscompressor" -version = "0.9.5" -description = "A python port of YUI CSS Compressor" -category = "dev" +name = "contourpy" +version = "1.1.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" + +[package.dependencies] +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] -name = "darglint" -version = "1.8.1" -description = "A utility for ensuring Google-style docstrings stay up to date with the source code." +name = "coverage" +version = "7.3.2" +description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.8" + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cron-descriptor" +version = "1.4.0" +description = "A Python library that converts cron expressions into human readable strings." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +dev = ["polib"] + +[[package]] +name = "croniter" +version = "1.4.1" +description = "croniter provides iteration for datetime object with cron like format" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +python-dateutil = "*" + +[[package]] +name = "cryptography" +version = "41.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "csscompressor" +version = "0.9.5" +description = "A python port of YUI CSS Compressor" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "darglint" +version = "1.8.1" +description = "A utility for ensuring Google-style docstrings stay up to date with the source code." +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "db-dtypes" +version = "1.1.1" +description = "Pandas Data Types for SQL systems (BigQuery, Spanner)" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.16.6" +packaging = ">=17.0" +pandas = ">=0.24.2" +pyarrow = ">=3.0.0" [[package]] name = "dbldatagen" -version = "0.3.1" +version = "0.3.5" description = "Databricks Labs - PySpark Synthetic Data Generator" category = "dev" optional = false @@ -457,11 +1092,11 @@ python-versions = ">=3.8.10" [[package]] name = "debugpy" -version = "1.6.6" +version = "1.8.0" description = "An implementation of the Debug Adapter Protocol for Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [[package]] name = "decorator" @@ -472,8 +1107,8 @@ optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" [[package]] -name = "Deprecated" -version = "1.2.13" +name = "deprecated" +version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." category = "main" optional = false @@ -483,12 +1118,12 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" wrapt = ">=1.10,<2" [package.extras] -dev = ["PyTest", "PyTest (<5)", "PyTest-Cov", "PyTest-Cov (<2.6)", "bump2version (<1)", "configparser (<5)", "importlib-metadata (<3)", "importlib-resources (<4)", "sphinx (<2)", "sphinxcontrib-websupport (<2)", "tox", "zipp (<2)"] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" +version = "0.3.7" +description = "serialize all of Python" category = "main" optional = false python-versions = ">=3.7" @@ -498,12 +1133,28 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.7" description = "Distribution utilities" category = "dev" optional = false python-versions = "*" +[[package]] +name = "dnspython" +version = "2.4.2" +description = "DNS toolkit" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.extras] +dnssec = ["cryptography (>=2.6,<42.0)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + [[package]] name = "docker-pycreds" version = "0.4.0" @@ -516,16 +1167,28 @@ python-versions = "*" six = ">=1.4.0" [[package]] -name = "eradicate" -version = "2.2.0" -description = "Removes commented-out code." +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" + +[[package]] +name = "email-validator" +version = "1.3.1" +description = "A robust email address syntax and deliverability validation library." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +dnspython = ">=1.15.0" +idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.1.0" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false @@ -534,337 +1197,1055 @@ python-versions = ">=3.7" [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "execnet" +version = "2.0.2" +description = "execnet: rapid multi-Python deployment" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + [[package]] name = "executing" -version = "1.2.0" +version = "2.0.0" description = "Get the currently executing AST node of a frame, and other information" category = "dev" optional = false python-versions = "*" [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "filelock" -version = "3.9.0" +version = "3.12.4" description = "A platform independent file lock." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] [[package]] name = "flake8" -version = "5.0.4" +version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8.1" [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.9.0,<2.10.0" -pyflakes = ">=2.5.0,<2.6.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.1.0,<3.2.0" [[package]] -name = "flake8-annotations" -version = "2.9.1" -description = "Flake8 Type Annotation Checks" +name = "flask" +version = "2.2.5" +description = "A simple framework for building complex web applications." category = "dev" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7" + +[package.dependencies] +click = ">=8.0" +itsdangerous = ">=2.0" +Jinja2 = ">=3.0" +Werkzeug = ">=2.2.2" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flask-appbuilder" +version = "4.3.6" +description = "Simple and rapid application development framework, built on top of Flask. includes detailed security, auto CRUD generation for your models, google charts and much more." +category = "dev" +optional = false +python-versions = "~=3.7" + +[package.dependencies] +apispec = {version = ">=6.0.0,<7", extras = ["yaml"]} +click = ">=8,<9" +colorama = ">=0.3.9,<1" +email-validator = ">=1.0.5,<2" +Flask = ">=2,<3" +Flask-Babel = ">=1,<3" +Flask-JWT-Extended = ">=4.0.0,<5.0.0" +Flask-Limiter = ">3,<4" +Flask-Login = ">=0.3,<0.7" +Flask-SQLAlchemy = ">=2.4,<3" +Flask-WTF = ">=0.14.2,<2" +jsonschema = ">=3,<5" +marshmallow = ">=3.18.0,<4" +marshmallow-sqlalchemy = ">=0.22.0,<0.27.0" +prison = ">=0.2.1,<1.0.0" +PyJWT = ">=2.0.0,<3.0.0" +python-dateutil = ">=2.3,<3" +SQLAlchemy = "<1.5" +sqlalchemy-utils = ">=0.32.21,<1" +WTForms = "<4" + +[package.extras] +jmespath = ["jmespath (>=0.9.5)"] +oauth = ["Authlib (>=0.14,<2.0.0)"] +openid = ["Flask-OpenID (>=1.2.5,<2)"] +talisman = ["flask-talisman (>=1.0.0,<2.0)"] + +[[package]] +name = "flask-babel" +version = "2.0.0" +description = "Adds i18n/l10n support to Flask applications" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +Babel = ">=2.3" +Flask = "*" +Jinja2 = ">=2.5" +pytz = "*" + +[package.extras] +dev = ["Pallets-Sphinx-Themes", "bumpversion", "ghp-import", "pytest", "pytest-mock", "sphinx"] + +[[package]] +name = "flask-caching" +version = "2.0.1" +description = "Adds caching support to Flask applications." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cachelib = ">=0.9.0" +Flask = "<3" + +[[package]] +name = "flask-jwt-extended" +version = "4.5.3" +description = "Extended JWT integration with Flask" +category = "dev" +optional = false +python-versions = ">=3.7,<4" [package.dependencies] -attrs = ">=21.4" -flake8 = ">=3.7" +Flask = ">=2.0,<4.0" +PyJWT = ">=2.0,<3.0" +Werkzeug = ">=0.14" + +[package.extras] +asymmetric-crypto = ["cryptography (>=3.3.1)"] [[package]] -name = "flake8-broken-line" +name = "flask-limiter" +version = "3.5.0" +description = "Rate limiting for flask applications" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Flask = ">=2" +limits = ">=2.8" +ordered-set = ">4,<5" +rich = ">=12,<14" +typing-extensions = ">=4" + +[package.extras] +memcached = ["limits[memcached]"] +mongodb = ["limits[mongodb]"] +redis = ["limits[redis]"] + +[[package]] +name = "flask-login" +version = "0.6.2" +description = "User authentication and session management for Flask." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Flask = ">=1.0.4" +Werkzeug = ">=1.0.1" + +[[package]] +name = "flask-session" version = "0.5.0" -description = "Flake8 plugin to forbid backslashes for line breaks" +description = "Server-side session support for Flask" category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7" + +[package.dependencies] +cachelib = "*" +flask = ">=2.2" + +[[package]] +name = "flask-sqlalchemy" +version = "2.5.1" +description = "Adds SQLAlchemy support to your Flask application." +category = "dev" +optional = false +python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" + +[package.dependencies] +Flask = ">=0.10" +SQLAlchemy = ">=0.8.0" + +[[package]] +name = "flask-wtf" +version = "1.2.1" +description = "Form rendering, validation, and CSRF protection for Flask with WTForms." +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +flask = "*" +itsdangerous = "*" +wtforms = "*" + +[package.extras] +email = ["email-validator"] + +[[package]] +name = "frozenlist" +version = "1.4.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "gcloud-aio-auth" +version = "4.2.3" +description = "Python Client for Google Cloud Auth" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + +[package.dependencies] +aiohttp = ">=3.3.0,<4.0.0" +backoff = ">=1.0.0,<3.0.0" +chardet = ">=2.0,<6.0" +cryptography = ">=2.0.0,<42.0.0" +pyjwt = ">=1.5.3,<3.0.0" +setuptools = ">=66.0.0,<67.0.0" + +[[package]] +name = "gcloud-aio-bigquery" +version = "7.0.0" +description = "Python Client for Google Cloud BigQuery" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +gcloud-aio-auth = ">=3.1.0,<6.0.0" + +[[package]] +name = "gcloud-aio-storage" +version = "9.0.0" +description = "Python Client for Google Cloud Storage" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +aiofiles = ">=0.6.0,<24.0.0" +gcloud-aio-auth = ">=3.6.0,<6.0.0" +pyasn1-modules = ">=0.2.1,<0.4.0" +rsa = ">=3.1.4,<5.0.0" + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.37" +description = "GitPython is a Python library used to interact with Git repositories" +category = "dev" +optional = false +python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3.5,<6" +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar"] [[package]] -name = "flake8-bugbear" -version = "22.7.1" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." +name = "google-ads" +version = "22.0.0" +description = "Client library for the Google Ads API" category = "dev" optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = ">=2.8.0,<=3.0.0" +google-auth-oauthlib = ">=0.3.0,<2.0.0" +googleapis-common-protos = ">=1.56.0,<2.0.0" +grpcio = ">=1.38.1,<2.0.0" +grpcio-status = ">=1.38.1,<2.0.0" +proto-plus = ">=1.19.6,<2.0.0" +protobuf = ">=3.12.0,<3.18.0 || >=3.20.0,<5.0.0dev" +PyYAML = ">=5.1,<7.0" +setuptools = ">=40.3.0" + +[package.extras] +tests = ["nox (>=2020.12.31,<2022.6)"] + +[[package]] +name = "google-api-core" +version = "2.12.0" +description = "Google API client core library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""} +grpcio-status = {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-api-python-client" +version = "2.102.0" +description = "Google API Client Library for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.19.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.1.0" +httplib2 = ">=0.15.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + +[[package]] +name = "google-auth" +version = "2.23.2" +description = "Google Authentication Library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-httplib2" +version = "0.1.1" +description = "Google Authentication Library: httplib2 transport" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-auth-oauthlib" +version = "0.8.0" +description = "Google Authentication Library" +category = "main" +optional = false python-versions = ">=3.6" [package.dependencies] -attrs = ">=19.2.0" -flake8 = ">=3.0.0" +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" [package.extras] -dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"] +tool = ["click (>=6.0.0)"] [[package]] -name = "flake8-class-attributes-order" -version = "0.1.3" -description = "A flake8 extension that checks classes attributes order" +name = "google-cloud-aiplatform" +version = "1.34.0" +description = "Vertex AI API client library" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -flake8 = "*" -typing-extensions = "*" +google-api-core = {version = ">=1.32.0,<2.0.0 || >=2.8.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-bigquery = ">=1.15.0,<4.0.0dev" +google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" +google-cloud-storage = ">=1.32.0,<3.0.0dev" +packaging = ">=14.3" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +shapely = "<2.0.0" + +[package.extras] +autologging = ["mlflow (>=1.27.0,<=2.1.1)"] +cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] +datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)"] +endpoint = ["requests (>=2.28.1)"] +full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.103.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (==0.0.11)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "importlib-metadata (<7.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (==5.3.1)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] +lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] +metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] +pipelines = ["pyyaml (==5.3.1)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.103.1)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +preview = ["cloudpickle (<3.0)", "google-cloud-logging (<4.0)", "importlib-metadata (<7.0)"] +private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] +ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "pandas (>=1.0.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)"] +tensorboard = ["tensorflow (>=2.3.0,<3.0.0dev)"] +testing = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.103.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (==0.0.11)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "importlib-metadata (<7.0)", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=10.0.1)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (==5.3.1)", "ray[default] (>=2.4,<2.5)", "ray[default] (>=2.5,<2.5.1)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<=2.12.0)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch", "torch (>=2.0.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost", "xgboost-ray"] +vizier = ["google-vizier (==0.0.11)", "google-vizier (==0.0.11)", "google-vizier (==0.0.4)", "google-vizier (>=0.1.6)"] +xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] + +[[package]] +name = "google-cloud-appengine-logging" +version = "1.3.2" +description = "Google Cloud Appengine Logging API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-audit-log" +version = "0.2.5" +description = "Google Cloud Audit Protos" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +googleapis-common-protos = ">=1.56.2,<2.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-automl" +version = "2.11.2" +description = "Google Cloud Automl API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[package.extras] +libcst = ["libcst (>=0.2.5)"] +pandas = ["pandas (>=1.0.5)"] +storage = ["google-cloud-storage (>=1.18.0,<3.0.0dev)"] + +[[package]] +name = "google-cloud-batch" +version = "0.17.1" +description = "Google Cloud Batch API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-bigquery" +version = "3.12.0" +description = "Google BigQuery API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.6.0,<3.0.0dev" +google-resumable-media = ">=0.6.0,<3.0dev" +grpcio = ">=1.47.0,<2.0dev" +packaging = ">=20.0.0" +proto-plus = ">=1.15.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +python-dateutil = ">=2.7.2,<3.0dev" +requests = ">=2.21.0,<3.0.0dev" + +[package.extras] +all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] + +[[package]] +name = "google-cloud-bigquery-datatransfer" +version = "3.12.1" +description = "Google Cloud Bigquery Datatransfer API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-bigquery-storage" +version = "2.22.0" +description = "Google Cloud Bigquery Storage API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[package.extras] +fastavro = ["fastavro (>=0.21.2)"] +pandas = ["pandas (>=0.21.1)"] +pyarrow = ["pyarrow (>=0.15.0)"] + +[[package]] +name = "google-cloud-bigtable" +version = "2.21.0" +description = "Google Cloud Bigtable API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.4.1,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[package.extras] +libcst = ["libcst (>=0.2.5)"] + +[[package]] +name = "google-cloud-build" +version = "3.20.0" +description = "Google Cloud Build API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-compute" +version = "1.14.1" +description = "Google Cloud Compute API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-container" +version = "2.32.0" +description = "Google Cloud Container API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-core" +version = "2.3.3" +description = "Google Cloud API client core library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)"] + +[[package]] +name = "google-cloud-datacatalog" +version = "3.16.0" +description = "Google Cloud Datacatalog API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-dataflow-client" +version = "0.8.4" +description = "Google Cloud Dataflow Client API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-dataform" +version = "0.5.3" +description = "Google Cloud Dataform API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-dataplex" +version = "1.6.3" +description = "Google Cloud Dataplex API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-dataproc" +version = "5.6.0" +description = "Google Cloud Dataproc API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-dataproc-metastore" +version = "1.13.0" +description = "Google Cloud Dataproc Metastore API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-dlp" +version = "3.12.3" +description = "Google Cloud Dlp API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-kms" +version = "2.19.1" +description = "Google Cloud Kms API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-language" +version = "2.11.1" +description = "Google Cloud Language API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-logging" +version = "3.8.0" +description = "Stackdriver Logging API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.33.2,<2.0.0 || >=2.8.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-appengine-logging = ">=0.1.0,<2.0.0dev" +google-cloud-audit-log = ">=0.1.0,<1.0.0dev" +google-cloud-core = ">=2.0.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-memcache" +version = "1.7.3" +description = "Google Cloud Memcache API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-cloud-monitoring" +version = "2.15.1" +description = "Stackdriver Monitoring API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +google-api-core = {version = ">=1.33.2,<2.0.0 || >=2.8.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[package.extras] +pandas = ["pandas (>=0.17.1)"] [[package]] -name = "flake8-comprehensions" -version = "3.10.0" -description = "A flake8 plugin to help you write better list/set/dict comprehensions." +name = "google-cloud-orchestration-airflow" +version = "1.9.2" +description = "Google Cloud Orchestration Airflow API client library" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3.0,<3.2.0 || >3.2.0" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-docstrings" -version = "1.7.0" -description = "Extension for flake8 which uses pydocstyle to check docstrings" +name = "google-cloud-os-login" +version = "2.10.0" +description = "Google Cloud Os Login API client library" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3" -pydocstyle = ">=2.1" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-eradicate" -version = "1.3.0" -description = "Flake8 plugin to find commented out code" +name = "google-cloud-pubsub" +version = "2.18.4" +description = "Google Cloud Pub/Sub API client library" category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7" [package.dependencies] -attrs = "*" -eradicate = ">=2.0,<3.0" -flake8 = ">=3.5,<6" -setuptools = "*" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +grpcio = ">=1.51.3,<2.0dev" +grpcio-status = ">=1.33.2" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -[[package]] -name = "flake8-plugin-utils" -version = "1.3.2" -description = "The package provides base classes and utils for flake8 plugin writing" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" +[package.extras] +libcst = ["libcst (>=0.3.10)"] [[package]] -name = "flake8-pytest-style" -version = "1.7.2" -description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests." +name = "google-cloud-redis" +version = "2.13.2" +description = "Google Cloud Redis API client library" category = "dev" optional = false -python-versions = ">=3.7.2,<4.0.0" +python-versions = ">=3.7" [package.dependencies] -flake8-plugin-utils = ">=1.3.2,<2.0.0" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-quotes" -version = "3.3.1" -description = "Flake8 lint for quotes." +name = "google-cloud-resource-manager" +version = "1.10.4" +description = "Google Cloud Resource Manager API client library" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] -flake8 = "*" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-simplify" -version = "0.19.3" -description = "flake8 plugin which checks for code that can be simplified" +name = "google-cloud-run" +version = "0.9.1" +description = "Google Cloud Run API client library" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] -astor = ">=0.1" -flake8 = ">=3.7" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-tidy-imports" -version = "4.8.0" -description = "A flake8 plugin that helps you write tidier imports." +name = "google-cloud-secret-manager" +version = "2.16.4" +description = "Google Cloud Secret Manager API client library" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3.8.0" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-type-checking" -version = "2.1.2" -description = "A flake8 plugin for managing type-checking imports & forward references" +name = "google-cloud-spanner" +version = "3.40.1" +description = "Google Cloud Spanner API client library" category = "dev" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.7" [package.dependencies] -astor = {version = "*", markers = "python_version < \"3.9\""} -classify-imports = "*" -flake8 = "*" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.4.1,<3.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +sqlparse = ">=0.4.4" + +[package.extras] +libcst = ["libcst (>=0.2.5)"] +tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0,<0.23dev)", "opentelemetry-sdk (>=1.1.0)"] [[package]] -name = "flake8-typing-imports" -version = "1.12.0" -description = "flake8 plugin which checks that typing imports are properly guarded" +name = "google-cloud-speech" +version = "2.21.0" +description = "Google Cloud Speech API client library" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3.8" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "flake8-use-fstring" -version = "1.4" -description = "Flake8 plugin for string formatting style." -category = "dev" +name = "google-cloud-storage" +version = "2.11.0" +description = "Google Cloud Storage API client library" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -flake8 = ">=3" +google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-resumable-media = ">=2.6.0" +requests = ">=2.18.0,<3.0.0dev" [package.extras] -ci = ["coverage (>=4.0.0,<5.0.0)", "coveralls", "flake8-builtins", "flake8-commas", "flake8-fixme", "flake8-print", "flake8-quotes", "flake8-todo", "pytest (>=4)", "pytest-cov (>=2)"] -dev = ["coverage (>=4.0.0,<5.0.0)", "flake8-builtins", "flake8-commas", "flake8-fixme", "flake8-print", "flake8-quotes", "flake8-todo", "pytest (>=4)", "pytest-cov (>=2)"] -test = ["coverage (>=4.0.0,<5.0.0)", "flake8-builtins", "flake8-commas", "flake8-fixme", "flake8-print", "flake8-quotes", "flake8-todo", "pytest (>=4)", "pytest-cov (>=2)"] - -[[package]] -name = "frozenlist" -version = "1.3.3" -description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" -optional = false -python-versions = ">=3.7" +protobuf = ["protobuf (<5.0.0dev)"] [[package]] -name = "ghp-import" -version = "2.1.0" -description = "Copy your docs directly to the gh-pages branch." +name = "google-cloud-storage-transfer" +version = "1.9.2" +description = "Google Cloud Storage Transfer API client library" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [package.dependencies] -python-dateutil = ">=2.8.1" - -[package.extras] -dev = ["flake8", "markdown", "twine", "wheel"] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "gitdb" -version = "4.0.10" -description = "Git Object Database" +name = "google-cloud-tasks" +version = "2.14.2" +description = "Google Cloud Tasks API client library" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -smmap = ">=3.0.1,<6" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "GitPython" -version = "3.1.31" -description = "GitPython is a Python library used to interact with Git repositories" +name = "google-cloud-texttospeech" +version = "2.14.2" +description = "Google Cloud Texttospeech API client library" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -gitdb = ">=4.0.1,<5" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "google-api-core" -version = "2.11.0" -description = "Google API client core library" -category = "main" +name = "google-cloud-translate" +version = "3.12.0" +description = "Google Cloud Translate API client library" +category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -google-auth = ">=2.14.1,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.3.0,<3.0.0dev" +proto-plus = ">=1.22.0,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)", "grpcio-status (>=1.49.1,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] [[package]] -name = "google-auth" -version = "2.14.1" -description = "Google Authentication Library" -category = "main" +name = "google-cloud-videointelligence" +version = "2.11.4" +description = "Google Cloud Videointelligence API client library" +category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" [package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "google-cloud-core" -version = "2.3.2" -description = "Google Cloud API client core library" -category = "main" +name = "google-cloud-vision" +version = "3.4.4" +description = "Google Cloud Vision API client library" +category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -google-api-core = ">=1.31.6,<2.0.0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)"] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] -name = "google-cloud-storage" -version = "2.7.0" -description = "Google Cloud Storage API client library" -category = "main" +name = "google-cloud-workflows" +version = "1.12.1" +description = "Google Cloud Workflows API client library" +category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" -google-cloud-core = ">=2.3.0,<3.0dev" -google-resumable-media = ">=2.3.2" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -protobuf = ["protobuf (<5.0.0dev)"] +google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" [[package]] name = "google-crc32c" @@ -877,9 +2258,17 @@ python-versions = ">=3.7" [package.extras] testing = ["pytest"] +[[package]] +name = "google-re2" +version = "1.1" +description = "RE2 Python bindings" +category = "dev" +optional = false +python-versions = "~=3.8" + [[package]] name = "google-resumable-media" -version = "2.4.1" +version = "2.6.0" description = "Utilities for Google Media Downloads and Resumable Uploads" category = "main" optional = false @@ -889,80 +2278,178 @@ python-versions = ">= 3.7" google-crc32c = ">=1.0,<2.0dev" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.58.0" +version = "1.60.0" description = "Common protobufs used in Google APIs" category = "main" optional = false python-versions = ">=3.7" [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "graphviz" +version = "0.20.1" +description = "Simple Python interface for Graphviz" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] +docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] + +[[package]] +name = "greenlet" +version = "3.0.0" +description = "Lightweight in-process concurrent programming" +category = "dev" +optional = false +python-versions = ">=3.7" [package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] [[package]] name = "griffe" -version = "0.25.5" +version = "0.36.5" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] colorama = ">=0.4" +[[package]] +name = "grpc-google-iam-v1" +version = "0.12.6" +description = "IAM API client library" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} +grpcio = ">=1.44.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "grpcio" +version = "1.59.0" +description = "HTTP/2-based RPC framework" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +protobuf = ["grpcio-tools (>=1.59.0)"] + +[[package]] +name = "grpcio-gcp" +version = "0.2.2" +description = "gRPC extensions for Google Cloud Platform" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +grpcio = ">=1.12.0" + +[[package]] +name = "grpcio-status" +version = "1.48.2" +description = "Status proto mapping for gRPC" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.48.2" +protobuf = ">=3.12.0" + +[[package]] +name = "gunicorn" +version = "21.2.0" +description = "WSGI HTTP Server for UNIX" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +packaging = "*" + [package.extras] -async = ["aiofiles (>=0.7,<1.0)"] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +tornado = ["tornado (>=0.2)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "dev" +optional = false +python-versions = ">=3.7" [[package]] name = "hail" -version = "0.2.109" +version = "0.2.124" description = "Scalable library for exploring and analyzing genomic data." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" [package.dependencies] +aiodns = ">=2.0.0,<3" aiohttp = ">=3.8.1,<4" -aiohttp-session = ">=2.7,<2.13" asyncinit = ">=0.2.4,<0.3" avro = ">=1.10,<1.12" azure-identity = ">=1.6.0,<2" +azure-mgmt-storage = "20.1.0" azure-storage-blob = ">=12.11.0,<13" -bokeh = "1.4.0" +bokeh = ">=3,<4" boto3 = ">=1.17,<2.0" botocore = ">=1.20,<2.0" decorator = "<5" Deprecated = ">=1.2.10,<1.3" -dill = ">=0.3.1.1,<0.4" +dill = ">=0.3.6,<0.4" frozenlist = ">=1.3.1,<2" -google-auth = "2.14.1" -google-cloud-storage = ">=1.25" +google-auth = ">=2.14.1,<3" +google-auth-oauthlib = ">=0.5.2,<1" +google-cloud-storage = ">=1.25.0" humanize = ">=1.0.0,<2" -"hurry.filesize" = ">=0.9,<1" janus = ">=0.6,<1.1" -Jinja2 = "3.0.3" +jproperties = ">=2.1.1,<3" nest-asyncio = ">=1.5.4,<2" numpy = "<2" orjson = ">=3.6.4,<4" -pandas = ">=1.3.0,<1.6.0" -parsimonious = "<0.9" -plotly = ">=5.5.0,<5.11" +pandas = ">=2,<3" +parsimonious = "<1" +plotly = ">=5.5.0,<6" protobuf = "3.20.2" -PyJWT = "*" -pyspark = ">=3.1.1,<3.2.0" +pyspark = ">=3.3.0,<3.4" python-json-logger = ">=2.0.2,<3" +pyyaml = ">=6.0,<7.0" requests = ">=2.25.1,<3" -rich = "12.6.0" -scipy = ">1.2,<1.10" +rich = ">=12.6.0,<13" +scipy = ">1.2,<1.12" sortedcontainers = ">=2.4.0,<3" tabulate = ">=0.8.9,<1" +typer = ">=0.9.0,<1" uvloop = {version = ">=0.16.0,<1", markers = "sys_platform != \"win32\""} [[package]] @@ -973,6 +2460,55 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "httpcore" +version = "0.18.0" +description = "A minimal low-level HTTP client." +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + +[[package]] +name = "httpx" +version = "0.25.0" +description = "The next generation HTTP client." +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +certifi = "*" +httpcore = ">=0.18.0,<0.19.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + [[package]] name = "humanize" version = "1.1.0" @@ -984,17 +2520,6 @@ python-versions = ">=3.5" [package.extras] tests = ["freezegun", "pytest", "pytest-cov"] -[[package]] -name = "hurry.filesize" -version = "0.9" -description = "A simple Python library for human readable file sizes (or anything sized in bytes)." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -setuptools = "*" - [[package]] name = "hydra-core" version = "1.3.2" @@ -1005,17 +2530,16 @@ python-versions = "*" [package.dependencies] antlr4-python3-runtime = ">=4.9.0,<4.10.0" -importlib-resources = {version = "*", markers = "python_version < \"3.9\""} omegaconf = ">=2.2,<2.4" packaging = "*" [[package]] name = "identify" -version = "2.5.19" +version = "2.5.30" description = "File identification library for Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] license = ["ukkonen"] @@ -1030,11 +2554,11 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "6.0.0" +version = "6.8.0" description = "Read metadata from Python packages" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] zipp = ">=0.5" @@ -1042,22 +2566,27 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.1.0" description = "Read resources from Python packages" -category = "main" +category = "dev" optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} +python-versions = ">=3.8" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + +[[package]] +name = "inflection" +version = "0.5.1" +description = "A port of Ruby on Rails inflector to Python" +category = "dev" +optional = false +python-versions = ">=3.5" [[package]] name = "iniconfig" @@ -1091,7 +2620,7 @@ tests = ["pytest", "pytest-cov", "pytest-mock"] [[package]] name = "ipykernel" -version = "6.21.3" +version = "6.25.2" description = "IPython Kernel for Jupyter" category = "dev" optional = false @@ -1121,17 +2650,18 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.11.0" +version = "8.16.1" description = "IPython: Productive Interactive Computing" category = "dev" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" [package.dependencies] appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} @@ -1142,9 +2672,9 @@ stack-data = "*" traitlets = ">=5" [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] @@ -1179,6 +2709,14 @@ pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib" plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "janus" version = "1.0.0" @@ -1192,27 +2730,27 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] -name = "Jinja2" -version = "3.0.3" +name = "jinja2" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -1230,12 +2768,23 @@ python-versions = ">=3.7" [[package]] name = "joblib" -version = "1.2.0" +version = "1.3.2" description = "Lightweight pipelining with Python functions" category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "jproperties" +version = "2.1.1" +description = "Java Property file parser and writer for Python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.13,<2.0" + [[package]] name = "jsmin" version = "3.0.1" @@ -1244,16 +2793,52 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "json-merge-patch" +version = "0.2" +description = "JSON Merge Patch library (https://tools.ietf.org/html/rfc7386)" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "jsonschema" +version = "4.19.1" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +referencing = ">=0.28.0" + [[package]] name = "jupyter-client" -version = "8.0.3" +version = "8.3.1" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false python-versions = ">=3.8" [package.dependencies] -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" @@ -1262,11 +2847,11 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.2.0" +version = "5.3.2" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" optional = false @@ -1274,16 +2859,89 @@ python-versions = ">=3.8" [package.dependencies] platformdirs = ">=2.5" -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} traitlets = ">=5.3" [package.extras] docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "limits" +version = "3.6.0" +description = "Rate limiting utilities" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +deprecated = ">=1.2" +importlib-resources = ">=1.3" +packaging = ">=21,<24" +typing-extensions = "*" + +[package.extras] +all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] +async-etcd = ["aetcd"] +async-memcached = ["emcache (>=0.6.1)", "emcache (>=1)"] +async-mongodb = ["motor (>=3,<4)"] +async-redis = ["coredis (>=3.4.0,<5)"] +etcd = ["etcd3"] +memcached = ["pymemcache (>3,<5.0.0)"] +mongodb = ["pymongo (>4.1,<5)"] +redis = ["redis (>3,!=4.5.2,!=4.5.3,<6.0.0)"] +rediscluster = ["redis (>=4.2.0,!=4.5.2,!=4.5.3)"] + +[[package]] +name = "linkify-it-py" +version = "2.0.2" +description = "Links recognition library with FULL unicode support." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +uc-micro-py = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] +doc = ["myst-parser", "sphinx", "sphinx-book-theme"] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "looker-sdk" +version = "23.16.0" +description = "Looker REST API" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +attrs = {version = ">=20.1.0", markers = "python_version >= \"3.7\""} +cattrs = {version = ">=1.3", markers = "python_version >= \"3.7\""} +requests = ">=2.22" +typing-extensions = ">=4.1.1" + [[package]] name = "lxml" -version = "4.9.2" +version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." category = "dev" optional = false @@ -1293,30 +2951,116 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] +source = ["Cython (>=0.29.35)"] [[package]] -name = "Markdown" -version = "3.3.7" -description = "Python implementation of Markdown." +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markdown" +version = "3.5" +description = "Python implementation of John Gruber's Markdown." +category = "dev" +optional = false +python-versions = ">=3.8" [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] -name = "MarkupSafe" -version = "2.1.2" +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "marshmallow" +version = "3.20.1" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "marshmallow-oneofschema" +version = "3.0.1" +description = "marshmallow multiplexing schema" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +marshmallow = ">=3.0.0,<4.0.0" + +[package.extras] +dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mock", "pre-commit (>=2.7,<3.0)", "pytest", "tox"] +lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.7,<3.0)"] +tests = ["mock", "pytest"] + +[[package]] +name = "marshmallow-sqlalchemy" +version = "0.26.1" +description = "SQLAlchemy integration with the marshmallow (de)serialization library" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +marshmallow = ">=3.0.0" +SQLAlchemy = ">=1.2.0" + +[package.extras] +dev = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.0,<3.0)", "pytest", "pytest-lazy-fixture", "tox"] +docs = ["alabaster (==0.7.12)", "sphinx (==4.0.2)", "sphinx-issues (==1.2.0)"] +lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.0,<3.0)"] +tests = ["pytest", "pytest-lazy-fixture"] + [[package]] name = "matplotlib-inline" version = "0.1.6" @@ -1336,6 +3080,30 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "mergedeep" version = "1.3.4" @@ -1346,7 +3114,7 @@ python-versions = ">=3.6" [[package]] name = "mkdocs" -version = "1.4.2" +version = "1.5.3" description = "Project documentation with Markdown." category = "dev" optional = false @@ -1356,18 +3124,20 @@ python-versions = ">=3.7" click = ">=7.0" colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} ghp-import = ">=1.0" -importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} jinja2 = ">=2.11.1" -markdown = ">=3.2.1,<3.4" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" mergedeep = ">=1.3.4" packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" pyyaml = ">=5.1" pyyaml-env-tag = ">=0.1" watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autolinks-plugin" @@ -1382,11 +3152,11 @@ mkdocs = ">=1.2.3" [[package]] name = "mkdocs-autorefs" -version = "0.4.1" +version = "0.5.0" description = "Automatically link across pages in MkDocs." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] Markdown = ">=3.3" @@ -1394,11 +3164,11 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-awesome-pages-plugin" -version = "2.8.0" +version = "2.9.2" description = "An MkDocs plugin that simplifies configuring page titles and their order" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] mkdocs = ">=1" @@ -1418,15 +3188,16 @@ mkdocs = "*" [[package]] name = "mkdocs-git-committers-plugin-2" -version = "1.1.1" -description = "An MkDocs plugin to create a list of contributors on the page" +version = "1.2.0" +description = "An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of github committers and other useful GIT info such as last modified date" category = "dev" optional = false -python-versions = ">=2.7" +python-versions = ">=3.8,<4" [package.dependencies] beautifulsoup4 = "*" gitpython = "*" +lxml = ">=4.9" mkdocs = ">=1.0.3" requests = "*" @@ -1446,26 +3217,33 @@ pytz = "*" [[package]] name = "mkdocs-material" -version = "9.1.2" +version = "9.4.4" description = "Documentation that simply works" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] -colorama = ">=0.4" -jinja2 = ">=3.0" -markdown = ">=3.2" -mkdocs = ">=1.4.2" -mkdocs-material-extensions = ">=1.1" -pygments = ">=2.14" -pymdown-extensions = ">=9.9.1" -regex = ">=2022.4.24" -requests = ">=2.26" +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<2.0" +mkdocs-material-extensions = ">=1.2,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] name = "mkdocs-material-extensions" -version = "1.1.1" +version = "1.2" description = "Extension pack for Python Markdown and MkDocs Material." category = "dev" optional = false @@ -1487,36 +3265,22 @@ mkdocs = ">=1.0.4" [[package]] name = "mkdocs-section-index" -version = "0.3.5" +version = "0.3.8" description = "MkDocs plugin to allow clickable sections that lead to an index page" category = "dev" optional = false python-versions = ">=3.7" -[package.dependencies] -mkdocs = ">=1.0.3" - -[[package]] -name = "mkdocs-simple-hooks" -version = "0.1.5" -description = "Define your own hooks for mkdocs, without having to create a new package." -category = "dev" -optional = false -python-versions = "*" - [package.dependencies] mkdocs = ">=1.2" -[package.extras] -test = ["pytest (>=4.0)", "pytest-cov"] - [[package]] name = "mkdocstrings" -version = "0.20.0" +version = "0.23.0" description = "Automatic documentation from sources, for MkDocs." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] Jinja2 = ">=2.11.1" @@ -1545,14 +3309,14 @@ mkdocstrings = ">=0.19" [[package]] name = "msal" -version = "1.21.0" -description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +version = "1.24.1" +description = "The Microsoft Authentication Library (MSAL) for Python library" category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7" [package.dependencies] -cryptography = ">=0.6,<41" +cryptography = ">=0.6,<44" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" @@ -1574,6 +3338,24 @@ portalocker = [ {version = ">=1.6,<3", markers = "python_version >= \"3.5\" and platform_system == \"Windows\""}, ] +[[package]] +name = "msrest" +version = "0.7.1" +description = "AutoRest swagger generator Python client runtime." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +azure-core = ">=1.24.0" +certifi = ">=2017.4.17" +isodate = ">=0.6.0" +requests = ">=2.16,<3.0" +requests-oauthlib = ">=0.5.0" + +[package.extras] +async = ["aiodns", "aiohttp (>=3.0)"] + [[package]] name = "multidict" version = "6.0.4" @@ -1610,7 +3392,7 @@ python-versions = ">=3.5" [[package]] name = "natsort" -version = "8.3.1" +version = "8.4.0" description = "Simple yet flexible natural sorting in Python." category = "dev" optional = false @@ -1622,7 +3404,7 @@ icu = ["PyICU (>=1.0.0)"] [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.5.8" description = "Patch asyncio to allow nested event loops" category = "main" optional = false @@ -1630,7 +3412,7 @@ python-versions = ">=3.5" [[package]] name = "nodeenv" -version = "1.7.0" +version = "1.8.0" description = "Node.js virtual environment builder" category = "dev" optional = false @@ -1641,11 +3423,24 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.24.2" +version = "1.26.0" description = "Fundamental package for array computing in Python" category = "main" optional = false -python-versions = ">=3.8" +python-versions = "<3.13,>=3.9" + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "omegaconf" @@ -1659,9 +3454,130 @@ python-versions = ">=3.6" antlr4-python3-runtime = ">=4.9.0,<4.10.0" PyYAML = ">=5.1.0" +[[package]] +name = "opentelemetry-api" +version = "1.20.0" +description = "OpenTelemetry Python API" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0,<7.0" + +[[package]] +name = "opentelemetry-exporter-otlp" +version = "1.20.0" +description = "OpenTelemetry Collector Exporters" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +opentelemetry-exporter-otlp-proto-grpc = "1.20.0" +opentelemetry-exporter-otlp-proto-http = "1.20.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.20.0" +description = "OpenTelemetry Protobuf encoding" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +opentelemetry-proto = "1.20.0" + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.20.0" +description = "OpenTelemetry Collector Protobuf over gRPC Exporter" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +grpcio = ">=1.0.0,<2.0.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.20.0" +opentelemetry-proto = "1.20.0" +opentelemetry-sdk = ">=1.20.0,<1.21.0" + +[package.extras] +test = ["pytest-grpc"] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.20.0" +description = "OpenTelemetry Collector Protobuf over HTTP Exporter" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +backoff = {version = ">=1.10.0,<3.0.0", markers = "python_version >= \"3.7\""} +deprecated = ">=1.2.6" +googleapis-common-protos = ">=1.52,<2.0" +opentelemetry-api = ">=1.15,<2.0" +opentelemetry-exporter-otlp-proto-common = "1.20.0" +opentelemetry-proto = "1.20.0" +opentelemetry-sdk = ">=1.20.0,<1.21.0" +requests = ">=2.7,<3.0" + +[package.extras] +test = ["responses (==0.22.0)"] + +[[package]] +name = "opentelemetry-proto" +version = "1.20.0" +description = "OpenTelemetry Python Proto" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +protobuf = ">=3.19,<5.0" + +[[package]] +name = "opentelemetry-sdk" +version = "1.20.0" +description = "OpenTelemetry Python SDK" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +opentelemetry-api = "1.20.0" +opentelemetry-semantic-conventions = "0.41b0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.41b0" +description = "OpenTelemetry Semantic Conventions" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +dev = ["black", "mypy", "pytest"] + [[package]] name = "orjson" -version = "3.8.7" +version = "3.9.7" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" category = "main" optional = false @@ -1669,42 +3585,92 @@ python-versions = ">=3.7" [[package]] name = "packaging" -version = "23.0" +version = "23.2" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "pandas" -version = "1.4.4" +version = "2.1.1" description = "Powerful data structures for data analysis, time series, and statistics" category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" [package.dependencies] -numpy = [ - {version = ">=1.18.5", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, - {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, - {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, -] -python-dateutil = ">=2.8.1" +numpy = {version = ">=1.22.4", markers = "python_version < \"3.11\""} +python-dateutil = ">=2.8.2" pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + +[[package]] +name = "pandas-gbq" +version = "0.19.2" +description = "Google BigQuery connector for pandas" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +db-dtypes = ">=1.0.4,<2.0.0" +google-api-core = ">=2.10.2,<3.0.0dev" +google-auth = ">=2.13.0" +google-auth-oauthlib = ">=0.7.0" +google-cloud-bigquery = ">=3.3.5,<4.0.0dev" +google-cloud-bigquery-storage = ">=2.16.2,<3.0.0dev" +numpy = ">=1.16.6" +pandas = ">=1.1.4" +pyarrow = ">=3.0.0" +pydata-google-auth = ">=1.5.0" +setuptools = "*" [package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] +tqdm = ["tqdm (>=4.23.0)"] [[package]] name = "parsimonious" -version = "0.8.1" +version = "0.10.0" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" category = "main" optional = false python-versions = "*" [package.dependencies] -six = ">=1.9.0" +regex = ">=2022.3.15" [[package]] name = "parso" @@ -1720,7 +3686,7 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.0" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false @@ -1734,6 +3700,18 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + [[package]] name = "pep8-naming" version = "0.13.3" @@ -1765,47 +3743,48 @@ optional = false python-versions = "*" [[package]] -name = "Pillow" -version = "9.4.0" +name = "pillow" +version = "10.0.1" description = "Python Imaging Library (Fork)" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "platformdirs" -version = "3.1.1" +version = "3.11.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "plotly" -version = "5.10.0" +version = "5.17.0" description = "An open-source, interactive data visualization library for Python" category = "main" optional = false python-versions = ">=3.6" [package.dependencies] +packaging = "*" tenacity = ">=6.2.0" [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [package.extras] dev = ["pre-commit", "tox"] @@ -1813,11 +3792,11 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.7.0" +version = "2.8.2" description = "Wraps the portalocker recipe for easy usage" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" [package.dependencies] pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} @@ -1825,7 +3804,7 @@ pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} [package.extras] docs = ["sphinx (>=1.7.1)"] redis = ["redis"] -tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] [[package]] name = "pre-commit" @@ -1842,9 +3821,23 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prison" +version = "0.2.1" +description = "Rison encoder/decoder" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +dev = ["nose", "pipreqs", "twine"] + [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false @@ -1853,6 +3846,20 @@ python-versions = ">=3.7.0" [package.dependencies] wcwidth = "*" +[[package]] +name = "proto-plus" +version = "1.22.3" +description = "Beautiful, Pythonic protocol buffers." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + [[package]] name = "protobuf" version = "3.20.2" @@ -1863,7 +3870,7 @@ python-versions = ">=3.7" [[package]] name = "psutil" -version = "5.9.4" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." category = "dev" optional = false @@ -1901,7 +3908,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "py4j" -version = "0.10.9" +version = "0.10.9.5" description = "Enables Python programs to dynamically access arbitrary Java objects" category = "main" optional = false @@ -1920,30 +3927,44 @@ numpy = ">=1.16.6" [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.6.0" + +[[package]] +name = "pycares" +version = "4.4.0" +description = "Python interface for c-ares" +category = "main" +optional = false +python-versions = ">=3.8" [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" +cffi = ">=1.5.0" + +[package.extras] +idna = ["idna (>=2.1)"] [[package]] name = "pycodestyle" -version = "2.9.1" +version = "2.11.0" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [[package]] name = "pycparser" @@ -1954,41 +3975,67 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] -name = "pydocstyle" -version = "6.3.0" -description = "Python docstring style checker" +name = "pydantic" +version = "2.4.2" +description = "Data validation using Python type hints" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -snowballstemmer = ">=2.2.0" +annotated-types = ">=0.4.0" +pydantic-core = "2.10.1" +typing-extensions = ">=4.6.1" [package.extras] -toml = ["tomli (>=1.2.3)"] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.10.1" +description = "" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydata-google-auth" +version = "1.8.2" +description = "PyData helpers for authenticating to Google APIs" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +google-auth = {version = ">=1.25.0,<3.0dev", markers = "python_version >= \"3.6\""} +google-auth-oauthlib = {version = ">=0.4.0", markers = "python_version >= \"3.6\""} +setuptools = "*" [[package]] name = "pyflakes" -version = "2.5.0" +version = "3.1.0" description = "passive checker of Python programs" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [[package]] -name = "Pygments" -version = "2.14.0" +name = "pygments" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] plugins = ["importlib-metadata"] [[package]] -name = "PyJWT" -version = "2.6.0" +name = "pyjwt" +version = "2.8.0" description = "JSON Web Token implementation in Python" category = "main" optional = false @@ -2013,19 +4060,37 @@ python-versions = "*" [[package]] name = "pymdown-extensions" -version = "9.10" +version = "10.3" description = "Extension pack for Python Markdown." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] markdown = ">=3.2" pyyaml = "*" +[package.extras] +extra = ["pygments (>=2.12)"] + +[[package]] +name = "pyopenssl" +version = "23.2.0" +description = "Python wrapper module around the OpenSSL library" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false @@ -2036,30 +4101,30 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyspark" -version = "3.1.3" +version = "3.3.0" description = "Apache Spark Python API" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] -py4j = "0.10.9" +py4j = "0.10.9.5" [package.extras] -ml = ["numpy (>=1.7)"] -mllib = ["numpy (>=1.7)"] -sql = ["pandas (>=0.23.2)", "pyarrow (>=1.0.0)"] +ml = ["numpy (>=1.15)"] +mllib = ["numpy (>=1.15)"] +pandas-on-spark = ["numpy (>=1.15)", "pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] +sql = ["pandas (>=1.0.5)", "pyarrow (>=1.0.0)"] [[package]] name = "pytest" -version = "7.2.2" +version = "7.4.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -2068,15 +4133,15 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.0.0" +version = "4.1.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] coverage = {version = ">=5.2.1", extras = ["toml"]} @@ -2087,16 +4152,53 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-sugar" -version = "0.9.6" +version = "0.9.7" description = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." category = "dev" optional = false python-versions = "*" [package.dependencies] -packaging = ">=14.1" -pytest = ">=2.9" -termcolor = ">=1.1.0" +packaging = ">=21.3" +pytest = ">=6.2.0" +termcolor = ">=2.1.0" + +[package.extras] +dev = ["black", "flake8", "pre-commit"] + +[[package]] +name = "pytest-xdist" +version = "3.3.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +execnet = ">=1.1" +pytest = ">=6.2.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + +[[package]] +name = "python-daemon" +version = "3.0.1" +description = "Library to implement a well-behaved Unix daemon process." +category = "dev" +optional = false +python-versions = ">=3" + +[package.dependencies] +docutils = "*" +lockfile = ">=0.10" +setuptools = ">=62.4.0" + +[package.extras] +devel = ["coverage", "docutils", "isort", "testscenarios (>=0.4)", "testtools", "twine"] +test = ["coverage", "docutils", "testscenarios (>=0.4)", "testtools"] [[package]] name = "python-dateutil" @@ -2117,32 +4219,66 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "python-nvd3" +version = "0.15.0" +description = "Python NVD3 - Chart Library for d3.js" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +Jinja2 = ">=2.8" +python-slugify = ">=1.2.5" + +[[package]] +name = "python-slugify" +version = "8.0.1" +description = "A Python slugify application that also handles Unicode" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +text-unidecode = ">=1.3" + +[package.extras] +unidecode = ["Unidecode (>=1.1.1)"] + [[package]] name = "pytz" -version = "2022.7.1" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pywin32" -version = "305" +version = "306" description = "Python for Window Extensions" category = "dev" optional = false python-versions = "*" [[package]] -name = "PyYAML" -version = "6.0" +name = "pyyaml" +version = "6.0.1" description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" [[package]] -name = "pyyaml_env_tag" +name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " category = "dev" @@ -2154,7 +4290,7 @@ pyyaml = "*" [[package]] name = "pyzmq" -version = "25.0.0" +version = "25.1.1" description = "Python bindings for 0MQ" category = "dev" optional = false @@ -2163,32 +4299,81 @@ python-versions = ">=3.6" [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} +[[package]] +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" -version = "2022.10.31" +version = "2023.10.3" description = "Alternative regular expression module, to replace re." -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = "*" + [[package]] name = "rich" version = "12.6.0" @@ -2200,11 +4385,29 @@ python-versions = ">=3.6.3,<4.0.0" [package.dependencies] commonmark = ">=0.9.0,<0.10.0" pygments = ">=2.6.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} [package.extras] jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] +[[package]] +name = "rich-argparse" +version = "1.3.0" +description = "Rich help formatters for argparse and optparse" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +rich = ">=11.0.0" + +[[package]] +name = "rpds-py" +version = "0.10.4" +description = "Python bindings to Rust's persistent data structures (rpds)" +category = "dev" +optional = false +python-versions = ">=3.8" + [[package]] name = "rsa" version = "4.9" @@ -2216,9 +4419,17 @@ python-versions = ">=3.6,<4" [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "ruff" +version = "0.0.287" +description = "An extremely fast Python linter, written in Rust." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "s3transfer" -version = "0.6.0" +version = "0.7.0" description = "An Amazon S3 Transfer Manager" category = "main" optional = false @@ -2232,7 +4443,7 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] [[package]] name = "scikit-learn" -version = "1.2.1" +version = "1.3.1" description = "A set of python modules for machine learning and data mining" category = "main" optional = false @@ -2240,35 +4451,35 @@ python-versions = ">=3.8" [package.dependencies] joblib = ">=1.1.1" -numpy = ">=1.17.3" -scipy = ">=1.3.2" +numpy = ">=1.17.3,<2.0" +scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" [package.extras] benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] [[package]] name = "scipy" -version = "1.9.3" +version = "1.11.3" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false -python-versions = ">=3.8" +python-versions = "<3.13,>=3.9" [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.21.6,<1.28.0" [package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "sentry-sdk" -version = "1.14.0" +version = "1.31.0" description = "Python client for Sentry (https://sentry.io)" category = "dev" optional = false @@ -2280,16 +4491,23 @@ urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] -flask = ["blinker (>=1.1)", "flask (>=0.11)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -2303,7 +4521,7 @@ tornado = ["tornado (>=5)"] [[package]] name = "setproctitle" -version = "1.3.2" +version = "1.3.3" description = "A Python module to customize the process title" category = "dev" optional = false @@ -2314,9 +4532,9 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "67.6.0" +version = "66.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -2325,49 +4543,181 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-g testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" +[[package]] +name = "shapely" +version = "1.8.5.post1" +description = "Geometric objects, predicates, and operations" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +all = ["numpy", "pytest", "pytest-cov"] +test = ["pytest", "pytest-cov"] +vectorized = ["numpy"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "sqlalchemy" +version = "1.4.49" +description = "Database Abstraction Library" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "sqlalchemy-bigquery" +version = "1.8.0" +description = "SQLAlchemy dialect for BigQuery" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7, <3.12" + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0.0dev" +google-cloud-bigquery = ">=2.25.2,<4.0.0dev" +packaging = "*" +sqlalchemy = ">=1.2.0,<2.0.0dev" + +[package.extras] +alembic = ["alembic"] +all = ["GeoAlchemy2", "alembic", "google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "packaging", "pyarrow (>=3.0.0)", "pytz", "shapely"] +bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geography = ["GeoAlchemy2", "shapely"] +tests = ["packaging", "pytz"] [[package]] -name = "smmap" -version = "5.0.0" -description = "A pure Python implementation of a sliding window memory map manager" +name = "sqlalchemy-jsonfield" +version = "1.0.1.post0" +description = "SQLALchemy JSONField implementation for storing dicts at SQL" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7.0" + +[package.dependencies] +sqlalchemy = "*" [[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +name = "sqlalchemy-spanner" +version = "1.6.2" +description = "SQLAlchemy dialect integrated into Cloud Spanner database" category = "dev" optional = false python-versions = "*" +[package.dependencies] +alembic = "*" +google-cloud-spanner = ">=3.12.0" +sqlalchemy = ">=1.1.13" + +[package.extras] +tracing = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] + [[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" +name = "sqlalchemy-utils" +version = "0.41.1" +description = "Various utility functions for SQLAlchemy." +category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" -[[package]] -name = "soupsieve" -version = "2.4" -description = "A modern CSS selector implementation for Beautiful Soup." +[package.dependencies] +SQLAlchemy = ">=1.3" + +[package.extras] +arrow = ["arrow (>=0.3.4)"] +babel = ["Babel (>=1.3)"] +color = ["colour (>=0.0.4)"] +encrypted = ["cryptography (>=0.6)"] +intervals = ["intervals (>=0.7.1)"] +password = ["passlib (>=1.6,<2.0)"] +pendulum = ["pendulum (>=2.0.5)"] +phone = ["phonenumbers (>=5.9.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +timezone = ["python-dateutil"] +url = ["furl (>=0.4.1)"] + +[[package]] +name = "sqlparse" +version = "0.4.4" +description = "A non-validating SQL parser." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" + +[package.extras] +dev = ["build", "flake8"] +doc = ["sphinx"] +test = ["pytest", "pytest-cov"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" category = "dev" optional = false @@ -2394,18 +4744,18 @@ widechars = ["wcwidth"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "termcolor" -version = "2.2.0" +version = "2.3.0" description = "ANSI color formatting for output in terminal" category = "dev" optional = false @@ -2414,13 +4764,21 @@ python-versions = ">=3.7" [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "threadpoolctl" -version = "3.1.0" +version = "3.2.0" description = "threadpoolctl" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" [[package]] name = "toml" @@ -2440,44 +4798,98 @@ python-versions = ">=3.7" [[package]] name = "tornado" -version = "6.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "main" optional = false -python-versions = ">= 3.7" +python-versions = ">= 3.8" [[package]] name = "traitlets" -version = "5.9.0" +version = "5.11.2" description = "Traitlets Python configuration system" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] [[package]] name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" category = "main" optional = false +python-versions = ">=2" + +[[package]] +name = "uc-micro-py" +version = "1.0.2" +description = "Micro subset of unicode data files for linkify-it-py projects." +category = "dev" +optional = false python-versions = ">=3.7" +[package.extras] +test = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "unicodecsv" +version = "0.14.1" +description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "urllib3" -version = "1.26.14" +version = "2.0.6" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvloop" @@ -2494,20 +4906,20 @@ test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "my [[package]] name = "virtualenv" -version = "20.20.0" +version = "20.24.5" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<4" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "wandb" @@ -2523,17 +4935,13 @@ Click = ">=7.0,<8.0.0 || >8.0.0" docker-pycreds = ">=0.4.0" GitPython = ">=1.0.0,<3.1.29 || >3.1.29" pathtools = "*" -protobuf = [ - {version = ">=3.12.0,<4.21.0 || >4.21.0,<5", markers = "python_version < \"3.9\" and sys_platform == \"linux\""}, - {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "sys_platform != \"linux\""}, -] +protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} psutil = ">=5.0.0" PyYAML = "*" requests = ">=2.0.0,<3" sentry-sdk = ">=1.0.0" setproctitle = "*" setuptools = "*" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] aws = ["boto3"] @@ -2548,34 +4956,48 @@ sweeps = ["sweeps (>=0.2.0)"] [[package]] name = "watchdog" -version = "2.3.1" +version = "3.0.0" description = "Filesystem events monitoring" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcmatch" -version = "8.4.1" +version = "8.5" description = "Wildcard/glob file name matcher." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.dependencies] bracex = ">=2.1.1" [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.8" description = "Measures the displayed width of unicode strings in a terminal" category = "dev" optional = false python-versions = "*" +[[package]] +name = "werkzeug" +version = "2.2.3" +description = "The comprehensive WSGI web application library." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog"] + [[package]] name = "wrapt" version = "1.15.0" @@ -2584,9 +5006,23 @@ category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +[[package]] +name = "wtforms" +version = "3.0.1" +description = "Form validation and rendering for Python web development." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = "*" + +[package.extras] +email = ["email-validator"] + [[package]] name = "xgboost" -version = "1.7.4" +version = "1.7.6" description = "XGBoost Python Package" category = "main" optional = false @@ -2604,9 +5040,17 @@ plotting = ["graphviz", "matplotlib"] pyspark = ["cloudpickle", "pyspark", "scikit-learn"] scikit-learn = ["scikit-learn"] +[[package]] +name = "xyzservices" +version = "2023.10.0" +description = "Source of XYZ tiles providers" +category = "main" +optional = false +python-versions = ">=3.8" + [[package]] name = "yarl" -version = "1.8.2" +version = "1.9.2" description = "Yet another URL library" category = "main" optional = false @@ -2618,122 +5062,170 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" +category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "1.1" -python-versions = "3.8.15" -content-hash = "48a8e2f5ba5857a64adb43bdf1fc6322af7bb00ad9f7fe0fba5853546fa33f84" +python-versions = "3.10.8" +content-hash = "0a6d32ddb97c6fa78e9b4ca7c7465b962634f0a7f292ddd4524ff10fd26a0939" [metadata.files] +aiodns = [ + {file = "aiodns-2.0.0-py2.py3-none-any.whl", hash = "sha256:aaa5ac584f40fe778013df0aa6544bf157799bd3f608364b451840ed2c8688de"}, + {file = "aiodns-2.0.0.tar.gz", hash = "sha256:815fdef4607474295d68da46978a54481dd1e7be153c7d60f9e72773cd38d77d"}, +] +aiofiles = [ + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, +] aiohttp = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, -] -aiohttp-session = [ - {file = "aiohttp-session-2.12.0.tar.gz", hash = "sha256:0ccd11a7c77cb9e5a61f4daacdc9170d561112f9cfaf9e9a2d9867c0587d1950"}, - {file = "aiohttp_session-2.12.0-py3-none-any.whl", hash = "sha256:f0bf0caa2f5b5a56cb50a45f98d61f60d8523322099a2857410530149706f5e5"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, ] aiosignal = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, ] +alembic = [ + {file = "alembic-1.12.0-py3-none-any.whl", hash = "sha256:03226222f1cf943deee6c85d9464261a6c710cd19b4fe867a3ad1f25afda610f"}, + {file = "alembic-1.12.0.tar.gz", hash = "sha256:8e7645c32e4f200675e69f0745415335eb59a3663f5feb487abfa0b30c45888b"}, +] +annotated-types = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] antlr4-python3-runtime = [ {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, ] +anyio = [ + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, +] +apache-airflow = [ + {file = "apache-airflow-2.7.1.tar.gz", hash = "sha256:b4fead8f3e09a673ece479c8cc398a61fa4f2fa13626ac6588f1813f2bd21920"}, + {file = "apache_airflow-2.7.1-py3-none-any.whl", hash = "sha256:06214ece464bbb54910220903081b84056d97e2271400ca01ee63743c41cf4f1"}, +] +apache-airflow-providers-common-sql = [ + {file = "apache-airflow-providers-common-sql-1.7.2.tar.gz", hash = "sha256:e268a8f0a224c092136a30e1ddec196edcaa861ff69ac26f270f18d8eca986c6"}, + {file = "apache_airflow_providers_common_sql-1.7.2-py3-none-any.whl", hash = "sha256:5a0e6a1ffcde4d4d41660bcecdad33364ef81c8d98f0d8a3dcf385f0e419d80f"}, +] +apache-airflow-providers-ftp = [ + {file = "apache-airflow-providers-ftp-3.5.2.tar.gz", hash = "sha256:f5994d2f43664eb946b0e6f868991ec83efd8d37bf7488345eeeeb0168a23d81"}, + {file = "apache_airflow_providers_ftp-3.5.2-py3-none-any.whl", hash = "sha256:a3960872de03467c289b925172f48dec45d028c992093cc3a6c45816e0e43536"}, +] +apache-airflow-providers-google = [ + {file = "apache-airflow-providers-google-10.9.0.tar.gz", hash = "sha256:0ea8085185e8d0328a121323fb04648aaa7bd4f14b79ca52b775b80ab0b9534f"}, + {file = "apache_airflow_providers_google-10.9.0-py3-none-any.whl", hash = "sha256:f2b5723955dce94bca4987a47d1bafe2a9c9981ed4bee3473055f088b96bf731"}, +] +apache-airflow-providers-http = [ + {file = "apache-airflow-providers-http-4.5.2.tar.gz", hash = "sha256:73a1107ce1350a68c6fcec8aa4b5bd5a837e71f63fc2bce4210183e53bb24f17"}, + {file = "apache_airflow_providers_http-4.5.2-py3-none-any.whl", hash = "sha256:e890d02a64244cb70c36dc0155c2f97ae563c6c0ea3dfa9a050b787865897cbf"}, +] +apache-airflow-providers-imap = [ + {file = "apache-airflow-providers-imap-3.3.2.tar.gz", hash = "sha256:3853c54f71d48f8f7417c154168a99c5b999babf0695dc814bba99cb2aa61a1f"}, + {file = "apache_airflow_providers_imap-3.3.2-py3-none-any.whl", hash = "sha256:6c4511e30abac3ec888e9beee29e65fe3d0d92141fdea3d14edf117739378baa"}, +] +apache-airflow-providers-sqlite = [ + {file = "apache-airflow-providers-sqlite-3.4.3.tar.gz", hash = "sha256:347d2db03eaa5ea9fef414666565ffa5e849935cbc30e37237edcaa822b5ced8"}, + {file = "apache_airflow_providers_sqlite-3.4.3-py3-none-any.whl", hash = "sha256:4ffa6a50f0ea1b4e51240b657dfec3fb026c87bdfa71af908a56461df6a6f2e0"}, +] +apispec = [ + {file = "apispec-6.3.0-py3-none-any.whl", hash = "sha256:95a0b9355785df998bb0e9b939237a30ee4c7428fd6ef97305eae3da06b9b339"}, + {file = "apispec-6.3.0.tar.gz", hash = "sha256:6cb08d92ce73ff0b3bf46cb2ea5c00d57289b0f279fb0256a3df468182ba5344"}, +] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -2742,52 +5234,72 @@ appnope = [ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] -astor = [ - {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, - {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, +argcomplete = [ + {file = "argcomplete-3.1.2-py3-none-any.whl", hash = "sha256:d97c036d12a752d1079f190bc1521c545b941fda89ad85d15afa909b4d1b9a99"}, + {file = "argcomplete-3.1.2.tar.gz", hash = "sha256:d5d1e5efd41435260b8f85673b74ea2e883affcbec9f4230c582689e8e78251b"}, +] +asgiref = [ + {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, + {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, ] asttokens = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, + {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, ] async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] asyncinit = [ {file = "asyncinit-0.2.4-py3-none-any.whl", hash = "sha256:9f11291943488abd15a1463dad98452e3bd6b39e8e6d45bc7cc008a09825b11e"}, {file = "asyncinit-0.2.4.tar.gz", hash = "sha256:4acaf614f4d6f78babd278bbacf21bd9f7756efc17cd5d7e1bae31ff770b3cfa"}, ] attrs = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] avro = [ - {file = "avro-1.11.1.tar.gz", hash = "sha256:f123623ecc648d0e20ce14f8ed85162140c13cc4b108865d1b2529fbfa06c008"}, + {file = "avro-1.11.3.tar.gz", hash = "sha256:3393bb5139f9cf0791d205756ce1e39a5b58586af5b153d6a3b5a199610e9d17"}, +] +azure-common = [ + {file = "azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3"}, + {file = "azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"}, ] azure-core = [ - {file = "azure-core-1.26.3.zip", hash = "sha256:acbd0daa9675ce88623da35c80d819cdafa91731dee6b2695c64d7ca9da82db4"}, - {file = "azure_core-1.26.3-py3-none-any.whl", hash = "sha256:f7bad0a7b4d800d6e73733ea7e13a616016221ac111ff9a344fe4cba41e51bbe"}, + {file = "azure-core-1.29.4.tar.gz", hash = "sha256:500b3aa9bf2e90c5ccc88bb105d056114ca0ce7d0ce73afb8bc4d714b2fc7568"}, + {file = "azure_core-1.29.4-py3-none-any.whl", hash = "sha256:b03261bcba22c0b9290faf9999cedd23e849ed2577feee90515694cea6bc74bf"}, ] azure-identity = [ - {file = "azure-identity-1.12.0.zip", hash = "sha256:7f9b1ae7d97ea7af3f38dd09305e19ab81a1e16ab66ea186b6579d85c1ca2347"}, - {file = "azure_identity-1.12.0-py3-none-any.whl", hash = "sha256:2a58ce4a209a013e37eaccfd5937570ab99e9118b3e1acf875eed3a85d541b92"}, + {file = "azure-identity-1.14.0.zip", hash = "sha256:72441799f8c5c89bfe21026965e266672a7c5d050c2c65119ef899dd5362e2b1"}, + {file = "azure_identity-1.14.0-py3-none-any.whl", hash = "sha256:edabf0e010eb85760e1dd19424d5e8f97ba2c9caff73a16e7b30ccbdbcce369b"}, +] +azure-mgmt-core = [ + {file = "azure-mgmt-core-1.4.0.zip", hash = "sha256:d195208340094f98e5a6661b781cde6f6a051e79ce317caabd8ff97030a9b3ae"}, + {file = "azure_mgmt_core-1.4.0-py3-none-any.whl", hash = "sha256:81071675f186a585555ef01816f2774d49c1c9024cb76e5720c3c0f6b337bb7d"}, +] +azure-mgmt-storage = [ + {file = "azure-mgmt-storage-20.1.0.zip", hash = "sha256:214f3fde8c91e27d53f2e654a28d15003ad3f6f15c8438a8205f0c88a48d9451"}, + {file = "azure_mgmt_storage-20.1.0-py3-none-any.whl", hash = "sha256:afdc830329c674d96a91c963fa03ac81a4e387dfbf9f5a4e823950dc1fe95659"}, ] azure-storage-blob = [ - {file = "azure-storage-blob-12.15.0.zip", hash = "sha256:f8b8d582492740ab16744455408342fb8e4c8897b64a8a3fc31743844722c2f2"}, - {file = "azure_storage_blob-12.15.0-py3-none-any.whl", hash = "sha256:08d8807c577c63a436740627927c1a03a97c963efc29af5c818aed906590e1cf"}, + {file = "azure-storage-blob-12.18.2.tar.gz", hash = "sha256:e11935348981ffc005b848b55db25c04f2d1f90e1ee33000659906b763cf14c8"}, + {file = "azure_storage_blob-12.18.2-py3-none-any.whl", hash = "sha256:ffd864bf9abf33dfc72c6ef37899a19bd9d585a946a2c61e288b4420c035df3a"}, ] -Babel = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +babel = [ + {file = "Babel-2.13.0-py3-none-any.whl", hash = "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec"}, + {file = "Babel-2.13.0.tar.gz", hash = "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210"}, ] backcall = [ {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] +backoff = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.2-py3-none-any.whl", hash = "sha256:0e79446b10b3ecb499c1556f7e228a53e64a2bfcebd455f370d8927cb5b59e39"}, - {file = "beautifulsoup4-4.11.2.tar.gz", hash = "sha256:bc4bdda6717de5a2987436fb8d72f45dc90dd856bdfd512a1314ce90349a0106"}, + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] black = [ {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, @@ -2803,273 +5315,367 @@ black = [ {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, ] +blinker = [ + {file = "blinker-1.6.3-py3-none-any.whl", hash = "sha256:296320d6c28b006eb5e32d4712202dbcdcbf5dc482da298c2f44881c43884aaa"}, + {file = "blinker-1.6.3.tar.gz", hash = "sha256:152090d27c1c5c722ee7e48504b02d76502811ce02e1523553b4cf8c8b3d3a8d"}, +] bokeh = [ - {file = "bokeh-1.4.0.tar.gz", hash = "sha256:c60d38a41a777b8147ee4134e6142cea8026b5eebf48149e370c44689869dce7"}, + {file = "bokeh-3.2.2-py3-none-any.whl", hash = "sha256:e31670a013e1ff15c3d4d04f587c8162c4cc9fe1af507fd741d295e6c4e1225b"}, + {file = "bokeh-3.2.2.tar.gz", hash = "sha256:b2959b8524d69ec4e7886bc36407445f0a92e1f19530d3bfc4045236a1b7a6ff"}, ] boto3 = [ - {file = "boto3-1.26.88-py3-none-any.whl", hash = "sha256:5374c409d0153e5da4ccde3a0f7e3efac81ce7c60e4e18ffc9acc87c67e0c0a3"}, - {file = "boto3-1.26.88.tar.gz", hash = "sha256:f4839565feeaaca4ef775b74a8df996b79b61d988db62c90571bcc948a9f24c5"}, + {file = "boto3-1.28.62-py3-none-any.whl", hash = "sha256:0dfa2fc96ccafce4feb23044d6cba8b25075ad428a0c450d369d099c6a1059d2"}, + {file = "boto3-1.28.62.tar.gz", hash = "sha256:148eeba0f1867b3db5b3e5ae2997d75a94d03fad46171374a0819168c36f7ed0"}, ] botocore = [ - {file = "botocore-1.29.88-py3-none-any.whl", hash = "sha256:c320275d18ee140005ace4d04e9e720d5b1e30625cfde5267b1fc5133fd4d44d"}, - {file = "botocore-1.29.88.tar.gz", hash = "sha256:48ed2af0a10e7c15a3445eda62f665b106a2aba4ffa1ce730d7083022fd9596f"}, + {file = "botocore-1.31.62-py3-none-any.whl", hash = "sha256:be792d806afc064694a2d0b9b25779f3ca0c1584b29a35ac32e67f0064ddb8b7"}, + {file = "botocore-1.31.62.tar.gz", hash = "sha256:272b78ac65256b6294cb9cdb0ac484d447ad3a85642e33cb6a3b1b8afee15a4c"}, ] bracex = [ - {file = "bracex-2.3.post1-py3-none-any.whl", hash = "sha256:351b7f20d56fb9ea91f9b9e9e7664db466eb234188c175fd943f8f755c807e73"}, - {file = "bracex-2.3.post1.tar.gz", hash = "sha256:e7b23fc8b2cd06d3dec0692baabecb249dda94e06a617901ff03a6c56fd71693"}, + {file = "bracex-2.4-py3-none-any.whl", hash = "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418"}, + {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, +] +cachelib = [ + {file = "cachelib-0.10.2-py3-none-any.whl", hash = "sha256:42d49f2fad9310dd946d7be73d46776bcd4d5fde4f49ad210cfdd447fbdfc346"}, + {file = "cachelib-0.10.2.tar.gz", hash = "sha256:593faeee62a7c037d50fc835617a01b887503f972fb52b188ae7e50e9cb69740"}, ] cachetools = [ - {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, - {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, + {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, + {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, +] +cattrs = [ + {file = "cattrs-23.1.2-py3-none-any.whl", hash = "sha256:b2bb14311ac17bed0d58785e5a60f022e5431aca3932e3fc5cc8ed8639de50a4"}, + {file = "cattrs-23.1.2.tar.gz", hash = "sha256:db1c821b8c537382b2c7c66678c3790091ca0275ac486c76f3c8f3920e83c657"}, ] certifi = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] cfgv = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] +chardet = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, ] charset-normalizer = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, -] -classify-imports = [ - {file = "classify_imports-4.2.0-py2.py3-none-any.whl", hash = "sha256:dbbc264b70a470ed8c6c95976a11dfb8b7f63df44ed1af87328bbed2663f5161"}, - {file = "classify_imports-4.2.0.tar.gz", hash = "sha256:7abfb7ea92149b29d046bd34573d247ba6e68cc28100c801eba4af17964fc40e"}, + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, ] click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] +clickclick = [ + {file = "clickclick-20.10.2-py2.py3-none-any.whl", hash = "sha256:c8f33e6d9ec83f68416dd2136a7950125bd256ec39ccc9a85c6e280a16be2bb5"}, + {file = "clickclick-20.10.2.tar.gz", hash = "sha256:4efb13e62353e34c5eef7ed6582c4920b418d7dedc86d819e22ee089ba01802c"}, ] colorama = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +colorlog = [ + {file = "colorlog-4.8.0-py2.py3-none-any.whl", hash = "sha256:3dd15cb27e8119a24c1a7b5c93f9f3b455855e0f73993b1c25921b2f646f1dcd"}, + {file = "colorlog-4.8.0.tar.gz", hash = "sha256:59b53160c60902c405cdec28d38356e09d40686659048893e026ecbd589516b1"}, +] comm = [ - {file = "comm-0.1.2-py3-none-any.whl", hash = "sha256:9f3abf3515112fa7c55a42a6a5ab358735c9dccc8b5910a9d8e3ef5998130666"}, - {file = "comm-0.1.2.tar.gz", hash = "sha256:3e2f5826578e683999b93716285b3b1f344f157bf75fa9ce0a797564e742f062"}, + {file = "comm-0.1.4-py3-none-any.whl", hash = "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a"}, + {file = "comm-0.1.4.tar.gz", hash = "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15"}, ] commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] +configupdater = [ + {file = "ConfigUpdater-3.1.1-py2.py3-none-any.whl", hash = "sha256:805986dbeba317886c7a8d348b2e34986dc9e3128cd3761ecc35decbd372b286"}, + {file = "ConfigUpdater-3.1.1.tar.gz", hash = "sha256:46f0c74d73efa723776764b43c9739f68052495dd3d734319c1d0eb58511f15b"}, +] +connexion = [ + {file = "connexion-2.14.2-py2.py3-none-any.whl", hash = "sha256:a73b96a0e07b16979a42cde7c7e26afe8548099e352cf350f80c57185e0e0b36"}, + {file = "connexion-2.14.2.tar.gz", hash = "sha256:dbc06f52ebeebcf045c9904d570f24377e8bbd5a6521caef15a06f634cf85646"}, +] +contourpy = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] coverage = [ - {file = "coverage-7.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8"}, - {file = "coverage-7.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03"}, - {file = "coverage-7.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339"}, - {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a"}, - {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820"}, - {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4"}, - {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6"}, - {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833"}, - {file = "coverage-7.2.1-cp310-cp310-win32.whl", hash = "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4"}, - {file = "coverage-7.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6"}, - {file = "coverage-7.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6"}, - {file = "coverage-7.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9"}, - {file = "coverage-7.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b"}, - {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319"}, - {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508"}, - {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed"}, - {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e"}, - {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b"}, - {file = "coverage-7.2.1-cp311-cp311-win32.whl", hash = "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80"}, - {file = "coverage-7.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273"}, - {file = "coverage-7.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97"}, - {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84"}, - {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd"}, - {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc"}, - {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e"}, - {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54"}, - {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5"}, - {file = "coverage-7.2.1-cp37-cp37m-win32.whl", hash = "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae"}, - {file = "coverage-7.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff"}, - {file = "coverage-7.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657"}, - {file = "coverage-7.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1"}, - {file = "coverage-7.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3"}, - {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99"}, - {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384"}, - {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa"}, - {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec"}, - {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2"}, - {file = "coverage-7.2.1-cp38-cp38-win32.whl", hash = "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0"}, - {file = "coverage-7.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb"}, - {file = "coverage-7.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef"}, - {file = "coverage-7.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454"}, - {file = "coverage-7.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993"}, - {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6"}, - {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63"}, - {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58"}, - {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e"}, - {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431"}, - {file = "coverage-7.2.1-cp39-cp39-win32.whl", hash = "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8"}, - {file = "coverage-7.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a"}, - {file = "coverage-7.2.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616"}, - {file = "coverage-7.2.1.tar.gz", hash = "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] +cron-descriptor = [ + {file = "cron_descriptor-1.4.0.tar.gz", hash = "sha256:b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd"}, +] +croniter = [ + {file = "croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128"}, + {file = "croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361"}, ] cryptography = [ - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06"}, - {file = "cryptography-39.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011"}, - {file = "cryptography-39.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5"}, - {file = "cryptography-39.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0"}, - {file = "cryptography-39.0.2-cp36-abi3-win32.whl", hash = "sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480"}, - {file = "cryptography-39.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1"}, - {file = "cryptography-39.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3"}, - {file = "cryptography-39.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3"}, - {file = "cryptography-39.0.2.tar.gz", hash = "sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:80907d3faa55dc5434a16579952ac6da800935cd98d14dbd62f6f042c7f5e839"}, + {file = "cryptography-41.0.4-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:35c00f637cd0b9d5b6c6bd11b6c3359194a8eba9c46d4e875a3660e3b400005f"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cecfefa17042941f94ab54f769c8ce0fe14beff2694e9ac684176a2535bf9714"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e40211b4923ba5a6dc9769eab704bdb3fbb58d56c5b336d30996c24fcf12aadb"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:23a25c09dfd0d9f28da2352503b23e086f8e78096b9fd585d1d14eca01613e13"}, + {file = "cryptography-41.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2ed09183922d66c4ec5fdaa59b4d14e105c084dd0febd27452de8f6f74704143"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5a0f09cefded00e648a127048119f77bc2b2ec61e736660b5789e638f43cc397"}, + {file = "cryptography-41.0.4-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9eeb77214afae972a00dee47382d2591abe77bdae166bda672fb1e24702a3860"}, + {file = "cryptography-41.0.4-cp37-abi3-win32.whl", hash = "sha256:3b224890962a2d7b57cf5eeb16ccaafba6083f7b811829f00476309bce2fe0fd"}, + {file = "cryptography-41.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:c880eba5175f4307129784eca96f4e70b88e57aa3f680aeba3bab0e980b0f37d"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:004b6ccc95943f6a9ad3142cfabcc769d7ee38a3f60fb0dddbfb431f818c3a67"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:86defa8d248c3fa029da68ce61fe735432b047e32179883bdb1e79ed9bb8195e"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:37480760ae08065437e6573d14be973112c9e6dcaf5f11d00147ee74f37a3829"}, + {file = "cryptography-41.0.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b5f4dfe950ff0479f1f00eda09c18798d4f49b98f4e2006d644b3301682ebdca"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7e53db173370dea832190870e975a1e09c86a879b613948f09eb49324218c14d"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5b72205a360f3b6176485a333256b9bcd48700fc755fef51c8e7e67c4b63e3ac"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:93530900d14c37a46ce3d6c9e6fd35dbe5f5601bf6b3a5c325c7bffc030344d9"}, + {file = "cryptography-41.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efc8ad4e6fc4f1752ebfb58aefece8b4e3c4cae940b0994d43649bdfce8d0d4f"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c3391bd8e6de35f6f1140e50aaeb3e2b3d6a9012536ca23ab0d9c35ec18c8a91"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0d9409894f495d465fe6fda92cb70e8323e9648af912d5b9141d616df40a87b8"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ac4f9ead4bbd0bc8ab2d318f97d85147167a488be0e08814a37eb2f439d5cf6"}, + {file = "cryptography-41.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:047c4603aeb4bbd8db2756e38f5b8bd7e94318c047cfe4efeb5d715e08b49311"}, + {file = "cryptography-41.0.4.tar.gz", hash = "sha256:7febc3094125fc126a7f6fb1f420d0da639f3f32cb15c8ff0dc3997c4549f51a"}, ] csscompressor = [ {file = "csscompressor-0.9.5.tar.gz", hash = "sha256:afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05"}, @@ -3078,202 +5684,200 @@ darglint = [ {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"}, {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"}, ] +db-dtypes = [ + {file = "db-dtypes-1.1.1.tar.gz", hash = "sha256:ab485c85fef2454f3182427def0b0a3ab179b2871542787d33ba519d62078883"}, + {file = "db_dtypes-1.1.1-py2.py3-none-any.whl", hash = "sha256:23be34ea2bc91065447ecea4d5f107e46d1de223d152e69fa73673a62d5bd27d"}, +] dbldatagen = [ - {file = "dbldatagen-0.3.1-py3-none-any.whl", hash = "sha256:a8f20ee7dd462ea8c4799bdcf947227ae1eaf869955d7e259db4b1197dcbb92a"}, - {file = "dbldatagen-0.3.1.tar.gz", hash = "sha256:d8ef2fb3ffd107faf3ef2f6e5bd65d5f8ad31a0f93d4b861b1df6d91a3bb19a4"}, + {file = "dbldatagen-0.3.5-py3-none-any.whl", hash = "sha256:75db379c68adda518fbe5d09184ca0756255f2086d8466fbdeaba29863b98349"}, + {file = "dbldatagen-0.3.5.tar.gz", hash = "sha256:d50dd7f2180d6f3e21a107b8759d62f9a9dd093b64833f73940d99f58723c4b4"}, ] debugpy = [ - {file = "debugpy-1.6.6-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:0ea1011e94416e90fb3598cc3ef5e08b0a4dd6ce6b9b33ccd436c1dffc8cd664"}, - {file = "debugpy-1.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dff595686178b0e75580c24d316aa45a8f4d56e2418063865c114eef651a982e"}, - {file = "debugpy-1.6.6-cp310-cp310-win32.whl", hash = "sha256:87755e173fcf2ec45f584bb9d61aa7686bb665d861b81faa366d59808bbd3494"}, - {file = "debugpy-1.6.6-cp310-cp310-win_amd64.whl", hash = "sha256:72687b62a54d9d9e3fb85e7a37ea67f0e803aaa31be700e61d2f3742a5683917"}, - {file = "debugpy-1.6.6-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:78739f77c58048ec006e2b3eb2e0cd5a06d5f48c915e2fc7911a337354508110"}, - {file = "debugpy-1.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23c29e40e39ad7d869d408ded414f6d46d82f8a93b5857ac3ac1e915893139ca"}, - {file = "debugpy-1.6.6-cp37-cp37m-win32.whl", hash = "sha256:7aa7e103610e5867d19a7d069e02e72eb2b3045b124d051cfd1538f1d8832d1b"}, - {file = "debugpy-1.6.6-cp37-cp37m-win_amd64.whl", hash = "sha256:f6383c29e796203a0bba74a250615ad262c4279d398e89d895a69d3069498305"}, - {file = "debugpy-1.6.6-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:23363e6d2a04d726bbc1400bd4e9898d54419b36b2cdf7020e3e215e1dcd0f8e"}, - {file = "debugpy-1.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b5d1b13d7c7bf5d7cf700e33c0b8ddb7baf030fcf502f76fc061ddd9405d16c"}, - {file = "debugpy-1.6.6-cp38-cp38-win32.whl", hash = "sha256:70ab53918fd907a3ade01909b3ed783287ede362c80c75f41e79596d5ccacd32"}, - {file = "debugpy-1.6.6-cp38-cp38-win_amd64.whl", hash = "sha256:c05349890804d846eca32ce0623ab66c06f8800db881af7a876dc073ac1c2225"}, - {file = "debugpy-1.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771739902b1ae22a120dbbb6bd91b2cae6696c0e318b5007c5348519a4211c6"}, - {file = "debugpy-1.6.6-cp39-cp39-win32.whl", hash = "sha256:549ae0cb2d34fc09d1675f9b01942499751d174381b6082279cf19cdb3c47cbe"}, - {file = "debugpy-1.6.6-cp39-cp39-win_amd64.whl", hash = "sha256:de4a045fbf388e120bb6ec66501458d3134f4729faed26ff95de52a754abddb1"}, - {file = "debugpy-1.6.6-py2.py3-none-any.whl", hash = "sha256:be596b44448aac14eb3614248c91586e2bc1728e020e82ef3197189aae556115"}, - {file = "debugpy-1.6.6.zip", hash = "sha256:b9c2130e1c632540fbf9c2c88341493797ddf58016e7cba02e311de9b0a96b67"}, + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, ] decorator = [ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, ] -Deprecated = [ - {file = "Deprecated-1.2.13-py2.py3-none-any.whl", hash = "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d"}, - {file = "Deprecated-1.2.13.tar.gz", hash = "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d"}, +deprecated = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, ] dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] distlib = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] +dnspython = [ + {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, + {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, ] docker-pycreds = [ {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, ] -eradicate = [ - {file = "eradicate-2.2.0-py3-none-any.whl", hash = "sha256:751813c315a48ce7e3d0483410991015342d380a956e86e0265c61bfb875bcbc"}, - {file = "eradicate-2.2.0.tar.gz", hash = "sha256:c329a05def6a4b558dab58bb1b694f5209706b7c99ba174d226dfdb69a5ba0da"}, +docutils = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] +email-validator = [ + {file = "email_validator-1.3.1-py2.py3-none-any.whl", hash = "sha256:49a72f5fa6ed26be1c964f0567d931d10bf3fdeeacdf97bc26ef1cd2a44e0bda"}, + {file = "email_validator-1.3.1.tar.gz", hash = "sha256:d178c5c6fa6c6824e9b04f199cf23e79ac15756786573c190d2ad13089411ad2"}, ] exceptiongroup = [ - {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"}, - {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] +execnet = [ + {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, + {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, ] executing = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.0-py2.py3-none-any.whl", hash = "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657"}, + {file = "executing-2.0.0.tar.gz", hash = "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08"}, ] filelock = [ - {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, - {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, ] flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -flake8-annotations = [ - {file = "flake8-annotations-2.9.1.tar.gz", hash = "sha256:11f09efb99ae63c8f9d6b492b75fe147fbc323179fddfe00b2e56eefeca42f57"}, - {file = "flake8_annotations-2.9.1-py3-none-any.whl", hash = "sha256:a4385158a7a9fc8af1d8820a2f4c8d03387997006a83f5f8bfe5bc6085bdf88a"}, + {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, + {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, ] -flake8-broken-line = [ - {file = "flake8-broken-line-0.5.0.tar.gz", hash = "sha256:7c98de9dd1385b71e888709c7f2aee3f0514107ecb5875bc95d0c03392191c97"}, - {file = "flake8_broken_line-0.5.0-py3-none-any.whl", hash = "sha256:daafb19b67eead0410ce7ba155d51a15b9d020ebe7630d87de9c2b93cedb6703"}, +flask = [ + {file = "Flask-2.2.5-py3-none-any.whl", hash = "sha256:58107ed83443e86067e41eff4631b058178191a355886f8e479e347fa1285fdf"}, + {file = "Flask-2.2.5.tar.gz", hash = "sha256:edee9b0a7ff26621bd5a8c10ff484ae28737a2410d99b0bb9a6850c7fb977aa0"}, ] -flake8-bugbear = [ - {file = "flake8-bugbear-22.7.1.tar.gz", hash = "sha256:e450976a07e4f9d6c043d4f72b17ec1baf717fe37f7997009c8ae58064f88305"}, - {file = "flake8_bugbear-22.7.1-py3-none-any.whl", hash = "sha256:db5d7a831ef4412a224b26c708967ff816818cabae415e76b8c58df156c4b8e5"}, +flask-appbuilder = [ + {file = "Flask-AppBuilder-4.3.6.tar.gz", hash = "sha256:8ca9710fa7d2704747d195e11b487d45a571f40559d8399d9d5dfa42ea1f3c78"}, + {file = "Flask_AppBuilder-4.3.6-py3-none-any.whl", hash = "sha256:840480dfd43134bebf78f3c7dc909e324c2689d2d9f27aeb1880a8a25466bc8d"}, ] -flake8-class-attributes-order = [ - {file = "flake8_class_attributes_order-0.1.3-py3-none-any.whl", hash = "sha256:6398368da4511cdda1a7c0e25934bcaac49d9df89aa2842729353b4a20f7ed13"}, - {file = "flake8_class_attributes_order-0.1.3.tar.gz", hash = "sha256:9dde5581832d278ce247d4c47777f980cd86df2232bc0c50275144857d56e91d"}, +flask-babel = [ + {file = "Flask-Babel-2.0.0.tar.gz", hash = "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d"}, + {file = "Flask_Babel-2.0.0-py3-none-any.whl", hash = "sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468"}, ] -flake8-comprehensions = [ - {file = "flake8-comprehensions-3.10.0.tar.gz", hash = "sha256:181158f7e7aa26a63a0a38e6017cef28c6adee71278ce56ce11f6ec9c4905058"}, - {file = "flake8_comprehensions-3.10.0-py3-none-any.whl", hash = "sha256:dad454fd3d525039121e98fa1dd90c46bc138708196a4ebbc949ad3c859adedb"}, +flask-caching = [ + {file = "Flask-Caching-2.0.1.tar.gz", hash = "sha256:10df200a03f032af60077befe41779dd94898b67c82040d34e87210b71ba2638"}, + {file = "Flask_Caching-2.0.1-py3-none-any.whl", hash = "sha256:703df847cbe904d8ddffd5f5fb320e236a31cb7bebac4a93d6b1701dd16dbf37"}, ] -flake8-docstrings = [ - {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"}, - {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"}, +flask-jwt-extended = [ + {file = "Flask-JWT-Extended-4.5.3.tar.gz", hash = "sha256:061ef3d25ed5743babe4964ab38f36d870e6d2fd8a126bab5d77ddef8a01932b"}, + {file = "Flask_JWT_Extended-4.5.3-py2.py3-none-any.whl", hash = "sha256:eaec42af107dcb919785a4b3766c09ffba9f286b92a8d58603933f28fd4db6a3"}, ] -flake8-eradicate = [ - {file = "flake8-eradicate-1.3.0.tar.gz", hash = "sha256:e4c98f00d17dc8653e3388cac2624cd81e9735de2fd4a8dcf99029633ebd7a63"}, - {file = "flake8_eradicate-1.3.0-py3-none-any.whl", hash = "sha256:85a71e0c5f4e07f7c6c5fec520483561fd6bd295417d622855bdeade99242e3d"}, +flask-limiter = [ + {file = "Flask-Limiter-3.5.0.tar.gz", hash = "sha256:13a3491b994c49f7cb4706587a38ca47e8162b576530472df38be68104f299c0"}, + {file = "Flask_Limiter-3.5.0-py3-none-any.whl", hash = "sha256:dbda4174f44e6cb858c6eb75e7488186f2977dd5d33d7028ba1aabf179de1bee"}, ] -flake8-plugin-utils = [ - {file = "flake8-plugin-utils-1.3.2.tar.gz", hash = "sha256:20fa2a8ca2decac50116edb42e6af0a1253ef639ad79941249b840531889c65a"}, - {file = "flake8_plugin_utils-1.3.2-py3-none-any.whl", hash = "sha256:1fe43e3e9acf3a7c0f6b88f5338cad37044d2f156c43cb6b080b5f9da8a76f06"}, +flask-login = [ + {file = "Flask-Login-0.6.2.tar.gz", hash = "sha256:c0a7baa9fdc448cdd3dd6f0939df72eec5177b2f7abe6cb82fc934d29caac9c3"}, + {file = "Flask_Login-0.6.2-py3-none-any.whl", hash = "sha256:1ef79843f5eddd0f143c2cd994c1b05ac83c0401dc6234c143495af9a939613f"}, ] -flake8-pytest-style = [ - {file = "flake8_pytest_style-1.7.2-py3-none-any.whl", hash = "sha256:f5d2aa3219163a052dd92226589d45fab8ea027a3269922f0c4029f548ea5cd1"}, - {file = "flake8_pytest_style-1.7.2.tar.gz", hash = "sha256:b924197c99b951315949920b0e5547f34900b1844348432e67a44ab191582109"}, +flask-session = [ + {file = "Flask-Session-0.5.0.tar.gz", hash = "sha256:190875e6aebf2953c6803d42379ef3b934bc209ef8ef006f97aecb08f5aaeb86"}, + {file = "flask_session-0.5.0-py3-none-any.whl", hash = "sha256:1619bcbc16f04f64e90f8e0b17145ba5c9700090bb1294e889956c1282d58631"}, ] -flake8-quotes = [ - {file = "flake8-quotes-3.3.1.tar.gz", hash = "sha256:633adca6fb8a08131536af0d750b44d6985b9aba46f498871e21588c3e6f525a"}, +flask-sqlalchemy = [ + {file = "Flask-SQLAlchemy-2.5.1.tar.gz", hash = "sha256:2bda44b43e7cacb15d4e05ff3cc1f8bc97936cc464623424102bfc2c35e95912"}, + {file = "Flask_SQLAlchemy-2.5.1-py2.py3-none-any.whl", hash = "sha256:f12c3d4cc5cc7fdcc148b9527ea05671718c3ea45d50c7e732cceb33f574b390"}, ] -flake8-simplify = [ - {file = "flake8_simplify-0.19.3-py3-none-any.whl", hash = "sha256:1057320e9312d75849541fee822900d27bcad05b2405edc84713affee635629e"}, - {file = "flake8_simplify-0.19.3.tar.gz", hash = "sha256:2fb083bf5142a98d9c9554755cf2f56f8926eb4a33eae30c0809041b1546879e"}, -] -flake8-tidy-imports = [ - {file = "flake8-tidy-imports-4.8.0.tar.gz", hash = "sha256:df44f9c841b5dfb3a7a1f0da8546b319d772c2a816a1afefcce43e167a593d83"}, - {file = "flake8_tidy_imports-4.8.0-py3-none-any.whl", hash = "sha256:25bd9799358edefa0e010ce2c587b093c3aba942e96aeaa99b6d0500ae1bf09c"}, -] -flake8-type-checking = [ - {file = "flake8-type-checking-2.1.2.tar.gz", hash = "sha256:42bbe98dbb014f413473bfd38a75ece334cad1b5c0a66e96efa03bd69fdfd816"}, - {file = "flake8_type_checking-2.1.2-py3-none-any.whl", hash = "sha256:aeb55170ec7b77c123c130b95cb7ad32e9c0f1cf882203b24db94a85f24ebb93"}, -] -flake8-typing-imports = [ - {file = "flake8_typing_imports-1.12.0-py2.py3-none-any.whl", hash = "sha256:4a072a5f5975caedfbd364fb54755983cae812e2b2f0125f3a71237868971a25"}, - {file = "flake8_typing_imports-1.12.0.tar.gz", hash = "sha256:d9482d7a3dd3d777915c7f8907a166b405aaf8314ecceb1be2b642e9375d87ed"}, -] -flake8-use-fstring = [ - {file = "flake8-use-fstring-1.4.tar.gz", hash = "sha256:6550bf722585eb97dffa8343b0f1c372101f5c4ab5b07ebf0edd1c79880cdd39"}, +flask-wtf = [ + {file = "flask_wtf-1.2.1-py3-none-any.whl", hash = "sha256:fa6793f2fb7e812e0fe9743b282118e581fb1b6c45d414b8af05e659bd653287"}, + {file = "flask_wtf-1.2.1.tar.gz", hash = "sha256:8bb269eb9bb46b87e7c8233d7e7debdf1f8b74bf90cc1789988c29b37a97b695"}, ] frozenlist = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] +gcloud-aio-auth = [ + {file = "gcloud_aio_auth-4.2.3-py3-none-any.whl", hash = "sha256:e4adadd36e35eeeb8537b926840372c3080c2f5a6909d44aa1bacbced2260bb1"}, + {file = "gcloud_aio_auth-4.2.3.tar.gz", hash = "sha256:8e12297c5b45cfc20d629b83e1233f83a1c7d5f830f24f31bc5bb8816c0cda1b"}, +] +gcloud-aio-bigquery = [ + {file = "gcloud_aio_bigquery-7.0.0-py3-none-any.whl", hash = "sha256:188b96b16b0fdbef2a0bc15ffce3f5a930ecc36de537fcfa5794fc397506fdd8"}, + {file = "gcloud_aio_bigquery-7.0.0.tar.gz", hash = "sha256:2cd1c7c9dcb68122ff6187f2b533941c86d954e5312d942c8107aac4d20ea2ec"}, +] +gcloud-aio-storage = [ + {file = "gcloud_aio_storage-9.0.0-py3-none-any.whl", hash = "sha256:223583018b0ad68f22201593970c638e00fb86f40d9bb9187b17910a02ab118c"}, + {file = "gcloud_aio_storage-9.0.0.tar.gz", hash = "sha256:99e6d30c65809ceafe059d496dbf10a4186edb1850fe9634988e096966503046"}, ] ghp-import = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, @@ -3283,25 +5887,201 @@ gitdb = [ {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, ] -GitPython = [ - {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, - {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +gitpython = [ + {file = "GitPython-3.1.37-py3-none-any.whl", hash = "sha256:5f4c4187de49616d710a77e98ddf17b4782060a1788df441846bddefbb89ab33"}, + {file = "GitPython-3.1.37.tar.gz", hash = "sha256:f9b9ddc0761c125d5780eab2d64be4873fc6817c2899cbcb34b02344bdc7bc54"}, +] +google-ads = [ + {file = "google-ads-22.0.0.tar.gz", hash = "sha256:65498cdc176e515d62f6221a4278a16d08cf230a95f027843f2373e6a2dd71b7"}, + {file = "google_ads-22.0.0-py3-none-any.whl", hash = "sha256:186e6ffb0c60c29238ba93f593b90b545ff6af2a758c75d68d934b0b98dd43e9"}, ] google-api-core = [ - {file = "google-api-core-2.11.0.tar.gz", hash = "sha256:4b9bb5d5a380a0befa0573b302651b8a9a89262c1730e37bf423cec511804c22"}, - {file = "google_api_core-2.11.0-py3-none-any.whl", hash = "sha256:ce222e27b0de0d7bc63eb043b956996d6dccab14cc3b690aaea91c9cc99dc16e"}, + {file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"}, + {file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"}, +] +google-api-python-client = [ + {file = "google-api-python-client-2.102.0.tar.gz", hash = "sha256:906ff9b672a4d5ddad8f4073a040e59f1fba6734909c14cd49938e37be53691d"}, + {file = "google_api_python_client-2.102.0-py2.py3-none-any.whl", hash = "sha256:ce2fb4d80eb24519ced44a1e79030866cc8a6379ed5ba6c76ba46e772cc68137"}, ] google-auth = [ - {file = "google-auth-2.14.1.tar.gz", hash = "sha256:ccaa901f31ad5cbb562615eb8b664b3dd0bf5404a67618e642307f00613eda4d"}, - {file = "google_auth-2.14.1-py2.py3-none-any.whl", hash = "sha256:f5d8701633bebc12e0deea4df8abd8aff31c28b355360597f7f2ee60f2e4d016"}, + {file = "google-auth-2.23.2.tar.gz", hash = "sha256:5a9af4be520ba33651471a0264eead312521566f44631cbb621164bc30c8fd40"}, + {file = "google_auth-2.23.2-py2.py3-none-any.whl", hash = "sha256:c2e253347579d483004f17c3bd0bf92e611ef6c7ba24d41c5c59f2e7aeeaf088"}, +] +google-auth-httplib2 = [ + {file = "google-auth-httplib2-0.1.1.tar.gz", hash = "sha256:c64bc555fdc6dd788ea62ecf7bccffcf497bf77244887a3f3d7a5a02f8e3fc29"}, + {file = "google_auth_httplib2-0.1.1-py2.py3-none-any.whl", hash = "sha256:42c50900b8e4dcdf8222364d1f0efe32b8421fb6ed72f2613f12f75cc933478c"}, +] +google-auth-oauthlib = [ + {file = "google-auth-oauthlib-0.8.0.tar.gz", hash = "sha256:81056a310fb1c4a3e5a7e1a443e1eb96593c6bbc55b26c0261e4d3295d3e6593"}, + {file = "google_auth_oauthlib-0.8.0-py2.py3-none-any.whl", hash = "sha256:40cc612a13c3336d5433e94e2adb42a0c88f6feb6c55769e44500fc70043a576"}, +] +google-cloud-aiplatform = [ + {file = "google-cloud-aiplatform-1.34.0.tar.gz", hash = "sha256:4962badc52ed9d992881232ff70dd706f5134d15f30a17908386241247ea4904"}, + {file = "google_cloud_aiplatform-1.34.0-py2.py3-none-any.whl", hash = "sha256:c55e6f7893fecd81622aa1d47c6f5abf8f830917e99ed0af8637fe1e523ec2c6"}, +] +google-cloud-appengine-logging = [ + {file = "google-cloud-appengine-logging-1.3.2.tar.gz", hash = "sha256:a2989fca0e88463b56432aa821e64b81c3d171ee37b84771189b48e8b97cd496"}, + {file = "google_cloud_appengine_logging-1.3.2-py2.py3-none-any.whl", hash = "sha256:6ac6261567b56611f6891fa650f76db8a48d528762e5c2a09230b41d82ee2be0"}, +] +google-cloud-audit-log = [ + {file = "google-cloud-audit-log-0.2.5.tar.gz", hash = "sha256:86e2faba3383adc8fd04a5bd7fd4f960b3e4aedaa7ed950f2f891ce16902eb6b"}, + {file = "google_cloud_audit_log-0.2.5-py2.py3-none-any.whl", hash = "sha256:18b94d4579002a450b7902cd2e8b8fdcb1ea2dd4df3b41f8f82be6d9f7fcd746"}, +] +google-cloud-automl = [ + {file = "google-cloud-automl-2.11.2.tar.gz", hash = "sha256:c3893339ef1acfacdc30ba0d61b7e4bc2e40ab9cc26d2370ebe3c761990466a2"}, + {file = "google_cloud_automl-2.11.2-py2.py3-none-any.whl", hash = "sha256:4111ae06852d858e2ab6fa4520cc8b32bcee8a0c3fbf87f418eb998b7a7e11a1"}, +] +google-cloud-batch = [ + {file = "google-cloud-batch-0.17.1.tar.gz", hash = "sha256:ce339e7d95792a7bc58bc4d23091da4e09b7f9115de6acb1fc341da196df6ba7"}, + {file = "google_cloud_batch-0.17.1-py2.py3-none-any.whl", hash = "sha256:d935802badcf1afad99b6a6515cc4946a2e620af8995c58535664c96285683a1"}, +] +google-cloud-bigquery = [ + {file = "google-cloud-bigquery-3.12.0.tar.gz", hash = "sha256:1af93c5c28a18b13190bce479b793aaae56c0ecf7e1da73b4ba5798eca054a07"}, + {file = "google_cloud_bigquery-3.12.0-py2.py3-none-any.whl", hash = "sha256:e68851addfe0394ab7662bd58aa0e5a4527e7156568cc0410129ccb8a460a009"}, +] +google-cloud-bigquery-datatransfer = [ + {file = "google-cloud-bigquery-datatransfer-3.12.1.tar.gz", hash = "sha256:b845a74081ace32c9bbae93382b02a69db8560a356f61fd6a2e5f63334958148"}, + {file = "google_cloud_bigquery_datatransfer-3.12.1-py2.py3-none-any.whl", hash = "sha256:cb24e51155fb221cfc09f2a5b047f2dc8dbb1d106b84463c1300af0a6dcc7bae"}, +] +google-cloud-bigquery-storage = [ + {file = "google-cloud-bigquery-storage-2.22.0.tar.gz", hash = "sha256:f6d8c7b3ab9b574c66977fcee9d336e334ad1a3843a722be19123640e7808ea3"}, + {file = "google_cloud_bigquery_storage-2.22.0-py2.py3-none-any.whl", hash = "sha256:7f11b2ae590a5b3874fb6ddf705a66a070340db238f971cf7b53349eee9ca317"}, +] +google-cloud-bigtable = [ + {file = "google-cloud-bigtable-2.21.0.tar.gz", hash = "sha256:d9f0efbf940ca392f07d13787fc2da76d1e168dedafae0f8f1b4208e0c1132dc"}, + {file = "google_cloud_bigtable-2.21.0-py2.py3-none-any.whl", hash = "sha256:219d39f2787b76394b045603bbd0b13dfc37645ca855022e646b8ecbfbe9ad1f"}, +] +google-cloud-build = [ + {file = "google-cloud-build-3.20.0.tar.gz", hash = "sha256:82db53e2bebcfd2777b9a5b4c5805e13dc57b4cf781d5b5e3cf0a9894d1ae133"}, + {file = "google_cloud_build-3.20.0-py2.py3-none-any.whl", hash = "sha256:877ec8c8e75a8ee32273bb2c8f0427fced54ba51dfe9d49f49c90ef9ff50a135"}, +] +google-cloud-compute = [ + {file = "google-cloud-compute-1.14.1.tar.gz", hash = "sha256:acd987647d7c826aa97b4418141c740ead5e8811d3349315f2f89a30c01c7f4b"}, + {file = "google_cloud_compute-1.14.1-py2.py3-none-any.whl", hash = "sha256:b40d6aeeb2c5ce373675c869f1404a1bc19b9763b746ad8f2d91ed1148893d6f"}, +] +google-cloud-container = [ + {file = "google-cloud-container-2.32.0.tar.gz", hash = "sha256:694fb8da77963653e1c70fa60928b4a11faf8e1f1580a39025053a3e1bcce6de"}, + {file = "google_cloud_container-2.32.0-py2.py3-none-any.whl", hash = "sha256:a5555c6c19679332086859838fbaee468cb206e5e76365bb5027d5305a2c5bf4"}, ] google-cloud-core = [ - {file = "google-cloud-core-2.3.2.tar.gz", hash = "sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a"}, - {file = "google_cloud_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe"}, + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, +] +google-cloud-datacatalog = [ + {file = "google-cloud-datacatalog-3.16.0.tar.gz", hash = "sha256:703e414396248fa98474bbab9ea962f4c96a3caf1184c903bfc9453d274b0ea2"}, + {file = "google_cloud_datacatalog-3.16.0-py2.py3-none-any.whl", hash = "sha256:06f43501ce57742f394508bca6b0eb14e6dd5aa7e0d51cc0fd9d259295d46c9f"}, +] +google-cloud-dataflow-client = [ + {file = "google-cloud-dataflow-client-0.8.4.tar.gz", hash = "sha256:638a7a97cefa0f1f1918eb1403e2c34f9efe748d71787f7d668fd15993b92400"}, + {file = "google_cloud_dataflow_client-0.8.4-py2.py3-none-any.whl", hash = "sha256:80f95f8ba02cc1515c2856fc1d2959504b2e119622644499da1d4faa96161714"}, +] +google-cloud-dataform = [ + {file = "google-cloud-dataform-0.5.3.tar.gz", hash = "sha256:89ed0dce20ce34f74cb038d614dd71191451fb70ea60888b6dbfc4265cea7a48"}, + {file = "google_cloud_dataform-0.5.3-py2.py3-none-any.whl", hash = "sha256:aa265043272b0b925fe5e40ea928a4793e1e30f37fff4169a38dfde9d7e32dc9"}, +] +google-cloud-dataplex = [ + {file = "google-cloud-dataplex-1.6.3.tar.gz", hash = "sha256:3056a4069820a19c9e2f10d8d103e02416c452e22c796949d29fd3c7a65fa5af"}, + {file = "google_cloud_dataplex-1.6.3-py2.py3-none-any.whl", hash = "sha256:65f47e0ecf1cf0e55044238af13bdbdac8bc56c3b1df5073d0f0bae38ddd8f7b"}, +] +google-cloud-dataproc = [ + {file = "google-cloud-dataproc-5.6.0.tar.gz", hash = "sha256:5fa9dfb88433c2d0c138b7ebb6ade174103be3762ccd039b24d53c7448e3760d"}, + {file = "google_cloud_dataproc-5.6.0-py2.py3-none-any.whl", hash = "sha256:d76a7791d5b81b498cf353be4f14a2194a696fdd1a41a69b33ac3319c5a8a213"}, +] +google-cloud-dataproc-metastore = [ + {file = "google-cloud-dataproc-metastore-1.13.0.tar.gz", hash = "sha256:58066b89d782bcf6985afb29822fb2a1d9a67c20210c87e3a990f69e6354e52c"}, + {file = "google_cloud_dataproc_metastore-1.13.0-py2.py3-none-any.whl", hash = "sha256:76e462a42537077ba4f9b1c4c8ec5d91d4fc4bac6d3f31a81446f50d39ef850f"}, +] +google-cloud-dlp = [ + {file = "google-cloud-dlp-3.12.3.tar.gz", hash = "sha256:73880f2a8bfa60049576fb94d85698aa2367d32ac901b76278fe50b75663440b"}, + {file = "google_cloud_dlp-3.12.3-py2.py3-none-any.whl", hash = "sha256:db263305466d0fb22b756043c8a7e1cc2842e3ed6b59fb800b9e9af63a8b0ec8"}, +] +google-cloud-kms = [ + {file = "google-cloud-kms-2.19.1.tar.gz", hash = "sha256:89add70a92d45c9f7700610774368e89d4046a05243150276f65182be92dcca7"}, + {file = "google_cloud_kms-2.19.1-py2.py3-none-any.whl", hash = "sha256:1275f2e7f08ee1106e094ec39f721af383814d94a8d123cf84bc0e9e0129562e"}, +] +google-cloud-language = [ + {file = "google-cloud-language-2.11.1.tar.gz", hash = "sha256:5f184409f040c0c73057c2616e6bd2e86e45aeb646180d19c189df4aa3d02dba"}, + {file = "google_cloud_language-2.11.1-py2.py3-none-any.whl", hash = "sha256:beb5dd1344a6ed00dd04b1eb05a967e7f83fc1b51471f9bd51f238f63f46f9d4"}, +] +google-cloud-logging = [ + {file = "google-cloud-logging-3.8.0.tar.gz", hash = "sha256:fdd916e59a84aa8c02e8148d7fdd3b3b623c57b0c1ff71f43297ce8e50fc1eab"}, + {file = "google_cloud_logging-3.8.0-py2.py3-none-any.whl", hash = "sha256:c868b276b021cf5f32b6e8356b6cb3666357d149ad0fd798076043a5ec7ed988"}, +] +google-cloud-memcache = [ + {file = "google-cloud-memcache-1.7.3.tar.gz", hash = "sha256:a73f44ec5bfc398b4c9d94d5e77621c54795bcade19960242dec2cd91b854bcb"}, + {file = "google_cloud_memcache-1.7.3-py2.py3-none-any.whl", hash = "sha256:054e2adde4e99fca6a2e3f9ef733a2159083923c0a41af51b7d5e9d38ca9de12"}, +] +google-cloud-monitoring = [ + {file = "google-cloud-monitoring-2.15.1.tar.gz", hash = "sha256:086a845a34a6e105ab8a3a4809392ea6367a65b28b7561c26101534a8705ed37"}, + {file = "google_cloud_monitoring-2.15.1-py2.py3-none-any.whl", hash = "sha256:4394e5e031f30d622a24739678ec48a45400ead94af9a6032cbff7f66194dc12"}, +] +google-cloud-orchestration-airflow = [ + {file = "google-cloud-orchestration-airflow-1.9.2.tar.gz", hash = "sha256:78c7cb164259c8bac9dd99ae9af9d2b4af933d3fbcd30895441479a36c5513b2"}, + {file = "google_cloud_orchestration_airflow-1.9.2-py2.py3-none-any.whl", hash = "sha256:fb1801bd11f63c94614c0f9f7a9e1ec846ffabd487a3fa4b7ee62ff784b46d29"}, +] +google-cloud-os-login = [ + {file = "google-cloud-os-login-2.10.0.tar.gz", hash = "sha256:2b9917802583c8179133213b2d36485a0e275f655cfff001241bb2c2e66398df"}, + {file = "google_cloud_os_login-2.10.0-py2.py3-none-any.whl", hash = "sha256:5176ddea571463078ea819c664774c7bb4451243459639d300ac1d6615779160"}, +] +google-cloud-pubsub = [ + {file = "google-cloud-pubsub-2.18.4.tar.gz", hash = "sha256:32eb61fd4c1dc6c842f594d69d9afa80544e3b327aa640a164eb6fb0201eaf2d"}, + {file = "google_cloud_pubsub-2.18.4-py2.py3-none-any.whl", hash = "sha256:f32144ad9ed32331a80a2f8379a3ca7526bbc01e7bd76de2e8ab52e492d21f50"}, +] +google-cloud-redis = [ + {file = "google-cloud-redis-2.13.2.tar.gz", hash = "sha256:5c485730355d96723d64ae637f1b2264f35b57c301ec0ef2c6d30b2f06dca14e"}, + {file = "google_cloud_redis-2.13.2-py2.py3-none-any.whl", hash = "sha256:86378e8ed1c5a1c621eb2731d734436f443dffdbbafc6cd5d24511c94d6c38bc"}, +] +google-cloud-resource-manager = [ + {file = "google-cloud-resource-manager-1.10.4.tar.gz", hash = "sha256:456b25ddda3d4cd27488a72736bbc3af04d713ae2fe3655c01b66a339d28d679"}, + {file = "google_cloud_resource_manager-1.10.4-py2.py3-none-any.whl", hash = "sha256:2ba56ba8e5280cd425bd63620da48b78da2cd299ece58a71f0f2ce3a32d56f99"}, +] +google-cloud-run = [ + {file = "google-cloud-run-0.9.1.tar.gz", hash = "sha256:727b93c8d9663b7ed4dbb6678173a149152564c7d36d6a737b4024208eb20243"}, + {file = "google_cloud_run-0.9.1-py2.py3-none-any.whl", hash = "sha256:976154a33d658fe486dfe35255f663116105f7ffe1efd8904284c3826561b3c6"}, +] +google-cloud-secret-manager = [ + {file = "google-cloud-secret-manager-2.16.4.tar.gz", hash = "sha256:371dc72f9145af323e8a813c8e50380e6ac4bd6a5dbcd42dcf3162d8f37e5080"}, + {file = "google_cloud_secret_manager-2.16.4-py2.py3-none-any.whl", hash = "sha256:5031c45dd84dc584d91ee0baae2bbd5df6710efe0c42719ee370a3ab62aaf618"}, +] +google-cloud-spanner = [ + {file = "google-cloud-spanner-3.40.1.tar.gz", hash = "sha256:616b07c86cdae6c78bad27b8ab39d8ce7a273511f2b91fe260f170d926653c2e"}, + {file = "google_cloud_spanner-3.40.1-py2.py3-none-any.whl", hash = "sha256:0c5825bb5956df83ee1d732e1851467be97bbc4502ccd91ed0c5e7fb4b3f4ccb"}, +] +google-cloud-speech = [ + {file = "google-cloud-speech-2.21.0.tar.gz", hash = "sha256:661c39bbb6f2b216ba56ace3b087260e9778dd19ade9efa3700adee9258009ad"}, + {file = "google_cloud_speech-2.21.0-py2.py3-none-any.whl", hash = "sha256:88e51aa35d385d7b8325c461327c5f4a19ac8ab38d92ffb0d61c4e91494a0171"}, ] google-cloud-storage = [ - {file = "google-cloud-storage-2.7.0.tar.gz", hash = "sha256:1ac2d58d2d693cb1341ebc48659a3527be778d9e2d8989697a2746025928ff17"}, - {file = "google_cloud_storage-2.7.0-py2.py3-none-any.whl", hash = "sha256:f78a63525e72dd46406b255bbdf858a22c43d6bad8dc5bdeb7851a42967e95a1"}, + {file = "google-cloud-storage-2.11.0.tar.gz", hash = "sha256:6fbf62659b83c8f3a0a743af0d661d2046c97c3a5bfb587c4662c4bc68de3e31"}, + {file = "google_cloud_storage-2.11.0-py2.py3-none-any.whl", hash = "sha256:88cbd7fb3d701c780c4272bc26952db99f25eb283fb4c2208423249f00b5fe53"}, +] +google-cloud-storage-transfer = [ + {file = "google-cloud-storage-transfer-1.9.2.tar.gz", hash = "sha256:c36800cf425e23cca5bed51320dce6eec313b68db8dd4677be6e3b49c891207d"}, + {file = "google_cloud_storage_transfer-1.9.2-py2.py3-none-any.whl", hash = "sha256:d30b519b57eee0d337da6d9051442337625128e950e6b487b4fd63f4942f7cb7"}, +] +google-cloud-tasks = [ + {file = "google-cloud-tasks-2.14.2.tar.gz", hash = "sha256:3efb280e7a635f57860a06a346131c117042e820ad483afd256800fae1b4d701"}, + {file = "google_cloud_tasks-2.14.2-py2.py3-none-any.whl", hash = "sha256:801a671c6dbd2269179037e93490f87e2df59ddfcb59551128bab27e7dd09f94"}, +] +google-cloud-texttospeech = [ + {file = "google-cloud-texttospeech-2.14.2.tar.gz", hash = "sha256:a23738366988faf4d265200f57c5de4312efa3d14bb434b92a6e541713f5d906"}, + {file = "google_cloud_texttospeech-2.14.2-py2.py3-none-any.whl", hash = "sha256:3a4e7ca71a1d3f90de77170a013b37f18775858dac01c80793752b8c160d6555"}, +] +google-cloud-translate = [ + {file = "google-cloud-translate-3.12.0.tar.gz", hash = "sha256:97423c1c3bf614102f1d4278175a03c523e5b4acd648b00a3407d02302aaccd9"}, + {file = "google_cloud_translate-3.12.0-py2.py3-none-any.whl", hash = "sha256:351405a07a122280d8ae5d52797a48dcfae769e29c5ebdea2a5dedacb48d41ff"}, +] +google-cloud-videointelligence = [ + {file = "google-cloud-videointelligence-2.11.4.tar.gz", hash = "sha256:07ace299a63f5b3d4441375634853b55ce8f90c62c6a24f8a47eb054149f6f99"}, + {file = "google_cloud_videointelligence-2.11.4-py2.py3-none-any.whl", hash = "sha256:4d62f7b074f6f1eae4efd8697b5a93fb59b3b22f9934e383b4f6fbed69f49eb6"}, +] +google-cloud-vision = [ + {file = "google-cloud-vision-3.4.4.tar.gz", hash = "sha256:405744ae50852034cc47b32a9b1bae50d3fb09cd1e2160014182891ef5766695"}, + {file = "google_cloud_vision-3.4.4-py2.py3-none-any.whl", hash = "sha256:49617c2b31544095151a051839a32a8864e5e12db3169f5c63b2b23500f91665"}, +] +google-cloud-workflows = [ + {file = "google-cloud-workflows-1.12.1.tar.gz", hash = "sha256:fad66cece6279f7be4fd919c1cc50f2a4a7ebf8bba97feaba75b9addece0b64b"}, + {file = "google_cloud_workflows-1.12.1-py2.py3-none-any.whl", hash = "sha256:1c24dc2b7eb4d953677407a0826e2680fc03fe6dc81b75a15d38d5a452aa467f"}, ] google-crc32c = [ {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, @@ -3373,50 +6153,258 @@ google-crc32c = [ {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, ] +google-re2 = [ + {file = "google-re2-1.1.tar.gz", hash = "sha256:d3a9467ee52b46ac77ca928f6d0cbeaccfd92f03ca0f0f65b9df6a95184f3a1c"}, + {file = "google_re2-1.1-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:874d2e36dfa506b03d4f9c4aef1701a65304f4004c96c7edac7d8aea08fe193e"}, + {file = "google_re2-1.1-1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b66eb84850afdce09aabca40bcd6f2a0e96178a1b4990d555678edb1f59bf255"}, + {file = "google_re2-1.1-1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c461640a07db26dc2b51f43de607b7520e7debaf4f6a000f796a3c0196ca52af"}, + {file = "google_re2-1.1-1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7f9ba69eaee6e7a9f5ddfb919bf1a866af14a18b26a179e3fb1a6fe3d0cbf349"}, + {file = "google_re2-1.1-1-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f95cf16739cc3ea63728366881221b119f2322b4b739b7da6522d45a68792cea"}, + {file = "google_re2-1.1-1-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:9fb56a41250191298e6a2859b0fdea1e83330c9870fe8d84e5836c506ae46e96"}, + {file = "google_re2-1.1-1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb22ea995564d87baf4a4bfbb3ca024be913683a710f4f0dc9c94dc663afab20"}, + {file = "google_re2-1.1-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19b3f0bfbb2a2ca58ed0aaa9356d07a5c0921383a6dbeca086b2b74472f5ee08"}, + {file = "google_re2-1.1-1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34fd7f97b84af7453cf05b25adfe2491ba3cef1ca548ac2907efa63d3510954d"}, + {file = "google_re2-1.1-1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e029664192d8d30f7c977706183ef483e82ca239302272df74e01d2e22897ca"}, + {file = "google_re2-1.1-1-cp310-cp310-win32.whl", hash = "sha256:41a8f222f9839d059d37efd28e4deec203502d7e39c3759d83d6a33deadf1d2e"}, + {file = "google_re2-1.1-1-cp310-cp310-win_amd64.whl", hash = "sha256:6141d569fdf72aa693f040ba05c469036587395af07ff419b9a3c009d6ffefd3"}, + {file = "google_re2-1.1-1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2d03f6aaf22788ba13a770f0d183b8eebe55545bcbb6e4c41dcccac7ded014d"}, + {file = "google_re2-1.1-1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:a98f15fd9c31bf80d368698447191a2e9703880b305dbf34d9a63ce634b8a557"}, + {file = "google_re2-1.1-1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:42128916cc2966623832aabbd224c88e862d1c531d6bc49ab141f565e6321a90"}, + {file = "google_re2-1.1-1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:6e27986a166903ad7000635f6faed8ab5072d687f822ac9f692c40b2470aebcf"}, + {file = "google_re2-1.1-1-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:5e9edcd743a830d0c0b2729201e42ab86fceef8f4086df65563f482e4544359e"}, + {file = "google_re2-1.1-1-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:d33145bbfd32e916f1c911cd9225be5364a36c3959742a0cc4dfc0692d6a2a5e"}, + {file = "google_re2-1.1-1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b27cc2544b69a357ab2a749dc0c13a1b9055198c56f4c2c3b0f61d693f8e203"}, + {file = "google_re2-1.1-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cdf8982b6def987e95b37984d0c1c878de32635dd78acde3273f730b69708c9"}, + {file = "google_re2-1.1-1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71ac661a7365e134741fe5542f13d7ce1e6187446b96ddee4c8b7d153fc8f05a"}, + {file = "google_re2-1.1-1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35a902ba31a71a3e9e114e44473624d9aa9f9b85ec981bfa91671aefe0ef1a6c"}, + {file = "google_re2-1.1-1-cp311-cp311-win32.whl", hash = "sha256:9469f26b485da2784c658e687a766c72e1a17b1e63b3ed24b5f64c3d19fbae3d"}, + {file = "google_re2-1.1-1-cp311-cp311-win_amd64.whl", hash = "sha256:07dd0780240ee431781119b46c3bbf76f5cef24a2cbb542f6a08c643e0a68d98"}, + {file = "google_re2-1.1-1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9857dc4d69b8025057c8129e98406a24d51bdaf1b96e481dbba7e69e0ec85104"}, + {file = "google_re2-1.1-1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:a6eaaa5f200022eb0bdded5949c91454fc96e1edd6f9e9a96dd1dc32c821c00e"}, + {file = "google_re2-1.1-1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a32bb2afe128d90b8edc20d4f7d297f7e2753206eba92937a57e5280736eac74"}, + {file = "google_re2-1.1-1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4f2754616c61b76ab4e5a4f39892a52a00897203b859c5abd7e3c630dd883cda"}, + {file = "google_re2-1.1-1-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:b110f3d657e8f67a43a699d327ce47095b80180ea1118e2de44cb5c7002503d9"}, + {file = "google_re2-1.1-1-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:fd62ba2853eef65e249a9c4437a9ecac568222062bc956f0c61a3d1151a6271b"}, + {file = "google_re2-1.1-1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23b50eb74dc3e1d480b04b987c61242df5dade50d08bc16e25eb3582b83fca80"}, + {file = "google_re2-1.1-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1bde89855dd5ab0811187d21eec149975510c80e865c771c883524a452445e7"}, + {file = "google_re2-1.1-1-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10c6cddc720151a509beb98ab310fa0cc8bcb265f83518ebf831de2c9ff73af0"}, + {file = "google_re2-1.1-1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bea09c5e8401ec50b8f211bc820ec2f0ca5e744ac67431a1b39bdacbd266553"}, + {file = "google_re2-1.1-1-cp38-cp38-win32.whl", hash = "sha256:ffa51b118037518bcdf63c7649d0b4be7071982b83f48ee3bbabf24a9cb48f8a"}, + {file = "google_re2-1.1-1-cp38-cp38-win_amd64.whl", hash = "sha256:3b47715b6d43c9351957eb5092ad0fa625d04106d81f34cb8a726c53395ad474"}, + {file = "google_re2-1.1-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:998f31bf7efbc9bb603d0c356c1c77e5331f689c71783df8e21e67bb025fc66a"}, + {file = "google_re2-1.1-1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0b5f0eaab859d3ba5f462c82bf37ab56e9d37e19b40b5898c731dbe4213a85f7"}, + {file = "google_re2-1.1-1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f6d591d9c4cbc7142b729ddcc3f654d059d8ebc3bc95891198808a4785a6b4d8"}, + {file = "google_re2-1.1-1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:3c325c2eae197b423330a04ab62e2e1cf942676cd5560907db4d63e23ce0648a"}, + {file = "google_re2-1.1-1-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:1e019e8f57955806ee843254ce454249b58800a6e872b2c8e9df2ef3459de0d5"}, + {file = "google_re2-1.1-1-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:58ebbcc7ad2b639768a6bca586357291660ea40dfac83039208e5055c357513b"}, + {file = "google_re2-1.1-1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:723f8553e7fc022294071f14fb7dfc7958c365dc7d4a71d4938ccd2df8c6eca4"}, + {file = "google_re2-1.1-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d81512b08e6787fc8ef29fea365d3fdbf957553a625550e1d96c36877ae30355"}, + {file = "google_re2-1.1-1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c58601b155651cc572a23ee2860788c77581aad85d3567a55b89b0674702f34d"}, + {file = "google_re2-1.1-1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c6c9f64b9724ec38da8e514f404ac64e9a6a5e8b1d7031c2dadd05c1f4c16fd"}, + {file = "google_re2-1.1-1-cp39-cp39-win32.whl", hash = "sha256:d1b751b9ab9f8e2ab2a36d72b909281ce65f328c9115a1685acae1a2d1afd7a4"}, + {file = "google_re2-1.1-1-cp39-cp39-win_amd64.whl", hash = "sha256:ac775c75cec7069351d201da4e0fb0cae4c1c5ebecd08fa34e1be89740c1d80b"}, +] google-resumable-media = [ - {file = "google-resumable-media-2.4.1.tar.gz", hash = "sha256:15b8a2e75df42dc6502d1306db0bce2647ba6013f9cd03b6e17368c0886ee90a"}, - {file = "google_resumable_media-2.4.1-py2.py3-none-any.whl", hash = "sha256:831e86fd78d302c1a034730a0c6e5369dd11d37bad73fa69ca8998460d5bae8d"}, + {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, + {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, ] googleapis-common-protos = [ - {file = "googleapis-common-protos-1.58.0.tar.gz", hash = "sha256:c727251ec025947d545184ba17e3578840fc3a24a0516a020479edab660457df"}, - {file = "googleapis_common_protos-1.58.0-py2.py3-none-any.whl", hash = "sha256:ca3befcd4580dab6ad49356b46bf165bb68ff4b32389f028f1abd7c10ab9519a"}, + {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, + {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, +] +graphviz = [ + {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, + {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, +] +greenlet = [ + {file = "greenlet-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e09dea87cc91aea5500262993cbd484b41edf8af74f976719dd83fe724644cd6"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47932c434a3c8d3c86d865443fadc1fbf574e9b11d6650b656e602b1797908a"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdfaeecf8cc705d35d8e6de324bf58427d7eafb55f67050d8f28053a3d57118c"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a68d670c8f89ff65c82b936275369e532772eebc027c3be68c6b87ad05ca695"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ad562a104cd41e9d4644f46ea37167b93190c6d5e4048fcc4b80d34ecb278f"}, + {file = "greenlet-3.0.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a807b2a58d5cdebb07050efe3d7deaf915468d112dfcf5e426d0564aa3aa4a"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1660a15a446206c8545edc292ab5c48b91ff732f91b3d3b30d9a915d5ec4779"}, + {file = "greenlet-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:813720bd57e193391dfe26f4871186cf460848b83df7e23e6bef698a7624b4c9"}, + {file = "greenlet-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:aa15a2ec737cb609ed48902b45c5e4ff6044feb5dcdfcf6fa8482379190330d7"}, + {file = "greenlet-3.0.0-cp310-universal2-macosx_11_0_x86_64.whl", hash = "sha256:7709fd7bb02b31908dc8fd35bfd0a29fc24681d5cc9ac1d64ad07f8d2b7db62f"}, + {file = "greenlet-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:211ef8d174601b80e01436f4e6905aca341b15a566f35a10dd8d1e93f5dbb3b7"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6512592cc49b2c6d9b19fbaa0312124cd4c4c8a90d28473f86f92685cc5fef8e"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871b0a8835f9e9d461b7fdaa1b57e3492dd45398e87324c047469ce2fc9f516c"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b505fcfc26f4148551826a96f7317e02c400665fa0883fe505d4fcaab1dabfdd"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123910c58234a8d40eaab595bc56a5ae49bdd90122dde5bdc012c20595a94c14"}, + {file = "greenlet-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96d9ea57292f636ec851a9bb961a5cc0f9976900e16e5d5647f19aa36ba6366b"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0b72b802496cccbd9b31acea72b6f87e7771ccfd7f7927437d592e5c92ed703c"}, + {file = "greenlet-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:527cd90ba3d8d7ae7dceb06fda619895768a46a1b4e423bdb24c1969823b8362"}, + {file = "greenlet-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:37f60b3a42d8b5499be910d1267b24355c495064f271cfe74bf28b17b099133c"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1482fba7fbed96ea7842b5a7fc11d61727e8be75a077e603e8ab49d24e234383"}, + {file = "greenlet-3.0.0-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:be557119bf467d37a8099d91fbf11b2de5eb1fd5fc5b91598407574848dc910f"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b2f1922a39d5d59cc0e597987300df3396b148a9bd10b76a058a2f2772fc04"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1e22c22f7826096ad503e9bb681b05b8c1f5a8138469b255eb91f26a76634f2"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d363666acc21d2c204dd8705c0e0457d7b2ee7a76cb16ffc099d6799744ac99"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:334ef6ed8337bd0b58bb0ae4f7f2dcc84c9f116e474bb4ec250a8bb9bd797a66"}, + {file = "greenlet-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6672fdde0fd1a60b44fb1751a7779c6db487e42b0cc65e7caa6aa686874e79fb"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:952256c2bc5b4ee8df8dfc54fc4de330970bf5d79253c863fb5e6761f00dda35"}, + {file = "greenlet-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:269d06fa0f9624455ce08ae0179430eea61085e3cf6457f05982b37fd2cefe17"}, + {file = "greenlet-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9adbd8ecf097e34ada8efde9b6fec4dd2a903b1e98037adf72d12993a1c80b51"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b5ce7f40f0e2f8b88c28e6691ca6806814157ff05e794cdd161be928550f4c"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf94aa539e97a8411b5ea52fc6ccd8371be9550c4041011a091eb8b3ca1d810"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80dcd3c938cbcac986c5c92779db8e8ce51a89a849c135172c88ecbdc8c056b7"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a712c38e5fb4fd68e00dc3caf00b60cb65634d50e32281a9d6431b33b4af1"}, + {file = "greenlet-3.0.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5539f6da3418c3dc002739cb2bb8d169056aa66e0c83f6bacae0cd3ac26b423"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:343675e0da2f3c69d3fb1e894ba0a1acf58f481f3b9372ce1eb465ef93cf6fed"}, + {file = "greenlet-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:abe1ef3d780de56defd0c77c5ba95e152f4e4c4e12d7e11dd8447d338b85a625"}, + {file = "greenlet-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:e693e759e172fa1c2c90d35dea4acbdd1d609b6936115d3739148d5e4cd11947"}, + {file = "greenlet-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bdd696947cd695924aecb3870660b7545a19851f93b9d327ef8236bfc49be705"}, + {file = "greenlet-3.0.0-cp37-universal2-macosx_11_0_x86_64.whl", hash = "sha256:cc3e2679ea13b4de79bdc44b25a0c4fcd5e94e21b8f290791744ac42d34a0353"}, + {file = "greenlet-3.0.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:63acdc34c9cde42a6534518e32ce55c30f932b473c62c235a466469a710bfbf9"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a1a6244ff96343e9994e37e5b4839f09a0207d35ef6134dce5c20d260d0302c"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b822fab253ac0f330ee807e7485769e3ac85d5eef827ca224feaaefa462dc0d0"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8060b32d8586e912a7b7dac2d15b28dbbd63a174ab32f5bc6d107a1c4143f40b"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621fcb346141ae08cb95424ebfc5b014361621b8132c48e538e34c3c93ac7365"}, + {file = "greenlet-3.0.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb36985f606a7c49916eff74ab99399cdfd09241c375d5a820bb855dfb4af9f"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10b5582744abd9858947d163843d323d0b67be9432db50f8bf83031032bc218d"}, + {file = "greenlet-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f351479a6914fd81a55c8e68963609f792d9b067fb8a60a042c585a621e0de4f"}, + {file = "greenlet-3.0.0-cp38-cp38-win32.whl", hash = "sha256:9de687479faec7db5b198cc365bc34addd256b0028956501f4d4d5e9ca2e240a"}, + {file = "greenlet-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:3fd2b18432e7298fcbec3d39e1a0aa91ae9ea1c93356ec089421fabc3651572b"}, + {file = "greenlet-3.0.0-cp38-universal2-macosx_11_0_x86_64.whl", hash = "sha256:3c0d36f5adc6e6100aedbc976d7428a9f7194ea79911aa4bf471f44ee13a9464"}, + {file = "greenlet-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4cd83fb8d8e17633ad534d9ac93719ef8937568d730ef07ac3a98cb520fd93e4"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a5b2d4cdaf1c71057ff823a19d850ed5c6c2d3686cb71f73ae4d6382aaa7a06"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e7dcdfad252f2ca83c685b0fa9fba00e4d8f243b73839229d56ee3d9d219314"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94e4e924d09b5a3e37b853fe5924a95eac058cb6f6fb437ebb588b7eda79870"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6fb737e46b8bd63156b8f59ba6cdef46fe2b7db0c5804388a2d0519b8ddb99"}, + {file = "greenlet-3.0.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d55db1db455c59b46f794346efce896e754b8942817f46a1bada2d29446e305a"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:56867a3b3cf26dc8a0beecdb4459c59f4c47cdd5424618c08515f682e1d46692"}, + {file = "greenlet-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a812224a5fb17a538207e8cf8e86f517df2080c8ee0f8c1ed2bdaccd18f38f4"}, + {file = "greenlet-3.0.0-cp39-cp39-win32.whl", hash = "sha256:0d3f83ffb18dc57243e0151331e3c383b05e5b6c5029ac29f754745c800f8ed9"}, + {file = "greenlet-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:831d6f35037cf18ca5e80a737a27d822d87cd922521d18ed3dbc8a6967be50ce"}, + {file = "greenlet-3.0.0-cp39-universal2-macosx_11_0_x86_64.whl", hash = "sha256:a048293392d4e058298710a54dfaefcefdf49d287cd33fb1f7d63d55426e4355"}, + {file = "greenlet-3.0.0.tar.gz", hash = "sha256:19834e3f91f485442adc1ee440171ec5d9a4840a1f7bd5ed97833544719ce10b"}, ] griffe = [ - {file = "griffe-0.25.5-py3-none-any.whl", hash = "sha256:1fb9edff48e66d4873014a2ebf21aca5f271d0006a4c937826e3cf592ffb3706"}, - {file = "griffe-0.25.5.tar.gz", hash = "sha256:11ea3403ef0560a1cbcf7f302eb5d21cf4c1d8ed3f8a16a75aa9f6f458caf3f1"}, + {file = "griffe-0.36.5-py3-none-any.whl", hash = "sha256:62af1ca94a5ac73259278b7692d300bf1c6bd8f9beeabaeaa229009bb82d09c6"}, + {file = "griffe-0.36.5.tar.gz", hash = "sha256:b8a672c54b99e958b985b3cfbf1de09e25d686dd8a667aa5ec2d0b1601a542fc"}, +] +grpc-google-iam-v1 = [ + {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, + {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, +] +grpcio = [ + {file = "grpcio-1.59.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:225e5fa61c35eeaebb4e7491cd2d768cd8eb6ed00f2664fa83a58f29418b39fd"}, + {file = "grpcio-1.59.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b95ec8ecc4f703f5caaa8d96e93e40c7f589bad299a2617bdb8becbcce525539"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1a839ba86764cc48226f50b924216000c79779c563a301586a107bda9cbe9dcf"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6cfe44a5d7c7d5f1017a7da1c8160304091ca5dc64a0f85bca0d63008c3137a"}, + {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0fcf53df684fcc0154b1e61f6b4a8c4cf5f49d98a63511e3f30966feff39cd0"}, + {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa66cac32861500f280bb60fe7d5b3e22d68c51e18e65367e38f8669b78cea3b"}, + {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8cd2d38c2d52f607d75a74143113174c36d8a416d9472415eab834f837580cf7"}, + {file = "grpcio-1.59.0-cp310-cp310-win32.whl", hash = "sha256:228b91ce454876d7eed74041aff24a8f04c0306b7250a2da99d35dd25e2a1211"}, + {file = "grpcio-1.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca87ee6183421b7cea3544190061f6c1c3dfc959e0b57a5286b108511fd34ff4"}, + {file = "grpcio-1.59.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c173a87d622ea074ce79be33b952f0b424fa92182063c3bda8625c11d3585d09"}, + {file = "grpcio-1.59.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec78aebb9b6771d6a1de7b6ca2f779a2f6113b9108d486e904bde323d51f5589"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:0b84445fa94d59e6806c10266b977f92fa997db3585f125d6b751af02ff8b9fe"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c251d22de8f9f5cca9ee47e4bade7c5c853e6e40743f47f5cc02288ee7a87252"}, + {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d"}, + {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:38da5310ef84e16d638ad89550b5b9424df508fd5c7b968b90eb9629ca9be4b9"}, + {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63982150a7d598281fa1d7ffead6096e543ff8be189d3235dd2b5604f2c553e5"}, + {file = "grpcio-1.59.0-cp311-cp311-win32.whl", hash = "sha256:50eff97397e29eeee5df106ea1afce3ee134d567aa2c8e04fabab05c79d791a7"}, + {file = "grpcio-1.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f03bd714f987d48ae57fe092cf81960ae36da4e520e729392a59a75cda4f29"}, + {file = "grpcio-1.59.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f1feb034321ae2f718172d86b8276c03599846dc7bb1792ae370af02718f91c5"}, + {file = "grpcio-1.59.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d09bd2a4e9f5a44d36bb8684f284835c14d30c22d8ec92ce796655af12163588"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:2f120d27051e4c59db2f267b71b833796770d3ea36ca712befa8c5fff5da6ebd"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0ca727a173ee093f49ead932c051af463258b4b493b956a2c099696f38aa66"}, + {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5711c51e204dc52065f4a3327dca46e69636a0b76d3e98c2c28c4ccef9b04c52"}, + {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d74f7d2d7c242a6af9d4d069552ec3669965b74fed6b92946e0e13b4168374f9"}, + {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3859917de234a0a2a52132489c4425a73669de9c458b01c9a83687f1f31b5b10"}, + {file = "grpcio-1.59.0-cp312-cp312-win32.whl", hash = "sha256:de2599985b7c1b4ce7526e15c969d66b93687571aa008ca749d6235d056b7205"}, + {file = "grpcio-1.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:598f3530231cf10ae03f4ab92d48c3be1fee0c52213a1d5958df1a90957e6a88"}, + {file = "grpcio-1.59.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b34c7a4c31841a2ea27246a05eed8a80c319bfc0d3e644412ec9ce437105ff6c"}, + {file = "grpcio-1.59.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c4dfdb49f4997dc664f30116af2d34751b91aa031f8c8ee251ce4dcfc11277b0"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:61bc72a00ecc2b79d9695220b4d02e8ba53b702b42411397e831c9b0589f08a3"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f367e4b524cb319e50acbdea57bb63c3b717c5d561974ace0b065a648bb3bad3"}, + {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849c47ef42424c86af069a9c5e691a765e304079755d5c29eff511263fad9c2a"}, + {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c0488c2b0528e6072010182075615620071371701733c63ab5be49140ed8f7f0"}, + {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:611d9aa0017fa386809bddcb76653a5ab18c264faf4d9ff35cb904d44745f575"}, + {file = "grpcio-1.59.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5378785dce2b91eb2e5b857ec7602305a3b5cf78311767146464bfa365fc897"}, + {file = "grpcio-1.59.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fe976910de34d21057bcb53b2c5e667843588b48bf11339da2a75f5c4c5b4055"}, + {file = "grpcio-1.59.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c041a91712bf23b2a910f61e16565a05869e505dc5a5c025d429ca6de5de842c"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ae444221b2c16d8211b55326f8ba173ba8f8c76349bfc1768198ba592b58f74"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceb1e68135788c3fce2211de86a7597591f0b9a0d2bb80e8401fd1d915991bac"}, + {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4b1cc3a9dc1924d2eb26eec8792fedd4b3fcd10111e26c1d551f2e4eda79ce"}, + {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:871371ce0c0055d3db2a86fdebd1e1d647cf21a8912acc30052660297a5a6901"}, + {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93e9cb546e610829e462147ce724a9cb108e61647a3454500438a6deef610be1"}, + {file = "grpcio-1.59.0-cp38-cp38-win32.whl", hash = "sha256:f21917aa50b40842b51aff2de6ebf9e2f6af3fe0971c31960ad6a3a2b24988f4"}, + {file = "grpcio-1.59.0-cp38-cp38-win_amd64.whl", hash = "sha256:14890da86a0c0e9dc1ea8e90101d7a3e0e7b1e71f4487fab36e2bfd2ecadd13c"}, + {file = "grpcio-1.59.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:34341d9e81a4b669a5f5dca3b2a760b6798e95cdda2b173e65d29d0b16692857"}, + {file = "grpcio-1.59.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:986de4aa75646e963466b386a8c5055c8b23a26a36a6c99052385d6fe8aaf180"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aca8a24fef80bef73f83eb8153f5f5a0134d9539b4c436a716256b311dda90a6"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:936b2e04663660c600d5173bc2cc84e15adbad9c8f71946eb833b0afc205b996"}, + {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc8bf2e7bc725e76c0c11e474634a08c8f24bcf7426c0c6d60c8f9c6e70e4d4a"}, + {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81d86a096ccd24a57fa5772a544c9e566218bc4de49e8c909882dae9d73392df"}, + {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ea95cd6abbe20138b8df965b4a8674ec312aaef3147c0f46a0bac661f09e8d0"}, + {file = "grpcio-1.59.0-cp39-cp39-win32.whl", hash = "sha256:3b8ff795d35a93d1df6531f31c1502673d1cebeeba93d0f9bd74617381507e3f"}, + {file = "grpcio-1.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:38823bd088c69f59966f594d087d3a929d1ef310506bee9e3648317660d65b81"}, + {file = "grpcio-1.59.0.tar.gz", hash = "sha256:acf70a63cf09dd494000007b798aff88a436e1c03b394995ce450be437b8e54f"}, +] +grpcio-gcp = [ + {file = "grpcio-gcp-0.2.2.tar.gz", hash = "sha256:e292605effc7da39b7a8734c719afb12ec4b5362add3528d8afad3aa3aa9057c"}, + {file = "grpcio_gcp-0.2.2-py2.py3-none-any.whl", hash = "sha256:1ef8e8531eab11356a3eb4c5b84e79e0d923d6782d19e1b1a45e1cabe4e783d7"}, +] +grpcio-status = [ + {file = "grpcio-status-1.48.2.tar.gz", hash = "sha256:53695f45da07437b7c344ee4ef60d370fd2850179f5a28bb26d8e2aa1102ec11"}, + {file = "grpcio_status-1.48.2-py3-none-any.whl", hash = "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf"}, +] +gunicorn = [ + {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"}, + {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"}, +] +h11 = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] hail = [ - {file = "hail-0.2.109-py3-none-any.whl", hash = "sha256:4d0d5fe5376a3158588d97e43c1040b8c07b58f049a334882e40c01bac74bf27"}, + {file = "hail-0.2.124-py3-none-any.whl", hash = "sha256:11fe8782adf351fea0674a30462aa34f9a12f5481e0e8ff08954eb16bc6c0bcb"}, ] htmlmin = [ {file = "htmlmin-0.1.12.tar.gz", hash = "sha256:50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178"}, ] +httpcore = [ + {file = "httpcore-0.18.0-py3-none-any.whl", hash = "sha256:adc5398ee0a476567bf87467063ee63584a8bce86078bf748e48754f60202ced"}, + {file = "httpcore-0.18.0.tar.gz", hash = "sha256:13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9"}, +] +httplib2 = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] +httpx = [ + {file = "httpx-0.25.0-py3-none-any.whl", hash = "sha256:181ea7f8ba3a82578be86ef4171554dd45fec26a02556a744db029a0a27b7100"}, + {file = "httpx-0.25.0.tar.gz", hash = "sha256:47ecda285389cb32bb2691cc6e069e3ab0205956f681c5b2ad2325719751d875"}, +] humanize = [ {file = "humanize-1.1.0-py3-none-any.whl", hash = "sha256:3959c76f1f6c9b43258bb0b0f6b6161d6c07b8717b306c0b713ea36b7999331e"}, {file = "humanize-1.1.0.tar.gz", hash = "sha256:ad83016fae2453a7486f5be5dba8e19883020c77f6c12c63702f3b6c15ae3c5e"}, ] -"hurry.filesize" = [ - {file = "hurry.filesize-0.9.tar.gz", hash = "sha256:f5368329adbef86accd3bc9490522340bb79260455ae89b1a42c10f63801b9a6"}, -] hydra-core = [ {file = "hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824"}, {file = "hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b"}, ] identify = [ - {file = "identify-2.5.19-py2.py3-none-any.whl", hash = "sha256:3ee3533e7f6f5023157fbebbd5687bb4b698ce6f305259e0d24b2d7d9efb72bc"}, - {file = "identify-2.5.19.tar.gz", hash = "sha256:4102ecd051f6884449e7359e55b38ba6cd7aafb6ef27b8e2b38495a5723ea106"}, + {file = "identify-2.5.30-py2.py3-none-any.whl", hash = "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54"}, + {file = "identify-2.5.30.tar.gz", hash = "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d"}, ] idna = [ {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] importlib-metadata = [ - {file = "importlib_metadata-6.0.0-py3-none-any.whl", hash = "sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad"}, - {file = "importlib_metadata-6.0.0.tar.gz", hash = "sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] importlib-resources = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, + {file = "importlib_resources-6.1.0-py3-none-any.whl", hash = "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83"}, + {file = "importlib_resources-6.1.0.tar.gz", hash = "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9"}, +] +inflection = [ + {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, + {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, ] iniconfig = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, @@ -3427,12 +6415,12 @@ interrogate = [ {file = "interrogate-1.5.0.tar.gz", hash = "sha256:b6f325f0aa84ac3ac6779d8708264d366102226c5af7d69058cecffcff7a6d6c"}, ] ipykernel = [ - {file = "ipykernel-6.21.3-py3-none-any.whl", hash = "sha256:24ebd9715e317c185e37156ab3a87382410185230dde7aeffce389d6c7d4428a"}, - {file = "ipykernel-6.21.3.tar.gz", hash = "sha256:c8ff581905d70e7299bc1473a2f7c113bec1744fb3746d58e5b4b93bd8ee7001"}, + {file = "ipykernel-6.25.2-py3-none-any.whl", hash = "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77"}, + {file = "ipykernel-6.25.2.tar.gz", hash = "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b"}, ] ipython = [ - {file = "ipython-8.11.0-py3-none-any.whl", hash = "sha256:5b54478e459155a326bf5f42ee4f29df76258c0279c36f21d71ddb560f88b156"}, - {file = "ipython-8.11.0.tar.gz", hash = "sha256:735cede4099dbc903ee540307b9171fbfef4aa75cfcacc5a273b2cda2f02be04"}, + {file = "ipython-8.16.1-py3-none-any.whl", hash = "sha256:0852469d4d579d9cd613c220af7bf0c9cc251813e12be647cb9d463939db9b1e"}, + {file = "ipython-8.16.1.tar.gz", hash = "sha256:ad52f58fca8f9f848e256c629eff888efc0528c12fe0f8ec14f33205f23ef938"}, ] isodate = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, @@ -3442,171 +6430,289 @@ isort = [ {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, ] +itsdangerous = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] janus = [ {file = "janus-1.0.0-py3-none-any.whl", hash = "sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a"}, {file = "janus-1.0.0.tar.gz", hash = "sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612"}, ] jedi = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] -Jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] jmespath = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] joblib = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, +] +jproperties = [ + {file = "jproperties-2.1.1-py2.py3-none-any.whl", hash = "sha256:4dfcd7cab56d9c79bce4453f7ca9ffbe0ff0574ddcf1c2a99a8646df60634664"}, + {file = "jproperties-2.1.1.tar.gz", hash = "sha256:40b71124e8d257e8954899a91cd2d5c0f72e0f67f1b72048a5ba264567604f29"}, ] jsmin = [ {file = "jsmin-3.0.1.tar.gz", hash = "sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc"}, ] +json-merge-patch = [ + {file = "json-merge-patch-0.2.tar.gz", hash = "sha256:09898b6d427c08754e2a97c709cf2dfd7e28bd10c5683a538914975eab778d39"}, +] +jsonschema = [ + {file = "jsonschema-4.19.1-py3-none-any.whl", hash = "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e"}, + {file = "jsonschema-4.19.1.tar.gz", hash = "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf"}, +] +jsonschema-specifications = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] jupyter-client = [ - {file = "jupyter_client-8.0.3-py3-none-any.whl", hash = "sha256:be48ac6bd659cbbddb7a674cf06b3b8afbf53f228253cf58bde604c03bd487b0"}, - {file = "jupyter_client-8.0.3.tar.gz", hash = "sha256:ed65498bea6d876ef9d8da3e0db3dd33c5d129f5b2645f56ae03993782966bd0"}, + {file = "jupyter_client-8.3.1-py3-none-any.whl", hash = "sha256:5eb9f55eb0650e81de6b7e34308d8b92d04fe4ec41cd8193a913979e33d8e1a5"}, + {file = "jupyter_client-8.3.1.tar.gz", hash = "sha256:60294b2d5b869356c893f57b1a877ea6510d60d45cf4b38057f1672d85699ac9"}, ] jupyter-core = [ - {file = "jupyter_core-5.2.0-py3-none-any.whl", hash = "sha256:4bdc2928c37f6917130c667d8b8708f20aee539d8283c6be72aabd2a4b4c83b0"}, - {file = "jupyter_core-5.2.0.tar.gz", hash = "sha256:1407cdb4c79ee467696c04b76633fc1884015fa109323365a6372c8e890cc83f"}, + {file = "jupyter_core-5.3.2-py3-none-any.whl", hash = "sha256:a4af53c3fa3f6330cebb0d9f658e148725d15652811d1c32dc0f63bb96f2e6d6"}, + {file = "jupyter_core-5.3.2.tar.gz", hash = "sha256:0c28db6cbe2c37b5b398e1a1a5b22f84fd64cd10afc1f6c05b02fb09481ba45f"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] +limits = [ + {file = "limits-3.6.0-py3-none-any.whl", hash = "sha256:32fe29a398352c71bc43d53773117d47e22c5ea4200aef28d3f5fdee10334cd7"}, + {file = "limits-3.6.0.tar.gz", hash = "sha256:57a9c69fd37ad1e4fa3886dff8d035227e1f6af87f47e9118627e72cf1ced3bf"}, +] +linkify-it-py = [ + {file = "linkify-it-py-2.0.2.tar.gz", hash = "sha256:19f3060727842c254c808e99d465c80c49d2c7306788140987a1a7a29b0d6ad2"}, + {file = "linkify_it_py-2.0.2-py3-none-any.whl", hash = "sha256:a3a24428f6c96f27370d7fe61d2ac0be09017be5190d68d8658233171f1b6541"}, +] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] +looker-sdk = [ + {file = "looker_sdk-23.16.0-py3-none-any.whl", hash = "sha256:c5a680d4641a7725be6920630aa7ece0430e2a92abe1f396e8c63ed74dcd43d5"}, + {file = "looker_sdk-23.16.0.tar.gz", hash = "sha256:4daa7a9812a92fdd1e0094cb0afb0db2e7bb54e10492b1345b67705dbe5089d5"}, ] lxml = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, -] -Markdown = [ - {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, - {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, -] -MarkupSafe = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] +mako = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] +markdown = [ + {file = "Markdown-3.5-py3-none-any.whl", hash = "sha256:4afb124395ce5fc34e6d9886dab977fd9ae987fc6e85689f08278cf0c69d4bf3"}, + {file = "Markdown-3.5.tar.gz", hash = "sha256:a807eb2e4778d9156c8f07876c6e4d50b5494c5665c4834f67b06459dfd877b3"}, +] +markdown-it-py = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] +marshmallow = [ + {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, + {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, +] +marshmallow-oneofschema = [ + {file = "marshmallow-oneofschema-3.0.1.tar.gz", hash = "sha256:62cd2099b29188c92493c2940ee79d1bf2f2619a71721664e5a98ec2faa58237"}, + {file = "marshmallow_oneofschema-3.0.1-py2.py3-none-any.whl", hash = "sha256:bd29410a9f2f7457a2b428286e2a80ef76b8ddc3701527dc1f935a88914b02f2"}, +] +marshmallow-sqlalchemy = [ + {file = "marshmallow-sqlalchemy-0.26.1.tar.gz", hash = "sha256:d8525f74de51554b5c8491effe036f60629a426229befa33ff614c8569a16a73"}, + {file = "marshmallow_sqlalchemy-0.26.1-py2.py3-none-any.whl", hash = "sha256:ba7493eeb8669a3bf00d8f906b657feaa87a740ae9e4ecf829cfd6ddf763d276"}, ] matplotlib-inline = [ {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, @@ -3616,73 +6722,81 @@ mccabe = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +mdit-py-plugins = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] +mdurl = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] mergedeep = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] mkdocs = [ - {file = "mkdocs-1.4.2-py3-none-any.whl", hash = "sha256:c8856a832c1e56702577023cd64cc5f84948280c1c0fcc6af4cd39006ea6aa8c"}, - {file = "mkdocs-1.4.2.tar.gz", hash = "sha256:8947af423a6d0facf41ea1195b8e1e8c85ad94ac95ae307fe11232e0424b11c5"}, + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, ] mkdocs-autolinks-plugin = [ {file = "mkdocs-autolinks-plugin-0.6.0.tar.gz", hash = "sha256:7bddb5bfb06f003fa7f139a4373ffc433e9ad761a297c7fe6ee205a4d7d913b6"}, {file = "mkdocs_autolinks_plugin-0.6.0-py3-none-any.whl", hash = "sha256:db967582a5d3bd282d197730cd9035a74b559b0febb44645e95df27d5c67cad9"}, ] mkdocs-autorefs = [ - {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, - {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, + {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, + {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, ] mkdocs-awesome-pages-plugin = [ - {file = "mkdocs-awesome-pages-plugin-2.8.0.tar.gz", hash = "sha256:af7e327e14b2eea3b2735c37428e33a528ecd2d9ae2296dc0f1632f0f3bc28f7"}, - {file = "mkdocs_awesome_pages_plugin-2.8.0-py3-none-any.whl", hash = "sha256:6b21ad4f41aecbe89e3a9a51f8837892cc7ce8ca0f9f4e0a355d56159ace3d68"}, + {file = "mkdocs_awesome_pages_plugin-2.9.2-py3-none-any.whl", hash = "sha256:9c795587695bd1ee85a8b7e43293005418df5a8b9ef296a3e628be427b693b4d"}, + {file = "mkdocs_awesome_pages_plugin-2.9.2.tar.gz", hash = "sha256:c3f7d366ecfe99b64524c49a84d8e13c576c19a918ea2e6f59bb486a259313af"}, ] mkdocs-exclude = [ {file = "mkdocs-exclude-1.0.2.tar.gz", hash = "sha256:ba6fab3c80ddbe3fd31d3e579861fd3124513708271180a5f81846da8c7e2a51"}, ] mkdocs-git-committers-plugin-2 = [ - {file = "mkdocs-git-committers-plugin-2-1.1.1.tar.gz", hash = "sha256:4f6eb6137f35967dfa444703b6ea293f05bf2fd183506bc51db8fb21b061d5a3"}, - {file = "mkdocs_git_committers_plugin_2-1.1.1-py3-none-any.whl", hash = "sha256:14d4a89bf8965ab62ca9b8b0cd90f6c9b421bb89bfedca0d91c5119f18791360"}, + {file = "mkdocs-git-committers-plugin-2-1.2.0.tar.gz", hash = "sha256:921da26b3f4393e6c170279ac34089151dfc22cd29ec4fbce3506218541685c8"}, + {file = "mkdocs_git_committers_plugin_2-1.2.0-py3-none-any.whl", hash = "sha256:0bb5d71cdd9d43fec0dec16e52a9aad2784256b0fa6ef9bb0cceffc36c081ab3"}, ] mkdocs-git-revision-date-localized-plugin = [ {file = "mkdocs-git-revision-date-localized-plugin-1.2.0.tar.gz", hash = "sha256:7752edd7c4dcaa9383e9a5b6a4f729831a62d604b0c43b319331127720c6a2bf"}, {file = "mkdocs_git_revision_date_localized_plugin-1.2.0-py3-none-any.whl", hash = "sha256:540b9c930d8d48630c090b72ac2c3900ac2ed0799b23738a33b88e31f5198fe7"}, ] mkdocs-material = [ - {file = "mkdocs_material-9.1.2-py3-none-any.whl", hash = "sha256:344a1c66f0e217e5ceaf67739d274e51c61ac9f9d7af55a5b4805a4a2ab54184"}, - {file = "mkdocs_material-9.1.2.tar.gz", hash = "sha256:9ca8c980c30aab3b70e3bfbec691f9ffcbea8319873911c86e8af145147e2a9d"}, + {file = "mkdocs_material-9.4.4-py3-none-any.whl", hash = "sha256:86fe79253afccc7f085f89a2d8e9e3300f82c4813d9b910d9081ce57a7e68380"}, + {file = "mkdocs_material-9.4.4.tar.gz", hash = "sha256:ab84a7cfaf009c47cd2926cdd7e6040b8cc12c3806cc533e8b16d57bd16d9c47"}, ] mkdocs-material-extensions = [ - {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"}, - {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"}, + {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, + {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, ] mkdocs-minify-plugin = [ {file = "mkdocs-minify-plugin-0.5.0.tar.gz", hash = "sha256:32d9e8fbd89327a0f4f648f517297aad344c1bad64cfde110d059bd2f2780a6d"}, {file = "mkdocs_minify_plugin-0.5.0-py2-none-any.whl", hash = "sha256:487c31ae6b8b3230f56910ce6bcf5c7e6ad9a8c4f51c720a4b989f30c2b0233f"}, ] mkdocs-section-index = [ - {file = "mkdocs_section_index-0.3.5-py3-none-any.whl", hash = "sha256:1f6359287b0a823d6297cf1cb6c0a49ed75851d0d1cea8b425b207a45ce10141"}, - {file = "mkdocs_section_index-0.3.5.tar.gz", hash = "sha256:fa8b1ce0649326b1873c6460c1df2bb0c4825fd21e3dd416f13ec212d31edf12"}, -] -mkdocs-simple-hooks = [ - {file = "mkdocs-simple-hooks-0.1.5.tar.gz", hash = "sha256:dddbdf151a18723c9302a133e5cf79538be8eb9d274e8e07d2ac3ac34890837c"}, - {file = "mkdocs_simple_hooks-0.1.5-py3-none-any.whl", hash = "sha256:efeabdbb98b0850a909adee285f3404535117159d5cb3a34f541d6eaa644d50a"}, + {file = "mkdocs_section_index-0.3.8-py3-none-any.whl", hash = "sha256:823d298d78bc1e73e23678ff60889f3c369c2167b03dba73fea88bd0e268a60d"}, + {file = "mkdocs_section_index-0.3.8.tar.gz", hash = "sha256:bbd209f0da79441baf136ef3a9c40665bb9681d1fb62c73ca2f116fd1388a404"}, ] mkdocstrings = [ - {file = "mkdocstrings-0.20.0-py3-none-any.whl", hash = "sha256:f17fc2c4f760ec302b069075ef9e31045aa6372ca91d2f35ded3adba8e25a472"}, - {file = "mkdocstrings-0.20.0.tar.gz", hash = "sha256:c757f4f646d4f939491d6bc9256bfe33e36c5f8026392f49eaa351d241c838e5"}, + {file = "mkdocstrings-0.23.0-py3-none-any.whl", hash = "sha256:051fa4014dfcd9ed90254ae91de2dbb4f24e166347dae7be9a997fe16316c65e"}, + {file = "mkdocstrings-0.23.0.tar.gz", hash = "sha256:d9c6a37ffbe7c14a7a54ef1258c70b8d394e6a33a1c80832bce40b9567138d1c"}, ] mkdocstrings-python = [ {file = "mkdocstrings-python-0.7.1.tar.gz", hash = "sha256:c334b382dca202dfa37071c182418a6df5818356a95d54362a2b24822ca3af71"}, {file = "mkdocstrings_python-0.7.1-py3-none-any.whl", hash = "sha256:a22060bfa374697678e9af4e62b020d990dad2711c98f7a9fac5c0345bef93c7"}, ] msal = [ - {file = "msal-1.21.0-py2.py3-none-any.whl", hash = "sha256:e8444617c1eccdff7bb73f5d4f94036002accea4a2c05f8f39c9efb5bd2b0c6a"}, - {file = "msal-1.21.0.tar.gz", hash = "sha256:96b5c867830fd116e5f7d0ec8ef1b238b4cda4d1aea86d8fecf518260e136fbf"}, + {file = "msal-1.24.1-py2.py3-none-any.whl", hash = "sha256:ce4320688f95c301ee74a4d0e9dbcfe029a63663a8cc61756f40d0d0d36574ad"}, + {file = "msal-1.24.1.tar.gz", hash = "sha256:aa0972884b3c6fdec53d9a0bd15c12e5bd7b71ac1b66d746f54d128709f3f8f8"}, ] msal-extensions = [ {file = "msal-extensions-1.0.0.tar.gz", hash = "sha256:c676aba56b0cce3783de1b5c5ecfe828db998167875126ca4b47dc6436451354"}, {file = "msal_extensions-1.0.0-py2.py3-none-any.whl", hash = "sha256:91e3db9620b822d0ed2b4d1850056a0f133cba04455e62f11612e40f5502f2ee"}, ] +msrest = [ + {file = "msrest-0.7.1-py3-none-any.whl", hash = "sha256:21120a810e1233e5e6cc7fe40b474eeb4ec6f757a15d7cf86702c369f9567c32"}, + {file = "msrest-0.7.1.zip", hash = "sha256:6e7661f46f3afd88b75667b7187a92829924446c7ea1d169be8c4bb7eeb788b9"}, +] multidict = [ {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, @@ -3789,138 +6903,233 @@ mypy-extensions = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] natsort = [ - {file = "natsort-8.3.1-py3-none-any.whl", hash = "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb"}, - {file = "natsort-8.3.1.tar.gz", hash = "sha256:517595492dde570a4fd6b6a76f644440c1ba51e2338c8a671d7f0475fda8f9fd"}, + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, ] nest-asyncio = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, ] nodeenv = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] numpy = [ - {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, - {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, - {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, - {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, - {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, - {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, - {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, - {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, - {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, - {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, - {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, + {file = "numpy-1.26.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8db2f125746e44dce707dd44d4f4efeea8d7e2b43aace3f8d1f235cfa2733dd"}, + {file = "numpy-1.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0621f7daf973d34d18b4e4bafb210bbaf1ef5e0100b5fa750bd9cde84c7ac292"}, + {file = "numpy-1.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51be5f8c349fdd1a5568e72713a21f518e7d6707bcf8503b528b88d33b57dc68"}, + {file = "numpy-1.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:767254ad364991ccfc4d81b8152912e53e103ec192d1bb4ea6b1f5a7117040be"}, + {file = "numpy-1.26.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:436c8e9a4bdeeee84e3e59614d38c3dbd3235838a877af8c211cfcac8a80b8d3"}, + {file = "numpy-1.26.0-cp310-cp310-win32.whl", hash = "sha256:c2e698cb0c6dda9372ea98a0344245ee65bdc1c9dd939cceed6bb91256837896"}, + {file = "numpy-1.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:09aaee96c2cbdea95de76ecb8a586cb687d281c881f5f17bfc0fb7f5890f6b91"}, + {file = "numpy-1.26.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:637c58b468a69869258b8ae26f4a4c6ff8abffd4a8334c830ffb63e0feefe99a"}, + {file = "numpy-1.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:306545e234503a24fe9ae95ebf84d25cba1fdc27db971aa2d9f1ab6bba19a9dd"}, + {file = "numpy-1.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6adc33561bd1d46f81131d5352348350fc23df4d742bb246cdfca606ea1208"}, + {file = "numpy-1.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e062aa24638bb5018b7841977c360d2f5917268d125c833a686b7cbabbec496c"}, + {file = "numpy-1.26.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:546b7dd7e22f3c6861463bebb000646fa730e55df5ee4a0224408b5694cc6148"}, + {file = "numpy-1.26.0-cp311-cp311-win32.whl", hash = "sha256:c0b45c8b65b79337dee5134d038346d30e109e9e2e9d43464a2970e5c0e93229"}, + {file = "numpy-1.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:eae430ecf5794cb7ae7fa3808740b015aa80747e5266153128ef055975a72b99"}, + {file = "numpy-1.26.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:166b36197e9debc4e384e9c652ba60c0bacc216d0fc89e78f973a9760b503388"}, + {file = "numpy-1.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f042f66d0b4ae6d48e70e28d487376204d3cbf43b84c03bac57e28dac6151581"}, + {file = "numpy-1.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5e18e5b14a7560d8acf1c596688f4dfd19b4f2945b245a71e5af4ddb7422feb"}, + {file = "numpy-1.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6bad22a791226d0a5c7c27a80a20e11cfe09ad5ef9084d4d3fc4a299cca505"}, + {file = "numpy-1.26.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4acc65dd65da28060e206c8f27a573455ed724e6179941edb19f97e58161bb69"}, + {file = "numpy-1.26.0-cp312-cp312-win32.whl", hash = "sha256:bb0d9a1aaf5f1cb7967320e80690a1d7ff69f1d47ebc5a9bea013e3a21faec95"}, + {file = "numpy-1.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:ee84ca3c58fe48b8ddafdeb1db87388dce2c3c3f701bf447b05e4cfcc3679112"}, + {file = "numpy-1.26.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4a873a8180479bc829313e8d9798d5234dfacfc2e8a7ac188418189bb8eafbd2"}, + {file = "numpy-1.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:914b28d3215e0c721dc75db3ad6d62f51f630cb0c277e6b3bcb39519bed10bd8"}, + {file = "numpy-1.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c78a22e95182fb2e7874712433eaa610478a3caf86f28c621708d35fa4fd6e7f"}, + {file = "numpy-1.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f737708b366c36b76e953c46ba5827d8c27b7a8c9d0f471810728e5a2fe57c"}, + {file = "numpy-1.26.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b44e6a09afc12952a7d2a58ca0a2429ee0d49a4f89d83a0a11052da696440e49"}, + {file = "numpy-1.26.0-cp39-cp39-win32.whl", hash = "sha256:5671338034b820c8d58c81ad1dafc0ed5a00771a82fccc71d6438df00302094b"}, + {file = "numpy-1.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:020cdbee66ed46b671429c7265cf00d8ac91c046901c55684954c3958525dab2"}, + {file = "numpy-1.26.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0792824ce2f7ea0c82ed2e4fecc29bb86bee0567a080dacaf2e0a01fe7654369"}, + {file = "numpy-1.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d484292eaeb3e84a51432a94f53578689ffdea3f90e10c8b203a99be5af57d8"}, + {file = "numpy-1.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:186ba67fad3c60dbe8a3abff3b67a91351100f2661c8e2a80364ae6279720299"}, + {file = "numpy-1.26.0.tar.gz", hash = "sha256:f93fc78fe8bf15afe2b8d6b6499f1c73953169fad1e9a8dd086cdff3190e7fdf"}, +] +oauthlib = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, ] omegaconf = [ {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, ] +opentelemetry-api = [ + {file = "opentelemetry_api-1.20.0-py3-none-any.whl", hash = "sha256:982b76036fec0fdaf490ae3dfd9f28c81442a33414f737abc687a32758cdcba5"}, + {file = "opentelemetry_api-1.20.0.tar.gz", hash = "sha256:06abe351db7572f8afdd0fb889ce53f3c992dbf6f6262507b385cc1963e06983"}, +] +opentelemetry-exporter-otlp = [ + {file = "opentelemetry_exporter_otlp-1.20.0-py3-none-any.whl", hash = "sha256:3b4d47726da83fef84467bdf96da4f8f3d1a61b35db3c16354c391ce8e9decf6"}, + {file = "opentelemetry_exporter_otlp-1.20.0.tar.gz", hash = "sha256:f8cb69f80c333166e5cfaa030f9e28f7faaf343aff24caaa2cb4202ea4849b6b"}, +] +opentelemetry-exporter-otlp-proto-common = [ + {file = "opentelemetry_exporter_otlp_proto_common-1.20.0-py3-none-any.whl", hash = "sha256:dd63209b40702636ab6ae76a06b401b646ad7b008a906ecb41222d4af24fbdef"}, + {file = "opentelemetry_exporter_otlp_proto_common-1.20.0.tar.gz", hash = "sha256:df60c681bd61812e50b3a39a7a1afeeb6d4066117583249fcc262269374e7a49"}, +] +opentelemetry-exporter-otlp-proto-grpc = [ + {file = "opentelemetry_exporter_otlp_proto_grpc-1.20.0-py3-none-any.whl", hash = "sha256:7c3f066065891b56348ba2c7f9df6ec635a712841cae0a36f2f6a81642ae7dec"}, + {file = "opentelemetry_exporter_otlp_proto_grpc-1.20.0.tar.gz", hash = "sha256:6c06d43c3771bda1795226e327722b4b980fa1ca1ec9e985f2ef3e29795bdd52"}, +] +opentelemetry-exporter-otlp-proto-http = [ + {file = "opentelemetry_exporter_otlp_proto_http-1.20.0-py3-none-any.whl", hash = "sha256:03f6e768ad25f1c3a9586e8c695db4a4adf978f8546a1285fa962e16bfbb0bd6"}, + {file = "opentelemetry_exporter_otlp_proto_http-1.20.0.tar.gz", hash = "sha256:500f42821420fdf0759193d6438edc0f4e984a83e14c08a23023c06a188861b4"}, +] +opentelemetry-proto = [ + {file = "opentelemetry_proto-1.20.0-py3-none-any.whl", hash = "sha256:512c3d2c6864fb7547a69577c3907348e6c985b7a204533563cb4c4c5046203b"}, + {file = "opentelemetry_proto-1.20.0.tar.gz", hash = "sha256:cf01f49b3072ee57468bccb1a4f93bdb55411f4512d0ac3f97c5c04c0040b5a2"}, +] +opentelemetry-sdk = [ + {file = "opentelemetry_sdk-1.20.0-py3-none-any.whl", hash = "sha256:f2230c276ff4c63ea09b3cb2e2ac6b1265f90af64e8d16bbf275c81a9ce8e804"}, + {file = "opentelemetry_sdk-1.20.0.tar.gz", hash = "sha256:702e432a457fa717fd2ddfd30640180e69938f85bb7fec3e479f85f61c1843f8"}, +] +opentelemetry-semantic-conventions = [ + {file = "opentelemetry_semantic_conventions-0.41b0-py3-none-any.whl", hash = "sha256:45404391ed9e50998183a4925ad1b497c01c143f06500c3b9c3d0013492bb0f2"}, + {file = "opentelemetry_semantic_conventions-0.41b0.tar.gz", hash = "sha256:0ce5b040b8a3fc816ea5879a743b3d6fe5db61f6485e4def94c6ee4d402e1eb7"}, +] +ordered-set = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] orjson = [ - {file = "orjson-3.8.7-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:f98c82850b7b4b7e27785ca43706fa86c893cdb88d54576bbb9b0d9c1070e421"}, - {file = "orjson-3.8.7-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:1dee503c6c1a0659c5b46f5f39d9ca9d3657b11ca8bb4af8506086df416887d9"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4fa83831f42ce5c938f8cefc2e175fa1df6f661fdeaba3badf26d2b8cfcf73"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e432c6c9c8b97ad825276d5795286f7cc9689f377a97e3b7ecf14918413303f"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee519964a5a0efb9633f38b1129fd242807c5c57162844efeeaab1c8de080051"}, - {file = "orjson-3.8.7-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:109b539ce5bf60a121454d008fa67c3b67e5a3249e47d277012645922cf74bd0"}, - {file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ad4d441fbde4133af6fee37f67dbf23181b9c537ecc317346ec8c3b4c8ec7705"}, - {file = "orjson-3.8.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89dc786419e1ce2588345f58dd6a434e6728bce66b94989644234bcdbe39b603"}, - {file = "orjson-3.8.7-cp310-none-win_amd64.whl", hash = "sha256:697abde7350fb8076d44bcb6b4ab3ce415ae2b5a9bb91efc460e5ab0d96bb5d3"}, - {file = "orjson-3.8.7-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1c19f47b35b9966a3abadf341b18ee4a860431bf2b00fd8d58906d51cf78aa70"}, - {file = "orjson-3.8.7-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:3ffaabb380cd0ee187b4fc362516df6bf739808130b1339445c7d8878fca36e7"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d88837002c5a8af970745b8e0ca1b0fdb06aafbe7f1279e110d338ea19f3d23"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff60187d1b7e0bfab376b6002b08c560b7de06c87cf3a8ac639ecf58f84c5f3b"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0110970aed35dec293f30ed1e09f8604afd5d15c5ef83de7f6c427619b3ba47b"}, - {file = "orjson-3.8.7-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:51b275475d4e36118b65ad56f9764056a09d985c5d72e64579bf8816f1356a5e"}, - {file = "orjson-3.8.7-cp311-none-win_amd64.whl", hash = "sha256:63144d27735f3b60f079f247ac9a289d80dfe49a7f03880dfa0c0ba64d6491d5"}, - {file = "orjson-3.8.7-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:a16273d77db746bb1789a2bbfded81148a60743fd6f9d5185e02d92e3732fa18"}, - {file = "orjson-3.8.7-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5bb32259ea22cc9dd47a6fdc4b8f9f1e2f798fcf56c7c1122a7df0f4c5d33bf3"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad02e9102d4ba67db30a136e631e32aeebd1dce26c9f5942a457b02df131c5d0"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dbcfcec2b7ac52deb7be3685b551addc28ee8fa454ef41f8b714df6ba0e32a27"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a0e5504a5fc86083cc210c6946e8d61e13fe9f1d7a7bf81b42f7050a49d4fb"}, - {file = "orjson-3.8.7-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:7bd4fd37adb03b1f2a1012d43c9f95973a02164e131dfe3ff804d7e180af5653"}, - {file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:188ed9f9a781333ad802af54c55d5a48991e292239aef41bd663b6e314377eb8"}, - {file = "orjson-3.8.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cc52f58c688cb10afd810280e450f56fbcb27f52c053463e625c8335c95db0dc"}, - {file = "orjson-3.8.7-cp37-none-win_amd64.whl", hash = "sha256:403c8c84ac8a02c40613b0493b74d5256379e65196d39399edbf2ed3169cbeb5"}, - {file = "orjson-3.8.7-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:7d6ac5f8a2a17095cd927c4d52abbb38af45918e0d3abd60fb50cfd49d71ae24"}, - {file = "orjson-3.8.7-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0295a7bfd713fa89231fd0822c995c31fc2343c59a1d13aa1b8b6651335654f5"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feb32aaaa34cf2f891eb793ad320d4bb6731328496ae59b6c9eb1b620c42b529"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7a3ab1a473894e609b6f1d763838c6689ba2b97620c256a32c4d9f10595ac179"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e8c430d82b532c5ab95634e034bbf6ca7432ffe175a3e63eadd493e00b3a555"}, - {file = "orjson-3.8.7-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:366cc75f7e09106f9dac95a675aef413367b284f25507d21e55bd7f45f445e80"}, - {file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:84d154d07e8b17d97e990d5d710b719a031738eb1687d8a05b9089f0564ff3e0"}, - {file = "orjson-3.8.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06180014afcfdc167ca984b312218aa62ce20093965c437c5f9166764cb65ef7"}, - {file = "orjson-3.8.7-cp38-none-win_amd64.whl", hash = "sha256:41244431ba13f2e6ef22b52c5cf0202d17954489f4a3c0505bd28d0e805c3546"}, - {file = "orjson-3.8.7-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b20f29fa8371b8023f1791df035a2c3ccbd98baa429ac3114fc104768f7db6f8"}, - {file = "orjson-3.8.7-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:226bfc1da2f21ee74918cee2873ea9a0fec1a8830e533cb287d192d593e99d02"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75c11023ac29e29fd3e75038d0e8dd93f9ea24d7b9a5e871967a8921a88df24"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78604d3acfd7cd502f6381eea0c42281fe2b74755b334074ab3ebc0224100be1"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7129a6847f0494aa1427167486ef6aea2e835ba05f6c627df522692ee228f65"}, - {file = "orjson-3.8.7-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1a1a8f4980059f48483782c608145b0f74538c266e01c183d9bcd9f8b71dbada"}, - {file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d60304172a33705ce4bd25a6261ab84bed2dab0b3d3b79672ea16c7648af4832"}, - {file = "orjson-3.8.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4f733062d84389c32c0492e5a4929056fac217034a94523debe0430bcc602cda"}, - {file = "orjson-3.8.7-cp39-none-win_amd64.whl", hash = "sha256:010e2970ec9e826c332819e0da4b14b29b19641da0f1a6af4cec91629ef9b988"}, - {file = "orjson-3.8.7.tar.gz", hash = "sha256:8460c8810652dba59c38c80d27c325b5092d189308d8d4f3e688dbd8d4f3b2dc"}, + {file = "orjson-3.9.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b6df858e37c321cefbf27fe7ece30a950bcc3a75618a804a0dcef7ed9dd9c92d"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5198633137780d78b86bb54dafaaa9baea698b4f059456cd4554ab7009619221"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e736815b30f7e3c9044ec06a98ee59e217a833227e10eb157f44071faddd7c5"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a19e4074bc98793458b4b3ba35a9a1d132179345e60e152a1bb48c538ab863c4"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80acafe396ab689a326ab0d80f8cc61dec0dd2c5dca5b4b3825e7b1e0132c101"}, + {file = "orjson-3.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:355efdbbf0cecc3bd9b12589b8f8e9f03c813a115efa53f8dc2a523bfdb01334"}, + {file = "orjson-3.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3aab72d2cef7f1dd6104c89b0b4d6b416b0db5ca87cc2fac5f79c5601f549cc2"}, + {file = "orjson-3.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:36b1df2e4095368ee388190687cb1b8557c67bc38400a942a1a77713580b50ae"}, + {file = "orjson-3.9.7-cp310-none-win32.whl", hash = "sha256:e94b7b31aa0d65f5b7c72dd8f8227dbd3e30354b99e7a9af096d967a77f2a580"}, + {file = "orjson-3.9.7-cp310-none-win_amd64.whl", hash = "sha256:82720ab0cf5bb436bbd97a319ac529aee06077ff7e61cab57cee04a596c4f9b4"}, + {file = "orjson-3.9.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1f8b47650f90e298b78ecf4df003f66f54acdba6a0f763cc4df1eab048fe3738"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f738fee63eb263530efd4d2e9c76316c1f47b3bbf38c1bf45ae9625feed0395e"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38e34c3a21ed41a7dbd5349e24c3725be5416641fdeedf8f56fcbab6d981c900"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21a3344163be3b2c7e22cef14fa5abe957a892b2ea0525ee86ad8186921b6cf0"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23be6b22aab83f440b62a6f5975bcabeecb672bc627face6a83bc7aeb495dc7e"}, + {file = "orjson-3.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5205ec0dfab1887dd383597012199f5175035e782cdb013c542187d280ca443"}, + {file = "orjson-3.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8769806ea0b45d7bf75cad253fba9ac6700b7050ebb19337ff6b4e9060f963fa"}, + {file = "orjson-3.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f9e01239abea2f52a429fe9d95c96df95f078f0172489d691b4a848ace54a476"}, + {file = "orjson-3.9.7-cp311-none-win32.whl", hash = "sha256:8bdb6c911dae5fbf110fe4f5cba578437526334df381b3554b6ab7f626e5eeca"}, + {file = "orjson-3.9.7-cp311-none-win_amd64.whl", hash = "sha256:9d62c583b5110e6a5cf5169ab616aa4ec71f2c0c30f833306f9e378cf51b6c86"}, + {file = "orjson-3.9.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1c3cee5c23979deb8d1b82dc4cc49be59cccc0547999dbe9adb434bb7af11cf7"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a347d7b43cb609e780ff8d7b3107d4bcb5b6fd09c2702aa7bdf52f15ed09fa09"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:154fd67216c2ca38a2edb4089584504fbb6c0694b518b9020ad35ecc97252bb9"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ea3e63e61b4b0beeb08508458bdff2daca7a321468d3c4b320a758a2f554d31"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb0b0b2476f357eb2975ff040ef23978137aa674cd86204cfd15d2d17318588"}, + {file = "orjson-3.9.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b9a20a03576c6b7022926f614ac5a6b0914486825eac89196adf3267c6489d"}, + {file = "orjson-3.9.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:915e22c93e7b7b636240c5a79da5f6e4e84988d699656c8e27f2ac4c95b8dcc0"}, + {file = "orjson-3.9.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f26fb3e8e3e2ee405c947ff44a3e384e8fa1843bc35830fe6f3d9a95a1147b6e"}, + {file = "orjson-3.9.7-cp312-none-win_amd64.whl", hash = "sha256:d8692948cada6ee21f33db5e23460f71c8010d6dfcfe293c9b96737600a7df78"}, + {file = "orjson-3.9.7-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7bab596678d29ad969a524823c4e828929a90c09e91cc438e0ad79b37ce41166"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ef3d371ea0b7239ace284cab9cd00d9c92b73119a7c274b437adb09bda35e6"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f8fcf696bbbc584c0c7ed4adb92fd2ad7d153a50258842787bc1524e50d7081"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90fe73a1f0321265126cbba13677dcceb367d926c7a65807bd80916af4c17047"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45a47f41b6c3beeb31ac5cf0ff7524987cfcce0a10c43156eb3ee8d92d92bf22"}, + {file = "orjson-3.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a2937f528c84e64be20cb80e70cea76a6dfb74b628a04dab130679d4454395c"}, + {file = "orjson-3.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b4fb306c96e04c5863d52ba8d65137917a3d999059c11e659eba7b75a69167bd"}, + {file = "orjson-3.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:410aa9d34ad1089898f3db461b7b744d0efcf9252a9415bbdf23540d4f67589f"}, + {file = "orjson-3.9.7-cp37-none-win32.whl", hash = "sha256:26ffb398de58247ff7bde895fe30817a036f967b0ad0e1cf2b54bda5f8dcfdd9"}, + {file = "orjson-3.9.7-cp37-none-win_amd64.whl", hash = "sha256:bcb9a60ed2101af2af450318cd89c6b8313e9f8df4e8fb12b657b2e97227cf08"}, + {file = "orjson-3.9.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5da9032dac184b2ae2da4bce423edff7db34bfd936ebd7d4207ea45840f03905"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7951af8f2998045c656ba8062e8edf5e83fd82b912534ab1de1345de08a41d2b"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8e59650292aa3a8ea78073fc84184538783966528e442a1b9ed653aa282edcf"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9274ba499e7dfb8a651ee876d80386b481336d3868cba29af839370514e4dce0"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca1706e8b8b565e934c142db6a9592e6401dc430e4b067a97781a997070c5378"}, + {file = "orjson-3.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cc275cf6dcb1a248e1876cdefd3f9b5f01063854acdfd687ec360cd3c9712a"}, + {file = "orjson-3.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:11c10f31f2c2056585f89d8229a56013bc2fe5de51e095ebc71868d070a8dd81"}, + {file = "orjson-3.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cf334ce1d2fadd1bf3e5e9bf15e58e0c42b26eb6590875ce65bd877d917a58aa"}, + {file = "orjson-3.9.7-cp38-none-win32.whl", hash = "sha256:76a0fc023910d8a8ab64daed8d31d608446d2d77c6474b616b34537aa7b79c7f"}, + {file = "orjson-3.9.7-cp38-none-win_amd64.whl", hash = "sha256:7a34a199d89d82d1897fd4a47820eb50947eec9cda5fd73f4578ff692a912f89"}, + {file = "orjson-3.9.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e7e7f44e091b93eb39db88bb0cb765db09b7a7f64aea2f35e7d86cbf47046c65"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d647b2a9c45a23a84c3e70e19d120011cba5f56131d185c1b78685457320bb"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0eb850a87e900a9c484150c414e21af53a6125a13f6e378cf4cc11ae86c8f9c5"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f4b0042d8388ac85b8330b65406c84c3229420a05068445c13ca28cc222f1f7"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd3e7aae977c723cc1dbb82f97babdb5e5fbce109630fbabb2ea5053523c89d3"}, + {file = "orjson-3.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c616b796358a70b1f675a24628e4823b67d9e376df2703e893da58247458956"}, + {file = "orjson-3.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c3ba725cf5cf87d2d2d988d39c6a2a8b6fc983d78ff71bc728b0be54c869c884"}, + {file = "orjson-3.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4891d4c934f88b6c29b56395dfc7014ebf7e10b9e22ffd9877784e16c6b2064f"}, + {file = "orjson-3.9.7-cp39-none-win32.whl", hash = "sha256:14d3fb6cd1040a4a4a530b28e8085131ed94ebc90d72793c59a713de34b60838"}, + {file = "orjson-3.9.7-cp39-none-win_amd64.whl", hash = "sha256:9ef82157bbcecd75d6296d5d8b2d792242afcd064eb1ac573f8847b52e58f677"}, + {file = "orjson-3.9.7.tar.gz", hash = "sha256:85e39198f78e2f7e054d296395f6c96f5e02892337746ef5b6a1bf3ed5910142"}, ] packaging = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] +paginate = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, ] pandas = [ - {file = "pandas-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:799e6a25932df7e6b1f8dabf63de064e2205dc309abb75956126a0453fd88e97"}, - {file = "pandas-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd1d69a387f7d5e1a5a06a87574d9ef2433847c0e78113ab51c84d3a8bcaeaa"}, - {file = "pandas-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:94f2ed1fd51e545ebf71da1e942fe1822ee01e10d3dd2a7276d01351333b7c6b"}, - {file = "pandas-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4591cadd06fbbbd16fafc2de6e840c1aaefeae3d5864b688004777ef1bbdede3"}, - {file = "pandas-1.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0022fe6a313df1c4869b5edc012d734c6519a6fffa3cf70930f32e6a1078e49"}, - {file = "pandas-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:785e878a6e6d8ddcdb8c181e600855402750052497d7fc6d6b508894f6b8830b"}, - {file = "pandas-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c4bb8b0ab9f94207d07e401d24baebfc63057246b1a5e0cd9ee50df85a656871"}, - {file = "pandas-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:51c424ca134fdaeac9a4acd719d1ab48046afc60943a489028f0413fdbe9ef1c"}, - {file = "pandas-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ce35f947202b0b99c660221d82beb91d2e6d553d55a40b30128204e3e2c63848"}, - {file = "pandas-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6f1848148ed3204235967613b0a32be2d77f214e9623f554511047705c1e04"}, - {file = "pandas-1.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cc960959be28d064faefc0cb2aef854d46b827c004ebea7e79b5497ed83e7d"}, - {file = "pandas-1.4.4-cp38-cp38-win32.whl", hash = "sha256:9d805bce209714b1c1fa29bfb1e42ad87e4c0a825e4b390c56a3e71593b7e8d8"}, - {file = "pandas-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:afbddad78a98ec4d2ce08b384b81730de1ccc975b99eb663e6dac43703f36d98"}, - {file = "pandas-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a08ceb59db499864c58a9bf85ab6219d527d91f14c0240cc25fa2c261032b2a7"}, - {file = "pandas-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0959c41004e3d2d16f39c828d6da66ebee329836a7ecee49fb777ac9ad8a7501"}, - {file = "pandas-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87b4194f344dcd14c0f885cecb22005329b38bda10f1aaf7b9596a00ec8a4768"}, - {file = "pandas-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d2a7a3c1fea668d56bd91edbd5f2732e0af8feb9d2bf8d9bfacb2dea5fa9536"}, - {file = "pandas-1.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a981cfabf51c318a562deb4ae7deec594c07aee7cf18b4594a92c23718ec8275"}, - {file = "pandas-1.4.4-cp39-cp39-win32.whl", hash = "sha256:050aada67a5ec6699a7879e769825b510018a95fb9ac462bb1867483d0974a97"}, - {file = "pandas-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:8d4d2fe2863ecddb0ba1979bdda26c8bc2ea138f5a979abe3ba80c0fa4015c91"}, - {file = "pandas-1.4.4.tar.gz", hash = "sha256:ab6c0d738617b675183e5f28db32b5148b694ad9bba0a40c3ea26d96b431db67"}, + {file = "pandas-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58d997dbee0d4b64f3cb881a24f918b5f25dd64ddf31f467bb9b67ae4c63a1e4"}, + {file = "pandas-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02304e11582c5d090e5a52aec726f31fe3f42895d6bfc1f28738f9b64b6f0614"}, + {file = "pandas-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffa8f0966de2c22de408d0e322db2faed6f6e74265aa0856f3824813cf124363"}, + {file = "pandas-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1f84c144dee086fe4f04a472b5cd51e680f061adf75c1ae4fc3a9275560f8f4"}, + {file = "pandas-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ce97667d06d69396d72be074f0556698c7f662029322027c226fd7a26965cb"}, + {file = "pandas-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:4c3f32fd7c4dccd035f71734df39231ac1a6ff95e8bdab8d891167197b7018d2"}, + {file = "pandas-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e2959720b70e106bb1d8b6eadd8ecd7c8e99ccdbe03ee03260877184bb2877d"}, + {file = "pandas-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25e8474a8eb258e391e30c288eecec565bfed3e026f312b0cbd709a63906b6f8"}, + {file = "pandas-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8bd1685556f3374520466998929bade3076aeae77c3e67ada5ed2b90b4de7f0"}, + {file = "pandas-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc3657869c7902810f32bd072f0740487f9e030c1a3ab03e0af093db35a9d14e"}, + {file = "pandas-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:05674536bd477af36aa2effd4ec8f71b92234ce0cc174de34fd21e2ee99adbc2"}, + {file = "pandas-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:b407381258a667df49d58a1b637be33e514b07f9285feb27769cedb3ab3d0b3a"}, + {file = "pandas-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c747793c4e9dcece7bb20156179529898abf505fe32cb40c4052107a3c620b49"}, + {file = "pandas-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3bcad1e6fb34b727b016775bea407311f7721db87e5b409e6542f4546a4951ea"}, + {file = "pandas-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5ec7740f9ccb90aec64edd71434711f58ee0ea7f5ed4ac48be11cfa9abf7317"}, + {file = "pandas-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29deb61de5a8a93bdd033df328441a79fcf8dd3c12d5ed0b41a395eef9cd76f0"}, + {file = "pandas-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f99bebf19b7e03cf80a4e770a3e65eee9dd4e2679039f542d7c1ace7b7b1daa"}, + {file = "pandas-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:84e7e910096416adec68075dc87b986ff202920fb8704e6d9c8c9897fe7332d6"}, + {file = "pandas-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366da7b0e540d1b908886d4feb3d951f2f1e572e655c1160f5fde28ad4abb750"}, + {file = "pandas-2.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e50e72b667415a816ac27dfcfe686dc5a0b02202e06196b943d54c4f9c7693e"}, + {file = "pandas-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1ab6a25da197f03ebe6d8fa17273126120874386b4ac11c1d687df288542dd"}, + {file = "pandas-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0dbfea0dd3901ad4ce2306575c54348d98499c95be01b8d885a2737fe4d7a98"}, + {file = "pandas-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0489b0e6aa3d907e909aef92975edae89b1ee1654db5eafb9be633b0124abe97"}, + {file = "pandas-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4cdb0fab0400c2cb46dafcf1a0fe084c8bb2480a1fa8d81e19d15e12e6d4ded2"}, + {file = "pandas-2.1.1.tar.gz", hash = "sha256:fecb198dc389429be557cde50a2d46da8434a17fe37d7d41ff102e3987fd947b"}, +] +pandas-gbq = [ + {file = "pandas-gbq-0.19.2.tar.gz", hash = "sha256:b0f7fa84a2be0fe767e33a008ca7e4ad9a9e3ac67255fd0a41fc19b503138447"}, + {file = "pandas_gbq-0.19.2-py2.py3-none-any.whl", hash = "sha256:0ef8da3e4088053a2bea069ed688992a44b52af67dadb97eee494b32a2147563"}, ] parsimonious = [ - {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, + {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, + {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, ] parso = [ {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, ] pathspec = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] pathtools = [ {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"}, ] +pendulum = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] pep8-naming = [ {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"}, {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"}, @@ -3933,108 +7142,93 @@ pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] -Pillow = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, +pillow = [ + {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, + {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, + {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, + {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, + {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, + {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, + {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, + {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, + {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, + {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, + {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, + {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, + {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, + {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, + {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, + {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, + {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, + {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, + {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, + {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, + {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, + {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, + {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, + {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, ] platformdirs = [ - {file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, - {file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, ] plotly = [ - {file = "plotly-5.10.0-py2.py3-none-any.whl", hash = "sha256:989b13825cc974390aa0169479485d9257d37848a47bc63957251f8e1a7046ba"}, - {file = "plotly-5.10.0.tar.gz", hash = "sha256:4d36d9859b7a153b273562deeed8c292587a472eb1fd57cd4158ec89d9defadb"}, + {file = "plotly-5.17.0-py2.py3-none-any.whl", hash = "sha256:7c84cdf11da162423da957bb093287134f2d6f170eb9a74f1459f825892247c3"}, + {file = "plotly-5.17.0.tar.gz", hash = "sha256:290d796bf7bab87aad184fe24b86096234c4c95dcca6ecbca02d02bdf17d3d97"}, ] pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] portalocker = [ - {file = "portalocker-2.7.0-py2.py3-none-any.whl", hash = "sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983"}, - {file = "portalocker-2.7.0.tar.gz", hash = "sha256:032e81d534a88ec1736d03f780ba073f047a06c478b06e2937486f334e955c51"}, + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, ] pre-commit = [ {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, ] +prison = [ + {file = "prison-0.2.1-py2.py3-none-any.whl", hash = "sha256:f90bab63fca497aa0819a852f64fb21a4e181ed9f6114deaa5dc04001a7555c5"}, + {file = "prison-0.2.1.tar.gz", hash = "sha256:e6cd724044afcb1a8a69340cad2f1e3151a5839fd3a8027fd1357571e797c599"}, +] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] +proto-plus = [ + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, ] protobuf = [ {file = "protobuf-3.20.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559"}, @@ -4061,20 +7255,20 @@ protobuf = [ {file = "protobuf-3.20.2.tar.gz", hash = "sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750"}, ] psutil = [ - {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, - {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, - {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, - {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, - {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, - {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, - {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, - {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -4089,8 +7283,8 @@ py = [ {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] py4j = [ - {file = "py4j-0.10.9-py2.py3-none-any.whl", hash = "sha256:859ba728a7bb43e9c2bf058832759fb97a598bb28cc12f34f5fc4abdec08ede6"}, - {file = "py4j-0.10.9.tar.gz", hash = "sha256:36ec57f43ff8ced260a18aa9a4e46c3500a730cac8860e259cbaa546c2b9db2f"}, + {file = "py4j-0.10.9.5-py2.py3-none-any.whl", hash = "sha256:52d171a6a2b031d8a5d1de6efe451cf4f5baff1a2819aabc3741c8406539ba04"}, + {file = "py4j-0.10.9.5.tar.gz", hash = "sha256:276a4a3c5a2154df1860ef3303a927460e02e97b047dc0a47c1c3fb8cce34db6"}, ] pyarrow = [ {file = "pyarrow-11.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:40bb42afa1053c35c749befbe72f6429b7b5f45710e85059cdd534553ebcf4f2"}, @@ -4120,62 +7314,239 @@ pyarrow = [ {file = "pyarrow-11.0.0.tar.gz", hash = "sha256:5461c57dbdb211a632a48facb9b39bbeb8a7905ec95d768078525283caef5f6d"}, ] pyasn1 = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, ] pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] +pycares = [ + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:24da119850841d16996713d9c3374ca28a21deee056d609fbbed29065d17e1f6"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f64cb58729689d4d0e78f0bfb4c25ce2f851d0274c0273ac751795c04b8798a"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33e2a1120887e89075f7f814ec144f66a6ce06a54f5722ccefc62fbeda83cff"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c680fef1b502ee680f8f0b95a41af4ec2c234e50e16c0af5bbda31999d3584bd"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fff16b09042ba077f7b8aa5868d1d22456f0002574d0ba43462b10a009331677"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:229a1675eb33bc9afb1fc463e73ee334950ccc485bc83a43f6ae5839fb4d5fa3"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3aebc73e5ad70464f998f77f2da2063aa617cbd8d3e8174dd7c5b4518f967153"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef64649eba56448f65e26546d85c860709844d2fc22ef14d324fe0b27f761a9"}, + {file = "pycares-4.4.0-cp310-cp310-win32.whl", hash = "sha256:4afc2644423f4eef97857a9fd61be9758ce5e336b4b0bd3d591238bb4b8b03e0"}, + {file = "pycares-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5ed4e04af4012f875b78219d34434a6d08a67175150ac1b79eb70ab585d4ba8c"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bce8db2fc6f3174bd39b81405210b9b88d7b607d33e56a970c34a0c190da0490"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a0303428d013ccf5c51de59c83f9127aba6200adb7fd4be57eddb432a1edd2a"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb91792f1556f97be7f7acb57dc7756d89c5a87bd8b90363a77dbf9ea653817"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b61579cecf1f4d616e5ea31a6e423a16680ab0d3a24a2ffe7bb1d4ee162477ff"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7af06968cbf6851566e806bf3e72825b0e6671832a2cbe840be1d2d65350710"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ceb12974367b0a68a05d52f4162b29f575d241bd53de155efe632bf2c943c7f6"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2eeec144bcf6a7b6f2d74d6e70cbba7886a84dd373c886f06cb137a07de4954c"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6f7cfdfd11eb5493d6d632e582408c8f3b429f295f8799c584c108b28db6f"}, + {file = "pycares-4.4.0-cp311-cp311-win32.whl", hash = "sha256:34736a2ffaa9c08ca9c707011a2d7b69074bbf82d645d8138bba771479b2362f"}, + {file = "pycares-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb66c30eb11e877976b7ead13632082a8621df648c408b8e15cdb91a452dd502"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fd644505a8cfd7f6584d33a9066d4e3d47700f050ef1490230c962de5dfb28c6"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52084961262232ec04bd75f5043aed7e5d8d9695e542ff691dfef0110209f2d4"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0c5368206057884cde18602580083aeaad9b860e2eac14fd253543158ce1e93"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:112a4979c695b1c86f6782163d7dec58d57a3b9510536dcf4826550f9053dd9a"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d186dafccdaa3409194c0f94db93c1a5d191145a275f19da6591f9499b8e7b8"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:64965dc19c578a683ea73487a215a8897276224e004d50eeb21f0bc7a0b63c88"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ed2a38e34bec6f2586435f6ff0bc5fe11d14bebd7ed492cf739a424e81681540"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:94d6962db81541eb0396d2f0dfcbb18cdb8c8b251d165efc2d974ae652c547d4"}, + {file = "pycares-4.4.0-cp312-cp312-win32.whl", hash = "sha256:1168a48a834813aa80f412be2df4abaf630528a58d15c704857448b20b1675c0"}, + {file = "pycares-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:db24c4e7fea4a052c6e869cbf387dd85d53b9736cfe1ef5d8d568d1ca925e977"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:21a5a0468861ec7df7befa69050f952da13db5427ae41ffe4713bc96291d1d95"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22c00bf659a9fa44d7b405cf1cd69b68b9d37537899898d8cbe5dffa4016b273"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23aa3993a352491a47fcf17867f61472f32f874df4adcbb486294bd9fbe8abee"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813d661cbe2e37d87da2d16b7110a6860e93ddb11735c6919c8a3545c7b9c8d8"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77cf5a2fd5583c670de41a7f4a7b46e5cbabe7180d8029f728571f4d2e864084"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3eaa6681c0a3e3f3868c77aca14b7760fed35fdfda2fe587e15c701950e7bc69"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad58e284a658a8a6a84af2e0b62f2f961f303cedfe551854d7bd40c3cbb61912"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfb89ca9e3d0a9b5332deeb666b2ede9d3469107742158f4aeda5ce032d003f4"}, + {file = "pycares-4.4.0-cp38-cp38-win32.whl", hash = "sha256:f36bdc1562142e3695555d2f4ac0cb69af165eddcefa98efc1c79495b533481f"}, + {file = "pycares-4.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:902461a92b6a80fd5041a2ec5235680c7cc35e43615639ec2a40e63fca2dfb51"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7bddc6adba8f699728f7fc1c9ce8cef359817ad78e2ed52b9502cb5f8dc7f741"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb49d5805cd347c404f928c5ae7c35e86ba0c58ffa701dbe905365e77ce7d641"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cf3349fa3a2e67ed387a7974c11d233734636fe19facfcda261b411af14d80"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf2eaa83a5987e48fa63302f0fe7ce3275cfda87b34d40fef9ce703fb3ac002"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82bba2ab77eb5addbf9758d514d9bdef3c1bfe7d1649a47bd9a0d55a23ef478b"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c6a8bde63106f162fca736e842a916853cad3c8d9d137e11c9ffa37efa818b02"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5f646eec041db6ffdbcaf3e0756fb92018f7af3266138c756bb09d2b5baadec"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dc04c54c6ea615210c1b9e803d0e2d2255f87a3d5d119b6482c8f0dfa15b26b"}, + {file = "pycares-4.4.0-cp39-cp39-win32.whl", hash = "sha256:97892cced5794d721fb4ff8765764aa4ea48fe8b2c3820677505b96b83d4ef47"}, + {file = "pycares-4.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:917f08f0b5d9324e9a34211e68d27447c552b50ab967044776bbab7e42a553a2"}, + {file = "pycares-4.4.0.tar.gz", hash = "sha256:f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2"}, ] pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, + {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"}, + {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"}, ] pycparser = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -pydocstyle = [ - {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, - {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +pydantic = [ + {file = "pydantic-2.4.2-py3-none-any.whl", hash = "sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1"}, + {file = "pydantic-2.4.2.tar.gz", hash = "sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7"}, +] +pydantic-core = [ + {file = "pydantic_core-2.10.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63"}, + {file = "pydantic_core-2.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e"}, + {file = "pydantic_core-2.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6"}, + {file = "pydantic_core-2.10.1-cp310-none-win32.whl", hash = "sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b"}, + {file = "pydantic_core-2.10.1-cp310-none-win_amd64.whl", hash = "sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0"}, + {file = "pydantic_core-2.10.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea"}, + {file = "pydantic_core-2.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8"}, + {file = "pydantic_core-2.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4"}, + {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607"}, + {file = "pydantic_core-2.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f"}, + {file = "pydantic_core-2.10.1-cp311-none-win32.whl", hash = "sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6"}, + {file = "pydantic_core-2.10.1-cp311-none-win_amd64.whl", hash = "sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27"}, + {file = "pydantic_core-2.10.1-cp311-none-win_arm64.whl", hash = "sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921"}, + {file = "pydantic_core-2.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901"}, + {file = "pydantic_core-2.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f"}, + {file = "pydantic_core-2.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c"}, + {file = "pydantic_core-2.10.1-cp312-none-win32.whl", hash = "sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f"}, + {file = "pydantic_core-2.10.1-cp312-none-win_amd64.whl", hash = "sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430"}, + {file = "pydantic_core-2.10.1-cp312-none-win_arm64.whl", hash = "sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15"}, + {file = "pydantic_core-2.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f"}, + {file = "pydantic_core-2.10.1-cp37-none-win32.whl", hash = "sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c"}, + {file = "pydantic_core-2.10.1-cp37-none-win_amd64.whl", hash = "sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e"}, + {file = "pydantic_core-2.10.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc"}, + {file = "pydantic_core-2.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302"}, + {file = "pydantic_core-2.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e"}, + {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561"}, + {file = "pydantic_core-2.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de"}, + {file = "pydantic_core-2.10.1-cp38-none-win32.whl", hash = "sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee"}, + {file = "pydantic_core-2.10.1-cp38-none-win_amd64.whl", hash = "sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e"}, + {file = "pydantic_core-2.10.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970"}, + {file = "pydantic_core-2.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a"}, + {file = "pydantic_core-2.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429"}, + {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7"}, + {file = "pydantic_core-2.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595"}, + {file = "pydantic_core-2.10.1-cp39-none-win32.whl", hash = "sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a"}, + {file = "pydantic_core-2.10.1-cp39-none-win_amd64.whl", hash = "sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357"}, + {file = "pydantic_core-2.10.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2"}, + {file = "pydantic_core-2.10.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132"}, + {file = "pydantic_core-2.10.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7"}, + {file = "pydantic_core-2.10.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776"}, + {file = "pydantic_core-2.10.1.tar.gz", hash = "sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82"}, +] +pydata-google-auth = [ + {file = "pydata-google-auth-1.8.2.tar.gz", hash = "sha256:547b6c0fbea657dcecd50887c5db8640ebec062a59a2b88e8ff8e53a04818303"}, + {file = "pydata_google_auth-1.8.2-py2.py3-none-any.whl", hash = "sha256:a9dce59af4a170ea60c4b2ebbc83ee1f74d34255a4f97b2469ae9a4a0dc98e99"}, ] pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, ] -Pygments = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +pygments = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] -PyJWT = [ - {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, - {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, +pyjwt = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] pyliftover = [ {file = "pyliftover-0.4.tar.gz", hash = "sha256:72bcfb7de907569b0eb75e86c817840365297d63ba43a961da394187e399da41"}, ] pymdown-extensions = [ - {file = "pymdown_extensions-9.10-py3-none-any.whl", hash = "sha256:31eaa76ce6f96aabfcea98787c2fff2c5c0611b20a53a94213970cfbf05f02b8"}, - {file = "pymdown_extensions-9.10.tar.gz", hash = "sha256:562c38eee4ce3f101ce631b804bfc2177a8a76c7e4dc908871fb6741a90257a7"}, + {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, + {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, +] +pyopenssl = [ + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, ] pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, ] pyspark = [ - {file = "pyspark-3.1.3.tar.gz", hash = "sha256:39ac641ef5559a3d1286154779fc990316e9934520853615ae4785c1af52d14b"}, + {file = "pyspark-3.3.0.tar.gz", hash = "sha256:7ebe8e9505647b4d124d5a82fca60dfd3891021cf8ad6c5ec88777eeece92cf7"}, ] pytest = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, ] pytest-cov = [ - {file = "pytest-cov-4.0.0.tar.gz", hash = "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470"}, - {file = "pytest_cov-4.0.0-py3-none-any.whl", hash = "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b"}, + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, ] pytest-sugar = [ - {file = "pytest-sugar-0.9.6.tar.gz", hash = "sha256:c4793495f3c32e114f0f5416290946c316eb96ad5a3684dcdadda9267e59b2b8"}, - {file = "pytest_sugar-0.9.6-py2.py3-none-any.whl", hash = "sha256:30e5225ed2b3cc988a8a672f8bda0fc37bcd92d62e9273937f061112b3f2186d"}, + {file = "pytest-sugar-0.9.7.tar.gz", hash = "sha256:f1e74c1abfa55f7241cf7088032b6e378566f16b938f3f08905e2cf4494edd46"}, + {file = "pytest_sugar-0.9.7-py2.py3-none-any.whl", hash = "sha256:8cb5a4e5f8bbcd834622b0235db9e50432f4cbd71fef55b467fe44e43701e062"}, +] +pytest-xdist = [ + {file = "pytest-xdist-3.3.1.tar.gz", hash = "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93"}, + {file = "pytest_xdist-3.3.1-py3-none-any.whl", hash = "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"}, +] +python-daemon = [ + {file = "python-daemon-3.0.1.tar.gz", hash = "sha256:6c57452372f7eaff40934a1c03ad1826bf5e793558e87fef49131e6464b4dae5"}, + {file = "python_daemon-3.0.1-py3-none-any.whl", hash = "sha256:42bb848a3260a027fa71ad47ecd959e471327cb34da5965962edd5926229f341"}, ] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, @@ -4185,424 +7556,734 @@ python-json-logger = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, ] +python-nvd3 = [ + {file = "python-nvd3-0.15.0.tar.gz", hash = "sha256:fbd75ff47e0ef255b4aa4f3a8b10dc8b4024aa5a9a7abed5b2406bd3cb817715"}, +] +python-slugify = [ + {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, + {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, +] pytz = [ - {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, - {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] +pytzdata = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, ] pywin32 = [ - {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, - {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, - {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, - {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, - {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, - {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, - {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, - {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, - {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, - {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, - {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, - {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, - {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, - {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, -] -PyYAML = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -pyyaml_env_tag = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] +pyyaml = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] +pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] pyzmq = [ - {file = "pyzmq-25.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:2d05d904f03ddf1e0d83d97341354dfe52244a619b5a1440a5f47a5b3451e84e"}, - {file = "pyzmq-25.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a154ef810d44f9d28868be04641f837374a64e7449df98d9208e76c260c7ef1"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487305c2a011fdcf3db1f24e8814bb76d23bc4d2f46e145bc80316a59a9aa07d"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e7b87638ee30ab13230e37ce5331b3e730b1e0dda30120b9eeec3540ed292c8"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75243e422e85a62f0ab7953dc315452a56b2c6a7e7d1a3c3109ac3cc57ed6b47"}, - {file = "pyzmq-25.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:31e523d067ce44a04e876bed3ff9ea1ff8d1b6636d16e5fcace9d22f8c564369"}, - {file = "pyzmq-25.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8539216173135e9e89f6b1cc392e74e6b935b91e8c76106cf50e7a02ab02efe5"}, - {file = "pyzmq-25.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2754fa68da08a854f4816e05160137fa938a2347276471103d31e04bcee5365c"}, - {file = "pyzmq-25.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1bc30f0c18444d51e9b0d0dd39e3a4e7c53ee74190bebef238cd58de577ea9"}, - {file = "pyzmq-25.0.0-cp310-cp310-win32.whl", hash = "sha256:01d53958c787cfea34091fcb8ef36003dbb7913b8e9f8f62a0715234ebc98b70"}, - {file = "pyzmq-25.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:58fc3ad5e1cfd2e6d24741fbb1e216b388115d31b0ca6670f894187f280b6ba6"}, - {file = "pyzmq-25.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:e4bba04ea779a3d7ef25a821bb63fd0939142c88e7813e5bd9c6265a20c523a2"}, - {file = "pyzmq-25.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:af1fbfb7ad6ac0009ccee33c90a1d303431c7fb594335eb97760988727a37577"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85456f0d8f3268eecd63dede3b99d5bd8d3b306310c37d4c15141111d22baeaf"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0645b5a2d2a06fd8eb738018490c514907f7488bf9359c6ee9d92f62e844b76f"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f72ea279b2941a5203e935a4588b9ba8a48aeb9a926d9dfa1986278bd362cb8"}, - {file = "pyzmq-25.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:4e295f7928a31ae0f657e848c5045ba6d693fe8921205f408ca3804b1b236968"}, - {file = "pyzmq-25.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ac97e7d647d5519bcef48dd8d3d331f72975afa5c4496c95f6e854686f45e2d9"}, - {file = "pyzmq-25.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:656281d496aaf9ca4fd4cea84e6d893e3361057c4707bd38618f7e811759103c"}, - {file = "pyzmq-25.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f6116991568aac48b94d6d8aaed6157d407942ea385335a6ed313692777fb9d"}, - {file = "pyzmq-25.0.0-cp311-cp311-win32.whl", hash = "sha256:0282bba9aee6e0346aa27d6c69b5f7df72b5a964c91958fc9e0c62dcae5fdcdc"}, - {file = "pyzmq-25.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:526f884a27e8bba62fe1f4e07c62be2cfe492b6d432a8fdc4210397f8cf15331"}, - {file = "pyzmq-25.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ccb3e1a863222afdbda42b7ca8ac8569959593d7abd44f5a709177d6fa27d266"}, - {file = "pyzmq-25.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4046d03100aca266e70d54a35694cb35d6654cfbef633e848b3c4a8d64b9d187"}, - {file = "pyzmq-25.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3100dddcada66ec5940ed6391ebf9d003cc3ede3d320748b2737553019f58230"}, - {file = "pyzmq-25.0.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7877264aa851c19404b1bb9dbe6eed21ea0c13698be1eda3784aab3036d1c861"}, - {file = "pyzmq-25.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5049e75cc99db65754a3da5f079230fb8889230cf09462ec972d884d1704a3ed"}, - {file = "pyzmq-25.0.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:81f99fb1224d36eb91557afec8cdc2264e856f3464500b55749020ce4c848ef2"}, - {file = "pyzmq-25.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a1cd4a95f176cdc0ee0a82d49d5830f13ae6015d89decbf834c273bc33eeb3d3"}, - {file = "pyzmq-25.0.0-cp36-cp36m-win32.whl", hash = "sha256:926236ca003aec70574754f39703528947211a406f5c6c8b3e50eca04a9e87fc"}, - {file = "pyzmq-25.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:94f0a7289d0f5c80807c37ebb404205e7deb737e8763eb176f4770839ee2a287"}, - {file = "pyzmq-25.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f3f96d452e9580cb961ece2e5a788e64abaecb1232a80e61deffb28e105ff84a"}, - {file = "pyzmq-25.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:930e6ad4f2eaac31a3d0c2130619d25db754b267487ebc186c6ad18af2a74018"}, - {file = "pyzmq-25.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1081d7030a1229c8ff90120346fb7599b54f552e98fcea5170544e7c6725aab"}, - {file = "pyzmq-25.0.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:531866c491aee5a1e967c286cfa470dffac1e2a203b1afda52d62b58782651e9"}, - {file = "pyzmq-25.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fc7c1421c5b1c916acf3128bf3cc7ea7f5018b58c69a6866d70c14190e600ce9"}, - {file = "pyzmq-25.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9a2d5e419bd39a1edb6cdd326d831f0120ddb9b1ff397e7d73541bf393294973"}, - {file = "pyzmq-25.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:183e18742be3621acf8908903f689ec520aee3f08449bfd29f583010ca33022b"}, - {file = "pyzmq-25.0.0-cp37-cp37m-win32.whl", hash = "sha256:02f5cb60a7da1edd5591a15efa654ffe2303297a41e1b40c3c8942f8f11fc17c"}, - {file = "pyzmq-25.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:cac602e02341eaaf4edfd3e29bd3fdef672e61d4e6dfe5c1d065172aee00acee"}, - {file = "pyzmq-25.0.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:e14df47c1265356715d3d66e90282a645ebc077b70b3806cf47efcb7d1d630cb"}, - {file = "pyzmq-25.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:293a7c2128690f496057f1f1eb6074f8746058d13588389981089ec45d8fdc77"}, - {file = "pyzmq-25.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:731b208bc9412deeb553c9519dca47136b5a01ca66667cafd8733211941b17e4"}, - {file = "pyzmq-25.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b055a1cddf8035966ad13aa51edae5dc8f1bba0b5d5e06f7a843d8b83dc9b66b"}, - {file = "pyzmq-25.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17e1cb97d573ea84d7cd97188b42ca6f611ab3ee600f6a75041294ede58e3d20"}, - {file = "pyzmq-25.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:60ecbfe7669d3808ffa8a7dd1487d6eb8a4015b07235e3b723d4b2a2d4de7203"}, - {file = "pyzmq-25.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4c25c95416133942280faaf068d0fddfd642b927fb28aaf4ab201a738e597c1e"}, - {file = "pyzmq-25.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:be05504af0619d1cffa500af1e0ede69fb683f301003851f5993b5247cc2c576"}, - {file = "pyzmq-25.0.0-cp38-cp38-win32.whl", hash = "sha256:6bf3842af37af43fa953e96074ebbb5315f6a297198f805d019d788a1021dbc8"}, - {file = "pyzmq-25.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b90bb8dfbbd138558f1f284fecfe328f7653616ff9a972433a00711d9475d1a9"}, - {file = "pyzmq-25.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:62b9e80890c0d2408eb42d5d7e1fc62a5ce71be3288684788f74cf3e59ffd6e2"}, - {file = "pyzmq-25.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484c2c4ee02c1edc07039f42130bd16e804b1fe81c4f428e0042e03967f40c20"}, - {file = "pyzmq-25.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9ca6db34b26c4d3e9b0728841ec9aa39484eee272caa97972ec8c8e231b20c7e"}, - {file = "pyzmq-25.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:610d2d112acd4e5501fac31010064a6c6efd716ceb968e443cae0059eb7b86de"}, - {file = "pyzmq-25.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3594c0ff604e685d7e907860b61d0e10e46c74a9ffca168f6e9e50ea934ee440"}, - {file = "pyzmq-25.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c21a5f4e54a807df5afdef52b6d24ec1580153a6bcf0607f70a6e1d9fa74c5c3"}, - {file = "pyzmq-25.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4725412e27612f0d7d7c2f794d89807ad0227c2fc01dd6146b39ada49c748ef9"}, - {file = "pyzmq-25.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d3d604fe0a67afd1aff906e54da557a5203368a99dcc50a70eef374f1d2abef"}, - {file = "pyzmq-25.0.0-cp39-cp39-win32.whl", hash = "sha256:3670e8c5644768f214a3b598fe46378a4a6f096d5fb82a67dfd3440028460565"}, - {file = "pyzmq-25.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:e99629a976809fe102ef73e856cf4b2660acd82a412a51e80ba2215e523dfd0a"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:66509c48f7446b640eeae24b60c9c1461799a27b1b0754e438582e36b5af3315"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c464cc508177c09a5a6122b67f978f20e2954a21362bf095a0da4647e3e908"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28bcb2e66224a7ac2843eb632e4109d6b161479e7a2baf24e37210461485b4f1"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0e7ef9ac807db50b4eb6f534c5dcc22f998f5dae920cc28873d2c1d080a4fc9"}, - {file = "pyzmq-25.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5050f5c50b58a6e38ccaf9263a356f74ef1040f5ca4030225d1cb1a858c5b7b6"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2a73af6504e0d2805e926abf136ebf536735a13c22f709be7113c2ec65b4bec3"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0e8d00228db627ddd1b418c7afd81820b38575f237128c9650365f2dd6ac3443"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5605621f2181f20b71f13f698944deb26a0a71af4aaf435b34dd90146092d530"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6136bfb0e5a9cf8c60c6ac763eb21f82940a77e6758ea53516c8c7074f4ff948"}, - {file = "pyzmq-25.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0a90b2480a26aef7c13cff18703ba8d68e181facb40f78873df79e6d42c1facc"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00c94fd4c9dd3c95aace0c629a7fa713627a5c80c1819326b642adf6c4b8e2a2"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20638121b0bdc80777ce0ec8c1f14f1ffec0697a1f88f0b564fa4a23078791c4"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6f75b4b8574f3a8a0d6b4b52606fc75b82cb4391471be48ab0b8677c82f9ed4"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cbb885f347eba7ab7681c450dee5b14aed9f153eec224ec0c3f299273d9241f"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c48f257da280b3be6c94e05bd575eddb1373419dbb1a72c3ce64e88f29d1cd6d"}, - {file = "pyzmq-25.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:866eabf7c1315ef2e93e34230db7cbf672e0d7c626b37c11f7e870c8612c3dcc"}, - {file = "pyzmq-25.0.0.tar.gz", hash = "sha256:f330a1a2c7f89fd4b0aa4dcb7bf50243bf1c8da9a2f1efc31daf57a2046b31f2"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, +] +referencing = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, ] regex = [ - {file = "regex-2022.10.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8ff454ef0bb061e37df03557afda9d785c905dab15584860f982e88be73015f"}, - {file = "regex-2022.10.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eba476b1b242620c266edf6325b443a2e22b633217a9835a52d8da2b5c051f9"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0e5af9a9effb88535a472e19169e09ce750c3d442fb222254a276d77808620b"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d03fe67b2325cb3f09be029fd5da8df9e6974f0cde2c2ac6a79d2634e791dd57"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9d0b68ac1743964755ae2d89772c7e6fb0118acd4d0b7464eaf3921c6b49dd4"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a45b6514861916c429e6059a55cf7db74670eaed2052a648e3e4d04f070e001"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b0886885f7323beea6f552c28bff62cbe0983b9fbb94126531693ea6c5ebb90"}, - {file = "regex-2022.10.31-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5aefb84a301327ad115e9d346c8e2760009131d9d4b4c6b213648d02e2abe144"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:702d8fc6f25bbf412ee706bd73019da5e44a8400861dfff7ff31eb5b4a1276dc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a3c1ebd4ed8e76e886507c9eddb1a891673686c813adf889b864a17fafcf6d66"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:50921c140561d3db2ab9f5b11c5184846cde686bb5a9dc64cae442926e86f3af"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7db345956ecce0c99b97b042b4ca7326feeec6b75facd8390af73b18e2650ffc"}, - {file = "regex-2022.10.31-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:763b64853b0a8f4f9cfb41a76a4a85a9bcda7fdda5cb057016e7706fde928e66"}, - {file = "regex-2022.10.31-cp310-cp310-win32.whl", hash = "sha256:44136355e2f5e06bf6b23d337a75386371ba742ffa771440b85bed367c1318d1"}, - {file = "regex-2022.10.31-cp310-cp310-win_amd64.whl", hash = "sha256:bfff48c7bd23c6e2aec6454aaf6edc44444b229e94743b34bdcdda2e35126cf5"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b4b1fe58cd102d75ef0552cf17242705ce0759f9695334a56644ad2d83903fe"}, - {file = "regex-2022.10.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:542e3e306d1669b25936b64917285cdffcd4f5c6f0247636fec037187bd93542"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c27cc1e4b197092e50ddbf0118c788d9977f3f8f35bfbbd3e76c1846a3443df7"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e38472739028e5f2c3a4aded0ab7eadc447f0d84f310c7a8bb697ec417229e"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76c598ca73ec73a2f568e2a72ba46c3b6c8690ad9a07092b18e48ceb936e9f0c"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28d3309ebd6d6b2cf82969b5179bed5fefe6142c70f354ece94324fa11bf6a1"}, - {file = "regex-2022.10.31-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9af69f6746120998cd9c355e9c3c6aec7dff70d47247188feb4f829502be8ab4"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a5f9505efd574d1e5b4a76ac9dd92a12acb2b309551e9aa874c13c11caefbe4f"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5ff525698de226c0ca743bfa71fc6b378cda2ddcf0d22d7c37b1cc925c9650a5"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe7fda2fe7c8890d454f2cbc91d6c01baf206fbc96d89a80241a02985118c0c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2cdc55ca07b4e70dda898d2ab7150ecf17c990076d3acd7a5f3b25cb23a69f1c"}, - {file = "regex-2022.10.31-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:44a6c2f6374e0033873e9ed577a54a3602b4f609867794c1a3ebba65e4c93ee7"}, - {file = "regex-2022.10.31-cp311-cp311-win32.whl", hash = "sha256:d8716f82502997b3d0895d1c64c3b834181b1eaca28f3f6336a71777e437c2af"}, - {file = "regex-2022.10.31-cp311-cp311-win_amd64.whl", hash = "sha256:61edbca89aa3f5ef7ecac8c23d975fe7261c12665f1d90a6b1af527bba86ce61"}, - {file = "regex-2022.10.31-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a069c8483466806ab94ea9068c34b200b8bfc66b6762f45a831c4baaa9e8cdd"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d26166acf62f731f50bdd885b04b38828436d74e8e362bfcb8df221d868b5d9b"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac741bf78b9bb432e2d314439275235f41656e189856b11fb4e774d9f7246d81"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75f591b2055523fc02a4bbe598aa867df9e953255f0b7f7715d2a36a9c30065c"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bddd61d2a3261f025ad0f9ee2586988c6a00c780a2fb0a92cea2aa702c54"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef4163770525257876f10e8ece1cf25b71468316f61451ded1a6f44273eedeb5"}, - {file = "regex-2022.10.31-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7b280948d00bd3973c1998f92e22aa3ecb76682e3a4255f33e1020bd32adf443"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:d0213671691e341f6849bf33cd9fad21f7b1cb88b89e024f33370733fec58742"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:22e7ebc231d28393dfdc19b185d97e14a0f178bedd78e85aad660e93b646604e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8ad241da7fac963d7573cc67a064c57c58766b62a9a20c452ca1f21050868dfa"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:586b36ebda81e6c1a9c5a5d0bfdc236399ba6595e1397842fd4a45648c30f35e"}, - {file = "regex-2022.10.31-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0653d012b3bf45f194e5e6a41df9258811ac8fc395579fa82958a8b76286bea4"}, - {file = "regex-2022.10.31-cp36-cp36m-win32.whl", hash = "sha256:144486e029793a733e43b2e37df16a16df4ceb62102636ff3db6033994711066"}, - {file = "regex-2022.10.31-cp36-cp36m-win_amd64.whl", hash = "sha256:c14b63c9d7bab795d17392c7c1f9aaabbffd4cf4387725a0ac69109fb3b550c6"}, - {file = "regex-2022.10.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4cac3405d8dda8bc6ed499557625585544dd5cbf32072dcc72b5a176cb1271c8"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23cbb932cc53a86ebde0fb72e7e645f9a5eec1a5af7aa9ce333e46286caef783"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74bcab50a13960f2a610cdcd066e25f1fd59e23b69637c92ad470784a51b1347"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d680ef3e4d405f36f0d6d1ea54e740366f061645930072d39bca16a10d8c93"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce6910b56b700bea7be82c54ddf2e0ed792a577dfaa4a76b9af07d550af435c6"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:659175b2144d199560d99a8d13b2228b85e6019b6e09e556209dfb8c37b78a11"}, - {file = "regex-2022.10.31-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ddf14031a3882f684b8642cb74eea3af93a2be68893901b2b387c5fd92a03ec"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b683e5fd7f74fb66e89a1ed16076dbab3f8e9f34c18b1979ded614fe10cdc4d9"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2bde29cc44fa81c0a0c8686992c3080b37c488df167a371500b2a43ce9f026d1"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4919899577ba37f505aaebdf6e7dc812d55e8f097331312db7f1aab18767cce8"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:9c94f7cc91ab16b36ba5ce476f1904c91d6c92441f01cd61a8e2729442d6fcf5"}, - {file = "regex-2022.10.31-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae1e96785696b543394a4e3f15f3f225d44f3c55dafe3f206493031419fedf95"}, - {file = "regex-2022.10.31-cp37-cp37m-win32.whl", hash = "sha256:c670f4773f2f6f1957ff8a3962c7dd12e4be54d05839b216cb7fd70b5a1df394"}, - {file = "regex-2022.10.31-cp37-cp37m-win_amd64.whl", hash = "sha256:8e0caeff18b96ea90fc0eb6e3bdb2b10ab5b01a95128dfeccb64a7238decf5f0"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:131d4be09bea7ce2577f9623e415cab287a3c8e0624f778c1d955ec7c281bd4d"}, - {file = "regex-2022.10.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e613a98ead2005c4ce037c7b061f2409a1a4e45099edb0ef3200ee26ed2a69a8"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052b670fafbe30966bbe5d025e90b2a491f85dfe5b2583a163b5e60a85a321ad"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa62a07ac93b7cb6b7d0389d8ef57ffc321d78f60c037b19dfa78d6b17c928ee"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5352bea8a8f84b89d45ccc503f390a6be77917932b1c98c4cdc3565137acc714"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20f61c9944f0be2dc2b75689ba409938c14876c19d02f7585af4460b6a21403e"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29c04741b9ae13d1e94cf93fca257730b97ce6ea64cfe1eba11cf9ac4e85afb6"}, - {file = "regex-2022.10.31-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:543883e3496c8b6d58bd036c99486c3c8387c2fc01f7a342b760c1ea3158a318"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7a8b43ee64ca8f4befa2bea4083f7c52c92864d8518244bfa6e88c751fa8fff"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6a9a19bea8495bb419dc5d38c4519567781cd8d571c72efc6aa959473d10221a"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6ffd55b5aedc6f25fd8d9f905c9376ca44fcf768673ffb9d160dd6f409bfda73"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4bdd56ee719a8f751cf5a593476a441c4e56c9b64dc1f0f30902858c4ef8771d"}, - {file = "regex-2022.10.31-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ca88da1bd78990b536c4a7765f719803eb4f8f9971cc22d6ca965c10a7f2c4c"}, - {file = "regex-2022.10.31-cp38-cp38-win32.whl", hash = "sha256:5a260758454580f11dd8743fa98319bb046037dfab4f7828008909d0aa5292bc"}, - {file = "regex-2022.10.31-cp38-cp38-win_amd64.whl", hash = "sha256:5e6a5567078b3eaed93558842346c9d678e116ab0135e22eb72db8325e90b453"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5217c25229b6a85049416a5c1e6451e9060a1edcf988641e309dbe3ab26d3e49"}, - {file = "regex-2022.10.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4bf41b8b0a80708f7e0384519795e80dcb44d7199a35d52c15cc674d10b3081b"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf0da36a212978be2c2e2e2d04bdff46f850108fccc1851332bcae51c8907cc"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d403d781b0e06d2922435ce3b8d2376579f0c217ae491e273bab8d092727d244"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a37d51fa9a00d265cf73f3de3930fa9c41548177ba4f0faf76e61d512c774690"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4f781ffedd17b0b834c8731b75cce2639d5a8afe961c1e58ee7f1f20b3af185"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d243b36fbf3d73c25e48014961e83c19c9cc92530516ce3c43050ea6276a2ab7"}, - {file = "regex-2022.10.31-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:370f6e97d02bf2dd20d7468ce4f38e173a124e769762d00beadec3bc2f4b3bc4"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:597f899f4ed42a38df7b0e46714880fb4e19a25c2f66e5c908805466721760f5"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7dbdce0c534bbf52274b94768b3498abdf675a691fec5f751b6057b3030f34c1"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:22960019a842777a9fa5134c2364efaed5fbf9610ddc5c904bd3a400973b0eb8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7f5a3ffc731494f1a57bd91c47dc483a1e10048131ffb52d901bfe2beb6102e8"}, - {file = "regex-2022.10.31-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ef6b5942e6bfc5706301a18a62300c60db9af7f6368042227ccb7eeb22d0892"}, - {file = "regex-2022.10.31-cp39-cp39-win32.whl", hash = "sha256:395161bbdbd04a8333b9ff9763a05e9ceb4fe210e3c7690f5e68cedd3d65d8e1"}, - {file = "regex-2022.10.31-cp39-cp39-win_amd64.whl", hash = "sha256:957403a978e10fb3ca42572a23e6f7badff39aa1ce2f4ade68ee452dc6807692"}, - {file = "regex-2022.10.31.tar.gz", hash = "sha256:a3a98921da9a1bf8457aeee6a551948a83601689e5ecdd736894ea9bbec77e83"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, ] requests = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] +requests-oauthlib = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] +rfc3339-validator = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, ] rich = [ {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, ] +rich-argparse = [ + {file = "rich_argparse-1.3.0-py3-none-any.whl", hash = "sha256:1a5eda1659c0a215862fe3630fcbe68d7792f18a8106baaf4e005b9896acc6f6"}, + {file = "rich_argparse-1.3.0.tar.gz", hash = "sha256:974cc1ba0aaa0d6aabc09ab1b78f9ba928670e08590f9551121bcbc60c75b74a"}, +] +rpds-py = [ + {file = "rpds_py-0.10.4-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:e41824343c2c129599645373992b1ce17720bb8a514f04ff9567031e1c26951e"}, + {file = "rpds_py-0.10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9d8884d58ea8801e5906a491ab34af975091af76d1a389173db491ee7e316bb"}, + {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5db93f9017b384a4f194e1d89e1ce82d0a41b1fafdbbd3e0c8912baf13f2950f"}, + {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c31ecfc53ac03dad4928a1712f3a2893008bfba1b3cde49e1c14ff67faae2290"}, + {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f92d2372ec992c82fd7c74aa21e2a1910b3dcdc6a7e6392919a138f21d528a3"}, + {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7ea49ddf51d5ec0c3cbd95190dd15e077a3153c8d4b22a33da43b5dd2b3c640"}, + {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c27942722cd5039bbf5098c7e21935a96243fed00ea11a9589f3c6c6424bd84"}, + {file = "rpds_py-0.10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08f07150c8ebbdbce1d2d51b8e9f4d588749a2af6a98035485ebe45c7ad9394e"}, + {file = "rpds_py-0.10.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f3331a3684192659fa1090bf2b448db928152fcba08222e58106f44758ef25f7"}, + {file = "rpds_py-0.10.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:efffa359cc69840c8793f0c05a7b663de6afa7b9078fa6c80309ee38b9db677d"}, + {file = "rpds_py-0.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:86e8d6ff15fa7a9590c0addaf3ce52fb58bda4299cab2c2d0afa404db6848dab"}, + {file = "rpds_py-0.10.4-cp310-none-win32.whl", hash = "sha256:8f90fc6dd505867514c8b8ef68a712dc0be90031a773c1ae2ad469f04062daef"}, + {file = "rpds_py-0.10.4-cp310-none-win_amd64.whl", hash = "sha256:9f9184744fb800c9f28e155a5896ecb54816296ee79d5d1978be6a2ae60f53c4"}, + {file = "rpds_py-0.10.4-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:72e9b1e92830c876cd49565d8404e4dcc9928302d348ea2517bc3f9e3a873a2a"}, + {file = "rpds_py-0.10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3650eae998dc718960e90120eb45d42bd57b18b21b10cb9ee05f91bff2345d48"}, + {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f40413d2859737ce6d95c29ce2dde0ef7cdc3063b5830ae4342fef5922c3bba7"}, + {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b953d11b544ca5f2705bb77b177d8e17ab1bfd69e0fd99790a11549d2302258c"}, + {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28b4942ec7d9d6114c1e08cace0157db92ef674636a38093cab779ace5742d3a"}, + {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e0e2e01c5f61ddf47e3ed2d1fe1c9136e780ca6222d57a2517b9b02afd4710c"}, + {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:927e3461dae0c09b1f2e0066e50c1a9204f8a64a3060f596e9a6742d3b307785"}, + {file = "rpds_py-0.10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e69bbe0ede8f7fe2616e779421bbdb37f025c802335a90f6416e4d98b368a37"}, + {file = "rpds_py-0.10.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc688a59c100f038fa9fec9e4ab457c2e2d1fca350fe7ea395016666f0d0a2dc"}, + {file = "rpds_py-0.10.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ec001689402b9104700b50a005c2d3d0218eae90eaa8bdbbd776fe78fe8a74b7"}, + {file = "rpds_py-0.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:628fbb8be71a103499d10b189af7764996ab2634ed7b44b423f1e19901606e0e"}, + {file = "rpds_py-0.10.4-cp311-none-win32.whl", hash = "sha256:e3f9c9e5dd8eba4768e15f19044e1b5e216929a43a54b4ab329e103aed9f3eda"}, + {file = "rpds_py-0.10.4-cp311-none-win_amd64.whl", hash = "sha256:3bc561c183684636c0099f9c3fbab8c1671841942edbce784bb01b4707d17924"}, + {file = "rpds_py-0.10.4-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:36ff30385fb9fb3ac23a28bffdd4a230a5229ed5b15704b708b7c84bfb7fce51"}, + {file = "rpds_py-0.10.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db0589e0bf41ff6ce284ab045ca89f27be1adf19e7bce26c2e7de6739a70c18b"}, + {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c330cb125983c5d380fef4a4155248a276297c86d64625fdaf500157e1981c"}, + {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d230fddc60caced271cc038e43e6fb8f4dd6b2dbaa44ac9763f2d76d05b0365a"}, + {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a9e864ec051a58fdb6bb2e6da03942adb20273897bc70067aee283e62bbac4d"}, + {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e41d5b334e8de4bc3f38843f31b2afa9a0c472ebf73119d3fd55cde08974bdf"}, + {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5bb3f3cb6072c73e6ec1f865d8b80419b599f1597acf33f63fbf02252aab5a03"}, + {file = "rpds_py-0.10.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576d48e1e45c211e99fc02655ade65c32a75d3e383ccfd98ce59cece133ed02c"}, + {file = "rpds_py-0.10.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b28b9668a22ca2cfca4433441ba9acb2899624a323787a509a3dc5fbfa79c49d"}, + {file = "rpds_py-0.10.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ddbd113a37307638f94be5ae232a325155fd24dbfae2c56455da8724b471e7be"}, + {file = "rpds_py-0.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd0ad98c7d72b0e4cbfe89cdfa12cd07d2fd6ed22864341cdce12b318a383442"}, + {file = "rpds_py-0.10.4-cp312-none-win32.whl", hash = "sha256:2a97406d5e08b7095428f01dac0d3c091dc072351151945a167e7968d2755559"}, + {file = "rpds_py-0.10.4-cp312-none-win_amd64.whl", hash = "sha256:aab24b9bbaa3d49e666e9309556591aa00748bd24ea74257a405f7fed9e8b10d"}, + {file = "rpds_py-0.10.4-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6c5ca3eb817fb54bfd066740b64a2b31536eb8fe0b183dc35b09a7bd628ed680"}, + {file = "rpds_py-0.10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd37ab9a24021821b715478357af1cf369d5a42ac7405e83e5822be00732f463"}, + {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2573ec23ad3a59dd2bc622befac845695972f3f2d08dc1a4405d017d20a6c225"}, + {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:362faeae52dc6ccc50c0b6a01fa2ec0830bb61c292033f3749a46040b876f4ba"}, + {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f6e53461b19ddbb3354fe5bcf3d50d4333604ae4bf25b478333d83ca68002c"}, + {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6090ba604ea06b525a231450ae5d343917a393cbf50423900dea968daf61d16f"}, + {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28e29dac59df890972f73c511948072897f512974714a803fe793635b80ff8c7"}, + {file = "rpds_py-0.10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f82abb5c5b83dc30e96be99ce76239a030b62a73a13c64410e429660a5602bfd"}, + {file = "rpds_py-0.10.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a3628815fd170a64624001bfb4e28946fd515bd672e68a1902d9e0290186eaf3"}, + {file = "rpds_py-0.10.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d37f27ad80f742ef82796af3fe091888864958ad0bc8bab03da1830fa00c6004"}, + {file = "rpds_py-0.10.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:255a23bded80605e9f3997753e3a4b89c9aec9efb07ec036b1ca81440efcc1a9"}, + {file = "rpds_py-0.10.4-cp38-none-win32.whl", hash = "sha256:049098dabfe705e9638c55a3321137a821399c50940041a6fcce267a22c70db2"}, + {file = "rpds_py-0.10.4-cp38-none-win_amd64.whl", hash = "sha256:aa45cc71bf23a3181b8aa62466b5a2b7b7fb90fdc01df67ca433cd4fce7ec94d"}, + {file = "rpds_py-0.10.4-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3507c459767cf24c11e9520e2a37c89674266abe8e65453e5cb66398aa47ee7b"}, + {file = "rpds_py-0.10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2603e084054351cc65097da326570102c4c5bd07426ba8471ceaefdb0b642cc9"}, + {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0f1d336786cb62613c72c00578c98e5bb8cd57b49c5bae5d4ab906ca7872f98"}, + {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf032367f921201deaecf221d4cc895ea84b3decf50a9c73ee106f961885a0ad"}, + {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f050ceffd8c730c1619a16bbf0b9cd037dcdb94b54710928ba38c7bde67e4a4"}, + {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8709eb4ab477c533b7d0a76cd3065d7d95c9e25e6b9f6e27caeeb8c63e8799c9"}, + {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc20dadb102140dff63529e08ce6f9745dbd36e673ebb2b1c4a63e134bca81c2"}, + {file = "rpds_py-0.10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd7da2adc721ccf19ac7ec86cae3a4fcaba03d9c477d5bd64ded6e9bb817bf3f"}, + {file = "rpds_py-0.10.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5dba1c11e089b526379e74f6c636202e4c5bad9a48c7416502b8a5b0d026c91"}, + {file = "rpds_py-0.10.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ffd539d213c1ea2989ab92a5b9371ae7159c8c03cf2bcb9f2f594752f755ecd3"}, + {file = "rpds_py-0.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e791e3d13b14d0a7921804d0efe4d7bd15508bbcf8cb7a0c1ee1a27319a5f033"}, + {file = "rpds_py-0.10.4-cp39-none-win32.whl", hash = "sha256:2f2ac8bb01f705c5caaa7fe77ffd9b03f92f1b5061b94228f6ea5eaa0fca68ad"}, + {file = "rpds_py-0.10.4-cp39-none-win_amd64.whl", hash = "sha256:7c7ca791bedda059e5195cf7c6b77384657a51429357cdd23e64ac1d4973d6dc"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9c7e7bd1fa1f535af71dfcd3700fc83a6dc261a1204f8f5327d8ffe82e52905d"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7089d8bfa8064b28b2e39f5af7bf12d42f61caed884e35b9b4ea9e6fb1175077"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1f191befea279cb9669b57be97ab1785781c8bab805900e95742ebfaa9cbf1d"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98c0aecf661c175ce9cb17347fc51a5c98c3e9189ca57e8fcd9348dae18541db"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d81359911c3bb31c899c6a5c23b403bdc0279215e5b3bc0d2a692489fed38632"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83da147124499fe41ed86edf34b4e81e951b3fe28edcc46288aac24e8a5c8484"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49db6c0a0e6626c2b97f5e7f8f7074da21cbd8ec73340c25e839a2457c007efa"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:125776d5db15162fdd9135372bef7fe4fb7c5f5810cf25898eb74a06a0816aec"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:32819b662e3b4c26355a4403ea2f60c0a00db45b640fe722dd12db3d2ef807fb"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3bd38b80491ef9686f719c1ad3d24d14fbd0e069988fdd4e7d1a6ffcdd7f4a13"}, + {file = "rpds_py-0.10.4-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2e79eeeff8394284b09577f36316d410525e0cf0133abb3de10660e704d3d38e"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3e37f1f134037601eb4b1f46854194f0cc082435dac2ee3de11e51529f7831f2"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ba3246c60303eab3d0e562addf25a983d60bddc36f4d1edc2510f056d19df255"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9123ba0f3f98ff79780eebca9984a2b525f88563844b740f94cffb9099701230"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d98802b78093c7083cc51f83da41a5be5a57d406798c9f69424bd75f8ae0812a"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:58bae860d1d116e6b4e1aad0cdc48a187d5893994f56d26db0c5534df7a47afd"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd7e62e7d5bcfa38a62d8397fba6d0428b970ab7954c2197501cd1624f7f0bbb"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83f5228459b84fa6279e4126a53abfdd73cd9cc183947ee5084153880f65d7"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bcb1abecd998a72ad4e36a0fca93577fd0c059a6aacc44f16247031b98f6ff4"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9e7b3ad9f53ea9e085b3d27286dd13f8290969c0a153f8a52c8b5c46002c374b"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:cbec8e43cace64e63398155dc585dc479a89fef1e57ead06c22d3441e1bd09c3"}, + {file = "rpds_py-0.10.4-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ad21c60fc880204798f320387164dcacc25818a7b4ec2a0bf6b6c1d57b007d23"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:6baea8a4f6f01e69e75cfdef3edd4a4d1c4b56238febbdf123ce96d09fbff010"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:94876c21512535955a960f42a155213315e6ab06a4ce8ce372341a2a1b143eeb"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cb55454a20d1b935f9eaab52e6ceab624a2efd8b52927c7ae7a43e02828dbe0"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13cbd79ccedc6b39c279af31ebfb0aec0467ad5d14641ddb15738bf6e4146157"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00a88003db3cc953f8656b59fc9af9d0637a1fb93c235814007988f8c153b2f2"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0f7f77a77c37159c9f417b8dd847f67a29e98c6acb52ee98fc6b91efbd1b2b6"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70563a1596d2e0660ca2cebb738443437fc0e38597e7cbb276de0a7363924a52"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3ece9aa6d07e18c966f14b4352a4c6f40249f6174d3d2c694c1062e19c6adbb"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d5ad7b1a1f6964d19b1a8acfc14bf7864f39587b3e25c16ca04f6cd1815026b3"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:60018626e637528a1fa64bb3a2b3e46ab7bf672052316d61c3629814d5e65052"}, + {file = "rpds_py-0.10.4-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ae8a32ab77a84cc870bbfb60645851ca0f7d58fd251085ad67464b1445d632ca"}, + {file = "rpds_py-0.10.4.tar.gz", hash = "sha256:18d5ff7fbd305a1d564273e9eb22de83ae3cd9cd6329fddc8f12f6428a711a6a"}, +] rsa = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, ] +ruff = [ + {file = "ruff-0.0.287-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:1e0f9ee4c3191444eefeda97d7084721d9b8e29017f67997a20c153457f2eafd"}, + {file = "ruff-0.0.287-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e9843e5704d4fb44e1a8161b0d31c1a38819723f0942639dfeb53d553be9bfb5"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca1ed11d759a29695aed2bfc7f914b39bcadfe2ef08d98ff69c873f639ad3a8"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cf4d5ad3073af10f186ea22ce24bc5a8afa46151f6896f35c586e40148ba20b"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d9d58bcb29afd72d2afe67120afcc7d240efc69a235853813ad556443dc922"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:06ac5df7dd3ba8bf83bba1490a72f97f1b9b21c7cbcba8406a09de1a83f36083"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2bfb478e1146a60aa740ab9ebe448b1f9e3c0dfb54be3cc58713310eef059c30"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00d579a011949108c4b4fa04c4f1ee066dab536a9ba94114e8e580c96be2aeb4"}, + {file = "ruff-0.0.287-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a810a79b8029cc92d06c36ea1f10be5298d2323d9024e1d21aedbf0a1a13e5"}, + {file = "ruff-0.0.287-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:150007028ad4976ce9a7704f635ead6d0e767f73354ce0137e3e44f3a6c0963b"}, + {file = "ruff-0.0.287-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a24a280db71b0fa2e0de0312b4aecb8e6d08081d1b0b3c641846a9af8e35b4a7"}, + {file = "ruff-0.0.287-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2918cb7885fa1611d542de1530bea3fbd63762da793751cc8c8d6e4ba234c3d8"}, + {file = "ruff-0.0.287-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:33d7b251afb60bec02a64572b0fd56594b1923ee77585bee1e7e1daf675e7ae7"}, + {file = "ruff-0.0.287-py3-none-win32.whl", hash = "sha256:022f8bed2dcb5e5429339b7c326155e968a06c42825912481e10be15dafb424b"}, + {file = "ruff-0.0.287-py3-none-win_amd64.whl", hash = "sha256:26bd0041d135a883bd6ab3e0b29c42470781fb504cf514e4c17e970e33411d90"}, + {file = "ruff-0.0.287-py3-none-win_arm64.whl", hash = "sha256:44bceb3310ac04f0e59d4851e6227f7b1404f753997c7859192e41dbee9f5c8d"}, + {file = "ruff-0.0.287.tar.gz", hash = "sha256:02dc4f5bf53ef136e459d467f3ce3e04844d509bc46c025a05b018feb37bbc39"}, +] s3transfer = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, + {file = "s3transfer-0.7.0-py3-none-any.whl", hash = "sha256:10d6923c6359175f264811ef4bf6161a3156ce8e350e705396a7557d6293c33a"}, + {file = "s3transfer-0.7.0.tar.gz", hash = "sha256:fd3889a66f5fe17299fe75b82eae6cf722554edca744ca5d5fe308b104883d2e"}, ] scikit-learn = [ - {file = "scikit-learn-1.2.1.tar.gz", hash = "sha256:fbf8a5c893c9b4b99bcc7ed8fb3e8500957a113f4101860386d06635520f7cfb"}, - {file = "scikit_learn-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9f75763bd392c094bf474c7ab75a01d68b15146ea7a20c0f9ff6fb3063dad"}, - {file = "scikit_learn-1.2.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:c9285275a435d1f8f47bbe3500346ab9ead2499e0e090518404d318ea90d1c1c"}, - {file = "scikit_learn-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc838b5a4057c55ba81b82316ea8bf443af445f96eb21500b0e40618017e0923"}, - {file = "scikit_learn-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8bcd303dd982494842a3f482f844d539484c6043b4eed896b43ea8e5f609a21"}, - {file = "scikit_learn-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:a9abf17d177df54e529154f26acfd42930e19117d045e8a9a8e893ca82dd94ec"}, - {file = "scikit_learn-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:70fa30d146b7e9d0c256e73e271b3e17f23123b7c4adcbde1a385031adf59090"}, - {file = "scikit_learn-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5a8111f3c7a314017ebf90d6feab861c11d1ca14f3dbafb39abcc31aa4c54ba6"}, - {file = "scikit_learn-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba0c7c6bf1493f8ce670bab69f9317874826ee838988de377ae355abd4d74cf"}, - {file = "scikit_learn-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479aedd0abedbda6b8b4529145fe4cd8622f69f726a72cef8f75548a93eeb1e1"}, - {file = "scikit_learn-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5523e21ab2b4d52b2bd41bedd335dbe8f3c1b5f6dd7c9c001b2e17ec9818af8d"}, - {file = "scikit_learn-1.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dcfab6a19b236194af88771d8e6e778a60c3339248ab0018696ebf2b7c8bed4b"}, - {file = "scikit_learn-1.2.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:559f66e12f93b34c8c85c0a5728c3b8af98f04eb12f2c9ee18ea3c82c3d2fad1"}, - {file = "scikit_learn-1.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbb7831b2308c67bb6dd83c5ea3cdaf8e8cafd2de4000b93d78bb689126bd2cf"}, - {file = "scikit_learn-1.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2c5d9930ced2b7821ad936b9940706ccb5471d89b8a516bb641cec87257d1c"}, - {file = "scikit_learn-1.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:54731e2c2fbff40da6d76cbb9022ace5f44a4020a10bd5cd92107e86882bad15"}, - {file = "scikit_learn-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d00e46a2a7fce6e118ed0f4c6263785bf6c297a94ffd0cd7b32455043c508cc8"}, - {file = "scikit_learn-1.2.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da0e2d50a8435ea8dc5cd21f1fc1a45d329bae03dcca92087ebed859d22d184e"}, - {file = "scikit_learn-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61bb9c654b5d2e6cdd4b1c7e6048fc66270c1682bda1b0f7d2726fdae09010f4"}, - {file = "scikit_learn-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0ee4d4d32c94e082344308528f7b3c9294b60ab19c84eb37a2d9c88bdffd9d1"}, - {file = "scikit_learn-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:c722f3446ad8c4f1a93b2399fe1a188635b94709a3f25e6f4d61efbe75fe8eaa"}, + {file = "scikit-learn-1.3.1.tar.gz", hash = "sha256:1a231cced3ee3fa04756b4a7ab532dc9417acd581a330adff5f2c01ac2831fcf"}, + {file = "scikit_learn-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3153612ff8d36fa4e35ef8b897167119213698ea78f3fd130b4068e6f8d2da5a"}, + {file = "scikit_learn-1.3.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6bb9490fdb8e7e00f1354621689187bef3cab289c9b869688f805bf724434755"}, + {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7135a03af71138669f19bc96e7d0cc8081aed4b3565cc3b131135d65fc642ba"}, + {file = "scikit_learn-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d8dee8c1f40eeba49a85fe378bdf70a07bb64aba1a08fda1e0f48d27edfc3e6"}, + {file = "scikit_learn-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4d379f2b34096105a96bd857b88601dffe7389bd55750f6f29aaa37bc6272eb5"}, + {file = "scikit_learn-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14e8775eba072ab10866a7e0596bc9906873e22c4c370a651223372eb62de180"}, + {file = "scikit_learn-1.3.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:58b0c2490eff8355dc26e884487bf8edaccf2ba48d09b194fb2f3a026dd64f9d"}, + {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f66eddfda9d45dd6cadcd706b65669ce1df84b8549875691b1f403730bdef217"}, + {file = "scikit_learn-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6448c37741145b241eeac617028ba6ec2119e1339b1385c9720dae31367f2be"}, + {file = "scikit_learn-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c413c2c850241998168bbb3bd1bb59ff03b1195a53864f0b80ab092071af6028"}, + {file = "scikit_learn-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ef540e09873e31569bc8b02c8a9f745ee04d8e1263255a15c9969f6f5caa627f"}, + {file = "scikit_learn-1.3.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:9147a3a4df4d401e618713880be023e36109c85d8569b3bf5377e6cd3fecdeac"}, + {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2cd3634695ad192bf71645702b3df498bd1e246fc2d529effdb45a06ab028b4"}, + {file = "scikit_learn-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c275a06c5190c5ce00af0acbb61c06374087949f643ef32d355ece12c4db043"}, + {file = "scikit_learn-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:0e1aa8f206d0de814b81b41d60c1ce31f7f2c7354597af38fae46d9c47c45122"}, + {file = "scikit_learn-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:52b77cc08bd555969ec5150788ed50276f5ef83abb72e6f469c5b91a0009bbca"}, + {file = "scikit_learn-1.3.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a683394bc3f80b7c312c27f9b14ebea7766b1f0a34faf1a2e9158d80e860ec26"}, + {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15d964d9eb181c79c190d3dbc2fff7338786bf017e9039571418a1d53dab236"}, + {file = "scikit_learn-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ce9233cdf0cdcf0858a5849d306490bf6de71fa7603a3835124e386e62f2311"}, + {file = "scikit_learn-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:1ec668ce003a5b3d12d020d2cde0abd64b262ac5f098b5c84cf9657deb9996a8"}, + {file = "scikit_learn-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccbbedae99325628c1d1cbe3916b7ef58a1ce949672d8d39c8b190e10219fd32"}, + {file = "scikit_learn-1.3.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:845f81c7ceb4ea6bac64ab1c9f2ce8bef0a84d0f21f3bece2126adcc213dfecd"}, + {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8454d57a22d856f1fbf3091bd86f9ebd4bff89088819886dc0c72f47a6c30652"}, + {file = "scikit_learn-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d993fb70a1d78c9798b8f2f28705bfbfcd546b661f9e2e67aa85f81052b9c53"}, + {file = "scikit_learn-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:66f7bb1fec37d65f4ef85953e1df5d3c98a0f0141d394dcdaead5a6de9170347"}, ] scipy = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, + {file = "scipy-1.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:370f569c57e1d888304052c18e58f4a927338eafdaef78613c685ca2ea0d1fa0"}, + {file = "scipy-1.11.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9885e3e4f13b2bd44aaf2a1a6390a11add9f48d5295f7a592393ceb8991577a3"}, + {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04aa19acc324a1a076abb4035dabe9b64badb19f76ad9c798bde39d41025cdc"}, + {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1a8a4657673bfae1e05e1e1d6e94b0cabe5ed0c7c144c8aa7b7dbb774ce5c1"}, + {file = "scipy-1.11.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7abda0e62ef00cde826d441485e2e32fe737bdddee3324e35c0e01dee65e2a88"}, + {file = "scipy-1.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:033c3fd95d55012dd1148b201b72ae854d5086d25e7c316ec9850de4fe776929"}, + {file = "scipy-1.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:925c6f09d0053b1c0f90b2d92d03b261e889b20d1c9b08a3a51f61afc5f58165"}, + {file = "scipy-1.11.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5664e364f90be8219283eeb844323ff8cd79d7acbd64e15eb9c46b9bc7f6a42a"}, + {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f325434b6424952fbb636506f0567898dca7b0f7654d48f1c382ea338ce9a3"}, + {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f290cf561a4b4edfe8d1001ee4be6da60c1c4ea712985b58bf6bc62badee221"}, + {file = "scipy-1.11.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:91770cb3b1e81ae19463b3c235bf1e0e330767dca9eb4cd73ba3ded6c4151e4d"}, + {file = "scipy-1.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1f97cd89c0fe1a0685f8f89d85fa305deb3067d0668151571ba50913e445820"}, + {file = "scipy-1.11.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dfcc1552add7cb7c13fb70efcb2389d0624d571aaf2c80b04117e2755a0c5d15"}, + {file = "scipy-1.11.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0d3a136ae1ff0883fffbb1b05b0b2fea251cb1046a5077d0b435a1839b3e52b7"}, + {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae66a2d7d5768eaa33008fa5a974389f167183c87bf39160d3fefe6664f8ddc"}, + {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2f6dee6cbb0e263b8142ed587bc93e3ed5e777f1f75448d24fb923d9fd4dce6"}, + {file = "scipy-1.11.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:74e89dc5e00201e71dd94f5f382ab1c6a9f3ff806c7d24e4e90928bb1aafb280"}, + {file = "scipy-1.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:90271dbde4be191522b3903fc97334e3956d7cfb9cce3f0718d0ab4fd7d8bfd6"}, + {file = "scipy-1.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a63d1ec9cadecce838467ce0631c17c15c7197ae61e49429434ba01d618caa83"}, + {file = "scipy-1.11.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:5305792c7110e32ff155aed0df46aa60a60fc6e52cd4ee02cdeb67eaccd5356e"}, + {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea7f579182d83d00fed0e5c11a4aa5ffe01460444219dedc448a36adf0c3917"}, + {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c77da50c9a91e23beb63c2a711ef9e9ca9a2060442757dffee34ea41847d8156"}, + {file = "scipy-1.11.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15f237e890c24aef6891c7d008f9ff7e758c6ef39a2b5df264650eb7900403c0"}, + {file = "scipy-1.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:4b4bb134c7aa457e26cc6ea482b016fef45db71417d55cc6d8f43d799cdf9ef2"}, + {file = "scipy-1.11.3.tar.gz", hash = "sha256:bba4d955f54edd61899776bad459bf7326e14b9fa1c552181f0479cc60a568cd"}, ] sentry-sdk = [ - {file = "sentry-sdk-1.14.0.tar.gz", hash = "sha256:273fe05adf052b40fd19f6d4b9a5556316807246bd817e5e3482930730726bb0"}, - {file = "sentry_sdk-1.14.0-py2.py3-none-any.whl", hash = "sha256:72c00322217d813cf493fe76590b23a757e063ff62fec59299f4af7201dd4448"}, + {file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"}, + {file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"}, ] setproctitle = [ - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe"}, - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1"}, - {file = "setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099"}, - {file = "setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7"}, - {file = "setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc"}, - {file = "setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff"}, - {file = "setproctitle-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202"}, - {file = "setproctitle-1.3.2-cp38-cp38-win32.whl", hash = "sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1"}, - {file = "setproctitle-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f"}, - {file = "setproctitle-1.3.2-cp39-cp39-win32.whl", hash = "sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c"}, - {file = "setproctitle-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665"}, - {file = "setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, ] setuptools = [ - {file = "setuptools-67.6.0-py3-none-any.whl", hash = "sha256:b78aaa36f6b90a074c1fa651168723acbf45d14cb1196b6f02c0fd07f17623b2"}, - {file = "setuptools-67.6.0.tar.gz", hash = "sha256:2ee892cd5f29f3373097f5a814697e397cf3ce313616df0af11231e2ad118077"}, + {file = "setuptools-66.1.1-py3-none-any.whl", hash = "sha256:6f590d76b713d5de4e49fe4fbca24474469f53c83632d5d0fd056f7ff7e8112b"}, + {file = "setuptools-66.1.1.tar.gz", hash = "sha256:ac4008d396bc9cd983ea483cb7139c0240a07bbc74ffb6232fceffedc6cf03a8"}, +] +shapely = [ + {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d048f93e42ba578b82758c15d8ae037d08e69d91d9872bca5a1895b118f4e2b0"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99ab0ddc05e44acabdbe657c599fdb9b2d82e86c5493bdae216c0c4018a82dee"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a2f0da0109e81e0c101a2b4cd8412f73f5f299e7b5b2deaf64cd2a100ac118"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6fe855e7d45685926b6ba00aaeb5eba5862611f7465775dacd527e081a8ced6d"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec14ceca36f67cb48b34d02d7f65a9acae15cd72b48e303531893ba4a960f3ea"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a2b2a65fa7f97115c1cd989fe9d6f39281ca2a8a014f1d4904c1a6e34d7f25"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-win32.whl", hash = "sha256:21776184516a16bf82a0c3d6d6a312b3cd15a4cabafc61ee01cf2714a82e8396"}, + {file = "Shapely-1.8.5.post1-cp310-cp310-win_amd64.whl", hash = "sha256:a354199219c8d836f280b88f2c5102c81bb044ccea45bd361dc38a79f3873714"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:783bad5f48e2708a0e2f695a34ed382e4162c795cb2f0368b39528ac1d6db7ed"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a23ef3882d6aa203dd3623a3d55d698f59bfbd9f8a3bfed52c2da05a7f0f8640"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab38f7b5196ace05725e407cb8cab9ff66edb8e6f7bb36a398e8f73f52a7aaa2"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d086591f744be483b34628b391d741e46f2645fe37594319e0a673cc2c26bcf"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4728666fff8cccc65a07448cae72c75a8773fea061c3f4f139c44adc429b18c3"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-win32.whl", hash = "sha256:84010db15eb364a52b74ea8804ef92a6a930dfc1981d17a369444b6ddec66efd"}, + {file = "Shapely-1.8.5.post1-cp311-cp311-win_amd64.whl", hash = "sha256:48dcfffb9e225c0481120f4bdf622131c8c95f342b00b158cdbe220edbbe20b6"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2fd15397638df291c427a53d641d3e6fd60458128029c8c4f487190473a69a91"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a74631e511153366c6dbe3229fa93f877e3c87ea8369cd00f1d38c76b0ed9ace"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:66bdac74fbd1d3458fa787191a90fa0ae610f09e2a5ec398c36f968cc0ed743f"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-win32.whl", hash = "sha256:6d388c0c1bd878ed1af4583695690aa52234b02ed35f93a1c8486ff52a555838"}, + {file = "Shapely-1.8.5.post1-cp36-cp36m-win_amd64.whl", hash = "sha256:be9423d5a3577ac2e92c7e758bd8a2b205f5e51a012177a590bc46fc51eb4834"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5d7f85c2d35d39ff53c9216bc76b7641c52326f7e09aaad1789a3611a0f812f2"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:adcf8a11b98af9375e32bff91de184f33a68dc48b9cb9becad4f132fa25cfa3c"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:753ed0e21ab108bd4282405b9b659f2e985e8502b1a72b978eaa51d3496dee19"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-win32.whl", hash = "sha256:65b21243d8f6bcd421210daf1fabb9de84de2c04353c5b026173b88d17c1a581"}, + {file = "Shapely-1.8.5.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:370b574c78dc5af3a198a6da5d9b3d7c04654bd2ef7e80e80a3a0992dfb2d9cd"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:532a55ee2a6c52d23d6f7d1567c8f0473635f3b270262c44e1b0c88096827e22"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3480657460e939f45a7d359ef0e172a081f249312557fe9aa78c4fd3a362d993"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b65f5d530ba91e49ffc7c589255e878d2506a8b96ffce69d3b7c4500a9a9eaf8"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:147066da0be41b147a61f8eb805dea3b13709dbc873a431ccd7306e24d712bc0"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2822111ddc5bcfb116e6c663e403579d0fe3f147d2a97426011a191c43a7458"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b47bb6f9369e8bf3e6dbd33e6a25a47ee02b2874792a529fe04a49bf8bc0df6"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-win32.whl", hash = "sha256:2e0a8c2e55f1be1312b51c92b06462ea89e6bb703fab4b114e7a846d941cfc40"}, + {file = "Shapely-1.8.5.post1-cp38-cp38-win_amd64.whl", hash = "sha256:0d885cb0cf670c1c834df3f371de8726efdf711f18e2a75da5cfa82843a7ab65"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0b4ee3132ee90f07d63db3aea316c4c065ed7a26231458dda0874414a09d6ba3"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02dd5d7dc6e46515d88874134dc8fcdc65826bca93c3eecee59d1910c42c1b17"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6a9a4a31cd6e86d0fbe8473ceed83d4fe760b19d949fb557ef668defafea0f6"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:38f0fbbcb8ca20c16451c966c1f527cc43968e121c8a048af19ed3e339a921cd"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78fb9d929b8ee15cfd424b6c10879ce1907f24e05fb83310fc47d2cd27088e40"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89164e7a9776a19e29f01369a98529321994e2e4d852b92b7e01d4d9804c55bf"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-win32.whl", hash = "sha256:8e59817b0fe63d34baedaabba8c393c0090f061917d18fc0bcc2f621937a8f73"}, + {file = "Shapely-1.8.5.post1-cp39-cp39-win_amd64.whl", hash = "sha256:e9c30b311de2513555ab02464ebb76115d242842b29c412f5a9aa0cac57be9f6"}, + {file = "Shapely-1.8.5.post1.tar.gz", hash = "sha256:ef3be705c3eac282a28058e6c6e5503419b250f482320df2172abcbea642c831"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +sniffio = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, ] sortedcontainers = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] soupsieve = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] +sqlalchemy = [ + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, +] +sqlalchemy-bigquery = [ + {file = "sqlalchemy-bigquery-1.8.0.tar.gz", hash = "sha256:fdc58cc23415b9e251dc90a97052a4831894c15b1b54911909d746696eba6f38"}, + {file = "sqlalchemy_bigquery-1.8.0-py2.py3-none-any.whl", hash = "sha256:d755a9f820c373858cc799fd4b03d334fb1c372e21a6d224f82eb4f10db00124"}, +] +sqlalchemy-jsonfield = [ + {file = "SQLAlchemy-JSONField-1.0.1.post0.tar.gz", hash = "sha256:72a5e714fe0493d2660abd7484a9fd9f492f493a0856288dd22a5decb29f5dc4"}, + {file = "SQLAlchemy_JSONField-1.0.1.post0-py3-none-any.whl", hash = "sha256:d6f1e5ee329a3c0d9d164e40d81a2143ac8332e09988fbbaff84179dac5503d4"}, +] +sqlalchemy-spanner = [ + {file = "sqlalchemy-spanner-1.6.2.tar.gz", hash = "sha256:093aed5b46d75a075a259d7aa8fbead4924190535461756cd6b86e19f1592c58"}, + {file = "sqlalchemy_spanner-1.6.2-py3-none-any.whl", hash = "sha256:901d5fe35d105baf58dce9f8098e903f399e9d6f9ccd027964bea853c9e4e507"}, +] +sqlalchemy-utils = [ + {file = "SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74"}, + {file = "SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801"}, +] +sqlparse = [ + {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, + {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, ] stack-data = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] tabulate = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, ] tenacity = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] termcolor = [ - {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, - {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] +text-unidecode = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] threadpoolctl = [ - {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, - {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, + {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, + {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, ] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, @@ -4613,29 +8294,48 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tornado = [ - {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, - {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, - {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, - {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, - {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] traitlets = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.11.2-py3-none-any.whl", hash = "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae"}, + {file = "traitlets-5.11.2.tar.gz", hash = "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e"}, +] +typer = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, ] typing-extensions = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] +tzdata = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] +uc-micro-py = [ + {file = "uc-micro-py-1.0.2.tar.gz", hash = "sha256:30ae2ac9c49f39ac6dce743bd187fcd2b574b16ca095fa74cd9396795c954c54"}, + {file = "uc_micro_py-1.0.2-py3-none-any.whl", hash = "sha256:8c9110c309db9d9e87302e2f4ad2c3152770930d88ab385cd544e7a7e75f3de0"}, +] +unicodecsv = [ + {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, +] +uritemplate = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] urllib3 = [ - {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, - {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, + {file = "urllib3-2.0.6-py3-none-any.whl", hash = "sha256:7a7c7003b000adf9e7ca2a377c9688bbc54ed41b985789ed576570342a375cd2"}, + {file = "urllib3-2.0.6.tar.gz", hash = "sha256:b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564"}, ] uvloop = [ {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, @@ -4670,50 +8370,53 @@ uvloop = [ {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, ] virtualenv = [ - {file = "virtualenv-20.20.0-py3-none-any.whl", hash = "sha256:3c22fa5a7c7aa106ced59934d2c20a2ecb7f49b4130b8bf444178a16b880fa45"}, - {file = "virtualenv-20.20.0.tar.gz", hash = "sha256:a8a4b8ca1e28f864b7514a253f98c1d62b64e31e77325ba279248c65fb4fcef4"}, + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, ] wandb = [ {file = "wandb-0.13.11-py3-none-any.whl", hash = "sha256:e584ac7fb0097fba8a030d5aedc5fea157286aba69a2e6e6e689b794155fcc8f"}, {file = "wandb-0.13.11.tar.gz", hash = "sha256:f2b065d1c732e8e1828fabe720dc82f12e6109d0d2bbfbcccc17eaefae0fd7c9"}, ] watchdog = [ - {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, - {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, - {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, - {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, - {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, - {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, - {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, - {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, - {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, - {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, - {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, - {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, - {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, - {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, - {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, - {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, - {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, - {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, - {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, - {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, - {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, - {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, ] wcmatch = [ - {file = "wcmatch-8.4.1-py3-none-any.whl", hash = "sha256:3476cd107aba7b25ba1d59406938a47dc7eec6cfd0ad09ff77193f21a964dee7"}, - {file = "wcmatch-8.4.1.tar.gz", hash = "sha256:b1f042a899ea4c458b7321da1b5e3331e3e0ec781583434de1301946ceadb943"}, + {file = "wcmatch-8.5-py3-none-any.whl", hash = "sha256:14554e409b142edeefab901dc68ad570b30a72a8ab9a79106c5d5e9a6d241bd5"}, + {file = "wcmatch-8.5.tar.gz", hash = "sha256:86c17572d0f75cbf3bcb1a18f3bf2f9e72b39a9c08c9b4a74e991e1882a8efb3"}, ] wcwidth = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.8-py2.py3-none-any.whl", hash = "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704"}, + {file = "wcwidth-0.2.8.tar.gz", hash = "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4"}, +] +werkzeug = [ + {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, + {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, ] wrapt = [ {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, @@ -4792,91 +8495,99 @@ wrapt = [ {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] +wtforms = [ + {file = "WTForms-3.0.1-py3-none-any.whl", hash = "sha256:837f2f0e0ca79481b92884962b914eba4e72b7a2daaf1f939c890ed0124b834b"}, + {file = "WTForms-3.0.1.tar.gz", hash = "sha256:6b351bbb12dd58af57ffef05bc78425d08d1914e0fd68ee14143b7ade023c5bc"}, +] xgboost = [ - {file = "xgboost-1.7.4-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:986fb1b4ef0c1cf69a8ce0f6997e3dbd4b9d360bd0cecec8a17b6cb95e6b67cf"}, - {file = "xgboost-1.7.4-py3-none-macosx_12_0_arm64.whl", hash = "sha256:31aec5c4acb9e23bee9b9200444de1d808a1a44f48136ec6a4fbe8d57fc1b13b"}, - {file = "xgboost-1.7.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:f8b32ff0cb3a0130e4f8f1ae69312b4839c877455f0ac9c03377fb159cf5aab7"}, - {file = "xgboost-1.7.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ef8033c2ab2c7694f3d8c498b72c24719e3505abfc3dc5b8d67dc42be0cdb7ff"}, - {file = "xgboost-1.7.4-py3-none-win_amd64.whl", hash = "sha256:a4d8548b3b2c864477d1039fc82c3fa88508fa51445cb3e7b7cdb6086b7e4b47"}, - {file = "xgboost-1.7.4.tar.gz", hash = "sha256:7a2406562277d0f7f6ed08f1cda8fef0ed64956bc13a1ff1da1b4201b431e721"}, + {file = "xgboost-1.7.6-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:4c34675b4d2678c624ddde5d45361e7e16046923e362e4e609b88353e6b87124"}, + {file = "xgboost-1.7.6-py3-none-macosx_12_0_arm64.whl", hash = "sha256:59b4b366d2cafc7f645e87d897983a5b59be02876194b1d213bd8d8b811d8ce8"}, + {file = "xgboost-1.7.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:281c3c6f4fbed2d36bf95cd02a641afa95e72e9abde70064056da5e76233e8df"}, + {file = "xgboost-1.7.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b1d5db49b199152d62bd9217c98760207d3de86d2b9d243260c573ffe638f80a"}, + {file = "xgboost-1.7.6-py3-none-win_amd64.whl", hash = "sha256:127cf1f5e2ec25cd41429394c6719b87af1456ce583e89f0bffd35d02ad18bcb"}, + {file = "xgboost-1.7.6.tar.gz", hash = "sha256:1c527554a400445e0c38186039ba1a00425dcdb4e40b37eed0e74cb39a159c47"}, +] +xyzservices = [ + {file = "xyzservices-2023.10.0-py3-none-any.whl", hash = "sha256:70b9910f6c8e46f6ca92dea21e9b8cf89edf0ead35a870198fb59a7d63579525"}, + {file = "xyzservices-2023.10.0.tar.gz", hash = "sha256:eee203e91955782fd8bfc2f05846830c289139dc0ab4eaf733bfa8f0be71861f"}, ] yarl = [ - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, - {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, - {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, - {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, - {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, - {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, - {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, - {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, - {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, - {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, - {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, - {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, - {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, ] zipp = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] diff --git a/pyproject.toml b/pyproject.toml index 9bad24362..b0adc7c14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "otgenetics" -version = "0.1.4" +version = "1.0.0" description = "Open targets Genetics Portal Python ETL" authors = ["Open Targets core team"] license = "Apache License v2" @@ -9,11 +9,11 @@ packages = [ ] [tool.poetry.scripts] -otg = "cli:run_step" +otg = "otg.cli:main" [tool.poetry.dependencies] -python = "3.8.15" -pyspark = "3.1.3" +python = "3.10.8" +pyspark = "3.3.0" scipy = "^1.6.1" hydra-core = "^1.2.0" pyliftover = "^0.4" @@ -25,24 +25,12 @@ scikit-learn = "^1.2.1" [tool.poetry.dev-dependencies] pre-commit = "^2.15.0" black = {version = "^22.6.0", allow-prereleases = true} -flake8 = "^5.0.4" mypy = "^0.971" -flake8-annotations = "^2.9.1" -flake8-broken-line = "0.5.0" -flake8-bugbear = "22.7.1" -flake8-comprehensions = "3.10.0" -flake8-eradicate = "1.3.0" -flake8-quotes = "3.3.1" -flake8-simplify = "0.19.3" -flake8-tidy-imports = "4.8.0" -flake8-type-checking = "2.1.2" -flake8-typing-imports = "1.12.0" -flake8-use-fstring = "1.4" pep8-naming = "^0.13.2" interrogate = "^1.5.0" isort = "^5.10.1" darglint = "^1.8.1" -flake8-docstrings = "^1.6.0" +ruff = "^0.0.287" [tool.poetry.group.docs.dependencies] mkdocs = "^1.4.0" @@ -53,7 +41,6 @@ mkdocs-git-revision-date-localized-plugin = "^1.1.0" mkdocs-autolinks-plugin = "^0.6.0" mkdocs-minify-plugin = "^0.5.0" mkdocs-awesome-pages-plugin = "^2.8.0" -mkdocs-simple-hooks = "^0.1.5" mkdocs-exclude = "^1.0.2" mkdocs-git-committers-plugin-2 = "^1.1.1" lxml = "^4.9.2" @@ -62,23 +49,34 @@ lxml = "^4.9.2" [tool.poetry.group.tests.dependencies] pytest-cov = "^4.0.0" pytest-sugar = "^0.9.5" -pandas = "<1.5.0" dbldatagen = "^0.3.1" pyparsing = "^3.0.9" pytest = "^7.2.2" +pytest-xdist = "^3.3.1" [tool.poetry.group.dev.dependencies] ipython = "^8.5.0" -flake8-class-attributes-order = "^0.1.3" ipykernel = "^6.19.0" -flake8-pytest-style = "^1.7.2" xgboost = "^1.7.4" pyarrow = "^11.0.0" [tool.poetry.group.dev-dependencies.dependencies] wandb = "^0.13.9" +google-cloud-dataproc = "^5.4.1" +apache-airflow = "^2.7.0" +apache-airflow-providers-google = "^10.6.0" + +[tool.semantic_release] +branch = "main" +version_variable = "src/otg/__init__.py:__version__" +version_toml = ["pyproject.toml:tool.poetry.version"] +version_source = "tag" +commit_version_number = true # required for version_source = "tag" +tag_commit = true +upload_to_pypi = false +upload_to_release = false [build-system] requires = ["poetry-core>=1.0.0"] @@ -93,4 +91,31 @@ color = true exclude = ["dist"] [tool.pytest.ini_options] -addopts = "--ignore=deprecated_tests" +addopts = "-n auto --doctest-modules --cov=src/ --cov-report=xml" + +[[tool.mypy.overrides]] +module = "google.protobuf.duration_pb2" +ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = "yaml" +ignore_missing_imports = true + +[tool.ruff] +select = ["D", "E", "F", "B"] +ignore = ["D417", "E501", "E203"] +fixable = ["F401"] +unfixable = ["B"] +line-length = 88 +target-version = "py310" + +[tool.ruff.per-file-ignores] +"__init__.py" = ["E402"] +"path/to/file.py" = ["E402"] +"**/{tests,docs,tools}/*" = ["E402"] + +[tool.ruff.flake8-quotes] +docstring-quotes = "double" + +[tool.ruff.pydocstyle] +convention = "google" diff --git a/src/airflow/.env b/src/airflow/.env new file mode 100644 index 000000000..2b6ade116 --- /dev/null +++ b/src/airflow/.env @@ -0,0 +1,2 @@ +AIRFLOW_UID=1126896676 +AIRFLOW_IMAGE_NAME=extending_airflow:latest diff --git a/src/airflow/Dockerfile b/src/airflow/Dockerfile new file mode 100644 index 000000000..2962e4a98 --- /dev/null +++ b/src/airflow/Dockerfile @@ -0,0 +1,29 @@ +FROM apache/airflow:2.7.1-python3.8 + +COPY requirements.txt /requirements.txt +RUN pip install --user --upgrade pip +RUN pip install --no-cache-dir --user -r /requirements.txt # --no-cache-dir good practise when installing packages using pip. It helps to keep the image lightweight + + +# Source: https://airflow.apache.org/docs/docker-stack/recipes.html +# Installing the GCP CLI in the container +SHELL ["/bin/bash", "-o", "pipefail", "-e", "-u", "-x", "-c"] + +USER 0 +ARG CLOUD_SDK_VERSION=322.0.0 +ENV GCLOUD_HOME=/home/google-cloud-sdk + +ENV PATH="${GCLOUD_HOME}/bin/:${PATH}" + +RUN DOWNLOAD_URL="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" \ + && TMP_DIR="$(mktemp -d)" \ + && curl -fL "${DOWNLOAD_URL}" --output "${TMP_DIR}/google-cloud-sdk.tar.gz" \ + && mkdir -p "${GCLOUD_HOME}" \ + && tar xzf "${TMP_DIR}/google-cloud-sdk.tar.gz" -C "${GCLOUD_HOME}" --strip-components=1 \ + && "${GCLOUD_HOME}/install.sh" \ + --bash-completion=false \ + --path-update=false \ + --usage-reporting=false \ + --quiet \ + && rm -rf "${TMP_DIR}" \ + && gcloud --version diff --git a/src/airflow/dags/configs/dag.yaml b/src/airflow/dags/configs/dag.yaml new file mode 100644 index 000000000..a9416b774 --- /dev/null +++ b/src/airflow/dags/configs/dag.yaml @@ -0,0 +1,18 @@ +- id: "my_gene_index" +- id: "my_variant_annotation" +- id: "my_ld_index" +- id: "my_gwas_catalog" + prerequisites: + - "my_variant_annotation" + - "my_ld_index" +- id: "my_variant_index" + prerequisites: + - "my_variant_annotation" + - "my_gwas_catalog" +- id: "my_v2g" + prerequisites: + - "my_variant_index" + - "my_variant_annotation" + - "my_gene_index" +- id: "my_finngen" +- id: "my_ukbiobank" diff --git a/src/airflow/dags/genetics_etl_gcp.py b/src/airflow/dags/genetics_etl_gcp.py new file mode 100644 index 000000000..9938daa08 --- /dev/null +++ b/src/airflow/dags/genetics_etl_gcp.py @@ -0,0 +1,203 @@ +"""Generate jinja2 template for workflow.""" +from __future__ import annotations + +from pathlib import Path + +import pendulum +import yaml +from airflow.decorators import dag, task_group +from airflow.operators.empty import EmptyOperator +from airflow.providers.google.cloud.operators.dataproc import ( + ClusterGenerator, + DataprocCreateClusterOperator, + DataprocDeleteClusterOperator, + DataprocSubmitJobOperator, +) +from airflow.utils.trigger_rule import TriggerRule + +DAG_ID = "etl_using_external_flat_file" + +DAG_DIR = Path(__file__).parent +CONFIG_DIR = "configs" + +SOURCES_FILE_NAME = "dag.yaml" +SOURCE_CONFIG_FILE_PATH = DAG_DIR / CONFIG_DIR / SOURCES_FILE_NAME + +# Managed cluster +project_id = "open-targets-genetics-dev" +otg_version = "0.1.4" +initialisation_base_path = ( + f"gs://genetics_etl_python_playground/initialisation/{otg_version}" +) +python_cli = f"{initialisation_base_path}/cli.py" +config_name = "my_config" +config_tar = f"{initialisation_base_path}/config.tar.gz" +package_wheel = f"{initialisation_base_path}/otgenetics-{otg_version}-py3-none-any.whl" +initialisation_executable_file = [f"{initialisation_base_path}/initialise_cluster.sh"] +image_version = "2.1" +num_local_ssds = 1 +# job +cluster_config_dir = "/config" + +default_args = { + "owner": "Open Targets Data Team", + # Tell airflow to start one day ago, so that it runs as soon as you upload it + "start_date": pendulum.now(tz="Europe/London").subtract(days=1), + # "start_date": pendulum.datetime(2020, 1, 1, tz="Europe/London"), + "schedule_interval": "@once", + "project_id": project_id, + "catchup": False, + "retries": 3, +} + +cluster_generator_config = ClusterGenerator( + project_id=project_id, + zone="europe-west1-d", + master_machine_type="n1-standard-4", + num_workers=0, + init_actions_uris=initialisation_executable_file, + # init_action_timeout="600s", + enable_component_gateway=True, + num_local_ssds=1, + image_version=image_version, + metadata={ + "CONFIGTAR": config_tar, + "PACKAGE": package_wheel, + }, +).make() + + +def generate_pyspark_job_from_dict( + step: dict, + cluster_config_dir: str, + config_name: str, + cluster_name: str, +) -> DataprocSubmitJobOperator: + """Generates a pyspark job from dictionary describing step. + + Args: + step (dict): Dictionary describing step. + cluster_config_dir (str): Directory containing cluster config. + config_name (str): Name of config file. + cluster_name (str): Name of cluster. + + Returns: + DataprocSubmitJobOperator: Operator for submitting pyspark job. + """ + return DataprocSubmitJobOperator( + task_id=f"job-{step['id']}", + region="europe-west1", + project_id=project_id, + job={ + "job_uuid": f"airflow-{step['id']}", + "reference": {"project_id": project_id}, + "placement": {"cluster_name": cluster_name}, + "pyspark_job": { + "main_python_file_uri": f"{initialisation_base_path}/cli.py", + "args": [ + f"step={ step['id'] }", + f"--config-dir={ cluster_config_dir }", + f"--config-name={ config_name }", + ], + "properties": { + "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.executor.extraClassPath": "./hail-all-spark.jar", + "spark.serializer": "org.apache.spark.serializer.KryoSerializer", + "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", + }, + }, + }, + ) + + +@dag( + dag_id=Path(__file__).stem, + default_args=default_args, + description="Open Targets Genetics ETL workflow", + tags=["genetics_etl", "experimental"], +) +def create_dag() -> None: + """Submit dataproc workflow.""" + start = EmptyOperator(task_id="start") + + source_config_file_path = Path(SOURCE_CONFIG_FILE_PATH) + + end = EmptyOperator(task_id="end", trigger_rule="all_done") + + if source_config_file_path.exists(): + with open(source_config_file_path, "r") as config_file: + tasks_groups = {} + steps = yaml.safe_load(config_file) + for step in steps: + print(step["id"]) + + @task_group( + group_id=step["id"], + prefix_group_id=True, + ) + def tgroup(step: dict) -> None: + """Task group for step. + + Args: + step (dict): Dictionary describing step. + """ + cluster_name = ( + f"workflow-otg-cluster-{step['id'].replace('_', '-')}" + ) + create_cluster = DataprocCreateClusterOperator( + task_id=f"create_cluster_{step['id']}", + project_id=project_id, + cluster_config=cluster_generator_config, + region="europe-west1", + cluster_name=cluster_name, + trigger_rule=TriggerRule.ALL_SUCCESS, + ) + install_dependencies = DataprocSubmitJobOperator( + task_id=f"install_dependencies_{step['id']}", + region="europe-west1", + project_id=project_id, + job={ + "job_uuid": "airflow-install-dependencies", + "reference": {"project_id": project_id}, + "placement": {"cluster_name": cluster_name}, + "pig_job": { + "jar_file_uris": [ + f"gs://genetics_etl_python_playground/initialisation/{otg_version}/install_dependencies_on_cluster.sh" + ], + "query_list": { + "queries": [ + "sh chmod 750 ${PWD}/install_dependencies_on_cluster.sh", + "sh ${PWD}/install_dependencies_on_cluster.sh", + ] + }, + }, + }, + ) + task = generate_pyspark_job_from_dict( + step, + cluster_config_dir=cluster_config_dir, + config_name=config_name, + cluster_name=cluster_name, + ) + delete_cluster = DataprocDeleteClusterOperator( + task_id=f"delete_cluster_{step['id']}", + project_id=project_id, + cluster_name=cluster_name, + region="europe-west1", + trigger_rule=TriggerRule.ALL_DONE, + deferrable=True, + ) + create_cluster >> install_dependencies >> task >> delete_cluster + + thisgroup = tgroup(step) + tasks_groups[step["id"]] = thisgroup + if "prerequisites" in step: + for prerequisite in step["prerequisites"]: + print(f"|- {prerequisite}") + thisgroup.set_upstream(tasks_groups[prerequisite]) + + start >> thisgroup >> end + + +dag = create_dag() diff --git a/src/airflow/docker-compose.yaml b/src/airflow/docker-compose.yaml new file mode 100644 index 000000000..32c50f23d --- /dev/null +++ b/src/airflow/docker-compose.yaml @@ -0,0 +1,251 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL. +# +# WARNING: This configuration is for local development. Do not use it in a production deployment. +# +# This configuration supports basic configuration using environment variables or an .env file +# The following variables are supported: +# +# AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. +# Default: apache/airflow:2.7.1 +# AIRFLOW_UID - User ID in Airflow containers +# Default: 50000 +# AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. +# Default: . +# Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode +# +# _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested). +# Default: airflow +# _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested). +# Default: airflow +# _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers. +# Use this option ONLY for quick checks. Installing requirements at container +# startup is done EVERY TIME the service is started. +# A better way is to build a custom image or extend the official image +# as described in https://airflow.apache.org/docs/docker-stack/build.html. +# Default: '' +# +# Feel free to modify this file to suit your needs. +--- +version: '3.8' +x-airflow-common: + &airflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml + # and uncomment the "build" line below, Then run `docker-compose build` to build the images. + image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.7.1} + # build: . + environment: + &airflow-common-env + AIRFLOW__CORE__EXECUTOR: LocalExecutor + AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow + # For backward compatibility, with Airflow <2.3 + AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow + AIRFLOW__CORE__FERNET_KEY: '' + AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true' + AIRFLOW__CORE__LOAD_EXAMPLES: 'false' + AIRFLOW__API__AUTH_BACKENDS: 'airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session' + # yamllint disable rule:line-length + # Use simple http server on scheduler for health checks + # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server + # yamllint enable rule:line-length + AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: 'true' + # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks + # for other purpose (development, test and especially production usage) build/extend Airflow image. + _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} + # GCLOUD Authentication + GOOGLE_APPLICATION_CREDENTIALS: /.google/credentials/google_credentials.json + AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT: 'google-cloud-platform://?extra__google_cloud_platform__key_path=/.google/credentials/google_credentials.json' + # Nice to have, Not necessary + GCP_PROJECT_ID: 'open-targets-genetics-dev' + GCP_GCS_BUCKET: 'gs://genetics_etl_python_playground/' + + volumes: + - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags + - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs + - ${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config + - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins + # GCLOUD Authentication + - ~/.google/credentials/:/.google/credentials:ro + user: "${AIRFLOW_UID:-50000}:0" + depends_on: + &airflow-common-depends-on + redis: + condition: service_healthy + postgres: + condition: service_healthy + + + +services: + postgres: + image: postgres:13 + environment: + POSTGRES_USER: airflow + POSTGRES_PASSWORD: airflow + POSTGRES_DB: airflow + volumes: + - postgres-db-volume:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready", "-U", "airflow"] + interval: 10s + retries: 5 + start_period: 5s + restart: always + + redis: + image: redis:latest + expose: + - 6379 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 30s + retries: 50 + start_period: 30s + restart: always + + airflow-scheduler: + <<: *airflow-common + command: scheduler + healthcheck: + test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + restart: always + depends_on: + <<: *airflow-common-depends-on + airflow-init: + condition: service_completed_successfully + + airflow-webserver: + <<: *airflow-common + command: webserver + ports: + - "8080:8080" + healthcheck: + test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + restart: always + depends_on: + <<: *airflow-common-depends-on + airflow-init: + condition: service_completed_successfully + + airflow-triggerer: + <<: *airflow-common + command: triggerer + healthcheck: + test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"'] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + restart: always + depends_on: + <<: *airflow-common-depends-on + airflow-init: + condition: service_completed_successfully + + airflow-init: + <<: *airflow-common + entrypoint: /bin/bash + # yamllint disable rule:line-length + command: + - -c + - | + function ver() { + printf "%04d%04d%04d%04d" $${1//./ } + } + airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO && gosu airflow airflow version) + airflow_version_comparable=$$(ver $${airflow_version}) + min_airflow_version=2.2.0 + min_airflow_version_comparable=$$(ver $${min_airflow_version}) + if (( airflow_version_comparable < min_airflow_version_comparable )); then + echo + echo -e "\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\e[0m" + echo "The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!" + echo + exit 1 + fi + if [[ -z "${AIRFLOW_UID}" ]]; then + echo + echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m" + echo "If you are on Linux, you SHOULD follow the instructions below to set " + echo "AIRFLOW_UID environment variable, otherwise files will be owned by root." + echo "For other operating systems you can get rid of the warning with manually created .env file:" + echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user" + echo + fi + one_meg=1048576 + mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg)) + cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat) + disk_available=$$(df / | tail -1 | awk '{print $$4}') + warning_resources="false" + if (( mem_available < 4000 )) ; then + echo + echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m" + echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))" + echo + warning_resources="true" + fi + if (( cpus_available < 2 )); then + echo + echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m" + echo "At least 2 CPUs recommended. You have $${cpus_available}" + echo + warning_resources="true" + fi + if (( disk_available < one_meg * 10 )); then + echo + echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m" + echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))" + echo + warning_resources="true" + fi + if [[ $${warning_resources} == "true" ]]; then + echo + echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m" + echo "Please follow the instructions to increase amount of resources available:" + echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin" + echo + fi + mkdir -p /sources/logs /sources/dags /sources/plugins + chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins} + exec /entrypoint airflow version + # yamllint enable rule:line-length + environment: + <<: *airflow-common-env + _AIRFLOW_DB_MIGRATE: 'true' + _AIRFLOW_WWW_USER_CREATE: 'true' + _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} + _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} + _PIP_ADDITIONAL_REQUIREMENTS: '' + user: "0:0" + volumes: + - ${AIRFLOW_PROJ_DIR:-.}:/sources + +volumes: + postgres-db-volume: diff --git a/src/airflow/requirements.txt b/src/airflow/requirements.txt new file mode 100644 index 000000000..185ee6d67 --- /dev/null +++ b/src/airflow/requirements.txt @@ -0,0 +1 @@ +apache-airflow-providers-google diff --git a/src/config/step/locus_to_gene.yaml b/src/config/step/locus_to_gene.yaml deleted file mode 100644 index 60d4b99a0..000000000 --- a/src/config/step/locus_to_gene.yaml +++ /dev/null @@ -1,33 +0,0 @@ -_target_: otg.l2g.LocusToGeneStep -run_mode: predict # can be either 'train' or 'predict' -perform_cross_validation: False -wandb_run_name: null # set to null if you don't want to track the experiment -model_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/model -predictions_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/l2g_predictions -study_locus_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/mock_study_locus -study_locus_overlap_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/mock_study_locus_overlap -variant_gene_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/mock_v2g -study_index_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/mock_study_index -colocalisation_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/mock_colocalisation -gold_standard_curation_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/curation.json -gold_standard_processed_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/gold_standards_221107_transformed -feature_matrix_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/feature_matrix_221107_transformed -features_list: - - dist_tss_ave # average distance of all tagging variants to gene TSS - - dist_tss_min # minimum distance of all tagging variants to gene TSS - - eqtl_max_coloc_clpp_local # max clpp for each (study, locus, gene) aggregating over all eQTLs - - eqtl_max_coloc_clpp_nbh # max clpp for each (study, locus) aggregating over all eQTLs - - eqtl_max_coloc_llr_local # max log-likelihood ratio value for each (study, locus, gene) aggregating over all eQTLs - - eqtl_max_coloc_llr_nbh # max log-likelihood ratio value for each (study, locus) aggregating over all eQTLs - - pqtl_max_coloc_clpp_local # max clpp for each (study, locus, gene) aggregating over all pQTLs - - pqtl_max_coloc_clpp_nbh # max clpp for each (study, locus) aggregating over all pQTLs - - pqtl_max_coloc_llr_local # max log-likelihood ratio value for each (study, locus, gene) aggregating over all pQTLs - - pqtl_max_coloc_llr_nbh # max log-likelihood ratio value for each (study, locus) aggregating over all pQTLs - - sqtl_max_coloc_clpp_local # max clpp for each (study, locus, gene) aggregating over all sQTLs - - sqtl_max_coloc_clpp_nbh # max clpp for each (study, locus) aggregating over all sQTLs - - sqtl_max_coloc_llr_local # max log-likelihood ratio value for each (study, locus, gene) aggregating over all sQTLs - - sqtl_max_coloc_llr_nbh # max log-likelihood ratio value for each (study, locus) aggregating over all sQTLs -gene_interactions_path: /Users/irenelopez/MEGAsync/EBI/repos/genetics_etl_python/mock_data/interaction -hyperparameters: - max_depth: 5 - loss_function: binary:logistic diff --git a/src/conftest.py b/src/conftest.py index 316b8b075..03b82efb8 100644 --- a/src/conftest.py +++ b/src/conftest.py @@ -8,7 +8,7 @@ @pytest.fixture(scope="session", autouse=True) -def spark(doctest_namespace: dict[str, Any]) -> SparkSession: +def spark(doctest_namespace: dict[str, Any], tmp_path_factory: Any) -> SparkSession: """Local spark session for testing purposes. It returns a session and make it available to doctests through @@ -21,6 +21,33 @@ def spark(doctest_namespace: dict[str, Any]) -> SparkSession: SparkSession: local spark session """ # init spark session - spark = SparkSession.builder.getOrCreate() + spark = ( + SparkSession.builder.master("local[1]") + .config("spark.driver.bindAddress", "127.0.0.1") + .config("spark.executor.cores", "1") + .config("spark.executor.instances", "1") + # no shuffling + .config("spark.sql.shuffle.partitions", "1") + # ui settings + .config("spark.ui.showConsoleProgress", "false") + .config("spark.ui.enabled", "false") + .config("spark.ui.dagGraph.retainedRootRDDs", "1") + .config("spark.ui.retainedJobs", "1") + .config("spark.ui.retainedStages", "1") + .config("spark.ui.retainedTasks", "1") + .config("spark.sql.ui.retainedExecutions", "1") + .config("spark.worker.ui.retainedExecutors", "1") + .config("spark.worker.ui.retainedDrivers", "1") + # fixed memory + .config("spark.driver.memory", "2g") + .config("spark.sql.warehouse.dir", tmp_path_factory.mktemp("warehouse")) + .config( + "spark.driver.extraJavaOptions", + "-Dderby.system.home={tmp_path_factory.mktemp('derby')}", + ) + .appName("test") + .getOrCreate() + ) + doctest_namespace["spark"] = spark return spark diff --git a/src/otg/assets/__init__.py b/src/otg/assets/__init__.py new file mode 100644 index 000000000..65253747d --- /dev/null +++ b/src/otg/assets/__init__.py @@ -0,0 +1,3 @@ +"""JSON support for OTG.""" + +from __future__ import annotations diff --git a/src/otg/assets/data/__init__.py b/src/otg/assets/data/__init__.py new file mode 100644 index 000000000..dbc834ccf --- /dev/null +++ b/src/otg/assets/data/__init__.py @@ -0,0 +1,3 @@ +"""JSON dataframes.""" + +from __future__ import annotations diff --git a/src/otg/assets/data/gwas_pValueText_map.json b/src/otg/assets/data/gwas_pValueText_map.json new file mode 100644 index 000000000..89ee95beb --- /dev/null +++ b/src/otg/assets/data/gwas_pValueText_map.json @@ -0,0 +1,466 @@ +{ + "A risk allele not reported": "?", + "5-hydroxyindoleacetic acid": "5-HIAA", + "Biantennary nogalactosylated glycans": "A2", + "African ancestry": "AA", + "Age at menarche and buckling ratio": "AAM-BR", + "Age at menarche and cortical thickness": "AAM-CT", + "Age at menarche and periosteal diameter": "AAM-W", + "alanine aminotransferase": "ALT", + "abdominal aortic calcium": "AAC", + "Aggregatibacter actinomycetemcomitans": "A action", + "Amyloid-beta": "Ab", + "ankle brachial index": "ABI", + "anti-centromere antibodies": "ACA", + "Angiotensin-converting enzyme": "ACE", + "antibodies to citrullinated peptide antigens": "ACPA", + "normalised agkistrodon contortrix venom ratio": "ACVn", + "Alzheimer’s Disease": "AD", + "Attention deficit hyperactivity disorder": "ADHD", + "Adrenomedullin": "ADM", + "atrial fibrillation": "AF", + "Frontal Brain volume": "AFBV", + "? fetoprotein": "AFP", + "multivariable-adjusted frontal brain volume": "AFVB", + "Abnormal Involuntary Movements Scale": "AIMS", + "Acute insulin response": "AIRg", + "Alaine": "Ala", + "albumin": "ALB", + "serum albumin:globulin ratio": "ALB/GLB", + "all ancestries": "ALL", + "combined tests of verbal delayed recall": "ALL-dr", + "adjusted log lateral ventricular volume": "ALLV", + "alkaline phosphatase": "ALP", + "alpha-tocopherol": "Alpha-TOH", + "amyotrophic lateral sclerosis": "ALS", + "multivariable-adjusted temporal horn volume": "ALTHBV", + "Alkaline phosphatase": "AlkPhos", + "Age-related macular degeneration": "AMD", + "Absolute neutrophil count": "ANC", + "N-terminal pro-atrial natriuretic peptide": "ANP6", + "angiographic coronary disease": "AngCAD", + "age of smoking initiation": "AOI", + "apolipoprotein A-1": "apoA-1", + "activated partial thromboplastin time": "aPTT", + "pathogenic water channel aquaporin 4": "AQP4", + "AR-C124910XX": "ARC", + "ostium secundum atrial septal defect": "ASD", + "aspartate aminotransferase": "AST", + "antithrombin": "At", + "anti-topoisomerase antibodies": "ATA", + "temporal brain volume": "ATBV", + "total cerebral brain volume": "ATCBV", + "multivariable-adjusted temporal brain volume": "ATVB", + "area under the curve": "AUC", + "baseline brachial artery flow velocity": "BABF", + "Barnes Akathisia Scale": "BARS", + "beta blockers": "BB", + "bipolar disorder": "BD", + "bone density estimated by T score at distal radius": "BD-RT", + "bone density estimated by T score at midshaft tibia": "BD-TT", + "bone mineral density": "BMD", + "body mass index": "BMI", + "basal metabolic rate": "BMR", + "respiratory quotient during basal metabolic rate measurement": "BMR RQ", + "brain parenchymal volume": "BPV", + "breast cancer 1 gene and breast cancer 2 gene": "BRCA1/2", + "Broadband ultrasound attenuation": "BUA", + "blood urea nitrogen": "BUN", + "cholesterol": "C", + "Propionylcarnitine": "C3", + "Butyrylcarnitine": "C4", + "Nonaylcarnitine": "C9", + "Decanoylcarnitine": "C10", + "Decadienylcarnitine": "C10:2", + "Dodecanoylcarnitine": "C12", + "Hydroxytetradecenoylcarnitine": "C14:1-OH", + "cancer antigen 19-9": "CA19-9", + "coronary artery calcification": "CAC", + "coronary artery lesions": "CAL", + "carotid brachial pulse wave velocity": "CB-PWV", + "Cortical thickness of the tibia": "CBT", + "Clara cell secretory protein": "CC16", + "common carotid artery": "CCA", + "common carotid artery intimal medial thickness": "CCA IMT", + "calcium channel blockers": "CCB", + "central corneal thickness": "CCT", + "Ligand, serum & plasma": "CD40L", + "Disease Activity Score": "cDAS28", + "Complicated disease course": "CDC", + "cholesterol ester": "CE", + "carcinoembryonic antigen": "CEA", + "ceramide": "Cer", + "Consortium to Establish a Registry for Alzheimer’s Disease delayed recall": "CERAD-dr", + "CEPH (Centre d’Etude du Polymorphisme Humain) from Utah": "CEU", + "carotid-femoral pulse wave velocity, long-term average": "CF-PWVLTA", + "Clinical Global Impressions-Severity": "CGI", + "Coronary heart disease": "CHD", + "1st principal component on transformed hue and saturation values": "CHS1", + "95% confidence interval": "CI", + "creatinine kinase": "CK", + "chronic kidney disease": "CKD", + "health assessment questionnaire score": "cHAQ", + "Classical Hodgkin lymphoma": "cHL", + "former/current smokers": "CIGSTAT", + "carotid intima media thickness": "cIMT", + "cleft lip without cleft palate": "CL", + "cleft lip with or without cleft palate": "CL/P", + "total number of correct words across three letters": "COWA", + "cleft palate": "CP", + "Chronic periodontitis": "CPd", + "cigarettes per day": "CPD", + "10 or more cigarettes per day": "CPDBI", + "C-reactive protein": "CRP", + "C-reactive protein (CRP) averaged from 3 examinations (over about 20 years)": "CRP average 2,6,7", + "C-reactive protein, offspring exam 2": "CRP2", + "C-reactive protein exam 6": "CRP6", + "cardioembolic stroke": "CS", + "Swollen joint count": "cSJC", + "Tender joint count": "cTJC", + "cardiovascular disease": "CVD", + "California Verbal Learning Test delayed recall (belongs to WL-dr category)": "CVLT-dr", + "particle diameter": "D", + "diastolic blood pressure": "DBP", + "diastolic blood pressure, long-term average": "DBPLTA", + "Dermatophagoides farina": "D.f.", + "Desialylated 2AB-labelled human plasma N-glycans groups": "DG", + "combined results from the DGI, FUSION, WTCCC analyses": "DGI+FUSION+WTCCC", + "dehydroisoandrosterone sulfate": "DHEA-S", + "Disposition index": "DI", + "diabetes mellitus": "DM", + "Dermatophagoides pteronyssinus": "D.p.", + "Delayed Word Recall Test (belongs to WL-dr category)": "DWRT-dr", + "dual energy X-ray absorptiometry": "DXA", + "European Ancestry": "EA", + "Epstein-Barr virus": "EBV", + "excessive daytime sleepiness": "EDS", + "electroencephalography": "EEG", + "estimated energy requirement": "EER", + "glomerular filtration rate": "GFR", + "estimated glomerular filtration rate based on serum creatinine": "eGFRcrea", + "serum cystatin C": "eGFRcys", + "Extraintestinal manifestations": "EIM", + "Elated mania": "EM", + "Estrogen receptor positive": "ER +ve", + "Estrogen receptor negative": "ER -ve", + "Endothelin-1": "ET-1", + "endocrine treatment": "ET", + "esophageal squamous cell carcinoma": "ESCC", + "end-stage renal disease": "ESRD", + "Epworth Sleepiness Scale": "ESS", + "esterified cholesterol": "Est-C", + "ever smokers, never smokers": "EVNV", + "Factor 2 (visual memory and organization)": "F2", + "Factor 3 (measure of attention and executive function - Trails A and B)": "F3", + "female athletes": "FA", + "free cholesterol": "FC", + "forced expiratory flow": "FEF", + "forced expiratory volume in 1 second": "FEV1", + "longitudinal slope of forced expiratory volume in one second": "fev1slope", + "fibrinogen": "FG", + "fasting insulin": "FI", + "female long endurance athletes": "FLE", + "femoral neck": "FN", + "femoral bone mineral density in males": "FNBMDm", + "fasting plasma glucose": "FPG", + "free Protein S": "fPS", + "fasting serum free triiodothyronine": "Free T3", + "female-only stroke": "FS", + "female sexual dysfunction": "FSD", + "fasting serum glucose": "FSG", + "follicle-stimulating hormone": "FSH", + "frequently sampled intravenous glucose tolerance test": "FSIGT", + "free thyroxine 3": "Ft3", + "free thyroxine": "Ft4", + "frontotemporal dementia": "FTD", + "Antennary fucosylated glycans": "FUC-A", + "Core fucosylated glycans": "FUC-C", + "functional Protein S": "funcPS", + "forced vital capacity": "FVC", + "Coagulation factors VII": "FVII", + "forward wave amplitude, long-term average": "FWLTA", + "grade 3 diarrhea": "G3D", + "glucocerebrosiadase": "GBA", + "glutamyltranspeptidase": "GGT", + "Glucose": "Glc", + "Glutamine": "Gln", + "glucose": "GLU", + "glucosylceramide": "GluCer", + "Glutamyl oxaloacetic transaminase, Aspartate aminotransferase": "GOT (AST)", + "Glycan peak": "GP", + "glutamate pyruvate transaminase, alanine aminotransferase": "GPT (ALT)", + "glycoprotein 130": "GP130", + "general side effect burden": "GSE", + "Hamilton Anxiety Scale": "HAM-A", + "hemoglobin A1c": "HbA1C", + "fetal hemoglobin": "HbF", + "homocysteine": "Hcy", + "Total cholesterol in HDL": "HDL-C", + "human epidermal growth factor receptor 2": "HER2", + "Hemoglobin": "Hgb", + "Histidine": "His", + "homeostasis model assessment of insulin resistance": "HOMA-IR", + "human immunodeficiency virus": "HIV", + "high density lipoprotein": "HDL", + "homeostasis model assessment of beta-cell function": "HOMA-B", + "hormone receptor": "HR", + "maximum heart rate during treadmill fitness test": "HRmax", + "Herpes simplex virus type 2": "HSV-2", + "hematocrit": "Ht", + "Hounsfield units": "HU", + "homovanillic acid": "HVA", + "Hopkins Verbal Learning Test delayed recall (belongs to WL-dr category)": "HVLT-dr", + "islet autoantibody": "IA", + "internal cartotid artery internal and common carotid intimal medial thickness": "ICAIMT", + "Intercellular adhesion molecule": "ICAM", + "intra-extradimensional set shifting": "IED", + "insulin-like growth factor I precursor": "IGF1", + "fasting serum insulin-like growth factor binding protein-1": "IGFBP-1", + "fasting serum insulin-like growth factor binding protein-3": "IGFBP-3", + "Interleukin-6 precursor": "IL6", + "Interleukin-8 precursor": "IL8", + "Interleukin-10 precursor": "IL10", + "interleukin-12 precursor": "IL12", + "Interleukin-18 precursor": "IL18", + "Interleukin-1, beta": "IL1B", + "interleukin-1 receptor antagonist protein precursor": "IL1RA", + "irritable mania": "IM", + "Carotid intimal medial thickness": "IMT", + "insulin": "INS", + "interaction": "int", + "insulin resistance": "IR", + "all ischemic stroke": "IS", + "0-120 min insulin sensitivity index": "ISI_0-120", + "Kawasaki disease": "KD", + "linoleic acid": "LA", + "large artery atherosclerosis": "LAA", + "left atrial diameter": "LAD", + "lung cancer": "LC", + "low density lipoprotein": "LDL", + "Total cholesterol in LDL": "LDL-C", + "ratio of low frequency to high frequency power": "LF/HF", + "The free cholesterol content of large LDL": "L-LDL-FC", + "Total lipids in large HDL": "L-HDL-L", + "lipoprotein (a)": "Lp(a)", + "lumbar spine": "LS", + "lamotrigine-induced hypersensitivity": "LTG", + "leukocyte telomere length": "LTL", + "Left ventricular ejection fraction": "LVEF", + "large-vessel disease": "LVD", + "left ventricular diastolic diameter": "LVDD", + "left ventricular fractional shortening": "LVFS", + "left ventricular mass": "LVM", + "left ventricular mass index": "LVMI", + "left ventricular systolic dimension": "LVSD", + "Lymphoma subtypes": "LYM", + "from clamp": "M", + "male athletes": "MA", + "mean arterial pressure": "MAP", + "mean arterial pressure, long-term average": "MAPLTA", + "maximum L* (reflectance)": "maxL*", + "mother’s criticism": "MC", + "mean corpuscular hemoglobin": "MCH", + "mean corpuscular hemoglobin concentration": "MCHC", + "mild cognitive impairment": "MCI", + "Mental Component Summary": "MCS", + "mean corpuscular volume": "MCV", + "monocyte chemoattractant protein-1": "MCP1", + "Mild disease course": "MDC", + "mean forced vital capacity from 2 exams": "meanFVC", + "mean FEV1/FVC from 2 exams": "meanratio", + "Methamphetamine": "METH", + "2-(N-acetyl-L-cystein-S-yl)-1-hydroxybut-3-ene and 1-(N-acetyl-L-cystein-S-yl)-1-hydroxybut-3-ene": "MHBMA", + "Total lipids in medium HDL": "M-HDL-L", + "3-methoxy-4-hydroxyphenlglycol": "MHPG", + "myocardial infarction": "MI", + "macrophage inflammatory protein beta": "MIP-1b", + "Total cholesterol in medium LDL": "M-LDL-C", + "Phospholipids in medium LDL": "M-LDL-PL", + "male long endurance athletes": "MLE", + "double-bond protons of mobile lipids": "MobCH", + "mismatch negativity (300-710 ms)": "MMnb", + "measles, mumps and rubella vaccination": "MMR", + "Mini-mental state examination": "MMSE", + "middle and short endurance athletes": "MSE", + "Multiple Sclerosis Severity Scale": "MSSS", + "Multi-Trait Analysis of GWAS": "MTAG", + "Phospholipids in medium VLDL": "M-VLDL-PL", + "mother’s warmth": "MW", + "not applicable": "NA", + "non-albumin protein": "NAP", + "Boston Naming Test": "Nam", + "neurocognitive impairment": "NCI", + "Neck section modulus": "NeckZ1", + "neck section modulus in females": "NeckZ1rf", + "neck width in females": "NeckW1rf", + "neck section modulus in males": "NeckZ1rm", + "fasting serum nonesterified fatty acids": "NEFA", + "neurofibrillary tangles": "NFT", + "Non-Hodgkin’s Lymphoma": "NHL", + "neck length": "NL", + "nasopharyngeal carcinoma": "NPC", + "normal-pressure glaucoma": "NPG", + "not reported": "NR", + "none significant": "NS", + "neck shaft angle": "NSA", + "neck-shaft angle in males": "NSAm", + "nonsyndromic cleft lip with or without cleft palate": "NSCL/P", + "neck width": "NW", + "Non Verbal": "Nvrb", + "Childhood Obsessive-Compulsive Personality Disorder": "OCPD", + "odds ratio": "OR", + "particle concentration": "P", + "post exercise 3 minute recovery systolic blood pressure": "P3MRSBP", + "peripheral artery disease": "PAD", + "plasminogen activator inhibitor": "PAI-1", + "paired associates learning": "PAL", + "paragraph delayed recall": "PAR-dr", + "Protein C": "PC", + "principal component axis 1, CANTAB measures": "PC1", + "principal component analysis 2": "PC2", + "principal component analysis 3": "PC3", + "Phosphatidylcholine diacyl C36:3": "PC aa C36:3", + "Phosphatidylcholine diacyl C34:4": "PC aa C36:4", + "Physical Component Summary": "PCS", + "periodontal complex trait": "PCT", + "packed cell volume": "PCV", + "Parkinson’s disease": "PD", + "Porphyromonas gingivalis": "P gingi", + "Phenylalanine": "Phe", + "phenytoin-induced hypersensitivity": "PHT", + "pack-years": "PKYRS", + "phospholipid": "PL", + "platelets": "PLT", + "platelet aggregation (ADP-induced)": "pltadp", + "platelet aggregation (collagen-induced)": "pltcoll", + "pulse pressure": "PP", + "percent predicted FEF25-75 for latest exam": "ppfef", + "percent predicted FEF25-75/FVC for latest exam": "ppfefrat", + "percent predicted FVC for latest exam": "ppfvc", + "percent predicted FEV1 for latest exam": "ppfev1", + "percent predicted FEV1/FVC/FEF": "ppFEV1/FEC/FEE", + "percent predicted FEV1/FVC for latest exam": "ppratio", + "pattern recognition memory": "PRM", + "propylthiouracil solution": "PROP", + "protein S": "PS", + "primary sclerosing cholangitis": "PSC", + "prothrombin time": "PT", + "polyunsaturated fatty acids": "PUFA", + "peak-valley respiratory sinus arrhythmia or high frequency power": "pvRSA/HF", + "quality control": "QC", + "fasting serum quantitative insulin sensitivity check index": "QUICKI", + "Rheumatoid arthritis": "RA", + "risk allele frequency": "RAF", + "fasting serum regulated upon activation, normal T-cell expressed and secreted": "RANTES", + "Rey’s Auditory Verbal Learning Test delayed recall (belongs to WL-dr category)": "RAVLT-dr", + "red blood cell": "RBC", + "red blood cell count": "RBCC", + "red cell distribution width": "RDW", + "root mean square of the successive differences of inter beat intervals": "RMSSD", + "maximum respiratory quotient during treadmill fitness test": "RQmax", + "rapid visual processing": "RVP", + "reflected wave amplitude": "RW", + "reflected wave amplitude, long-term average": "RWLTA", + "Stage 2 exercise heart rate": "S2EHR", + "stage 2 exercise systolic blood pressure": "S2ESBP", + "subset-based meta-analysis approach": "SBM", + "standard deviation of the normal-to-normal inter beat intervals": "SDNN", + "serum total triglyceride content": "serum TG", + "Simpson-Angus Scale": "SAS", + "systolic blood pressure": "SBP", + "systolic blood pressure, long-term average": "SBPLTA", + "serum creatinine": "sCR", + "Schizophrenia and Bipolar disorder": "SCZ and BD", + "standard deviation": "s.d.", + "sleep efficiency": "SE", + "Glucose effectiveness": "SG", + "Shaft width combined": "ShaftW1", + "shaft width in females": "ShaftW1f", + "shaft section modulus in females": "ShaftZ1rf", + "shaft section modulus": "ShaftZ1R", + "sex hormone binding globulin": "SHBG", + "SI from FSIGT": "SI", + "fasting serum soluble intercellular adhesion molecule-1": "sICAM-1", + "soluble interleukin": "sIL-6R", + "Similarities": "Sim", + "respiratory quotient during sleep": "Sleep RQ", + "systemic lupus erythematosus": "SLE", + "butyrylcarnitine / propionylcarnitine": "SM-1", + "N-acetylornithine": "SM-2", + "1-arachidonoylglycero phosphoethanolamine / 1-linoleoylglycerophospho-ethanolamine": "SM-3", + "bilirubin (E,E) / oleoylcarnitine": "SM-4", + "hexanoylcarnitine / oleate (18:1n9)": "SM-5", + "myristate (14:0) / myristoleate (14:1n5)": "SM-6", + "1-methylxanthine / 4-acetamidobutanoate": "SM-7", + "ADpSGEGDFXAEGGGVR / ADSGEGDFXAEGGGVR": "SM-11", + "10-nonadecenoate (19:1n9) / 10-undecenoate (11:1n1)": "SM-9", + "eicosenoate (20:1n9 or 11) / tetradecanedioate": "SM-10", + "ADSGEGDFXAEGGGVR / DSGEGDFXAEGGGVR": "SM-12", + "androsterone sulfate / epiandrosterone sulfate": "SM-13", + "ADpSGEGDFXAEGGGVR / DSGEGDFXAEGGGVR": "SM-14", + "1-eicosatrienoylglycero-phosphocholine / 1-linoleoylglycero phosphocholine": "SM-15", + "docosahexaenoate (DHA; 22:6n3) / eicosapentaenoate (EPA; 20:5n3)": "SM-16", + "3-(4-hydroxyphenyl)lactate / isovalerylcarnitine": "SM-17", + "age of initiation (years)": "SMKAGE", + "duration (years)": "SMKDU", + "sphingomyelin": "SM", + "spectrum": "Spc", + "surfactant protein D": "SP-D", + "processing speed": "SPEED", + "spatial recognition memory": "SRM", + "spatial span": "SSP", + "selective serotonin reuptake inhibitor": "SSRI", + "Soluble Transferrin Receptor": "sTfR", + "soluble receptor Tie-2": "sTie-2", + "strict": "Str", + "small-vessel disease": "SVD", + "spatial working memory": "SWM", + "Tetra-antennary glycans": "TA", + "Total adipose tissue area": "TAT", + "total-body less head bone mineral density": "TBLH-BMD", + "total-body lean mass": "TB-LM", + "total cholesterol": "TC", + "24-h total energy expenditure": "TEE", + "28 year time averaged fasting plasma glucose (FPG)": "tFPG", + "triglycerides": "TG", + "transforming growth factor": "TGF-b1", + "fasting serum triglycerides/high density lipoprotein cholesterol": "TG/HDLC", + "Type 1 diabetes diabetic nephropathy": "TIDN", + "Total Protein S": "Total PS", + "fasting serum triiodothyronine": "Total T3", + "fasting serum thyroxine": "Total T4", + "total protein": "TP", + "tissue plasminogen activator": "tPA", + "tumor necrosis factor alpha": "TNFA", + "Trochanter bone mineral density": "TRBMD", + "Trochanter bone mineral density males": "TRBMDm", + "thyroid stimulating hormone": "TSH", + "Tyrosine": "Tyr", + "urinary albumin excretion": "UAE", + "Valine": "Val", + "volumetric bone mineral density": "vBMD", + "Vitamin D plasma 25(OH)-D": "VitD250H", + "Vitamin K plasma phylloquinone": "VitkPhylloq", + "very-low-density lipoprotein": "VLDL", + "Mean diameter for VLDL particles": "VLDL-D", + "maximum oxygen consumption during treadmill fitness test": "VO2max", + "velocity of sound": "VOS", + "delayed recall for visually presented word list": "VPWL-dr", + "verbal": "Vrb", + "verbal recall": "VRM", + "Willebrand factor": "vWF", + "white blood cell": "WBC", + "waist circumference": "WC", + "WC adjustment for BMI": "WCadjBMI", + "weight fluctuation": "WF", + "Women’s Genome Health Study": "WGHS", + "waist hip ratio": "WHR", + "WHR adjustment for BMI": "WHRadjBMI", + "word interference test": "WIT", + "word list delayed recall": "WL-dr", + "Wide-Range Achievement Test": "WRAT", + "The cholesterol ester content of extra large HD": "XL-HDL-CE", + "Triglycerides in very large HDL": "XL-HDL-TG", + "extremely large VLDL particles": "XXL-VLDL-P", + "(Chitinase 3-like 1) protein levels": "YKL-40" +} diff --git a/src/otg/assets/data/gwas_population_2_LD_panel_map.json b/src/otg/assets/data/gwas_population_2_LD_panel_map.json new file mode 100644 index 000000000..52cee5140 --- /dev/null +++ b/src/otg/assets/data/gwas_population_2_LD_panel_map.json @@ -0,0 +1,20 @@ +{ + "European": "nfe", + "African American or Afro-Caribbean": "afr", + "Native American": "amr", + "Asian unspecified": "eas", + "Hispanic or Latin American": "amr", + "East Asian": "eas", + "Central Asian": "seu", + "Oceanian": "eas", + "South East Asian": "eas", + "Other admixed ancestry": "nfe", + "African unspecified": "afr", + "Sub-Saharan African": "afr", + "Greater Middle Eastern (Middle Eastern, North African or Persian)": "seu", + "Aboriginal Australian": "eas", + "Other": "nfe", + "South Asian": "eas", + "NR": "nfe", + "Finnish": "fin" +} diff --git a/src/otg/dataset/schemas/__init__.py b/src/otg/assets/schemas/__init__.py similarity index 100% rename from src/otg/dataset/schemas/__init__.py rename to src/otg/assets/schemas/__init__.py diff --git a/src/otg/dataset/schemas/andersson2014.json b/src/otg/assets/schemas/andersson2014.json similarity index 100% rename from src/otg/dataset/schemas/andersson2014.json rename to src/otg/assets/schemas/andersson2014.json diff --git a/src/otg/dataset/schemas/colocalisation.json b/src/otg/assets/schemas/colocalisation.json similarity index 77% rename from src/otg/dataset/schemas/colocalisation.json rename to src/otg/assets/schemas/colocalisation.json index 9ed42ab86..7ff7453b9 100644 --- a/src/otg/dataset/schemas/colocalisation.json +++ b/src/otg/assets/schemas/colocalisation.json @@ -2,15 +2,15 @@ "type": "struct", "fields": [ { - "name": "left_studyLocusId", + "name": "leftStudyLocusId", "nullable": false, - "type": "string", + "type": "long", "metadata": {} }, { - "name": "right_studyLocusId", + "name": "rightStudyLocusId", "nullable": false, - "type": "string", + "type": "long", "metadata": {} }, { @@ -26,43 +26,43 @@ "metadata": {} }, { - "name": "coloc_n_vars", + "name": "numberColocalisingVariants", "type": "long", "nullable": false, "metadata": {} }, { - "name": "coloc_h0", + "name": "h0", "type": "double", "nullable": true, "metadata": {} }, { - "name": "coloc_h1", + "name": "h1", "type": "double", "nullable": true, "metadata": {} }, { - "name": "coloc_h2", + "name": "h2", "type": "double", "nullable": true, "metadata": {} }, { - "name": "coloc_h3", + "name": "h3", "type": "double", "nullable": true, "metadata": {} }, { - "name": "coloc_h4", + "name": "h4", "type": "double", "nullable": true, "metadata": {} }, { - "name": "coloc_log2_h4_h3", + "name": "log2h4h3", "type": "double", "nullable": true, "metadata": {} diff --git a/src/otg/dataset/schemas/targets.json b/src/otg/assets/schemas/gene_index.json similarity index 80% rename from src/otg/dataset/schemas/targets.json rename to src/otg/assets/schemas/gene_index.json index d0710d39f..cd901a995 100644 --- a/src/otg/dataset/schemas/targets.json +++ b/src/otg/assets/schemas/gene_index.json @@ -62,6 +62,24 @@ "type": "long", "nullable": true, "metadata": {} + }, + { + "metadata": {}, + "name": "start", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "end", + "nullable": true, + "type": "long" + }, + { + "metadata": {}, + "name": "strand", + "nullable": true, + "type": "integer" } ] } diff --git a/src/otg/dataset/schemas/intervals.json b/src/otg/assets/schemas/intervals.json similarity index 100% rename from src/otg/dataset/schemas/intervals.json rename to src/otg/assets/schemas/intervals.json diff --git a/src/otg/dataset/schemas/l2g_feature.json b/src/otg/assets/schemas/l2g_feature.json similarity index 95% rename from src/otg/dataset/schemas/l2g_feature.json rename to src/otg/assets/schemas/l2g_feature.json index a72eed464..f6eb54ab2 100644 --- a/src/otg/dataset/schemas/l2g_feature.json +++ b/src/otg/assets/schemas/l2g_feature.json @@ -3,7 +3,7 @@ "fields": [ { "name": "studyLocusId", - "type": "string", + "type": "long", "nullable": false, "metadata": {} }, diff --git a/src/otg/dataset/schemas/l2g_feature_matrix.json b/src/otg/assets/schemas/l2g_feature_matrix.json similarity index 94% rename from src/otg/dataset/schemas/l2g_feature_matrix.json rename to src/otg/assets/schemas/l2g_feature_matrix.json index c104ec876..c8900345b 100644 --- a/src/otg/dataset/schemas/l2g_feature_matrix.json +++ b/src/otg/assets/schemas/l2g_feature_matrix.json @@ -12,6 +12,12 @@ "nullable": false, "type": "string" }, + { + "metadata": {}, + "name": "gold_standard_set", + "nullable": true, + "type": "string" + }, { "metadata": {}, "name": "dist_tss_ave", diff --git a/src/otg/dataset/schemas/l2g_gold_standard.json b/src/otg/assets/schemas/l2g_gold_standard.json similarity index 84% rename from src/otg/dataset/schemas/l2g_gold_standard.json rename to src/otg/assets/schemas/l2g_gold_standard.json index e264c017f..d7a8d3199 100644 --- a/src/otg/dataset/schemas/l2g_gold_standard.json +++ b/src/otg/assets/schemas/l2g_gold_standard.json @@ -3,7 +3,7 @@ "fields": [ { "name": "studyLocusId", - "type": "string", + "type": "long", "nullable": false, "metadata": {} }, @@ -14,8 +14,8 @@ "metadata": {} }, { - "name": "label", - "type": "integer", + "name": "gold_standard_set", + "type": "string", "nullable": false, "metadata": {} } diff --git a/src/otg/dataset/schemas/l2g_predictions.json b/src/otg/assets/schemas/l2g_predictions.json similarity index 93% rename from src/otg/dataset/schemas/l2g_predictions.json rename to src/otg/assets/schemas/l2g_predictions.json index bffd6d7ac..7fbd6615a 100644 --- a/src/otg/dataset/schemas/l2g_predictions.json +++ b/src/otg/assets/schemas/l2g_predictions.json @@ -3,7 +3,7 @@ "fields": [ { "name": "studyLocusId", - "type": "string", + "type": "long", "nullable": false, "metadata": {} }, diff --git a/src/otg/assets/schemas/ld_index.json b/src/otg/assets/schemas/ld_index.json new file mode 100644 index 000000000..76582de19 --- /dev/null +++ b/src/otg/assets/schemas/ld_index.json @@ -0,0 +1,63 @@ +{ + "fields": [ + { + "metadata": {}, + "name": "variantId", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "chromosome", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "ldSet", + "nullable": false, + "type": { + "containsNull": false, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "tagVariantId", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "rValues", + "nullable": false, + "type": { + "containsNull": false, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "population", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "r", + "nullable": false, + "type": "double" + } + ], + "type": "struct" + }, + "type": "array" + } + } + ], + "type": "struct" + }, + "type": "array" + } + } + ], + "type": "struct" +} diff --git a/src/otg/dataset/schemas/studies.json b/src/otg/assets/schemas/study_index.json similarity index 84% rename from src/otg/dataset/schemas/studies.json rename to src/otg/assets/schemas/study_index.json index 26a808f79..88ed480a8 100644 --- a/src/otg/dataset/schemas/studies.json +++ b/src/otg/assets/schemas/study_index.json @@ -105,6 +105,32 @@ "nullable": true, "metadata": {} }, + { + "name": "ldPopulationStructure", + "type": { + "type": "array", + "elementType": { + "type": "struct", + "fields": [ + { + "name": "ldPopulation", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "relativeSampleSize", + "type": "double", + "nullable": true, + "metadata": {} + } + ] + }, + "containsNull": false + }, + "nullable": true, + "metadata": {} + }, { "name": "discoverySamples", "type": { @@ -114,7 +140,7 @@ "fields": [ { "name": "sampleSize", - "type": "string", + "type": "long", "nullable": true, "metadata": {} }, @@ -140,7 +166,7 @@ "fields": [ { "name": "sampleSize", - "type": "string", + "type": "long", "nullable": true, "metadata": {} }, diff --git a/src/otg/dataset/schemas/study_locus.json b/src/otg/assets/schemas/study_locus.json similarity index 71% rename from src/otg/dataset/schemas/study_locus.json rename to src/otg/assets/schemas/study_locus.json index 447d98422..a67b58b8a 100644 --- a/src/otg/dataset/schemas/study_locus.json +++ b/src/otg/assets/schemas/study_locus.json @@ -4,7 +4,7 @@ "metadata": {}, "name": "studyLocusId", "nullable": false, - "type": "string" + "type": "long" }, { "metadata": {}, @@ -70,13 +70,25 @@ "metadata": {}, "name": "pValueMantissa", "nullable": true, - "type": "double" + "type": "float" }, { "metadata": {}, "name": "pValueExponent", "nullable": true, - "type": "long" + "type": "integer" + }, + { + "metadata": {}, + "name": "effectAlleleFrequencyFromSource", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "standardError", + "nullable": true, + "type": "double" }, { "metadata": {}, @@ -89,7 +101,7 @@ "type": { "type": "array", "elementType": "string", - "containsNull": true + "containsNull": false }, "nullable": true, "metadata": {} @@ -102,7 +114,33 @@ }, { "metadata": {}, - "name": "credibleSet", + "name": "ldSet", + "nullable": true, + "type": { + "containsNull": true, + "elementType": { + "fields": [ + { + "metadata": {}, + "name": "tagVariantId", + "nullable": true, + "type": "string" + }, + { + "metadata": {}, + "name": "r2Overall", + "nullable": true, + "type": "double" + } + ], + "type": "struct" + }, + "type": "array" + } + }, + { + "metadata": {}, + "name": "locus", "nullable": true, "type": { "containsNull": true, @@ -134,43 +172,55 @@ }, { "metadata": {}, - "name": "tagVariantId", + "name": "variantId", "nullable": true, "type": "string" }, { "metadata": {}, - "name": "tagPValue", + "name": "pValueMantissa", "nullable": true, - "type": "double" + "type": "float" }, { "metadata": {}, - "name": "tagPValueConditioned", + "name": "pValueExponent", "nullable": true, - "type": "double" + "type": "integer" + }, + { + "metadata": {}, + "name": "pValueMantissaConditioned", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "pValueExponentConditioned", + "nullable": true, + "type": "integer" }, { "metadata": {}, - "name": "tagBeta", + "name": "beta", "nullable": true, "type": "double" }, { "metadata": {}, - "name": "tagStandardError", + "name": "standardError", "nullable": true, "type": "double" }, { "metadata": {}, - "name": "tagBetaConditioned", + "name": "betaConditioned", "nullable": true, "type": "double" }, { "metadata": {}, - "name": "tagStandardErrorConditioned", + "name": "standardErrorConditioned", "nullable": true, "type": "double" }, diff --git a/src/otg/assets/schemas/study_locus_overlap.json b/src/otg/assets/schemas/study_locus_overlap.json new file mode 100644 index 000000000..962a1186d --- /dev/null +++ b/src/otg/assets/schemas/study_locus_overlap.json @@ -0,0 +1,99 @@ +{ + "fields": [ + { + "metadata": {}, + "name": "leftStudyLocusId", + "nullable": false, + "type": "long" + }, + { + "metadata": {}, + "name": "rightStudyLocusId", + "nullable": false, + "type": "long" + }, + { + "metadata": {}, + "name": "chromosome", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "tagVariantId", + "nullable": false, + "type": "string" + }, + { + "metadata": {}, + "name": "statistics", + "nullable": false, + "type": { + "fields": [ + { + "metadata": {}, + "name": "left_pValueMantissa", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "left_pValueExponent", + "nullable": true, + "type": "integer" + }, + { + "metadata": {}, + "name": "right_pValueMantissa", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "right_pValueExponent", + "nullable": true, + "type": "integer" + }, + { + "metadata": {}, + "name": "left_beta", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "right_beta", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "left_logABF", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "right_logABF", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "left_posteriorProbability", + "nullable": true, + "type": "double" + }, + { + "metadata": {}, + "name": "right_posteriorProbability", + "nullable": true, + "type": "double" + } + ], + "type": "struct" + } + } + ], + "type": "struct" +} diff --git a/src/otg/dataset/schemas/study_locus_overlap.json b/src/otg/assets/schemas/summary_statistics.json similarity index 53% rename from src/otg/dataset/schemas/study_locus_overlap.json rename to src/otg/assets/schemas/summary_statistics.json index 84ec98939..4b2f47ea6 100644 --- a/src/otg/dataset/schemas/study_locus_overlap.json +++ b/src/otg/assets/schemas/summary_statistics.json @@ -2,13 +2,13 @@ "fields": [ { "metadata": {}, - "name": "left_studyLocusId", + "name": "studyId", "nullable": false, "type": "string" }, { "metadata": {}, - "name": "right_studyLocusId", + "name": "variantId", "nullable": false, "type": "string" }, @@ -20,31 +20,49 @@ }, { "metadata": {}, - "name": "tagVariantId", + "name": "position", "nullable": false, - "type": "string" + "type": "integer" }, { "metadata": {}, - "name": "right_logABF", - "nullable": true, + "name": "beta", + "nullable": false, "type": "double" }, { "metadata": {}, - "name": "left_logABF", + "name": "betaConfidenceIntervalLower", "nullable": true, "type": "double" }, { "metadata": {}, - "name": "right_posteriorProbability", + "name": "betaConfidenceIntervalUpper", "nullable": true, "type": "double" }, { "metadata": {}, - "name": "left_posteriorProbability", + "name": "pValueMantissa", + "nullable": false, + "type": "float" + }, + { + "metadata": {}, + "name": "pValueExponent", + "nullable": false, + "type": "integer" + }, + { + "metadata": {}, + "name": "effectAlleleFrequencyFromSource", + "nullable": true, + "type": "float" + }, + { + "metadata": {}, + "name": "standardError", "nullable": true, "type": "double" } diff --git a/src/otg/dataset/schemas/v2g.json b/src/otg/assets/schemas/v2g.json similarity index 100% rename from src/otg/dataset/schemas/v2g.json rename to src/otg/assets/schemas/v2g.json diff --git a/src/otg/assets/schemas/variant_annotation.json b/src/otg/assets/schemas/variant_annotation.json new file mode 100644 index 000000000..a5e914d68 --- /dev/null +++ b/src/otg/assets/schemas/variant_annotation.json @@ -0,0 +1,199 @@ +{ + "type": "struct", + "fields": [ + { + "name": "variantId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "chromosome", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "position", + "type": "integer", + "nullable": false, + "metadata": {} + }, + { + "name": "gnomad3VariantId", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "referenceAllele", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "alternateAllele", + "type": "string", + "nullable": false, + "metadata": {} + }, + { + "name": "chromosomeB37", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "positionB37", + "type": "integer", + "nullable": true, + "metadata": {} + }, + { + "name": "alleleType", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "rsIds", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "alleleFrequencies", + "type": { + "type": "array", + "elementType": { + "type": "struct", + "fields": [ + { + "name": "populationName", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "alleleFrequency", + "type": "double", + "nullable": true, + "metadata": {} + } + ] + }, + "containsNull": true + }, + "nullable": false, + "metadata": {} + }, + { + "name": "cadd", + "type": { + "type": "struct", + "fields": [ + { + "name": "phred", + "type": "float", + "nullable": true, + "metadata": {} + }, + { + "name": "raw", + "type": "float", + "nullable": true, + "metadata": {} + } + ] + }, + "nullable": true, + "metadata": {} + }, + { + "name": "vep", + "type": { + "type": "struct", + "fields": [ + { + "name": "mostSevereConsequence", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "transcriptConsequences", + "type": { + "type": "array", + "elementType": { + "type": "struct", + "fields": [ + { + "name": "aminoAcids", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "consequenceTerms", + "type": { + "type": "array", + "elementType": "string", + "containsNull": true + }, + "nullable": true, + "metadata": {} + }, + { + "name": "geneId", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "lof", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "polyphenScore", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "polyphenPrediction", + "type": "string", + "nullable": true, + "metadata": {} + }, + { + "name": "siftScore", + "type": "double", + "nullable": true, + "metadata": {} + }, + { + "name": "siftPrediction", + "type": "string", + "nullable": true, + "metadata": {} + } + ] + }, + "containsNull": true + }, + "nullable": true, + "metadata": {} + } + ] + }, + "nullable": false, + "metadata": {} + } + ] +} diff --git a/src/otg/dataset/schemas/variant_index.json b/src/otg/assets/schemas/variant_index.json similarity index 91% rename from src/otg/dataset/schemas/variant_index.json rename to src/otg/assets/schemas/variant_index.json index 939a44b4a..e4f41caa7 100644 --- a/src/otg/dataset/schemas/variant_index.json +++ b/src/otg/assets/schemas/variant_index.json @@ -57,14 +57,14 @@ "type": "struct", "fields": [ { - "name": "alleleFrequency", - "type": "double", + "name": "populationName", + "type": "string", "nullable": true, "metadata": {} }, { - "name": "populationName", - "type": "string", + "name": "alleleFrequency", + "type": "double", "nullable": true, "metadata": {} } @@ -72,7 +72,7 @@ }, "containsNull": true }, - "nullable": true, + "nullable": false, "metadata": {} }, { @@ -103,16 +103,6 @@ "nullable": true, "metadata": {} }, - { - "name": "filters", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, { "name": "rsIds", "type": { diff --git a/src/cli.py b/src/otg/cli.py similarity index 83% rename from src/cli.py rename to src/otg/cli.py index dbd5525a5..7c6139b95 100644 --- a/src/cli.py +++ b/src/otg/cli.py @@ -10,8 +10,8 @@ register_configs() -@hydra.main(version_base=None, config_name="config") -def run_step(cfg: Config) -> None: +@hydra.main(version_base="1.1", config_path=None, config_name="config") +def main(cfg: Config) -> None: """OTG ETL CLI. Args: @@ -28,4 +28,4 @@ def run_step(cfg: Config) -> None: if __name__ == "__main__": - run_step() + main() diff --git a/src/otg/colocalisation.py b/src/otg/colocalisation.py index aa4fa869d..c5a35c717 100644 --- a/src/otg/colocalisation.py +++ b/src/otg/colocalisation.py @@ -2,17 +2,13 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING - -from pyspark.sql import SparkSession +from otg.common.session import Session from otg.config import ColocalisationStepConfig +from otg.dataset.study_index import StudyIndex from otg.dataset.study_locus import CredibleInterval, StudyLocus from otg.method.colocalisation import Coloc, ECaviar -if TYPE_CHECKING: - from otg.common.session import Session - @dataclass class ColocalisationStep(ColocalisationStepConfig): @@ -21,21 +17,22 @@ class ColocalisationStep(ColocalisationStepConfig): This workflow runs colocalization analyses that assess the degree to which independent signals of the association share the same causal variant in a region of the genome, typically limited by linkage disequilibrium (LD). """ - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() def run(self: ColocalisationStep) -> None: """Run colocalisation step.""" # Study-locus information sl = StudyLocus.from_parquet(self.session, self.study_locus_path) + si = StudyIndex.from_parquet(self.session, self.study_index_path) # Study-locus overlaps for 95% credible sets - sl_overlaps = sl.credible_set(CredibleInterval.IS95).overlaps() + sl_overlaps = sl.credible_set(CredibleInterval.IS95).overlaps(si) coloc_results = Coloc.colocalise( sl_overlaps, self.priorc1, self.priorc2, self.priorc12 ) ecaviar_results = ECaviar.colocalise(sl_overlaps) - coloc_results.unionByName(ecaviar_results, allowMissingColumns=True) + coloc_results.df.unionByName(ecaviar_results.df, allowMissingColumns=True) - coloc_results.write.mode(self.session.write_mode).parquet(self.coloc_path) + coloc_results.df.write.mode(self.session.write_mode).parquet(self.coloc_path) diff --git a/src/otg/common/schemas.py b/src/otg/common/schemas.py index 0fa79dfa3..c45d8b42c 100644 --- a/src/otg/common/schemas.py +++ b/src/otg/common/schemas.py @@ -3,13 +3,14 @@ import importlib.resources as pkg_resources import json +from collections import namedtuple -import pyspark.sql.types as t +from pyspark.sql.types import ArrayType, StructType -from otg.dataset import schemas +from otg.assets import schemas -def parse_spark_schema(schema_json: str) -> t.StructType: +def parse_spark_schema(schema_json: str) -> StructType: """Parse Spark schema from JSON. Args: @@ -21,4 +22,42 @@ def parse_spark_schema(schema_json: str) -> t.StructType: core_schema = json.loads( pkg_resources.read_text(schemas, schema_json, encoding="utf-8") ) - return t.StructType.fromJson(core_schema) + return StructType.fromJson(core_schema) + + +def flatten_schema(schema: StructType, prefix: str = "") -> list: + """It takes a Spark schema and returns a list of all fields in the schema once flattened. + + Args: + schema: The schema of the dataframe + prefix: The prefix to prepend to the field names. + + Returns: + list: A list of all the columns in the dataframe. + + Examples: + >>> from pyspark.sql.types import ArrayType, StringType, StructField, StructType + >>> schema = StructType( + ... [ + ... StructField("studyLocusId", StringType(), False), + ... StructField("locus", ArrayType(StructType([StructField("variantId", StringType(), False)])), False) + ... ] + ... ) + >>> df = spark.createDataFrame([("A", [{"variantId": "varA"}]), ("B", [{"variantId": "varB"}])], schema) + >>> flatten_schema(df.schema) + [Field(name='studyLocusId', dataType=StringType()), Field(name='locus', dataType=ArrayType(StructType([]), True)), Field(name='locus.variantId', dataType=StringType())] + """ + Field = namedtuple("Field", ["name", "dataType"]) + fields = [] + for field in schema.fields: + name = f"{prefix}.{field.name}" if prefix else field.name + dtype = field.dataType + if isinstance(dtype, StructType): + fields.append(Field(name, ArrayType(StructType()))) + fields += flatten_schema(dtype, prefix=name) + elif isinstance(dtype, ArrayType) and isinstance(dtype.elementType, StructType): + fields.append(Field(name, ArrayType(StructType()))) + fields += flatten_schema(dtype.elementType, prefix=name) + else: + fields.append(Field(name, dtype)) + return fields diff --git a/src/otg/common/session.py b/src/otg/common/session.py index 92bb62607..c2ba59a6c 100644 --- a/src/otg/common/session.py +++ b/src/otg/common/session.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Dict from pyspark.conf import SparkConf from pyspark.sql import SparkSession @@ -15,14 +15,12 @@ class Session: """Spark session class.""" - spark_config = SparkConf() - def __init__( self: Session, spark_uri: str = "local[*]", write_mode: str = "errorifexists", app_name: str = "otgenetics", - spark_config: SparkConf = spark_config, + hail_home: str | None = None, ) -> None: """Initialises spark session and logger. @@ -30,9 +28,39 @@ def __init__( spark_uri (str): spark uri app_name (str): spark application name write_mode (str): spark write mode - spark_config (SparkConf): spark configuration. Defaults to spark_config. + hail_home (str | None): path to hail installation """ - # create session and retrieve Spark logger object + # create executors based on resources + default_spark_conf = ( + SparkConf() + # Dynamic allocation + .set("spark.dynamicAllocation.enabled", "true") + .set("spark.dynamicAllocation.minExecutors", "2") + .set("spark.dynamicAllocation.initialExecutors", "2") + .set( + "spark.shuffle.service.enabled", "true" + ) # required for dynamic allocation + ) + spark_config = ( + ( + default_spark_conf.set( + "spark.jars", + f"{hail_home}/backend/hail-all-spark.jar", + ) + .set( + "spark.driver.extraClassPath", + f"{hail_home}/backend/hail-all-spark.jar", + ) + .set("spark.executor.extraClassPath", "./hail-all-spark.jar") + .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") + .set("spark.kryo.registrator", "is.hail.kryo.HailKryoRegistrator") + .set("spark.sql.files.openCostInBytes", "50gb") + .set("spark.sql.files.maxPartitionBytes", "50gb") + # .set("spark.kryoserializer.buffer", "512m") + ) + if hail_home is not None + else default_spark_conf + ) self.spark = ( SparkSession.builder.config(conf=spark_config) .master(spark_uri) @@ -42,17 +70,20 @@ def __init__( self.logger = Log4j(self.spark) self.write_mode = write_mode - def read_parquet(self: Session, path: str, schema: StructType) -> DataFrame: + def read_parquet( + self: Session, path: str, schema: StructType, **kwargs: Dict[str, Any] + ) -> DataFrame: """Reads parquet dataset with a provided schema. Args: path (str): parquet dataset path schema (StructType): Spark schema + **kwargs: Additional arguments to pass to spark.read.parquet Returns: DataFrame: Dataframe with provided schema """ - return self.spark.read.schema(schema).format("parquet").load(path) + return self.spark.read.schema(schema).parquet(path, **kwargs, inferSchema=False) # type: ignore class Log4j: diff --git a/src/otg/common/spark_helpers.py b/src/otg/common/spark_helpers.py index 3aaace440..56386e780 100644 --- a/src/otg/common/spark_helpers.py +++ b/src/otg/common/spark_helpers.py @@ -2,13 +2,16 @@ from __future__ import annotations import re +import sys from typing import TYPE_CHECKING, Iterable, Optional import pyspark.sql.functions as f +import pyspark.sql.types as t from pyspark.ml import Pipeline from pyspark.ml.feature import MinMaxScaler, VectorAssembler from pyspark.ml.functions import vector_to_array from pyspark.sql import Window +from scipy.stats import norm if TYPE_CHECKING: from pyspark.sql import Column, DataFrame, WindowSpec @@ -89,6 +92,42 @@ def _convert_from_long_to_wide( return df.groupBy(id_vars).pivot(var_name).agg(f.first(value_name)) +def pvalue_to_zscore(pval_col: Column) -> Column: + """Convert p-value column to z-score column. + + Args: + pval_col (Column): pvalues to be casted to floats. + + Returns: + Column: p-values transformed to z-scores + + Examples: + >>> d = [{"id": "t1", "pval": "1"}, {"id": "t2", "pval": "0.9"}, {"id": "t3", "pval": "0.05"}, {"id": "t4", "pval": "1e-300"}, {"id": "t5", "pval": "1e-1000"}, {"id": "t6", "pval": "NA"}] + >>> df = spark.createDataFrame(d) + >>> df.withColumn("zscore", pvalue_to_zscore(f.col("pval"))).show() + +---+-------+----------+ + | id| pval| zscore| + +---+-------+----------+ + | t1| 1| 0.0| + | t2| 0.9|0.12566137| + | t3| 0.05| 1.959964| + | t4| 1e-300| 37.537838| + | t5|1e-1000| 37.537838| + | t6| NA| null| + +---+-------+----------+ + + + """ + pvalue_float = pval_col.cast(t.FloatType()) + pvalue_nozero = f.when(pvalue_float == 0, sys.float_info.min).otherwise( + pvalue_float + ) + return f.udf( + lambda pv: float(abs(norm.ppf((float(pv)) / 2))) if pv else None, + t.FloatType(), + )(pvalue_nozero) + + def nullify_empty_array(column: Column) -> Column: """Returns null when a Spark Column has an array of size 0, otherwise return the array. @@ -264,3 +303,20 @@ def column2camel_case(col_name: str) -> str: '`hello_world` as helloWorld' """ return f"`{col_name}` as {string2camelcase(col_name)}" + + +def order_array_of_structs_by_field(column_name: str, field_name: str) -> Column: + """Sort a column of array of structs by a field in descending order, nulls last.""" + return f.expr( + f""" + array_sort( + {column_name}, + (left, right) -> case + when left.{field_name} is null then 1 + when right.{field_name} is null then -1 + when left.{field_name} < right.{field_name} then 1 + when left.{field_name} > right.{field_name} then -1 + else 0 + end) + """ + ) diff --git a/src/otg/common/utils.py b/src/otg/common/utils.py index 9c3fac32e..d91cab45d 100644 --- a/src/otg/common/utils.py +++ b/src/otg/common/utils.py @@ -1,21 +1,216 @@ """Common functions in the Genetics datasets.""" from __future__ import annotations -from typing import TYPE_CHECKING +import sys +from math import floor, log10 +from typing import TYPE_CHECKING, List, Tuple -import pyspark.sql.functions as f +import hail as hl +from pyspark.sql import functions as f +from pyspark.sql import types as t + +from otg.common.spark_helpers import pvalue_to_zscore if TYPE_CHECKING: + from hail.table import Table from pyspark.sql import Column +def parse_region(region: str) -> Tuple[str, int, int]: + """Parse region string to chr:start-end. + + Args: + region (str): Genomic region expected to follow chr##:#,###-#,### format or ##:####-#####. + + Raises: + ValueError: If the end and start positions cannot be casted to integer or not all + three values value error is raised. + + Returns: + Tuple[str, int, int]: Chromosome, start position, end position + + + Examples: + >>> parse_region('chr6:28,510,120-33,480,577') + ('6', 28510120, 33480577) + >>> parse_region('6:28510120-33480577') + ('6', 28510120, 33480577) + >>> parse_region('6:28510120') + Traceback (most recent call last): + ... + ValueError: Genomic region should follow a ##:####-#### format. + >>> parse_region('6:28510120-foo') + Traceback (most recent call last): + ... + ValueError: Start and the end position of the region has to be integer. + """ + region = region.replace(":", "-").replace(",", "") + try: + (chromosome, start_position, end_position) = region.split("-") + except ValueError as err: + raise ValueError("Genomic region should follow a ##:####-#### format.") from err + + try: + return (chromosome.replace("chr", ""), int(start_position), int(end_position)) + except ValueError as err: + raise ValueError( + "Start and the end position of the region has to be integer." + ) from err + + +def calculate_confidence_interval( + pvalue_mantissa: Column, + pvalue_exponent: Column, + beta: Column, + standard_error: Column, +) -> tuple: + """Calculate the confidence interval for the effect based on the p-value and the effect size. + + If the standard error already available, don't re-calculate from p-value. + + Args: + pvalue_mantissa (Column): p-value mantissa (float) + pvalue_exponent (Column): p-value exponent (integer) + beta (Column): effect size in beta (float) + standard_error (Column): standard error. + + Returns: + tuple: betaConfidenceIntervalLower (float), betaConfidenceIntervalUpper (float) + + Examples: + >>> df = spark.createDataFrame([ + ... (2.5, -10, 0.5, 0.2), + ... (3.0, -5, 1.0, None), + ... (1.5, -8, -0.2, 0.1) + ... ], ["pvalue_mantissa", "pvalue_exponent", "beta", "standard_error"] + ... ) + >>> df.select("*", *calculate_confidence_interval(f.col("pvalue_mantissa"), f.col("pvalue_exponent"), f.col("beta"), f.col("standard_error"))).show() + +---------------+---------------+----+--------------+---------------------------+---------------------------+ + |pvalue_mantissa|pvalue_exponent|beta|standard_error|betaConfidenceIntervalLower|betaConfidenceIntervalUpper| + +---------------+---------------+----+--------------+---------------------------+---------------------------+ + | 2.5| -10| 0.5| 0.2| 0.3| 0.7| + | 3.0| -5| 1.0| null| 0.7603910153486024| 1.2396089846513976| + | 1.5| -8|-0.2| 0.1| -0.30000000000000004| -0.1| + +---------------+---------------+----+--------------+---------------------------+---------------------------+ + + """ + # Calculate p-value from mantissa and exponent: + pvalue = pvalue_mantissa * f.pow(10, pvalue_exponent) + + # Fix p-value underflow: + pvalue = f.when(pvalue == 0, sys.float_info.min).otherwise(pvalue) + + # Compute missing standard error: + standard_error = f.when( + standard_error.isNull(), f.abs(beta) / f.abs(pvalue_to_zscore(pvalue)) + ).otherwise(standard_error) + + # Calculate upper and lower confidence interval: + ci_lower = (beta - standard_error).alias("betaConfidenceIntervalLower") + ci_upper = (beta + standard_error).alias("betaConfidenceIntervalUpper") + + return (ci_lower, ci_upper) + + +def convert_odds_ratio_to_beta( + beta: Column, odds_ratio: Column, standard_error: Column +) -> List[Column]: + """Harmonizes effect and standard error to beta. + + Args: + beta (Column): Effect in beta + odds_ratio (Column): Effect in odds ratio + standard_error (Column): Standard error of the effect + + Returns: + tuple: beta, standard error + + Examples: + >>> df = spark.createDataFrame([{"beta": 0.1, "oddsRatio": 1.1, "standardError": 0.1}, {"beta": None, "oddsRatio": 1.1, "standardError": 0.1}, {"beta": 0.1, "oddsRatio": None, "standardError": 0.1}, {"beta": 0.1, "oddsRatio": 1.1, "standardError": None}]) + >>> df.select("*", *convert_odds_ratio_to_beta(f.col("beta"), f.col("oddsRatio"), f.col("standardError"))).show() + +----+---------+-------------+-------------------+-------------+ + |beta|oddsRatio|standardError| beta|standardError| + +----+---------+-------------+-------------------+-------------+ + | 0.1| 1.1| 0.1| 0.1| 0.1| + |null| 1.1| 0.1|0.09531017980432493| null| + | 0.1| null| 0.1| 0.1| 0.1| + | 0.1| 1.1| null| 0.1| null| + +----+---------+-------------+-------------------+-------------+ + + + """ + # We keep standard error when effect is given in beta, otherwise drop. + standard_error = f.when( + standard_error.isNotNull() & beta.isNotNull(), standard_error + ).alias("standardError") + + # Odds ratio is converted to beta: + beta = ( + f.when(beta.isNotNull(), beta) + .when(odds_ratio.isNotNull(), f.log(odds_ratio)) + .alias("beta") + ) + + return [beta, standard_error] + + +def parse_pvalue(pv: Column) -> List[Column]: + """This function takes a p-value string and returns two columns mantissa (float), exponent (integer). + + Args: + pv (Column): P-value as string + + Returns: + Column: p-value mantissa (float) + Column: p-value exponent (integer) + + Examples: + >>> d = [("0.01",),("4.2E-45",),("43.2E5",),("0",),("1",)] + >>> spark.createDataFrame(d, ['pval']).select('pval',*parse_pvalue(f.col('pval'))).show() + +-------+--------------+--------------+ + | pval|pValueMantissa|pValueExponent| + +-------+--------------+--------------+ + | 0.01| 1.0| -2| + |4.2E-45| 4.2| -45| + | 43.2E5| 43.2| 5| + | 0| 2.225| -308| + | 1| 1.0| 0| + +-------+--------------+--------------+ + + """ + # Making sure there's a number in the string: + pv = f.when( + pv == f.lit("0"), f.lit(sys.float_info.min).cast(t.StringType()) + ).otherwise(pv) + + # Get exponent: + exponent = f.when( + f.upper(pv).contains("E"), + f.split(f.upper(pv), "E").getItem(1), + ).otherwise(f.floor(f.log10(pv))) + + # Get mantissa: + mantissa = f.when( + f.upper(pv).contains("E"), + f.split(f.upper(pv), "E").getItem(0), + ).otherwise(pv / (10**exponent)) + + # Round value: + mantissa = f.round(mantissa, 3) + + return [ + mantissa.cast(t.FloatType()).alias("pValueMantissa"), + exponent.cast(t.IntegerType()).alias("pValueExponent"), + ] + + def convert_gnomad_position_to_ensembl( position: Column, reference: Column, alternate: Column ) -> Column: - """Converting GnomAD variant position to Ensembl variant position. + """Convert GnomAD variant position to Ensembl variant position. - For indels (the reference or alternate allele is longer than 1), then adding 1 to the position, for SNPs, the position is unchanged. - More info about the problem: https://www.biostars.org/p/84686/ + For indels (the reference or alternate allele is longer than 1), then adding 1 to the position, for SNPs, + the position is unchanged. More info about the problem: https://www.biostars.org/p/84686/ Args: position (Column): Column @@ -44,6 +239,62 @@ def convert_gnomad_position_to_ensembl( ).otherwise(position) +def _liftover_loci( + variant_index: Table, chain_path: str, dest_reference_genome: str +) -> Table: + """Liftover a Hail table containing variant information from GRCh37 to GRCh38 or viceversa. + + Args: + variant_index (Table): Variants to be lifted over + chain_path (str): Path to chain file for liftover + dest_reference_genome (str): Destination reference genome. It can be either GRCh37 or GRCh38. + + Returns: + Table: LD variant index with coordinates in the new reference genome + """ + if not hl.get_reference("GRCh37").has_liftover( + "GRCh38" + ): # True when a chain file has already been registered + rg37 = hl.get_reference("GRCh37") + rg38 = hl.get_reference("GRCh38") + if dest_reference_genome == "GRCh38": + rg37.add_liftover(chain_path, rg38) + elif dest_reference_genome == "GRCh37": + rg38.add_liftover(chain_path, rg37) + # Dynamically create the new field with transmute + new_locus = f"locus_{dest_reference_genome}" + return variant_index.transmute( + **{new_locus: hl.liftover(variant_index.locus, dest_reference_genome)} + ) + + +def split_pvalue(pvalue: float) -> tuple[float, int]: + """Convert a float to 10 based exponent and mantissa. + + Args: + pvalue (float): p-value + + Returns: + tuple[float, int]: Tuple with mantissa and exponent + + Examples: + >>> split_pvalue(0.00001234) + (1.234, -5) + + >>> split_pvalue(1) + (1.0, 0) + + >>> split_pvalue(0.123) + (1.23, -1) + """ + if pvalue < 0.0 or pvalue > 1.0: + raise ValueError("P-value must be between 0 and 1") + + exponent = floor(log10(pvalue)) if pvalue != 0 else 0 + mantissa = round(pvalue / 10**exponent, 3) + return (mantissa, exponent) + + def parse_efos(efo_uri: Column) -> Column: """Extracting EFO identifiers. @@ -69,27 +320,3 @@ def parse_efos(efo_uri: Column) -> Column: """ colname = efo_uri._jc.toString() # type: ignore return f.array_sort(f.expr(f"regexp_extract_all(`{colname}`, '([A-Z]+_[0-9]+)')")) - - -def get_study_locus_id(study_id_col_name: str, variant_id_col_name: str) -> Column: - """Hashes a column with a variant ID and a study ID to extract a consistent studyLocusId. - - Args: - study_id_col_name (str): column name with a study ID - variant_id_col_name (str): column name with a variant ID - - Returns: - Column: column with a study locus ID - - Examples: - >>> df = spark.createDataFrame([("GCST000001", "1_1000_A_C"), ("GCST000002", "1_1000_A_C")]).toDF("studyId", "variantId") - >>> df.withColumn("study_locus_id", get_study_locus_id(*["variantId", "studyId"])).show() - +----------+----------+--------------------+ - | studyId| variantId| study_locus_id| - +----------+----------+--------------------+ - |GCST000001|1_1000_A_C| 7437284926964690765| - |GCST000002|1_1000_A_C|-7653912547667845377| - +----------+----------+--------------------+ - - """ - return f.xxhash64(*[study_id_col_name, variant_id_col_name]).alias("studyLocusId") diff --git a/src/otg/config.py b/src/otg/config.py index 494c44a5a..fc532af2c 100644 --- a/src/otg/config.py +++ b/src/otg/config.py @@ -4,7 +4,7 @@ from dataclasses import dataclass, field from enum import Enum -from typing import Dict, List, Optional +from typing import Any, Dict, List, Optional from hydra.core.config_store import ConfigStore from omegaconf import MISSING @@ -23,6 +23,9 @@ class Config: default_factory=lambda: [{"step": "???"}, {"session": "session_config"}] ) + step: Any = MISSING + session: Any = MISSING + @dataclass class SessionConfig: @@ -32,37 +35,42 @@ class SessionConfig: app_name: str = "otgenetics" spark_uri: str = "local[*]" write_mode: str = "overwrite" + hail_home: Optional[str] = None @dataclass class LDIndexStepConfig: - """LD index step requirements. + """LD matrix step requirements. Attributes: - pop_ldindex_path (str): Input population LD index file from gnomAD. - ld_radius (int): Window radius around locus. + ld_matrix_template (str): Template path for LD matrix from gnomAD. + ld_index_raw_template (str): Template path for the variant indices correspondance in the LD Matrix from gnomAD. + min_r2 (float): Minimum r2 to consider when considering variants within a window. grch37_to_grch38_chain_path (str): Path to GRCh37 to GRCh38 chain file. - ld_index_path (str): Output LD index path. + ld_populations (List[str]): List of population-specific LD matrices to process. + ld_index_out (str): Output LD index path. """ _target_: str = "otg.ld_index.LDIndexStep" + ld_matrix_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.adj.ld.bm" ld_index_raw_template: str = "gs://gcp-public-data--gnomad/release/2.1.1/ld/gnomad.genomes.r2.1.1.{POP}.common.ld.variant_indices.ht" - ld_radius: int = 500_000 - grch37_to_grch38_chain_path: str = MISSING - ld_index_template: str = MISSING + min_r2: float = 0.5 + grch37_to_grch38_chain_path: str = ( + "gs://hail-common/references/grch37_to_grch38.over.chain.gz" + ) ld_populations: List[str] = field( default_factory=lambda: [ "afr", # African-American "amr", # American Admixed/Latino - "ami", # Amish ancestry "asj", # Ashkenazi Jewish "eas", # East Asian "fin", # Finnish "nfe", # Non-Finnish European - "mid", # Middle Eastern - "sas", # South Asian + "nwe", # Northwestern European + "seu", # Southeastern European ] ) + ld_index_out: str = MISSING @dataclass @@ -95,6 +103,7 @@ class ColocalisationStepConfig: _target_: str = "otg.colocalisation.ColocalisationStep" study_locus_path: str = MISSING + study_index_path: str = MISSING coloc_path: str = MISSING priorc1: float = 1e-4 priorc2: float = 1e-4 @@ -206,27 +215,28 @@ class GWASCatalogStepConfig: catalog_sumstats_lut: str = MISSING catalog_associations_file: str = MISSING variant_annotation_path: str = MISSING + ld_index_path: str = MISSING min_r2: float = 0.5 - ld_matrix_template: str = MISSING - ld_index_template: str = MISSING - ld_populations: List[str] = field( - default_factory=lambda: [ - "afr", # African-American - "amr", # American Admixed/Latino - "ami", # Amish ancestry - "asj", # Ashkenazi Jewish - "eas", # East Asian - "fin", # Finnish - "nfe", # Non-Finnish European - "mid", # Middle Eastern - "sas", # South Asian - "oth", # Other - ] - ) catalog_studies_out: str = MISSING catalog_associations_out: str = MISSING +@dataclass +class StudyLocusOverlapStepConfig: + """StudyLocus overlaps index step requirements. + + Attributes: + study_locus_path (str): Input study-locus path. + study_index_path (str): Input study index path to extract the type of study. + overlaps_index_out (str): Output overlaps index path. + """ + + _target_: str = "otg.overlaps.OverlapsIndexStep" + study_locus_path: str = MISSING + study_index_path: str = MISSING + overlaps_index_out: str = MISSING + + @dataclass class GeneIndexStepConfig: """Gene index step requirements. @@ -241,40 +251,42 @@ class GeneIndexStepConfig: gene_index_path: str = MISSING -# Register all configs -def register_configs() -> None: - """Register step configs - each config class has all the parameters needed to run a step.""" - cs = ConfigStore.instance() - cs.store(name="config", node=Config) - cs.store(name="session_config", group="session", node=SessionConfig) - cs.store(name="locus_to_gene", group="step", node=LocusToGeneConfig) - cs.store(name="gene_index", group="step", node=GeneIndexStepConfig) - cs.store(name="ld_index", group="step", node=LDIndexStepConfig) - cs.store(name="variant_index", group="step", node=VariantIndexStepConfig) - cs.store(name="variant_annotation", group="step", node=VariantAnnotationStepConfig) - cs.store(name="v2g", group="step", node=V2GStepConfig) - cs.store(name="colocalisation", group="step", node=ColocalisationStepConfig) - cs.store(name="gwas_catalog", group="step", node=GWASCatalogStepConfig) - - -# Each of these classes is a config class for a specific step @dataclass -class VariantAnnotationGnomadConfig: - """Variant annotation from gnomad configuration.""" +class GWASCatalogSumstatsPreprocessConfig: + """GWAS Catalog Sumstats Preprocessing step requirements. - path: str | None = None - gnomad_file: str = MISSING - chain_file: str = MISSING - populations: list = MISSING + Attributes: + raw_sumstats_path (str): Input raw GWAS Catalog summary statistics path. + out_sumstats_path (str): Output GWAS Catalog summary statistics path. + study_id (str): GWAS Catalog study identifier. + """ + + _target_: str = ( + "otg.gwas_catalog_sumstat_preprocess.GWASCatalogSumstatsPreprocessStep" + ) + raw_sumstats_path: str = MISSING + out_sumstats_path: str = MISSING + study_id: str = MISSING @dataclass -class VariantIndexCredsetConfig: - """Variant index from credible sets configuration.""" +class FinnGenStepConfig: + """FinnGen study table ingestion step requirements. - path: str | None = None - variant_annotation_path: str = MISSING - credible_sets_path: str = MISSING + Attributes: + finngen_phenotype_table_url (str): FinnGen API for fetching the list of studies. + finngen_release_prefix (str): Release prefix pattern. + finngen_sumstat_url_prefix (str): URL prefix for summary statistics location. + finngen_sumstat_url_suffix (str): URL prefix suffix for summary statistics location. + finngen_study_index_out (str): Output path for the FinnGen study index dataset. + """ + + _target_: str = "otg.finngen.FinnGenStep" + finngen_phenotype_table_url: str = MISSING + finngen_release_prefix: str = MISSING + finngen_sumstat_url_prefix: str = MISSING + finngen_sumstat_url_suffix: str = MISSING + finngen_study_index_out: str = MISSING class LocusToGeneMode(Enum): @@ -302,7 +314,81 @@ class LocusToGeneConfig: gold_standard_processed_path: str = MISSING gene_interactions_path: str = MISSING feature_matrix_path: str = MISSING - features_list: List[str] = MISSING - hyperparameters: dict = MISSING + features_list: List[str] = field( + default_factory=lambda: [ + # average distance of all tagging variants to gene TSS + "dist_tss_ave", + # minimum distance of all tagging variants to gene TSS + "dist_tss_min", + # max clpp for each (study, locus, gene) aggregating over all eQTLs + "eqtl_max_coloc_clpp_local", + # max clpp for each (study, locus) aggregating over all eQTLs + "eqtl_max_coloc_clpp_nbh", + # max log-likelihood ratio value for each (study, locus, gene) aggregating over all eQTLs + "eqtl_max_coloc_llr_local", + # max log-likelihood ratio value for each (study, locus) aggregating over all eQTLs + "eqtl_max_coloc_llr_nbh", + # max clpp for each (study, locus, gene) aggregating over all pQTLs + "pqtl_max_coloc_clpp_local", + # max clpp for each (study, locus) aggregating over all pQTLs + "pqtl_max_coloc_clpp_nbh", + # max log-likelihood ratio value for each (study, locus, gene) aggregating over all pQTLs + "pqtl_max_coloc_llr_local", + # max log-likelihood ratio value for each (study, locus) aggregating over all pQTLs + "pqtl_max_coloc_llr_nbh", + # max clpp for each (study, locus, gene) aggregating over all sQTLs + "sqtl_max_coloc_clpp_local", + # max clpp for each (study, locus) aggregating over all sQTLs + "sqtl_max_coloc_clpp_nbh", + # max log-likelihood ratio value for each (study, locus, gene) aggregating over all sQTLs + "sqtl_max_coloc_llr_local", + # max log-likelihood ratio value for each (study, locus) aggregating over all sQTLs + "sqtl_max_coloc_llr_nbh", + ] + ) + hyperparameters: dict = field( + default_factory=lambda: { + "max_depth": 5, + "loss_function": "binary:logistic", + } + ) id: str = "locus_to_gene" _target_: str = "otg.l2g.LocusToGeneStep" + + +@dataclass +class UKBiobankStepConfig: + """UKBiobank study table ingestion step requirements. + + Attributes: + ukbiobank_manifest (str): UKBiobank manifest of studies. + ukbiobank_study_index_out (str): Output path for the UKBiobank study index dataset. + """ + + _target_: str = "otg.ukbiobank.UKBiobankStep" + ukbiobank_manifest: str = MISSING + ukbiobank_study_index_out: str = MISSING + + +# Register all configs +def register_configs() -> None: + """Register step configs - each config class has all the parameters needed to run a step.""" + cs = ConfigStore.instance() + cs.store(name="config", node=Config) + cs.store(name="session_config", group="session", node=SessionConfig) + cs.store(name="locus_to_gene", group="step", node=LocusToGeneConfig) + cs.store(name="gene_index", group="step", node=GeneIndexStepConfig) + cs.store(name="ld_index", group="step", node=LDIndexStepConfig) + cs.store(name="variant_index", group="step", node=VariantIndexStepConfig) + cs.store(name="variant_annotation", group="step", node=VariantAnnotationStepConfig) + cs.store(name="v2g", group="step", node=V2GStepConfig) + cs.store(name="colocalisation", group="step", node=ColocalisationStepConfig) + cs.store(name="gwas_catalog", group="step", node=GWASCatalogStepConfig) + cs.store(name="finngen", group="step", node=FinnGenStepConfig) + cs.store(name="ukbiobank", group="step", node=UKBiobankStepConfig) + cs.store( + name="gwas_catalog_sumstats_preprocess", + group="step", + node=GWASCatalogSumstatsPreprocessConfig, + ) + cs.store(name="study_locus_overlap", group="step", node=StudyLocusOverlapStepConfig) diff --git a/src/otg/dataset/colocalisation.py b/src/otg/dataset/colocalisation.py index 54f1f87ff..c3c650885 100644 --- a/src/otg/dataset/colocalisation.py +++ b/src/otg/dataset/colocalisation.py @@ -10,26 +10,12 @@ if TYPE_CHECKING: from pyspark.sql.types import StructType - from otg.common.session import Session - @dataclass class Colocalisation(Dataset): """Colocalisation results for pairs of overlapping study-locus.""" - _schema: StructType = parse_spark_schema("colocalisation.json") - @classmethod - def from_parquet( - cls: type[Colocalisation], session: Session, path: str - ) -> Colocalisation: - """Initialise Colocalisation dataset from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - Colocalisation: Colocalisation results - """ - return super().from_parquet(session, path, cls._schema) + def get_schema(cls: type[Colocalisation]) -> StructType: + """Provides the schema for the Colocalisation dataset.""" + return parse_spark_schema("colocalisation.json") diff --git a/src/otg/dataset/dataset.py b/src/otg/dataset/dataset.py index 991b569c5..532105a21 100644 --- a/src/otg/dataset/dataset.py +++ b/src/otg/dataset/dataset.py @@ -1,8 +1,11 @@ """Dataset class for OTG.""" from __future__ import annotations +from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Dict + +from otg.common.schemas import flatten_schema if TYPE_CHECKING: from pyspark.sql import DataFrame @@ -12,7 +15,7 @@ @dataclass -class Dataset: +class Dataset(ABC): """Open Targets Genetics Dataset. `Dataset` is a wrapper around a Spark DataFrame with a predefined schema. Schemas for each child dataset are described in the `schemas` module. @@ -23,7 +26,7 @@ class Dataset: def __post_init__(self: Dataset) -> None: """Post init.""" - # self.validate_schema() # FIXME: This is causing issues with the schema validation + self.validate_schema() @property def df(self: Dataset) -> DataFrame: @@ -33,7 +36,7 @@ def df(self: Dataset) -> DataFrame: @df.setter def df(self: Dataset, new_df: DataFrame) -> None: # noqa: CCE001 """Dataframe setter.""" - self._df = new_df + self._df: DataFrame = new_df self.validate_schema() @property @@ -41,48 +44,84 @@ def schema(self: Dataset) -> StructType: """Dataframe expected schema.""" return self._schema + @classmethod + @abstractmethod + def get_schema(cls: type[Dataset]) -> StructType: + """Abstract method to get the schema. Must be implemented by child classes.""" + pass + @classmethod def from_parquet( - cls: type[Dataset], session: Session, path: str, schema: StructType + cls: type[Dataset], session: Session, path: str, **kwargs: Dict[str, Any] ) -> Dataset: - """Reads a parquet file into a Dataset with a given schema. - - Args: - session (Session): ETL session - path (str): Path to parquet file - schema (StructType): Schema to use - - Returns: - Dataset: Dataset with given schema - """ - df = session.read_parquet(path=path, schema=schema) + """Reads a parquet file into a Dataset with a given schema.""" + schema = cls.get_schema() + df = session.read_parquet(path=path, schema=schema, **kwargs) return cls(_df=df, _schema=schema) - def validate_schema(self: Dataset) -> None: + def validate_schema(self: Dataset) -> None: # sourcery skip: invert-any-all """Validate DataFrame schema against expected class schema. Raises: ValueError: DataFrame schema is not valid """ - expected_schema = self._schema # type: ignore[attr-defined] - observed_schema = self._df.schema # type: ignore[attr-defined] - - # Observed fields not in schema - missing_struct_fields = [x for x in observed_schema if x not in expected_schema] - error_message = f"The {missing_struct_fields} StructFields are not included in DataFrame schema: {expected_schema}" - if missing_struct_fields: - raise ValueError(error_message) + expected_schema = self._schema + expected_fields = flatten_schema(expected_schema) + observed_schema = self._df.schema + observed_fields = flatten_schema(observed_schema) + + # Unexpected fields in dataset + if unexpected_field_names := [ + x.name + for x in observed_fields + if x.name not in [y.name for y in expected_fields] + ]: + raise ValueError( + f"The {unexpected_field_names} fields are not included in DataFrame schema: {expected_fields}" + ) # Required fields not in dataset - required_fields = [x for x in expected_schema if not x.nullable] - missing_required_fields = [ - x for x in required_fields if x not in observed_schema - ] - error_message = f"The {missing_required_fields} StructFields are required but missing from the DataFrame schema: {expected_schema}" - if missing_required_fields: - raise ValueError(error_message) + required_fields = [x.name for x in expected_schema if not x.nullable] + if missing_required_fields := [ + req + for req in required_fields + if not any(field.name == req for field in observed_fields) + ]: + raise ValueError( + f"The {missing_required_fields} fields are required but missing: {required_fields}" + ) + + # Fields with duplicated names + if duplicated_fields := [ + x for x in set(observed_fields) if observed_fields.count(x) > 1 + ]: + raise ValueError( + f"The following fields are duplicated in DataFrame schema: {duplicated_fields}" + ) + + # Fields with different datatype + observed_field_types = { + field.name: type(field.dataType) for field in observed_fields + } + expected_field_types = { + field.name: type(field.dataType) for field in expected_fields + } + if fields_with_different_observed_datatype := [ + name + for name, observed_type in observed_field_types.items() + if name in expected_field_types + and observed_type != expected_field_types[name] + ]: + raise ValueError( + f"The following fields present differences in their datatypes: {fields_with_different_observed_datatype}." + ) def persist(self: Dataset) -> Dataset: - """Persist DataFrame included in the Dataset.""" - self._df = self.df.persist() + """Persist in memory the DataFrame included in the Dataset.""" + self.df = self._df.persist() + return self + + def unpersist(self: Dataset) -> Dataset: + """Remove the persisted DataFrame from memory.""" + self.df = self._df.unpersist() return self diff --git a/src/otg/dataset/gene_index.py b/src/otg/dataset/gene_index.py index 64978b61e..3b67560da 100644 --- a/src/otg/dataset/gene_index.py +++ b/src/otg/dataset/gene_index.py @@ -1,4 +1,4 @@ -"""Variant index dataset.""" +"""Gene index dataset.""" from __future__ import annotations from dataclasses import dataclass @@ -10,11 +10,9 @@ from otg.dataset.dataset import Dataset if TYPE_CHECKING: - from pyspark.sql import Column, DataFrame + from pyspark.sql import DataFrame from pyspark.sql.types import StructType - from otg.common.session import Session - @dataclass class GeneIndex(Dataset): @@ -23,73 +21,10 @@ class GeneIndex(Dataset): Gene-based annotation. """ - _schema: StructType = parse_spark_schema("targets.json") - - @staticmethod - def _get_gene_tss(strand_col: Column, start_col: Column, end_col: Column) -> Column: - """Returns the TSS of a gene based on its orientation. - - Args: - strand_col (Column): Column containing 1 if the coding strand of the gene is forward, and -1 if it is reverse. - start_col (Column): Column containing the start position of the gene. - end_col (Column): Column containing the end position of the gene. - - Returns: - Column: Column containing the TSS of the gene. - - Examples: - >>> df = spark.createDataFrame([{"strand": 1, "start": 100, "end": 200}, {"strand": -1, "start": 100, "end": 200}]) - >>> df.withColumn("tss", GeneIndex._get_gene_tss(f.col("strand"), f.col("start"), f.col("end"))).show() - +---+-----+------+---+ - |end|start|strand|tss| - +---+-----+------+---+ - |200| 100| 1|100| - |200| 100| -1|200| - +---+-----+------+---+ - - - """ - return f.when(strand_col == 1, start_col).when(strand_col == -1, end_col) - @classmethod - def from_source(cls: type[GeneIndex], target_index: DataFrame) -> GeneIndex: - """Initialise GeneIndex from source dataset. - - Args: - target_index (DataFrame): Target index dataframe - - Returns: - GeneIndex: Gene index dataset - """ - return cls( - _df=target_index.select( - f.coalesce(f.col("id"), f.lit("unknown")).alias("geneId"), - f.coalesce(f.col("genomicLocation.chromosome"), f.lit("unknown")).alias( - "chromosome" - ), - GeneIndex._get_gene_tss( - f.col("genomicLocation.strand"), - f.col("genomicLocation.start"), - f.col("genomicLocation.end"), - ).alias("tss"), - "biotype", - "approvedSymbol", - "obsoleteSymbols", - ) - ) - - @classmethod - def from_parquet(cls: type[GeneIndex], session: Session, path: str) -> GeneIndex: - """Initialise GeneIndex from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - GeneIndex: Gene index dataset - """ - return super().from_parquet(session, path, cls._schema) + def get_schema(cls: type[GeneIndex]) -> StructType: + """Provides the schema for the GeneIndex dataset.""" + return parse_spark_schema("gene_index.json") def filter_by_biotypes(self: GeneIndex, biotypes: list) -> GeneIndex: """Filter by approved biotypes. @@ -112,6 +47,9 @@ def locations_lut(self: GeneIndex) -> DataFrame: return self.df.select( "geneId", "chromosome", + "start", + "end", + "strand", "tss", ) @@ -125,8 +63,8 @@ def symbols_lut(self: GeneIndex) -> DataFrame: DataFrame: Gene LUT for symbol mapping containing `geneId` and `geneSymbol` columns. """ return self.df.select( - "geneId", f.explode( f.array_union(f.array("approvedSymbol"), f.col("obsoleteSymbols.label")) ).alias("geneSymbol"), + "*", ) diff --git a/src/otg/dataset/intervals.py b/src/otg/dataset/intervals.py index af8452e3d..526650569 100644 --- a/src/otg/dataset/intervals.py +++ b/src/otg/dataset/intervals.py @@ -1,25 +1,18 @@ """Interval dataset.""" from __future__ import annotations -import importlib.resources as pkg_resources -import json from dataclasses import dataclass from typing import TYPE_CHECKING import pyspark.sql.functions as f -import pyspark.sql.types as t from otg.common.schemas import parse_spark_schema -from otg.dataset import schemas from otg.dataset.dataset import Dataset from otg.dataset.v2g import V2G if TYPE_CHECKING: from pyspark.sql.types import StructType - from otg.common.Liftover import LiftOverSpark - from otg.common.session import Session - from otg.dataset.gene_index import GeneIndex from otg.dataset.variant_index import VariantIndex @@ -27,426 +20,10 @@ class Intervals(Dataset): """Intervals dataset links genes to genomic regions based on genome interaction studies.""" - _schema: StructType = parse_spark_schema("intervals.json") - - @classmethod - def from_parquet(cls: type[Intervals], session: Session, path: str) -> Intervals: - """Initialise Intervals from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - Intervals: Intervals dataset - """ - return super().from_parquet(session, path, cls._schema) - - @classmethod - def parse_andersson( - cls: type[Intervals], - session: Session, - path: str, - gene_index: GeneIndex, - lift: LiftOverSpark, - ) -> Intervals: - """Parse Andersson et al. 2014 dataset. - - Args: - session (Session): session - path (str): Path to dataset - gene_index (GeneIndex): Gene index - lift (LiftOverSpark): LiftOverSpark instance - - Returns: - Intervals: Intervals dataset - """ - # Constant values: - dataset_name = "andersson2014" - experiment_type = "fantom5" - pmid = "24670763" - bio_feature = "aggregate" - twosided_threshold = 2.45e6 # <- this needs to phased out. Filter by percentile instead of absolute value. - - session.logger.info("Parsing Andersson 2014 data...") - session.logger.info(f"Reading data from {path}") - - # Expected andersson et al. schema: - input_schema = t.StructType.fromJson( - json.loads( - pkg_resources.read_text(schemas, "andersson2014.json", encoding="utf-8") - ) - ) - - # Read the anderson file: - parsed_anderson_df = ( - session.spark.read.option("delimiter", "\t") - .option("header", "true") - .schema(input_schema) - .csv(path) - # Parsing score column and casting as float: - .withColumn("score", f.col("score").cast("float") / f.lit(1000)) - # Parsing the 'name' column: - .withColumn("parsedName", f.split(f.col("name"), ";")) - .withColumn("gene_symbol", f.col("parsedName")[2]) - .withColumn("location", f.col("parsedName")[0]) - .withColumn( - "chrom", - f.regexp_replace(f.split(f.col("location"), ":|-")[0], "chr", ""), - ) - .withColumn( - "start", f.split(f.col("location"), ":|-")[1].cast(t.IntegerType()) - ) - .withColumn( - "end", f.split(f.col("location"), ":|-")[2].cast(t.IntegerType()) - ) - # Select relevant columns: - .select("chrom", "start", "end", "gene_symbol", "score") - # Drop rows with non-canonical chromosomes: - .filter( - f.col("chrom").isin([str(x) for x in range(1, 23)] + ["X", "Y", "MT"]) - ) - # For each region/gene, keep only one row with the highest score: - .groupBy("chrom", "start", "end", "gene_symbol") - .agg(f.max("score").alias("resourceScore")) - .orderBy("chrom", "start") - ) - - return cls( - df=( - # Lift over the intervals: - lift.convert_intervals(parsed_anderson_df, "chrom", "start", "end") - .drop("start", "end") - .withColumnRenamed("mapped_start", "start") - .withColumnRenamed("mapped_end", "end") - .distinct() - # Joining with the gene index - .alias("intervals") - .join( - gene_index.symbols_lut().alias("genes"), - on=[f.col("intervals.gene_symbol") == f.col("genes.geneSymbol")], - how="left", - ) - .filter( - # Drop rows where the gene is not on the same chromosome - (f.col("chrom") == f.col("chromosome")) - # Drop rows where the TSS is far from the start of the region - & ( - f.abs((f.col("start") + f.col("end")) / 2 - f.col("tss")) - <= twosided_threshold - ) - ) - # Select relevant columns: - .select( - "chromosome", - "start", - "end", - "geneId", - "resourceScore", - f.lit(dataset_name).alias("datasourceId"), - f.lit(experiment_type).alias("datatypeId"), - f.lit(pmid).alias("pmid"), - f.lit(bio_feature).alias("biofeature"), - ) - ) - ) - - @classmethod - def parse_javierre( - cls: type[Intervals], - session: Session, - path: str, - gene_index: GeneIndex, - lift: LiftOverSpark, - ) -> Intervals: - """Parse Javierre et al. 2016 dataset. - - Args: - session (Session): session - path (str): Path to dataset - gene_index (GeneIndex): Gene index - lift (LiftOverSpark): LiftOverSpark instance - - Returns: - Intervals: Javierre et al. 2016 interval data - """ - # Constant values: - dataset_name = "javierre2016" - experiment_type = "pchic" - pmid = "27863249" - twosided_threshold = 2.45e6 - - session.logger.info("Parsing Javierre 2016 data...") - session.logger.info(f"Reading data from {path}") - - # Read Javierre data: - javierre_raw = ( - session.spark.read.parquet(path) - # Splitting name column into chromosome, start, end, and score: - .withColumn("name_split", f.split(f.col("name"), r":|-|,")) - .withColumn( - "name_chr", - f.regexp_replace(f.col("name_split")[0], "chr", "").cast( - t.StringType() - ), - ) - .withColumn("name_start", f.col("name_split")[1].cast(t.IntegerType())) - .withColumn("name_end", f.col("name_split")[2].cast(t.IntegerType())) - .withColumn("name_score", f.col("name_split")[3].cast(t.FloatType())) - # Cleaning up chromosome: - .withColumn( - "chrom", - f.regexp_replace(f.col("chrom"), "chr", "").cast(t.StringType()), - ) - .drop("name_split", "name", "annotation") - # Keep canonical chromosomes and consistent chromosomes with scores: - .filter( - (f.col("name_score").isNotNull()) - & (f.col("chrom") == f.col("name_chr")) - & f.col("name_chr").isin( - [f"{x}" for x in range(1, 23)] + ["X", "Y", "MT"] - ) - ) - ) - - # Lifting over intervals: - javierre_remapped = ( - javierre_raw - # Lifting over to GRCh38 interval 1: - .transform(lambda df: lift.convert_intervals(df, "chrom", "start", "end")) - .drop("start", "end") - .withColumnRenamed("mapped_chrom", "chrom") - .withColumnRenamed("mapped_start", "start") - .withColumnRenamed("mapped_end", "end") - # Lifting over interval 2 to GRCh38: - .transform( - lambda df: lift.convert_intervals( - df, "name_chr", "name_start", "name_end" - ) - ) - .drop("name_start", "name_end") - .withColumnRenamed("mapped_name_chr", "name_chr") - .withColumnRenamed("mapped_name_start", "name_start") - .withColumnRenamed("mapped_name_end", "name_end") - ) - - # Once the intervals are lifted, extracting the unique intervals: - unique_intervals_with_genes = ( - javierre_remapped.alias("intervals") - .select( - f.col("chrom"), - f.col("start").cast(t.IntegerType()), - f.col("end").cast(t.IntegerType()), - ) - .distinct() - .join( - gene_index.locations_lut().alias("genes"), - on=[f.col("intervals.chrom") == f.col("genes.chromosome")], - how="left", - ) - # TODO: add filter as part of the join condition - .filter( - ( - (f.col("start") >= f.col("genomicLocation.start")) - & (f.col("start") <= f.col("genomicLocation.end")) - ) - | ( - (f.col("end") >= f.col("genomicLocation.start")) - & (f.col("end") <= f.col("genomicLocation.end")) - ) - ) - .select("chrom", "start", "end", "geneId", "tss") - ) - - # Joining back the data: - return cls( - df=( - javierre_remapped.join( - unique_intervals_with_genes, - on=["chrom", "start", "end"], - how="left", - ) - .filter( - # Drop rows where the TSS is far from the start of the region - f.abs((f.col("start") + f.col("end")) / 2 - f.col("tss")) - <= twosided_threshold - ) - # For each gene, keep only the highest scoring interval: - .groupBy( - "name_chr", "name_start", "name_end", "genes.geneId", "bio_feature" - ) - .agg(f.max(f.col("name_score")).alias("resourceScore")) - # Create the output: - .select( - f.col("name_chr").alias("chromosome"), - f.col("name_start").alias("start"), - f.col("name_end").alias("end"), - f.col("resourceScore"), - f.col("genes.geneId").alias("geneId"), - f.col("bio_feature").alias("biofeature"), - f.lit(dataset_name).alias("datasourceId"), - f.lit(experiment_type).alias("datatypeId"), - f.lit(pmid).alias("pmid"), - ) - ) - ) - - @classmethod - def parse_jung( - cls: type[Intervals], - session: Session, - path: str, - gene_index: GeneIndex, - lift: LiftOverSpark, - ) -> Intervals: - """Parse the Jung et al. 2019 dataset. - - Args: - session (Session): session - path (str): path to the Jung et al. 2019 dataset - gene_index (GeneIndex): gene index - lift (LiftOverSpark): LiftOverSpark instance - - Returns: - Intervals: _description_ - """ - dataset_name = "javierre2016" - experiment_type = "pchic" - pmid = "27863249" - - session.logger.info("Parsing Jung 2019 data...") - session.logger.info(f"Reading data from {path}") - - # Read Jung data: - jung_raw = ( - session.spark.read.csv(path, sep=",", header=True) - .withColumn("interval", f.split(f.col("Interacting_fragment"), r"\.")) - .select( - # Parsing intervals: - f.regexp_replace(f.col("interval")[0], "chr", "").alias("chrom"), - f.col("interval")[1].cast(t.IntegerType()).alias("start"), - f.col("interval")[2].cast(t.IntegerType()).alias("end"), - # Extract other columns: - f.col("Promoter").alias("gene_name"), - f.col("Tissue_type").alias("tissue"), - ) - ) - - # Lifting over the coordinates: - return cls( - df=( - jung_raw - # Lifting over to GRCh38 interval 1: - .transform( - lambda df: lift.convert_intervals(df, "chrom", "start", "end") - ) - .select( - "chrom", - f.col("mapped_start").alias("start"), - f.col("mapped_end").alias("end"), - f.explode(f.split(f.col("gene_name"), ";")).alias("gene_name"), - "tissue", - ) - .alias("intervals") - # Joining with genes: - .join( - gene_index.symbols_lut().alias("genes"), - on=[f.col("intervals.gene_name") == f.col("genes.geneSymbol")], - how="inner", - ) - # Finalize dataset: - .select( - "chromosome", - "start", - "end", - "geneId", - f.col("tissue").alias("biofeature"), - f.lit(1.0).alias("score"), - f.lit(dataset_name).alias("datasourceId"), - f.lit(experiment_type).alias("datatypeId"), - f.lit(pmid).alias("pmid"), - ) - .drop_duplicates() - ) - ) - @classmethod - def parse_thurman( - cls: type[Intervals], - session: Session, - path: str, - gene_index: GeneIndex, - lift: LiftOverSpark, - ) -> Intervals: - """Parse the Thurman et al. 2019 dataset. - - Args: - session (Session): session - path (str): path to the Thurman et al. 2019 dataset - gene_index (GeneIndex): gene index - lift (LiftOverSpark): LiftOverSpark instance - - Returns: - Intervals: _description_ - """ - dataset_name = "thurman2012" - experiment_type = "dhscor" - pmid = "22955617" - - session.logger.info("Parsing Jung 2019 data...") - session.logger.info(f"Reading data from {path}") - - # Read Jung data: - jung_raw = ( - session.spark.read.csv(path, sep=",", header=True) - .withColumn("interval", f.split(f.col("Interacting_fragment"), r"\.")) - .select( - # Parsing intervals: - f.regexp_replace(f.col("interval")[0], "chr", "").alias("chrom"), - f.col("interval")[1].cast(t.IntegerType()).alias("start"), - f.col("interval")[2].cast(t.IntegerType()).alias("end"), - # Extract other columns: - f.col("Promoter").alias("gene_name"), - f.col("Tissue_type").alias("tissue"), - ) - ) - - return cls( - df=( - jung_raw - # Lifting over to GRCh38 interval 1: - .transform( - lambda df: lift.convert_intervals(df, "chrom", "start", "end") - ) - .select( - "chrom", - f.col("mapped_start").alias("start"), - f.col("mapped_end").alias("end"), - f.explode(f.split(f.col("gene_name"), ";")).alias("gene_name"), - "tissue", - ) - .alias("intervals") - # Joining with genes: - .join( - gene_index.symbols_lut().alias("genes"), - on=[f.col("intervals.gene_name") == f.col("genes.geneSymbol")], - how="inner", - ) - # Finalize dataset: - .select( - "chromosome", - "start", - "end", - "geneId", - f.col("tissue").alias("biofeature"), - f.lit(1.0).alias("score"), - f.lit(dataset_name).alias("datasourceId"), - f.lit(experiment_type).alias("datatypeId"), - f.lit(pmid).alias("pmid"), - ) - .drop_duplicates() - ) - ) + def get_schema(cls: type[Intervals]) -> StructType: + """Provides the schema for the Intervals dataset.""" + return parse_spark_schema("intervals.json") def v2g(self: Intervals, variant_index: VariantIndex) -> V2G: """Convert intervals into V2G by intersecting with a variant index. @@ -462,17 +39,18 @@ def v2g(self: Intervals, variant_index: VariantIndex) -> V2G: # TODO: We can include the start and end position as part of the `on` clause in the join self.df.alias("interval") .join( - variant_index.df.alias("vi").select( - "chromosome", "variantId", "position" - ), + variant_index.df.selectExpr( + "chromosome as vi_chromosome", "variantId", "position" + ).alias("vi"), on=[ - f.col("vi.chromosome") == f.col("interval.chromosome"), + f.col("vi.vi_chromosome") == f.col("interval.chromosome"), f.col("vi.position").between( f.col("interval.start"), f.col("interval.end") ), ], how="inner", ) - .drop("start", "end") - ) + .drop("start", "end", "vi_chromosome") + ), + _schema=V2G.get_schema(), ) diff --git a/src/otg/dataset/l2g/feature_matrix.py b/src/otg/dataset/l2g/feature_matrix.py index 26e1d4465..d1d892a74 100644 --- a/src/otg/dataset/l2g/feature_matrix.py +++ b/src/otg/dataset/l2g/feature_matrix.py @@ -7,11 +7,7 @@ from otg.common.schemas import parse_spark_schema from otg.common.spark_helpers import _convert_from_long_to_wide -from otg.dataset.colocalisation import Colocalisation from otg.dataset.dataset import Dataset -from otg.dataset.study_index import StudyIndex -from otg.dataset.study_locus import StudyLocus -from otg.dataset.v2g import V2G from otg.method.l2g_utils.feature_factory import ( ColocalisationFactory, StudyLocusFactory, @@ -22,14 +18,16 @@ from pyspark.sql.types import StructType from otg.common.session import Session + from otg.dataset.colocalisation import Colocalisation + from otg.dataset.study_index import StudyIndex + from otg.dataset.study_locus import StudyLocus + from otg.dataset.v2g import V2G @dataclass class L2GFeatureMatrix(Dataset): """Dataset with features for Locus to Gene prediction.""" - _schema: StructType = parse_spark_schema("l2g_feature_matrix.json") - @staticmethod def fill_na( df: DataFrame, value: float = 0.0, subset: Optional[List[str]] = None @@ -57,31 +55,41 @@ def from_parquet( @classmethod def generate_features( cls: Type[L2GFeatureMatrix], - session: Session, - study_locus_path: str, - study_index_path: str, - variant_gene_path: str, - colocalisation_path: str, + study_locus: StudyLocus, + study_index: StudyIndex, + variant_gene: V2G, + colocalisation: Colocalisation, ) -> L2GFeatureMatrix: """Generate features from the OTG datasets.""" - # Load datasets - study_locus = StudyLocus.from_parquet(session, study_locus_path) - studies = StudyIndex.from_parquet(session, study_index_path) - distances = V2G.from_parquet(session, variant_gene_path) - coloc = Colocalisation.from_parquet(session, colocalisation_path) - # Extract features coloc_features = ColocalisationFactory._get_coloc_features_df( - study_locus, studies, coloc + study_locus, study_index, colocalisation ) - distance_features = StudyLocusFactory._get_tss_distance_features(distances) + distance_features = StudyLocusFactory._get_tss_distance_features(variant_gene) fm = reduce( lambda x, y: x.unionByName(y), [coloc_features._df, distance_features._df], ) - return cls(_df=_convert_from_long_to_wide(fm)) + return cls( + _df=_convert_from_long_to_wide( + fm, ["studyLocusId", "geneId"], "feature_name", "feature_value" + ) + ) + + @classmethod + def get_schema(cls: type[L2GFeatureMatrix]) -> StructType: + """Provides the schema for the L2gFeatureMatrix dataset.""" + return parse_spark_schema("l2g_feature_matrix.json") + + def select_features( + self: L2GFeatureMatrix, features_list: List[str] + ) -> L2GFeatureMatrix: + """Select a subset of features from the feature matrix.""" + fixed_rows = ["studyLocusId", "geneId", "gold_standard_set"] + self.df = self._df.select(fixed_rows + features_list) + return self def train_test_split( self: L2GFeatureMatrix, fraction: float @@ -96,6 +104,6 @@ def train_test_split( """ train, test = self._df.randomSplit([fraction, 1 - fraction], seed=42) return ( - L2GFeatureMatrix(_df=train).persist(), - L2GFeatureMatrix(_df=test).persist(), + L2GFeatureMatrix(_df=train), # TODO: .persist(), possible when PR is merged + L2GFeatureMatrix(_df=test), # .persist(), ) diff --git a/src/otg/dataset/l2g/gold_standard.py b/src/otg/dataset/l2g/gold_standard.py index 1c45d9c81..9b715157b 100644 --- a/src/otg/dataset/l2g/gold_standard.py +++ b/src/otg/dataset/l2g/gold_standard.py @@ -8,16 +8,15 @@ from otg.common.schemas import parse_spark_schema from otg.common.spark_helpers import get_record_with_maximum_value -from otg.common.utils import get_study_locus_id from otg.dataset.dataset import Dataset -from otg.dataset.study_locus_overlap import StudyLocusOverlap -from otg.dataset.v2g import V2G +from otg.dataset.study_locus import StudyLocus if TYPE_CHECKING: from pyspark.sql import DataFrame from pyspark.sql.types import StructType - from otg.common.session import Session + from otg.dataset.study_locus_overlap import StudyLocusOverlap + from otg.dataset.v2g import V2G @dataclass @@ -29,15 +28,11 @@ class L2GGoldStandard(Dataset): - Gold Standard Negative (GSN): Variant is not within 500kb of gene """ - _schema: StructType = parse_spark_schema("l2g_feature.json") # TODO: define schema - @staticmethod - def process_gene_interactions( - session: Session, interactions_path: str - ) -> DataFrame: + def process_gene_interactions(interactions: DataFrame) -> DataFrame: """Extract top scoring gene-gene interaction from the interactions dataset of the Platform.""" return get_record_with_maximum_value( - session.spark.read.parquet(interactions_path), + interactions, ["targetA", "targetB"], "scoring", ).selectExpr( @@ -49,23 +44,18 @@ def process_gene_interactions( @classmethod def from_curation( cls: Type[L2GGoldStandard], - session: Session, - gold_standard_curation: str, - v2g_path: str, - study_locus_path: str, - study_locus_overlap_path: str, - interactions_path: str, + gold_standard_curation: DataFrame, + v2g: V2G, + study_locus_overlap: StudyLocusOverlap, + interactions: DataFrame, ) -> L2GGoldStandard: """Process gold standard curation to use as training data.""" - overlaps_df = StudyLocusOverlap.from_parquet( - session, study_locus_overlap_path - )._df.select("left_studyLocusId", "right_studyLocusId") - interactions_df = L2GGoldStandard.process_gene_interactions( - session, interactions_path + overlaps_df = study_locus_overlap._df.select( + "left_studyLocusId", "right_studyLocusId" ) + interactions_df = L2GGoldStandard.process_gene_interactions(interactions) return cls( - _df=session.spark.read.json(gold_standard_curation) - .select( + _df=gold_standard_curation.select( f.col("association_info.otg_id").alias("studyId"), f.col("gold_standard_info.gene_id").alias("geneId"), f.concat_ws( @@ -76,15 +66,15 @@ def from_curation( f.col("sentinel_variant.alleles.alternative"), ).alias("variantId"), ) - .withColumn("studyLocusId", get_study_locus_id("studyId", "variantId")) + .withColumn( + "studyLocusId", StudyLocus.assign_study_locus_id("studyId", "variantId") + ) .filter( f.col("gold_standard_info.highest_confidence").isin(["High", "Medium"]) ) # Assign Positive or Negative Status based on confidence .join( - V2G.from_parquet(session, v2g_path).df.select( - "variantId", "geneId", "distance" - ), + v2g.df.select("variantId", "geneId", "distance"), on=["variantId", "geneId"], how="inner", ) @@ -125,3 +115,8 @@ def from_curation( .select("studyLocusId", "geneId", "gold_standard_set") # TODO: comment from Daniel: include source of GS ) + + @classmethod + def get_schema(cls: type[L2GGoldStandard]) -> StructType: + """Provides the schema for the L2GGoldStandard dataset.""" + return parse_spark_schema("l2g_gold_standard.json") diff --git a/src/otg/dataset/l2g/predictions.py b/src/otg/dataset/l2g/predictions.py index 63dbecaf6..fd94b8a23 100644 --- a/src/otg/dataset/l2g/predictions.py +++ b/src/otg/dataset/l2g/predictions.py @@ -28,8 +28,6 @@ class L2GPredictions(Dataset): confidence of the prediction that a gene is causal to an association. """ - _schema: StructType = parse_spark_schema("l2g_predictions.json") - @classmethod def from_parquet( cls: Type[L2GPredictions], session: Session, path: str @@ -90,3 +88,8 @@ def from_study_locus( vector_to_array("probability")[1].alias("score"), ) ) + + @classmethod + def get_schema(cls: type[L2GPredictions]) -> StructType: + """Provides the schema for the L2GPredictions dataset.""" + return parse_spark_schema("l2g_predictions.json") diff --git a/src/otg/dataset/ld_index.py b/src/otg/dataset/ld_index.py index 8d6753966..477d6ccc3 100644 --- a/src/otg/dataset/ld_index.py +++ b/src/otg/dataset/ld_index.py @@ -1,253 +1,21 @@ -"""LD indexing classes.""" +"""LDIndex dataset.""" from __future__ import annotations from dataclasses import dataclass from typing import TYPE_CHECKING -from pyspark.sql import Window -from pyspark.sql import functions as f - from otg.common.schemas import parse_spark_schema -from otg.common.spark_helpers import ( - get_record_with_maximum_value, - get_record_with_minimum_value, -) -from otg.common.utils import convert_gnomad_position_to_ensembl from otg.dataset.dataset import Dataset if TYPE_CHECKING: - from otg.common.session import Session from pyspark.sql.types import StructType - from hail.table import Table - from pyspark.sql import Column - -import hail as hl @dataclass class LDIndex(Dataset): - """Dataset to index access to LD information from GnomAD.""" - - _schema: StructType = parse_spark_schema("ld_index.json") - - @staticmethod - def _liftover_loci(variant_index: Table, grch37_to_grch38_chain_path: str) -> Table: - """Liftover hail table with LD variant index. - - Args: - variant_index (Table): LD variant indexes - grch37_to_grch38_chain_path (str): Path to chain file - - Returns: - Table: LD variant index with locus 38 coordinates - """ - if not hl.get_reference("GRCh37").has_liftover("GRCh38"): - rg37 = hl.get_reference("GRCh37") - rg38 = hl.get_reference("GRCh38") - rg37.add_liftover(grch37_to_grch38_chain_path, rg38) - - return variant_index.annotate( - locus38=hl.liftover(variant_index.locus, "GRCh38") - ) - - @staticmethod - def _interval_start(contig: Column, position: Column, ld_radius: int) -> Column: - """Start position of the interval based on available positions. - - Args: - contig (Column): genomic contigs - position (Column): genomic positions - ld_radius (int): bp around locus - - Returns: - Column: Position of the locus starting the interval - - Examples: - >>> d = [ - ... {"contig": "21", "pos": 100}, - ... {"contig": "21", "pos": 200}, - ... {"contig": "21", "pos": 300}, - ... ] - >>> df = spark.createDataFrame(d) - >>> df.withColumn("start", LDIndex._interval_start(f.col("contig"), f.col("pos"), 100)).show() - +------+---+-----+ - |contig|pos|start| - +------+---+-----+ - | 21|100| 100| - | 21|200| 100| - | 21|300| 200| - +------+---+-----+ - - - """ - w = ( - Window.partitionBy(contig) - .orderBy(position) - .rangeBetween(-ld_radius, ld_radius) - ) - return f.min(position).over(w) - - @staticmethod - def _interval_stop(contig: Column, position: Column, ld_radius: int) -> Column: - """Stop position of the interval based on available positions. - - Args: - contig (Column): genomic contigs - position (Column): genomic positions - ld_radius (int): bp around locus - - Returns: - Column: Position of the locus at the end of the interval - - Examples: - >>> d = [ - ... {"contig": "21", "pos": 100}, - ... {"contig": "21", "pos": 200}, - ... {"contig": "21", "pos": 300}, - ... ] - >>> df = spark.createDataFrame(d) - >>> df.withColumn("start", LDIndex._interval_stop(f.col("contig"), f.col("pos"), 100)).show() - +------+---+-----+ - |contig|pos|start| - +------+---+-----+ - | 21|100| 200| - | 21|200| 300| - | 21|300| 300| - +------+---+-----+ - - - """ - w = ( - Window.partitionBy(contig) - .orderBy(position) - .rangeBetween(-ld_radius, ld_radius) - ) - return f.max(position).over(w) + """Dataset containing linkage desequilibrium information between variants.""" @classmethod - def from_parquet(cls: type[LDIndex], session: Session, path: str) -> LDIndex: - """Initialise LD index from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - LDIndex: LD index dataset - """ - return super().from_parquet(session, path, cls.schema) - - @classmethod - def create( - cls: type[LDIndex], - pop_ldindex_path: str, - ld_radius: int, - grch37_to_grch38_chain_path: str, - ) -> LDIndex: - """Parse LD index and annotate with interval start and stop. - - Args: - pop_ldindex_path (str): path to gnomAD LD index - ld_radius (int): radius - grch37_to_grch38_chain_path (str): path to chain file for liftover - - Returns: - LDIndex: Created GnomAD LD index - """ - ld_index = hl.read_table(pop_ldindex_path).naive_coalesce(400) - ld_index_38 = LDIndex._liftover_loci(ld_index, grch37_to_grch38_chain_path) - - return cls( - _df=ld_index_38.to_spark() - .filter(f.col("`locus38.position`").isNotNull()) - .select( - f.col("idx"), - f.regexp_replace("`locus38.contig`", "chr", "").alias("chromosome"), - f.col("`locus38.position`").alias("position"), - f.col("`alleles`").getItem(0).alias("referenceAllele"), - f.col("`alleles`").getItem(1).alias("alternateAllele"), - ) - .withColumn( - "position", - convert_gnomad_position_to_ensembl( - f.col("position"), - f.col("referenceAllele"), - f.col("alternateAllele"), - ), - ) - .withColumn( - "variantId", - f.concat_ws( - "_", - f.col("chromosome"), - f.col("position"), - f.col("referenceAllele"), - f.col("alternateAllele"), - ), - ) - # Convert gnomad position to Ensembl position (1-based for indels) - .repartition(400, "chromosome") - .sortWithinPartitions("position") - .persist() - ).annotate_index_intervals(ld_radius) - - def annotate_index_intervals(self: LDIndex, ld_radius: int) -> LDIndex: - """Annotate LD index with indexes starting and stopping a given interval. - - Args: - ld_radius (int): radius around each position - - Returns: - LDIndex: including `start_idx` and `stop_idx` columns - """ - index_with_positions = self._df.select( - "*", - LDIndex._interval_start( - contig=f.col("chromosome"), - position=f.col("position"), - ld_radius=ld_radius, - ).alias("start_pos"), - LDIndex._interval_stop( - contig=f.col("chromosome"), - position=f.col("position"), - ld_radius=ld_radius, - ).alias("stop_pos"), - ).persist() - - self.df = ( - index_with_positions.join( - ( - index_with_positions - # Given the multiple variants with the same chromosome/position can have different indexes, filter for the lowest index: - .transform( - lambda df: get_record_with_minimum_value( - df, ["chromosome", "position"], "idx" - ) - ).select( - "chromosome", - f.col("position").alias("start_pos"), - f.col("idx").alias("start_idx"), - ) - ), - on=["chromosome", "start_pos"], - ) - .join( - ( - index_with_positions - # Given the multiple variants with the same chromosome/position can have different indexes, filter for the highest index: - .transform( - lambda df: get_record_with_maximum_value( - df, ["chromosome", "position"], "idx" - ) - ).select( - "chromosome", - f.col("position").alias("stop_pos"), - f.col("idx").alias("stop_idx"), - ) - ), - on=["chromosome", "stop_pos"], - ) - .drop("start_pos", "stop_pos") - ) - - return self + def get_schema(cls: type[LDIndex]) -> StructType: + """Provides the schema for the LDIndex dataset.""" + return parse_spark_schema("ld_index.json") diff --git a/src/otg/dataset/schemas/ld_index.json b/src/otg/dataset/schemas/ld_index.json deleted file mode 100644 index cdf2bc6bb..000000000 --- a/src/otg/dataset/schemas/ld_index.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "fields": [ - { - "metadata": {}, - "name": "variantId", - "nullable": false, - "type": "string" - }, - { - "metadata": {}, - "name": "chromosome", - "nullable": false, - "type": "string" - }, - { - "metadata": {}, - "name": "position", - "nullable": false, - "type": "integer" - }, - { - "metadata": {}, - "name": "referenceAllele", - "nullable": false, - "type": "string" - }, - { - "metadata": {}, - "name": "alternateAllele", - "nullable": false, - "type": "string" - }, - { - "metadata": {}, - "name": "idx", - "nullable": false, - "type": "long" - }, - { - "metadata": {}, - "name": "start_idx", - "nullable": false, - "type": "long" - }, - { - "metadata": {}, - "name": "stop_idx", - "nullable": false, - "type": "long" - } - ], - "type": "struct" -} diff --git a/src/otg/dataset/schemas/variant_annotation.json b/src/otg/dataset/schemas/variant_annotation.json deleted file mode 100644 index 2aebab0e8..000000000 --- a/src/otg/dataset/schemas/variant_annotation.json +++ /dev/null @@ -1,589 +0,0 @@ -{ - "type": "struct", - "fields": [ - { - "name": "variantId", - "type": "string", - "nullable": false, - "metadata": {} - }, - { - "name": "chromosome", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "position", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "gnomad3VariantId", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "referenceAllele", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "alternateAllele", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "chromosomeB37", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "positionB37", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "alleleType", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "rsIds", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "alleleFrequencies", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "alleleFrequency", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "populationName", - "type": "string", - "nullable": false, - "metadata": {} - } - ] - }, - "containsNull": false - }, - "nullable": false, - "metadata": {} - }, - { - "name": "cadd", - "type": { - "type": "struct", - "fields": [ - { - "name": "phred", - "type": "float", - "nullable": true, - "metadata": {} - }, - { - "name": "raw", - "type": "float", - "nullable": true, - "metadata": {} - } - ] - }, - "nullable": true, - "metadata": {} - }, - { - "name": "vep", - "type": { - "type": "struct", - "fields": [ - { - "name": "mostSevereConsequence", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "motifFeatureConsequences", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "allele_num", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "consequence_terms", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "high_inf_pos", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "impact", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "minimised", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "motif_feature_id", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "motif_name", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "motif_pos", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "motif_score_change", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "strand", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "variant_allele", - "type": "string", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "regulatoryFeatureConsequences", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "allele_num", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "biotype", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "consequence_terms", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "impact", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "minimised", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "regulatory_feature_id", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "variant_allele", - "type": "string", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "transcriptConsequences", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "allele_num", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "amino_acids", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "appris", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "biotype", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "canonical", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "ccds", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "cdna_start", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "cdna_end", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "cds_end", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "cds_start", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "codons", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "consequence_terms", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "distance", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "domains", - "type": { - "type": "array", - "elementType": { - "type": "struct", - "fields": [ - { - "name": "db", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "name", - "type": "string", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, - "nullable": true, - "metadata": {} - }, - { - "name": "exon", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "gene_id", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "gene_pheno", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "gene_symbol", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "gene_symbol_source", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "hgnc_id", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "hgvsc", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "hgvsp", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "hgvs_offset", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "impact", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "intron", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "lof", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "lof_flags", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "lof_filter", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "lof_info", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "minimised", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "polyphen_prediction", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "polyphen_score", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "protein_end", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "protein_start", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "protein_id", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "sift_prediction", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "sift_score", - "type": "double", - "nullable": true, - "metadata": {} - }, - { - "name": "strand", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "swissprot", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "transcript_id", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "trembl", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "tsl", - "type": "integer", - "nullable": true, - "metadata": {} - }, - { - "name": "uniparc", - "type": "string", - "nullable": true, - "metadata": {} - }, - { - "name": "variant_allele", - "type": "string", - "nullable": true, - "metadata": {} - } - ] - }, - "containsNull": true - }, - "nullable": true, - "metadata": {} - } - ] - }, - "nullable": false, - "metadata": {} - }, - { - "name": "filters", - "type": { - "type": "array", - "elementType": "string", - "containsNull": true - }, - "nullable": true, - "metadata": {} - } - ] -} diff --git a/src/otg/dataset/study_index.py b/src/otg/dataset/study_index.py index 1c4b9c3e9..9af6d075a 100644 --- a/src/otg/dataset/study_index.py +++ b/src/otg/dataset/study_index.py @@ -7,22 +7,16 @@ from itertools import chain from typing import TYPE_CHECKING -import pyspark.sql.functions as f -import pyspark.sql.types as t -from pyspark.sql import Column, Window +from pyspark.sql import functions as f -from otg import data +from otg.assets import data from otg.common.schemas import parse_spark_schema -from otg.common.spark_helpers import column2camel_case -from otg.common.utils import parse_efos from otg.dataset.dataset import Dataset if TYPE_CHECKING: - from pyspark.sql import DataFrame + from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType - from otg.common.session import Session - @dataclass class StudyIndex(Dataset): @@ -31,388 +25,113 @@ class StudyIndex(Dataset): A study index dataset captures all the metadata for all studies including GWAS and Molecular QTL. """ - _schema: StructType = parse_spark_schema("studies.json") - - @classmethod - def from_parquet(cls: type[StudyIndex], session: Session, path: str) -> StudyIndex: - """Initialise StudyIndex from parquet file. + @staticmethod + def _aggregate_samples_by_ancestry(merged: Column, ancestry: Column) -> Column: + """Aggregate sample counts by ancestry in a list of struct colmns. Args: - session (Session): ETL session - path (str): Path to parquet file + merged (Column): A column representing merged data (list of structs). + ancestry (Column): The `ancestry` parameter is a column that represents the ancestry of each + sample. (a struct) Returns: - StudyIndex: Study index dataset + the modified "merged" column after aggregating the samples by ancestry. """ - return super().from_parquet(session, path, cls._schema) - - def study_type_lut(self: StudyIndex) -> DataFrame: - """Return a lookup table of study type. - - Returns: - DataFrame: A dataframe containing `studyId` and `studyType` columns. - """ - return self.df.select("studyId", "studyType") - - -@dataclass -class StudyIndexGWASCatalog(StudyIndex): - """Study index dataset from GWAS Catalog. - - The following information is harmonised from the GWAS Catalog: - - - All publication related information retained. - - Mapped measured and background traits parsed. - - Flagged if harmonized summary statistics datasets available. - - If available, the ftp path to these files presented. - - Ancestries from the discovery and replication stages are structured with sample counts. - - Case/control counts extracted. - - The number of samples with European ancestry extracted. - - """ + # Iterating over the list of ancestries and adding the sample size if label matches: + return f.transform( + merged, + lambda a: f.when( + a.ancestry == ancestry.ancestry, + f.struct( + a.ancestry.alias("ancestry"), + (a.sampleSize + ancestry.sampleSize).alias("sampleSize"), + ), + ).otherwise(a), + ) @staticmethod - def _gwas_ancestry_to_gnomad(gwas_catalog_ancestry: Column) -> Column: - """Normalised ancestry column from GWAS Catalog into Gnomad ancestry. + def _map_ancestries_to_ld_population(gwas_ancestry_label: Column) -> Column: + """Normalise ancestry column from GWAS studies into reference LD panel based on a pre-defined map. + + This function assumes all possible ancestry categories have a corresponding + LD panel in the LD index. It is very important to have the ancestry labels + moved to the LD panel map. Args: - gwas_catalog_ancestry (Column): GWAS Catalog ancestry + gwas_ancestry_label (Column): A struct column with ancestry label like Finnish, + European, African etc. and the corresponding sample size. Returns: - Column: mapped Gnomad ancestry using LUT + Column: Struct column with the mapped LD population label and the sample size. """ - # GWAS Catalog to p-value mapping + # Loading ancestry label to LD population label: json_dict = json.loads( pkg_resources.read_text( - data, "gwascat_2_gnomad_superpopulation_map.json", encoding="utf-8" + data, "gwas_population_2_LD_panel_map.json", encoding="utf-8" ) ) map_expr = f.create_map(*[f.lit(x) for x in chain(*json_dict.items())]) - return f.transform(gwas_catalog_ancestry, lambda x: map_expr[x]) - - @classmethod - def _parse_study_table( - cls: type[StudyIndexGWASCatalog], catalog_studies: DataFrame - ) -> StudyIndexGWASCatalog: - """Harmonise GWASCatalog study table with `StudyIndex` schema. - - Args: - catalog_studies (DataFrame): GWAS Catalog study table - - Returns: - StudyIndexGWASCatalog: - """ - return cls( - _df=catalog_studies.select( - f.coalesce( - f.col("STUDY ACCESSION"), f.monotonically_increasing_id() - ).alias("studyId"), - f.coalesce( - f.col("STUDY ACCESSION"), f.monotonically_increasing_id() - ).alias("projectId"), - f.lit("NOT IMPLEMENTED").alias("studyType"), - f.col("PUBMED ID").alias("pubmedId"), - f.col("FIRST AUTHOR").alias("publicationFirstAuthor"), - f.col("DATE").alias("publicationDate"), - f.col("JOURNAL").alias("publicationJournal"), - f.col("STUDY").alias("publicationTitle"), - f.coalesce(f.col("DISEASE/TRAIT"), f.lit("Unreported")).alias( - "traitFromSource" - ), - f.col("INITIAL SAMPLE SIZE").alias("initialSampleSize"), - parse_efos(f.col("MAPPED_TRAIT_URI")).alias("traitFromSourceMappedIds"), - parse_efos(f.col("MAPPED BACKGROUND TRAIT URI")).alias( - "backgroundTraitFromSourceMappedIds" - ), - ) + return f.struct( + map_expr[gwas_ancestry_label.ancestry].alias("ancestry"), + gwas_ancestry_label.sampleSize.alias("sampleSize"), ) @classmethod - def from_source( - cls: type[StudyIndexGWASCatalog], - catalog_studies: DataFrame, - ancestry_file: DataFrame, - sumstats_lut: DataFrame, - ) -> StudyIndexGWASCatalog: - """This function ingests study level metadata from the GWAS Catalog. - - Args: - catalog_studies (DataFrame): GWAS Catalog raw study table - ancestry_file (DataFrame): GWAS Catalog ancestry table. - sumstats_lut (DataFrame): GWAS Catalog summary statistics list. - - Returns: - StudyIndexGWASCatalog: Parsed and annotated GWAS Catalog study table. - """ - # Read GWAS Catalogue raw data - return ( - cls._parse_study_table(catalog_studies) - ._annotate_ancestries(ancestry_file) - ._annotate_sumstats_info(sumstats_lut) - ._annotate_discovery_sample_sizes() - ) - - def get_gnomad_ancestry_sample_sizes(self: StudyIndexGWASCatalog) -> DataFrame: - """Get all studies and their ancestries. - - Returns: - DataFrame: containing `studyId`, `gnomadPopulation` and `relativeSampleSize` columns - """ - # Study ancestries - w_study = Window.partitionBy("studyId") - return ( - self.df - # Excluding studies where no sample discription is provided: - .filter(f.col("discoverySamples").isNotNull()) - # Exploding sample description and study identifier: - .withColumn("discoverySample", f.explode(f.col("discoverySamples"))) - # Splitting sample descriptions further: - .withColumn( - "ancestries", - f.split(f.col("discoverySample.ancestry"), r",\s(?![^()]*\))"), - ) - # Dividing sample sizes assuming even distribution - .withColumn( - "adjustedSampleSize", - f.col("discoverySample.sampleSize") / f.size(f.col("ancestries")), - ) - # mapped to gnomAD superpopulation and exploded - .withColumn( - "gnomadPopulation", - f.explode( - StudyIndexGWASCatalog._gwas_ancestry_to_gnomad(f.col("ancestries")) - ), - ) - # Group by studies and aggregate for major population: - .groupBy("studyId", "gnomadPopulation") - .agg(f.sum(f.col("adjustedSampleSize")).alias("sampleSize")) - # Calculate proportions for each study - .withColumn( - "relativeSampleSize", - f.col("sampleSize") / f.sum("sampleSize").over(w_study), - ) - .drop("sampleSize") - ) - - def update_study_id( - self: StudyIndexGWASCatalog, study_annotation: DataFrame - ) -> StudyIndexGWASCatalog: - """Update studyId with a dataframe containing study. - - Args: - study_annotation (DataFrame): Dataframe containing `updatedStudyId`, `traitFromSource`, `traitFromSourceMappedIds` and key column `studyId`. + def get_schema(cls: type[StudyIndex]) -> StructType: + """Provide the schema for the StudyIndex dataset.""" + return parse_spark_schema("study_index.json") - Returns: - StudyIndexGWASCatalog: Updated study table. - """ - self.df = ( - self._df.alias("studyIndex") - .join(study_annotation.alias("studyAnnotation"), on="studyId", how="left") - .withColumn( - "studyIndex.studyId", - f.coalesce("studyAnnotation.updatedStudyId", "studyIndex.studyId"), - ) - .withColumn( - "studyIndex.traitFromSource", - f.coalesce( - "studyAnnotation.traitFromSource", "studyIndex.traitFromSource" - ), - ) - .withColumn( - "studyIndex.traitFromSourceMappedIds", - f.coalesce( - "studyAnnotation.traitFromSourceMappedIds", - "studyIndex.traitFromSourceMappedIds", - ), - ) - .select("studyIndex.*") - ) - return self - - def _annotate_ancestries( - self: StudyIndexGWASCatalog, ancestry_lut: DataFrame - ) -> StudyIndexGWASCatalog: - """Extracting sample sizes and ancestry information. - - This function parses the ancestry data. Also get counts for the europeans in the same - discovery stage. + @classmethod + def aggregate_and_map_ancestries( + cls: type[StudyIndex], discovery_samples: Column + ) -> Column: + """Map ancestries to populations in the LD reference and calculate relative sample size. Args: - ancestry_lut (DataFrame): Ancestry table as downloaded from the GWAS Catalog + discovery_samples (Column): A list of struct column. Has an `ancestry` column and a `sampleSize` columns Returns: - StudyIndexGWASCatalog: Slimmed and cleaned version of the ancestry annotation. + A list of struct with mapped LD population and their relative sample size. """ - ancestry = ( - ancestry_lut - # Convert column headers to camelcase: - .transform( - lambda df: df.select( - *[f.expr(column2camel_case(x)) for x in df.columns] - ) - ).withColumnRenamed("studyAccession", "projectId") + # Map ancestry categories to population labels of the LD index: + mapped_ancestries = f.transform( + discovery_samples, cls._map_ancestries_to_ld_population ) - # Get a high resolution dataset on experimental stage: - ancestry_stages = ( - ancestry.groupBy("projectId") - .pivot("stage") - .agg( - f.collect_set( - f.struct( - f.col("numberOfIndividuals").alias("sampleSize"), - f.col("broadAncestralCategory").alias("ancestry"), - ) + # Aggregate sample sizes belonging to the same LD population: + aggregated_counts = f.aggregate( + mapped_ancestries, + f.array_distinct( + f.transform( + mapped_ancestries, + lambda x: f.struct( + x.ancestry.alias("ancestry"), f.lit(0.0).alias("sampleSize") + ), ) - ) - .withColumnRenamed("initial", "discoverySamples") - .withColumnRenamed("replication", "replicationSamples") - .persist() + ), + cls._aggregate_samples_by_ancestry, ) - - # Generate information on the ancestry composition of the discovery stage, and calculate - # the proportion of the Europeans: - europeans_deconvoluted = ( - ancestry - # Focus on discovery stage: - .filter(f.col("stage") == "initial") - # Sorting ancestries if European: - .withColumn( - "ancestryFlag", - # Excluding finnish: - f.when( - f.col("initialSampleDescription").contains("Finnish"), - f.lit("other"), - ) - # Excluding Icelandic population: - .when( - f.col("initialSampleDescription").contains("Icelandic"), - f.lit("other"), - ) - # Including European ancestry: - .when(f.col("broadAncestralCategory") == "European", f.lit("european")) - # Exclude all other population: - .otherwise("other"), - ) - # Grouping by study accession and initial sample description: - .groupBy("projectId") - .pivot("ancestryFlag") - .agg( - # Summarizing sample sizes for all ancestries: - f.sum(f.col("numberOfIndividuals")) - ) - # Do aritmetics to make sure we have the right proportion of european in the set: - .withColumn( - "initialSampleCountEuropean", - f.when(f.col("european").isNull(), f.lit(0)).otherwise( - f.col("european") + # Getting total sample count: + total_sample_count = f.aggregate( + aggregated_counts, f.lit(0.0), lambda total, pop: total + pop.sampleSize + ).alias("sampleSize") + + # Calculating relative sample size for each LD population: + return f.transform( + aggregated_counts, + lambda ld_population: f.struct( + ld_population.ancestry.alias("ldPopulation"), + (ld_population.sampleSize / total_sample_count).alias( + "relativeSampleSize" ), - ) - .withColumn( - "initialSampleCountOther", - f.when(f.col("other").isNull(), f.lit(0)).otherwise(f.col("other")), - ) - .withColumn( - "initialSampleCount", - f.col("initialSampleCountEuropean") + f.col("other"), - ) - .drop( - "european", - "other", - "initialSampleCount", - "initialSampleCountEuropean", - "initialSampleCountOther", - ) - ) - - parsed_ancestry_lut = ancestry_stages.join( - europeans_deconvoluted, on="projectId", how="outer" - ) - - self.df = self.df.join(parsed_ancestry_lut, on="projectId", how="left") - return self - - def _annotate_sumstats_info( - self: StudyIndexGWASCatalog, sumstats_lut: DataFrame - ) -> StudyIndexGWASCatalog: - """Annotate summary stat locations. - - Args: - sumstats_lut (DataFrame): listing GWAS Catalog summary stats paths - - Returns: - StudyIndexGWASCatalog: including `summarystatsLocation` and `hasSumstats` columns - """ - gwas_sumstats_base_uri = ( - "ftp://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics" - ) - - parsed_sumstats_lut = sumstats_lut.withColumn( - "summarystatsLocation", - f.concat( - f.lit(gwas_sumstats_base_uri), - f.regexp_replace(f.col("_c0"), r"^\.\/", ""), - ), - ).select( - f.regexp_extract(f.col("summarystatsLocation"), r"\/(GCST\d+)\/", 1).alias( - "projectId" ), - "summarystatsLocation", - f.lit(True).alias("hasSumstats"), ) - self.df = ( - self.df.drop("hasSumstats") - .join(parsed_sumstats_lut, on="projectId", how="left") - .withColumn( - "hasSumstats", - f.when(f.col("hasSumstats"), True) - .when(f.col("hasSumstats").isNull(), False) - .otherwise(None), - ) - ) - return self - - def _annotate_discovery_sample_sizes( - self: StudyIndexGWASCatalog, - ) -> StudyIndexGWASCatalog: - """Extract the sample size of the discovery stage of the study as annotated in the GWAS Catalog. + def study_type_lut(self: StudyIndex) -> DataFrame: + """Return a lookup table of study type. Returns: - StudyIndexGWASCatalog: df with columns `nCases`, `nControls`, and `nSamples` per `ProjectId` + DataFrame: A dataframe containing `studyId` and `studyType` columns. """ - sample_size_lut = ( - self.df.select( - "projectId", - f.explode_outer(f.split(f.col("initialSampleSize"), r",\s+")).alias( - "samples" - ), - ) - # Extracting the sample size from the string: - .withColumn( - "sampleSize", - f.regexp_extract( - f.regexp_replace(f.col("samples"), ",", ""), r"[0-9,]+", 0 - ).cast(t.IntegerType()), - ) - .select( - "projectId", - "sampleSize", - f.when(f.col("samples").contains("cases"), f.col("sampleSize")) - .otherwise(f.lit(0)) - .alias("nCases"), - f.when(f.col("samples").contains("controls"), f.col("sampleSize")) - .otherwise(f.lit(0)) - .alias("nControls"), - ) - # Aggregating sample sizes for all ancestries: - .groupBy("projectId") - .agg( - f.sum("nCases").alias("nCases"), - f.sum("nControls").alias("nControls"), - f.sum("sampleSize").alias("nSamples"), - ) - ) - self.df = self.df.join(sample_size_lut, on="projectId", how="left") - return self + return self.df.select("studyId", "studyType") diff --git a/src/otg/dataset/study_locus.py b/src/otg/dataset/study_locus.py index 2ad7707cc..92e92b389 100644 --- a/src/otg/dataset/study_locus.py +++ b/src/otg/dataset/study_locus.py @@ -1,38 +1,26 @@ """Variant index dataset.""" from __future__ import annotations -import importlib.resources as pkg_resources -import json -import sys from dataclasses import dataclass from enum import Enum -from itertools import chain from typing import TYPE_CHECKING -import numpy as np import pyspark.sql.functions as f -import pyspark.sql.types as t -from pyspark.sql.window import Window -from scipy.stats import norm -from otg import data from otg.common.schemas import parse_spark_schema from otg.common.spark_helpers import ( calculate_neglog_pvalue, - get_record_with_maximum_value, + order_array_of_structs_by_field, ) -from otg.common.utils import get_study_locus_id, parse_efos from otg.dataset.dataset import Dataset from otg.dataset.study_locus_overlap import StudyLocusOverlap -from otg.method.ld import LDAnnotatorGnomad, LDclumping +from otg.method.clump import LDclumping if TYPE_CHECKING: from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType - from otg.common.session import Session - from otg.dataset.study_index import StudyIndex, StudyIndexGWASCatalog - from otg.dataset.variant_annotation import VariantAnnotation + from otg.dataset.study_index import StudyIndex class StudyLocusQualityCheck(Enum): @@ -59,6 +47,7 @@ class StudyLocusQualityCheck(Enum): AMBIGUOUS_STUDY = "Association with ambiguous study" UNRESOLVED_LD = "Variant not found in LD reference" LD_CLUMPED = "Explained by a more significant variant in high LD (clumped)" + NO_POPULATION = "Study does not have population annotation to resolve LD" class CredibleInterval(Enum): @@ -82,8 +71,6 @@ class StudyLocus(Dataset): This dataset captures associations between study/traits and a genetic loci as provided by finemapping methods. """ - _schema: StructType = parse_spark_schema("study_locus.json") - @staticmethod def _overlapping_peaks(credset_to_overlap: DataFrame) -> DataFrame: """Calculate overlapping signals (study-locus) between GWAS-GWAS and GWAS-Molecular trait. @@ -92,7 +79,7 @@ def _overlapping_peaks(credset_to_overlap: DataFrame) -> DataFrame: credset_to_overlap (DataFrame): DataFrame containing at least `studyLocusId`, `studyType`, `chromosome` and `tagVariantId` columns. Returns: - DataFrame: containing `left_studyLocusId`, `right_studyLocusId` and `chromosome` columns. + DataFrame: containing `leftStudyLocusId`, `rightStudyLocusId` and `chromosome` columns. """ # Reduce columns to the minimum to reduce the size of the dataframe credset_to_overlap = credset_to_overlap.select( @@ -113,8 +100,8 @@ def _overlapping_peaks(credset_to_overlap: DataFrame) -> DataFrame: how="inner", ) .select( - f.col("left.studyLocusId").alias("left_studyLocusId"), - f.col("right.studyLocusId").alias("right_studyLocusId"), + f.col("left.studyLocusId").alias("leftStudyLocusId"), + f.col("right.studyLocusId").alias("rightStudyLocusId"), f.col("left.chromosome").alias("chromosome"), ) .distinct() @@ -124,57 +111,62 @@ def _overlapping_peaks(credset_to_overlap: DataFrame) -> DataFrame: @staticmethod def _align_overlapping_tags( - credset_to_overlap: DataFrame, peak_overlaps: DataFrame + loci_to_overlap: DataFrame, peak_overlaps: DataFrame ) -> StudyLocusOverlap: """Align overlapping tags in pairs of overlapping study-locus, keeping all tags in both loci. Args: - credset_to_overlap (DataFrame): containing `studyLocusId`, `studyType`, `chromosome`, `tagVariantId`, `logABF` and `posteriorProbability` columns. + loci_to_overlap (DataFrame): containing `studyLocusId`, `studyType`, `chromosome`, `tagVariantId`, `logABF` and `posteriorProbability` columns. peak_overlaps (DataFrame): containing `left_studyLocusId`, `right_studyLocusId` and `chromosome` columns. Returns: StudyLocusOverlap: Pairs of overlapping study-locus with aligned tags. """ # Complete information about all tags in the left study-locus of the overlap - overlapping_left = credset_to_overlap.select( + stats_cols = [ + "logABF", + "posteriorProbability", + "beta", + "pValueMantissa", + "pValueExponent", + ] + overlapping_left = loci_to_overlap.select( f.col("chromosome"), f.col("tagVariantId"), - f.col("studyLocusId").alias("left_studyLocusId"), - f.col("logABF").alias("left_logABF"), - f.col("posteriorProbability").alias("left_posteriorProbability"), - ).join(peak_overlaps, on=["chromosome", "left_studyLocusId"], how="inner") + f.col("studyLocusId").alias("leftStudyLocusId"), + *[f.col(col).alias(f"left_{col}") for col in stats_cols], + ).join(peak_overlaps, on=["chromosome", "leftStudyLocusId"], how="inner") # Complete information about all tags in the right study-locus of the overlap - overlapping_right = credset_to_overlap.select( + overlapping_right = loci_to_overlap.select( f.col("chromosome"), f.col("tagVariantId"), - f.col("studyLocusId").alias("right_studyLocusId"), - f.col("logABF").alias("right_logABF"), - f.col("posteriorProbability").alias("right_posteriorProbability"), - ).join(peak_overlaps, on=["chromosome", "right_studyLocusId"], how="inner") + f.col("studyLocusId").alias("rightStudyLocusId"), + *[f.col(col).alias(f"right_{col}") for col in stats_cols], + ).join(peak_overlaps, on=["chromosome", "rightStudyLocusId"], how="inner") # Include information about all tag variants in both study-locus aligned by tag variant id + overlaps = overlapping_left.join( + overlapping_right, + on=[ + "chromosome", + "rightStudyLocusId", + "leftStudyLocusId", + "tagVariantId", + ], + how="outer", + ).select( + "leftStudyLocusId", + "rightStudyLocusId", + "chromosome", + "tagVariantId", + f.struct( + *[f"left_{e}" for e in stats_cols] + [f"right_{e}" for e in stats_cols] + ).alias("statistics"), + ) return StudyLocusOverlap( - _df=overlapping_left.join( - overlapping_right, - on=[ - "chromosome", - "right_studyLocusId", - "left_studyLocusId", - "tagVariantId", - ], - how="outer", - ) - # ensures nullable=false for following columns - .fillna( - value="unknown", - subset=[ - "chromosome", - "right_studyLocusId", - "left_studyLocusId", - "tagVariantId", - ], - ) + _df=overlaps, + _schema=StudyLocusOverlap.get_schema(), ) @staticmethod @@ -198,70 +190,56 @@ def _update_quality_flag( ).otherwise(qc) @staticmethod - def _is_in_credset( - posterior_probability: Column, - credset_probability: float, - ) -> Column: - """Check whether a variant is in the XX% credible set. + def assign_study_locus_id(study_id_col: Column, variant_id_col: Column) -> Column: + """Hashes a column with a variant ID and a study ID to extract a consistent studyLocusId. Args: - posterior_probability (Column): Posterior probability of the tag variant - credset_probability (float): Credible set probability + study_id_col (Column): column name with a study ID + variant_id_col (Column): column name with a variant ID Returns: - Column: Whether the variant is in the specified credible set + Column: column with a study locus ID + + Examples: + >>> df = spark.createDataFrame([("GCST000001", "1_1000_A_C"), ("GCST000002", "1_1000_A_C")]).toDF("studyId", "variantId") + >>> df.withColumn("study_locus_id", StudyLocus.assign_study_locus_id(*[f.col("variantId"), f.col("studyId")])).show() + +----------+----------+--------------------+ + | studyId| variantId| study_locus_id| + +----------+----------+--------------------+ + |GCST000001|1_1000_A_C| 7437284926964690765| + |GCST000002|1_1000_A_C|-7653912547667845377| + +----------+----------+--------------------+ + """ - w_cumlead = Window.orderBy(f.desc(posterior_probability)).rowsBetween( - Window.unboundedPreceding, Window.currentRow - ) - pics_postprob_cumsum = f.sum(posterior_probability).over(w_cumlead) - w_credset = Window.orderBy(pics_postprob_cumsum) - return ( - # If posterior probability is null, credible set flag is False: - f.when(posterior_probability.isNull(), False) - # If the posterior probability meets the criteria the flag is False: - .when( - f.lag(pics_postprob_cumsum, 1).over(w_credset) >= credset_probability, - False, - ).when( - f.lag(pics_postprob_cumsum, 1).over(w_credset) < credset_probability, - True, - ) - # ensures nullable=True: - .otherwise(None) - ) + return f.xxhash64(*[study_id_col, variant_id_col]).alias("studyLocusId") @classmethod - def from_parquet(cls: type[StudyLocus], session: Session, path: str) -> StudyLocus: - """Initialise StudyLocus from parquet file. + def get_schema(cls: type[StudyLocus]) -> StructType: + """Provides the schema for the StudyLocus dataset.""" + return parse_spark_schema("study_locus.json") - Args: - session (Session): spark session - path (str): Path to parquet file - - Returns: - StudyLocus: Study-locus dataset - """ - return super().from_parquet(session, path, cls._schema) - - def credible_set( + def filter_credible_set( self: StudyLocus, - credible_interval: str, + credible_interval: CredibleInterval, ) -> StudyLocus: """Filter study-locus tag variants based on given credible interval. Args: - credible_interval (str): Credible interval to filter for. + credible_interval (CredibleInterval): Credible interval to filter for. Returns: StudyLocus: Filtered study-locus dataset. """ - self.df = self._df.filter( - f.array_contains(f.col(f"credibleSet.{credible_interval}"), True) + self.df = self._df.withColumn( + "locus", + f.filter( + f.col("locus"), + lambda tag: (tag[credible_interval.value]), + ), ) return self - def overlaps(self: StudyLocus, study_index: StudyIndex) -> StudyLocusOverlap: + def find_overlaps(self: StudyLocus, study_index: StudyIndex) -> StudyLocusOverlap: """Calculate overlapping study-locus. Find overlapping study-locus that share at least one tagging variant. All GWAS-GWAS and all GWAS-Molecular traits are computed with the Molecular traits always @@ -273,25 +251,28 @@ def overlaps(self: StudyLocus, study_index: StudyIndex) -> StudyLocusOverlap: Returns: StudyLocusOverlap: Pairs of overlapping study-locus with aligned tags. """ - credset_to_overlap = ( + loci_to_overlap = ( self.df.join(study_index.study_type_lut(), on="studyId", how="inner") - .withColumn("credibleSet", f.explode("credibleSet")) + .withColumn("locus", f.explode("locus")) .select( "studyLocusId", "studyType", "chromosome", - f.col("credibleSet.tagVariantId").alias("tagVariantId"), - f.col("credibleSet.logABF").alias("logABF"), - f.col("credibleSet.posteriorProbability").alias("posteriorProbability"), + f.col("locus.variantId").alias("tagVariantId"), + f.col("locus.logABF").alias("logABF"), + f.col("locus.posteriorProbability").alias("posteriorProbability"), + f.col("locus.pValueMantissa").alias("pValueMantissa"), + f.col("locus.pValueExponent").alias("pValueExponent"), + f.col("locus.beta").alias("beta"), ) .persist() ) # overlapping study-locus - peak_overlaps = self._overlapping_peaks(credset_to_overlap) + peak_overlaps = self._overlapping_peaks(loci_to_overlap) # study-locus overlap by aligning overlapping variants - return self._align_overlapping_tags(credset_to_overlap, peak_overlaps) + return self._align_overlapping_tags(loci_to_overlap, peak_overlaps) def unique_lead_tag_variants(self: StudyLocus) -> DataFrame: """All unique lead and tag variants contained in the `StudyLocus` dataframe. @@ -303,7 +284,7 @@ def unique_lead_tag_variants(self: StudyLocus) -> DataFrame: self.df.select( f.col("variantId"), f.col("chromosome"), - f.explode("credibleSet.tagVariantId").alias("tagVariantId"), + f.explode("ldSet.tagVariantId").alias("tagVariantId"), ) .repartition("chromosome") .persist() @@ -316,35 +297,6 @@ def unique_lead_tag_variants(self: StudyLocus) -> DataFrame: .distinct() ) - def unique_study_locus_ancestries( - self: StudyLocus, studies: StudyIndexGWASCatalog - ) -> DataFrame: - """All unique lead variant and ancestries contained in the `StudyLocus`. - - Args: - studies (StudyIndexGWASCatalog): Metadata about studies in the `StudyLocus`. - - Returns: - DataFrame: unique ["variantId", "studyId", "gnomadPopulation", "chromosome", "relativeSampleSize"] - - Note: - This method is only available for GWAS Catalog studies. - """ - return ( - self.df.join( - studies.get_gnomad_ancestry_sample_sizes(), on="studyId", how="left" - ) - .filter(f.col("position").isNotNull()) - .select( - "variantId", - "studyId", - "gnomadPopulation", - "chromosome", - "relativeSampleSize", - ) - .distinct() - ) - def neglog_pvalue(self: StudyLocus) -> Column: """Returns the negative log p-value. @@ -383,25 +335,50 @@ def get_sentinels(self: StudyLocus) -> DataFrame: def annotate_credible_sets(self: StudyLocus) -> StudyLocus: """Annotate study-locus dataset with credible set flags. + Sorts the array in the `locus` column elements by their `posteriorProbability` values in descending order and adds + `is95CredibleSet` and `is99CredibleSet` fields to the elements, indicating which are the tagging variants whose cumulative sum + of their `posteriorProbability` values is below 0.95 and 0.99, respectively. + Returns: StudyLocus: including annotation on `is95CredibleSet` and `is99CredibleSet`. """ + if "locus" not in self.df.columns: + raise ValueError("Locus column not available.") + self.df = self.df.withColumn( - "credibleSet", - f.transform( - f.col("credibleSet"), - lambda x: x.withField( - CredibleInterval.IS95.value, - StudyLocus._is_in_credset(x.posteriorProbability, 0.95), - ), + # Sort credible set by posterior probability in descending order + "locus", + f.when( + f.col("locus").isNotNull() & (f.size(f.col("locus")) > 0), + order_array_of_structs_by_field("locus", "posteriorProbability"), ), ).withColumn( - "credibleSet", - f.transform( - f.col("credibleSet"), - lambda x: x.withField( - CredibleInterval.IS99.value, - StudyLocus._is_in_credset(x.posteriorProbability, 0.99), + # Calculate array of cumulative sums of posterior probabilities to determine which variants are in the 95% and 99% credible sets + # and zip the cumulative sums array with the credible set array to add the flags + "locus", + f.when( + f.col("locus").isNotNull() & (f.size(f.col("locus")) > 0), + f.zip_with( + f.col("locus"), + f.transform( + f.sequence(f.lit(1), f.size(f.col("locus"))), + lambda index: f.aggregate( + f.slice( + # By using `index - 1` we introduce a value of `0.0` in the cumulative sums array. to ensure that the last variant + # that exceeds the 0.95 threshold is included in the cumulative sum, as its probability is necessary to satisfy the threshold. + f.col("locus.posteriorProbability"), + 1, + index - 1, + ), + f.lit(0.0), + lambda acc, el: acc + el, + ), + ), + lambda struct_e, acc: struct_e.withField( + CredibleInterval.IS95.value, (acc < 0.95) & acc.isNotNull() + ).withField( + CredibleInterval.IS99.value, (acc < 0.99) & acc.isNotNull() + ), ), ), ) @@ -423,14 +400,12 @@ def clump(self: StudyLocus) -> StudyLocus: self.df.variantId, self.df.pValueExponent, self.df.pValueMantissa, - self.df.credibleSet, + self.df.ldSet, ), ) .withColumn( - "credibleSet", - f.when(f.col("is_lead_linked"), f.array()).otherwise( - f.col("credibleSet") - ), + "ldSet", + f.when(f.col("is_lead_linked"), f.array()).otherwise(f.col("ldSet")), ) .withColumn( "qualityControls", @@ -444,1214 +419,40 @@ def clump(self: StudyLocus) -> StudyLocus: ) return self - -class StudyLocusGWASCatalog(StudyLocus): - """Study-locus dataset derived from GWAS Catalog.""" - - @staticmethod - def _parse_pvalue(pvalue: Column) -> tuple[Column, Column]: - """Parse p-value column. - - Args: - pvalue (Column): p-value [string] - - Returns: - tuple[Column, Column]: p-value mantissa and exponent - - Example: - >>> import pyspark.sql.types as t - >>> d = [("1.0"), ("0.5"), ("1E-20"), ("3E-3"), ("1E-1000")] - >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.select('value',*StudyLocusGWASCatalog._parse_pvalue(f.col('value'))).show() - +-------+--------------+--------------+ - | value|pValueMantissa|pValueExponent| - +-------+--------------+--------------+ - | 1.0| 1.0| 1| - | 0.5| 0.5| 1| - | 1E-20| 1.0| -20| - | 3E-3| 3.0| -3| - |1E-1000| 1.0| -1000| - +-------+--------------+--------------+ - - - """ - split = f.split(pvalue, "E") - return split.getItem(0).cast("float").alias("pValueMantissa"), f.coalesce( - split.getItem(1).cast("integer"), f.lit(1) - ).alias("pValueExponent") - - @staticmethod - def _normalise_pvaluetext(p_value_text: Column) -> Column: - """Normalised p-value text column to a standardised format. - - Args: - p_value_text (Column): `pValueText` column from GWASCatalog - - Returns: - Column: mapped using GWAS Catalog mapping - - Example: - >>> import pyspark.sql.types as t - >>> d = [("European Ancestry"), ("African ancestry"), ("Alzheimer’s Disease")] - >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.withColumn('normalised', StudyLocusGWASCatalog._normalise_pvaluetext(f.col('value'))).show() - +-------------------+----------+ - | value|normalised| - +-------------------+----------+ - | European Ancestry| [EA]| - | African ancestry| [AA]| - |Alzheimer’s Disease| [AD]| - +-------------------+----------+ - - - """ - # GWAS Catalog to p-value mapping - json_dict = json.loads( - pkg_resources.read_text(data, "gwas_pValueText_map.json", encoding="utf-8") - ) - map_expr = f.create_map(*[f.lit(x) for x in chain(*json_dict.items())]) - - splitted_col = f.split(f.regexp_replace(p_value_text, r"[\(\)]", ""), ",") - return f.transform(splitted_col, lambda x: map_expr[x]) - - @staticmethod - def _normalise_risk_allele(risk_allele: Column) -> Column: - """Normalised risk allele column to a standardised format. - - If multiple risk alleles are present, the first one is returned. - - Args: - risk_allele (Column): `riskAllele` column from GWASCatalog - - Returns: - Column: mapped using GWAS Catalog mapping - - Example: - >>> import pyspark.sql.types as t - >>> d = [("rs1234-A-G"), ("rs1234-A"), ("rs1234-A; rs1235-G")] - >>> df = spark.createDataFrame(d, t.StringType()) - >>> df.withColumn('normalised', StudyLocusGWASCatalog._normalise_risk_allele(f.col('value'))).show() - +------------------+----------+ - | value|normalised| - +------------------+----------+ - | rs1234-A-G| A| - | rs1234-A| A| - |rs1234-A; rs1235-G| A| - +------------------+----------+ - - - """ - # GWAS Catalog to risk allele mapping - return f.split(f.split(risk_allele, "; ").getItem(0), "-").getItem(1) - - @staticmethod - def _collect_rsids( - snp_id: Column, snp_id_current: Column, risk_allele: Column - ) -> Column: - """It takes three columns, and returns an array of distinct values from those columns. - - Args: - snp_id (Column): The original snp id from the GWAS catalog. - snp_id_current (Column): The current snp id field is just a number at the moment (stored as a string). Adding 'rs' prefix if looks good. - risk_allele (Column): The risk allele for the SNP. - - Returns: - An array of distinct values. - """ - # The current snp id field is just a number at the moment (stored as a string). Adding 'rs' prefix if looks good. - snp_id_current = f.when( - snp_id_current.rlike("^[0-9]*$"), - f.format_string("rs%s", snp_id_current), - ) - # Cleaning risk allele: - risk_allele = f.split(risk_allele, "-").getItem(0) - - # Collecting all values: - return f.array_distinct(f.array(snp_id, snp_id_current, risk_allele)) - - @staticmethod - def _map_to_variant_annotation_variants( - gwas_associations: DataFrame, variant_annotation: VariantAnnotation - ) -> DataFrame: - """Add variant metadata in associations. - - Args: - gwas_associations (DataFrame): raw GWAS Catalog associations - variant_annotation (VariantAnnotation): variant annotation dataset - - Returns: - DataFrame: GWAS Catalog associations data including `variantId`, `referenceAllele`, - `alternateAllele`, `chromosome`, `position` with variant metadata - """ - # Subset of GWAS Catalog associations required for resolving variant IDs: - gwas_associations_subset = gwas_associations.select( - "studyLocusId", - f.col("CHR_ID").alias("chromosome"), - f.col("CHR_POS").alias("position"), - # List of all SNPs associated with the variant - StudyLocusGWASCatalog._collect_rsids( - f.split(f.col("SNPS"), "; ").getItem(0), - f.col("SNP_ID_CURRENT"), - f.split(f.col("STRONGEST SNP-RISK ALLELE"), "; ").getItem(0), - ).alias("rsIdsGwasCatalog"), - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ).alias("riskAllele"), - ) - - # Subset of variant annotation required for GWAS Catalog annotations: - va_subset = variant_annotation.df.select( - "variantId", - "chromosome", - "position", - f.col("rsIds").alias("rsIdsGnomad"), - "referenceAllele", - "alternateAllele", - "alleleFrequencies", - variant_annotation.max_maf().alias("maxMaf"), - ).join( - f.broadcast( - gwas_associations_subset.select("chromosome", "position").distinct() - ), - on=["chromosome", "position"], - how="inner", - ) - - # Semi-resolved ids (still contains duplicates when conclusion was not possible to make - # based on rsIds or allele concordance) - filtered_associations = gwas_associations_subset.join( - f.broadcast(va_subset), - on=["chromosome", "position"], - how="left", - ).filter( - # Filter out rows where GWAS Catalog rsId does not match with GnomAD rsId, - # but there is corresponding variant for the same association - StudyLocusGWASCatalog._flag_mappings_to_retain( - f.col("studyLocusId"), - StudyLocusGWASCatalog._compare_rsids( - f.col("rsIdsGnomad"), f.col("rsIdsGwasCatalog") - ), - ) - # or filter out rows where GWAS Catalog alleles are not concordant with GnomAD alleles, - # but there is corresponding variant for the same association - | StudyLocusGWASCatalog._flag_mappings_to_retain( - f.col("studyLocusId"), - StudyLocusGWASCatalog._check_concordance( - f.col("riskAllele"), - f.col("referenceAllele"), - f.col("alternateAllele"), - ), - ) - ) - - # Keep only highest maxMaf variant per studyLocusId - fully_mapped_associations = get_record_with_maximum_value( - filtered_associations, grouping_col="studyLocusId", sorting_col="maxMaf" - ).select( - "studyLocusId", - "variantId", - "referenceAllele", - "alternateAllele", - "chromosome", - "position", - ) - - return gwas_associations.join( - fully_mapped_associations, on="studyLocusId", how="left" - ) - - @staticmethod - def _compare_rsids(gnomad: Column, gwas: Column) -> Column: - """If the intersection of the two arrays is greater than 0, return True, otherwise return False. - - Args: - gnomad (Column): rsids from gnomad - gwas (Column): rsids from the GWAS Catalog - - Returns: - A boolean column that is true if the GnomAD rsIDs can be found in the GWAS rsIDs. - - Examples: - >>> d = [ - ... (1, ["rs123", "rs523"], ["rs123"]), - ... (2, [], ["rs123"]), - ... (3, ["rs123", "rs523"], []), - ... (4, [], []), - ... ] - >>> df = spark.createDataFrame(d, ['associationId', 'gnomad', 'gwas']) - >>> df.withColumn("rsid_matches", StudyLocusGWASCatalog._compare_rsids(f.col("gnomad"),f.col('gwas'))).show() - +-------------+--------------+-------+------------+ - |associationId| gnomad| gwas|rsid_matches| - +-------------+--------------+-------+------------+ - | 1|[rs123, rs523]|[rs123]| true| - | 2| []|[rs123]| false| - | 3|[rs123, rs523]| []| false| - | 4| []| []| false| - +-------------+--------------+-------+------------+ - - - """ - return f.when(f.size(f.array_intersect(gnomad, gwas)) > 0, True).otherwise( - False - ) - - @staticmethod - def _flag_mappings_to_retain( - association_id: Column, filter_column: Column - ) -> Column: - """Flagging mappings to drop for each association. - - Some associations have multiple mappings. Some has matching rsId others don't. We only - want to drop the non-matching mappings, when a matching is available for the given association. - This logic can be generalised for other measures eg. allele concordance. - - Args: - association_id (Column): association identifier column - filter_column (Column): boolean col indicating to keep a mapping - - Returns: - A column with a boolean value. - - Examples: - >>> d = [ - ... (1, False), - ... (1, False), - ... (2, False), - ... (2, True), - ... (3, True), - ... (3, True), - ... ] - >>> df = spark.createDataFrame(d, ['associationId', 'filter']) - >>> df.withColumn("isConcordant", StudyLocusGWASCatalog._flag_mappings_to_retain(f.col("associationId"),f.col('filter'))).show() - +-------------+------+------------+ - |associationId|filter|isConcordant| - +-------------+------+------------+ - | 1| false| true| - | 1| false| true| - | 3| true| true| - | 3| true| true| - | 2| false| false| - | 2| true| true| - +-------------+------+------------+ - - - """ - w = Window.partitionBy(association_id) - - # Generating a boolean column informing if the filter column contains true anywhere for the association: - aggregated_filter = f.when( - f.array_contains(f.collect_set(filter_column).over(w), True), True - ).otherwise(False) - - # Generate a filter column: - return f.when(aggregated_filter & (~filter_column), False).otherwise(True) - - @staticmethod - def _check_concordance( - risk_allele: Column, reference_allele: Column, alternate_allele: Column - ) -> Column: - """A function to check if the risk allele is concordant with the alt or ref allele. - - If the risk allele is the same as the reference or alternate allele, or if the reverse complement of - the risk allele is the same as the reference or alternate allele, then the allele is concordant. - If no mapping is available (ref/alt is null), the function returns True. - - Args: - risk_allele (Column): The allele that is associated with the risk of the disease. - reference_allele (Column): The reference allele from the GWAS catalog - alternate_allele (Column): The alternate allele of the variant. - - Returns: - A boolean column that is True if the risk allele is the same as the reference or alternate allele, - or if the reverse complement of the risk allele is the same as the reference or alternate allele. - - Examples: - >>> d = [ - ... ('A', 'A', 'G'), - ... ('A', 'T', 'G'), - ... ('A', 'C', 'G'), - ... ('A', 'A', '?'), - ... (None, None, 'A'), - ... ] - >>> df = spark.createDataFrame(d, ['riskAllele', 'referenceAllele', 'alternateAllele']) - >>> df.withColumn("isConcordant", StudyLocusGWASCatalog._check_concordance(f.col("riskAllele"),f.col('referenceAllele'), f.col('alternateAllele'))).show() - +----------+---------------+---------------+------------+ - |riskAllele|referenceAllele|alternateAllele|isConcordant| - +----------+---------------+---------------+------------+ - | A| A| G| true| - | A| T| G| true| - | A| C| G| false| - | A| A| ?| true| - | null| null| A| true| - +----------+---------------+---------------+------------+ - - - """ - # Calculating the reverse complement of the risk allele: - risk_allele_reverse_complement = f.when( - risk_allele.rlike(r"^[ACTG]+$"), - f.reverse(f.translate(risk_allele, "ACTG", "TGAC")), - ).otherwise(risk_allele) - - # OK, is the risk allele or the reverse complent is the same as the mapped alleles: - return ( - f.when( - (risk_allele == reference_allele) | (risk_allele == alternate_allele), - True, - ) - # If risk allele is found on the negative strand: - .when( - (risk_allele_reverse_complement == reference_allele) - | (risk_allele_reverse_complement == alternate_allele), - True, - ) - # If risk allele is ambiguous, still accepted: < This condition could be reconsidered - .when(risk_allele == "?", True) - # If the association could not be mapped we keep it: - .when(reference_allele.isNull(), True) - # Allele is discordant: - .otherwise(False) - ) - - @staticmethod - def _get_reverse_complement(allele_col: Column) -> Column: - """A function to return the reverse complement of an allele column. - - It takes a string and returns the reverse complement of that string if it's a DNA sequence, - otherwise it returns the original string. Assumes alleles in upper case. - - Args: - allele_col (Column): The column containing the allele to reverse complement. - - Returns: - A column that is the reverse complement of the allele column. - - Examples: - >>> d = [{"allele": 'A'}, {"allele": 'T'},{"allele": 'G'}, {"allele": 'C'},{"allele": 'AC'}, {"allele": 'GTaatc'},{"allele": '?'}, {"allele": None}] - >>> df = spark.createDataFrame(d) - >>> df.withColumn("revcom_allele", StudyLocusGWASCatalog._get_reverse_complement(f.col("allele"))).show() - +------+-------------+ - |allele|revcom_allele| - +------+-------------+ - | A| T| - | T| A| - | G| C| - | C| G| - | AC| GT| - |GTaatc| GATTAC| - | ?| null| - | null| null| - +------+-------------+ - - - """ - allele_col = f.upper(allele_col) - return ( - f.when( - allele_col.rlike("[ACTG]+"), - f.reverse(f.translate(allele_col, "ACTG", "TGAC")), - ) - .otherwise(f.lit(None)) - .alias("reverse_complement_allele") - ) - - @staticmethod - def _effect_needs_harmonisation( - risk_allele: Column, reference_allele: Column - ) -> Column: - """A function to check if the effect allele needs to be harmonised. - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Effect allele column - - Returns: - A boolean column indicating if the effect allele needs to be harmonised. - - Examples: - >>> d = [{"risk": 'A', "reference": 'A'}, {"risk": 'A', "reference": 'T'}, {"risk": 'AT', "reference": 'TA'}, {"risk": 'AT', "reference": 'AT'}] - >>> df = spark.createDataFrame(d) - >>> df.withColumn("needs_harmonisation", StudyLocusGWASCatalog._effect_needs_harmonisation(f.col("risk"), f.col("reference"))).show() - +---------+----+-------------------+ - |reference|risk|needs_harmonisation| - +---------+----+-------------------+ - | A| A| true| - | T| A| true| - | TA| AT| false| - | AT| AT| true| - +---------+----+-------------------+ - - - """ - return (risk_allele == reference_allele) | ( - risk_allele - == StudyLocusGWASCatalog._get_reverse_complement(reference_allele) - ) - - @staticmethod - def _are_alleles_palindromic( - reference_allele: Column, alternate_allele: Column - ) -> Column: - """A function to check if the alleles are palindromic. - - Args: - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - - Returns: - A boolean column indicating if the alleles are palindromic. - - Examples: - >>> d = [{"reference": 'A', "alternate": 'T'}, {"reference": 'AT', "alternate": 'AG'}, {"reference": 'AT', "alternate": 'AT'}, {"reference": 'CATATG', "alternate": 'CATATG'}, {"reference": '-', "alternate": None}] - >>> df = spark.createDataFrame(d) - >>> df.withColumn("is_palindromic", StudyLocusGWASCatalog._are_alleles_palindromic(f.col("reference"), f.col("alternate"))).show() - +---------+---------+--------------+ - |alternate|reference|is_palindromic| - +---------+---------+--------------+ - | T| A| true| - | AG| AT| false| - | AT| AT| true| - | CATATG| CATATG| true| - | null| -| false| - +---------+---------+--------------+ - - - """ - revcomp = StudyLocusGWASCatalog._get_reverse_complement(alternate_allele) - return ( - f.when(reference_allele == revcomp, True) - .when(revcomp.isNull(), False) - .otherwise(False) - ) - - @staticmethod - def _pval_to_zscore(pval_col: Column) -> Column: - """Convert p-value column to z-score column. - - Args: - pval_col (Column): pvalues to be casted to floats. - - Returns: - Column: p-values transformed to z-scores - - Examples: - >>> d = [{"id": "t1", "pval": "1"}, {"id": "t2", "pval": "0.9"}, {"id": "t3", "pval": "0.05"}, {"id": "t4", "pval": "1e-300"}, {"id": "t5", "pval": "1e-1000"}, {"id": "t6", "pval": "NA"}] - >>> df = spark.createDataFrame(d) - >>> df.withColumn("zscore", StudyLocusGWASCatalog._pval_to_zscore(f.col("pval"))).show() - +---+-------+----------+ - | id| pval| zscore| - +---+-------+----------+ - | t1| 1| 0.0| - | t2| 0.9|0.12566137| - | t3| 0.05| 1.959964| - | t4| 1e-300| 37.537838| - | t5|1e-1000| 37.537838| - | t6| NA| null| - +---+-------+----------+ - - - """ - pvalue_float = pval_col.cast(t.FloatType()) - pvalue_nozero = f.when(pvalue_float == 0, sys.float_info.min).otherwise( - pvalue_float - ) - return f.udf( - lambda pv: float(abs(norm.ppf((float(pv)) / 2))) if pv else None, - t.FloatType(), - )(pvalue_nozero) - - @staticmethod - def _harmonise_beta( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, - effect_size: Column, - confidence_interval: Column, - ) -> Column: - """A function to extract the beta value from the effect size and confidence interval. - - If the confidence interval contains the word "increase" or "decrease" it indicates, we are dealing with betas. - If it's "increase" and the effect size needs to be harmonized, then multiply the effect size by -1 - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column - - Returns: - A column containing the beta value. - """ - return f.when( - StudyLocusGWASCatalog._are_alleles_palindromic( - reference_allele, alternate_allele - ), - None, - ).otherwise( - f.when( - ( - StudyLocusGWASCatalog._effect_needs_harmonisation( - risk_allele, reference_allele - ) - & confidence_interval.contains("increase") - ) - | ( - ~StudyLocusGWASCatalog._effect_needs_harmonisation( - risk_allele, reference_allele - ) - & confidence_interval.contains("decrease") - ), - -effect_size, - ).otherwise(effect_size) - ) - - @staticmethod - def _harmonise_beta_ci( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, - effect_size: Column, - confidence_interval: Column, - p_value: Column, - direction: str, - ) -> Column: - """Calculating confidence intervals for beta values. - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column - p_value (Column): GWAS Catalog p-value column - direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". - - Returns: - The upper and lower bounds of the confidence interval for the beta coefficient. - """ - zscore_95 = f.lit(1.96) - beta = StudyLocusGWASCatalog._harmonise_beta( - risk_allele, - reference_allele, - alternate_allele, - effect_size, - confidence_interval, - ) - zscore = StudyLocusGWASCatalog._pval_to_zscore(p_value) - return ( - f.when(f.lit(direction) == "upper", beta + f.abs(zscore_95 * beta) / zscore) - .when(f.lit(direction) == "lower", beta - f.abs(zscore_95 * beta) / zscore) - .otherwise(None) - ) - - @staticmethod - def _harmonise_odds_ratio( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, - effect_size: Column, - confidence_interval: Column, - ) -> Column: - """Harmonizing odds ratio. - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column - - Returns: - A column with the odds ratio, or 1/odds_ratio if harmonization required. - """ - return f.when( - StudyLocusGWASCatalog._are_alleles_palindromic( - reference_allele, alternate_allele - ), - None, - ).otherwise( - f.when( - ( - StudyLocusGWASCatalog._effect_needs_harmonisation( - risk_allele, reference_allele - ) - & ~confidence_interval.rlike("|".join(["decrease", "increase"])) - ), - 1 / effect_size, - ).otherwise(effect_size) - ) - - @staticmethod - def _harmonise_odds_ratio_ci( - risk_allele: Column, - reference_allele: Column, - alternate_allele: Column, - effect_size: Column, - confidence_interval: Column, - p_value: Column, - direction: str, - ) -> Column: - """Calculating confidence intervals for beta values. - - Args: - risk_allele (Column): Risk allele column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - effect_size (Column): GWAS Catalog effect size column - confidence_interval (Column): GWAS Catalog confidence interval column - p_value (Column): GWAS Catalog p-value column - direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". - - Returns: - The upper and lower bounds of the 95% confidence interval for the odds ratio. - """ - zscore_95 = f.lit(1.96) - odds_ratio = StudyLocusGWASCatalog._harmonise_odds_ratio( - risk_allele, - reference_allele, - alternate_allele, - effect_size, - confidence_interval, - ) - odds_ratio_estimate = f.log(odds_ratio) - zscore = StudyLocusGWASCatalog._pval_to_zscore(p_value) - odds_ratio_se = odds_ratio_estimate / zscore - return f.when( - f.lit(direction) == "upper", - f.exp(odds_ratio_estimate + f.abs(zscore_95 * odds_ratio_se)), - ).when( - f.lit(direction) == "lower", - f.exp(odds_ratio_estimate - f.abs(zscore_95 * odds_ratio_se)), - ) - - @staticmethod - def _concatenate_substudy_description( - association_trait: Column, pvalue_text: Column, mapped_trait_uri: Column - ) -> Column: - """Substudy description parsing. Complex string containing metadata about the substudy (e.g. QTL, specific EFO, etc.). - - Args: - association_trait (Column): GWAS Catalog association trait column - pvalue_text (Column): GWAS Catalog p-value text column - mapped_trait_uri (Column): GWAS Catalog mapped trait URI column - - Returns: - A column with the substudy description in the shape EFO1_EFO2|pvaluetext1_pvaluetext2. - - Examples: - >>> d = {'association_trait': 'Height', 'pvalue_text': 'European Ancestry', 'mapped_trait_uri': 'http://www.ebi.ac.uk/efo/EFO_0000408'} - >>> df = spark.createDataFrame([d]) - >>> df.withColumn('substudy_description', StudyLocusGWASCatalog._concatenate_substudy_description(df.association_trait, df.pvalue_text, df.mapped_trait_uri)).show(truncate = False) - +-----------------+------------------------------------+-----------------+---------------------+ - |association_trait|mapped_trait_uri |pvalue_text |substudy_description | - +-----------------+------------------------------------+-----------------+---------------------+ - |Height |http://www.ebi.ac.uk/efo/EFO_0000408|European Ancestry|Height|EA|EFO_0000408| - +-----------------+------------------------------------+-----------------+---------------------+ - - - """ - return f.concat_ws( - "|", - association_trait, - f.concat_ws( - "_", - StudyLocusGWASCatalog._normalise_pvaluetext(pvalue_text), - ), - f.concat_ws( - "_", - parse_efos(mapped_trait_uri), - ), - ) - - @staticmethod - def _qc_all( - qc: Column, - chromosome: Column, - position: Column, - reference_allele: Column, - alternate_allele: Column, - strongest_snp_risk_allele: Column, - p_value_mantissa: Column, - p_value_exponent: Column, - p_value_cutoff: float, - ) -> Column: - """Flag associations that fail any QC. - - Args: - qc (Column): QC column - chromosome (Column): Chromosome column - position (Column): Position column - reference_allele (Column): Reference allele column - alternate_allele (Column): Alternate allele column - strongest_snp_risk_allele (Column): Strongest SNP risk allele column - p_value_mantissa (Column): P-value mantissa column - p_value_exponent (Column): P-value exponent column - p_value_cutoff (float): P-value cutoff - - Returns: - Column: Updated QC column with flag. - """ - qc = StudyLocusGWASCatalog._qc_variant_interactions( - qc, strongest_snp_risk_allele - ) - qc = StudyLocusGWASCatalog._qc_subsignificant_associations( - qc, p_value_mantissa, p_value_exponent, p_value_cutoff - ) - qc = StudyLocusGWASCatalog._qc_genomic_location(qc, chromosome, position) - qc = StudyLocusGWASCatalog._qc_variant_inconsistencies( - qc, chromosome, position, strongest_snp_risk_allele - ) - qc = StudyLocusGWASCatalog._qc_unmapped_variants(qc, alternate_allele) - qc = StudyLocusGWASCatalog._qc_palindromic_alleles( - qc, reference_allele, alternate_allele - ) - return qc - - @staticmethod - def _qc_variant_interactions( - qc: Column, strongest_snp_risk_allele: Column - ) -> Column: - """Flag associations based on variant x variant interactions. - - Args: - qc (Column): QC column - strongest_snp_risk_allele (Column): Column with the strongest SNP risk allele - - Returns: - Column: Updated QC column with flag. - """ - return StudyLocusGWASCatalog._update_quality_flag( - qc, - strongest_snp_risk_allele.contains(";"), - StudyLocusQualityCheck.COMPOSITE_FLAG, - ) - - @staticmethod - def _qc_subsignificant_associations( - qc: Column, - p_value_mantissa: Column, - p_value_exponent: Column, - pvalue_cutoff: float, - ) -> Column: - """Flag associations below significant threshold. - - Args: - qc (Column): QC column - p_value_mantissa (Column): P-value mantissa column - p_value_exponent (Column): P-value exponent column - pvalue_cutoff (float): association p-value cut-off - - Returns: - Column: Updated QC column with flag. - - Examples: - >>> import pyspark.sql.types as t - >>> d = [{'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -7}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 5, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -9}] - >>> df = spark.createDataFrame(d, t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('p_value_mantissa', t.IntegerType()), t.StructField('p_value_exponent', t.IntegerType())])) - >>> df.withColumn('qc', StudyLocusGWASCatalog._qc_subsignificant_associations(f.col("qc"), f.col("p_value_mantissa"), f.col("p_value_exponent"), 5e-8)).show(truncate = False) - +------------------------+----------------+----------------+ - |qc |p_value_mantissa|p_value_exponent| - +------------------------+----------------+----------------+ - |[Subsignificant p-value]|1 |-7 | - |[] |1 |-8 | - |[] |5 |-8 | - |[] |1 |-9 | - +------------------------+----------------+----------------+ - - - """ - return StudyLocus._update_quality_flag( - qc, - calculate_neglog_pvalue(p_value_mantissa, p_value_exponent) - < f.lit(-np.log10(pvalue_cutoff)), - StudyLocusQualityCheck.SUBSIGNIFICANT_FLAG, - ) - - @staticmethod - def _qc_genomic_location( - qc: Column, chromosome: Column, position: Column - ) -> Column: - """Flag associations without genomic location in GWAS Catalog. - - Args: - qc (Column): QC column - chromosome (Column): Chromosome column in GWAS Catalog - position (Column): Position column in GWAS Catalog - - Returns: - Column: Updated QC column with flag. - - Examples: - >>> import pyspark.sql.types as t - >>> d = [{'qc': None, 'chromosome': None, 'position': None}, {'qc': None, 'chromosome': '1', 'position': None}, {'qc': None, 'chromosome': None, 'position': 1}, {'qc': None, 'chromosome': '1', 'position': 1}] - >>> df = spark.createDataFrame(d, schema=t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('chromosome', t.StringType()), t.StructField('position', t.IntegerType())])) - >>> df.withColumn('qc', StudyLocusGWASCatalog._qc_genomic_location(df.qc, df.chromosome, df.position)).show(truncate=False) - +----------------------------+----------+--------+ - |qc |chromosome|position| - +----------------------------+----------+--------+ - |[Incomplete genomic mapping]|null |null | - |[Incomplete genomic mapping]|1 |null | - |[Incomplete genomic mapping]|null |1 | - |[] |1 |1 | - +----------------------------+----------+--------+ - - - """ - return StudyLocus._update_quality_flag( - qc, - position.isNull() | chromosome.isNull(), - StudyLocusQualityCheck.NO_GENOMIC_LOCATION_FLAG, - ) - - @staticmethod - def _qc_variant_inconsistencies( - qc: Column, - chromosome: Column, - position: Column, - strongest_snp_risk_allele: Column, - ) -> Column: - """Flag associations with inconsistencies in the variant annotation. - - Args: - qc (Column): QC column - chromosome (Column): Chromosome column in GWAS Catalog - position (Column): Position column in GWAS Catalog - strongest_snp_risk_allele (Column): Strongest SNP risk allele column in GWAS Catalog - - Returns: - Column: Updated QC column with flag. - """ - return StudyLocusGWASCatalog._update_quality_flag( - qc, - # Number of chromosomes does not correspond to the number of positions: - (f.size(f.split(chromosome, ";")) != f.size(f.split(position, ";"))) - # NUmber of chromosome values different from riskAllele values: - | ( - f.size(f.split(chromosome, ";")) - != f.size(f.split(strongest_snp_risk_allele, ";")) - ), - StudyLocusQualityCheck.INCONSISTENCY_FLAG, - ) - - @staticmethod - def _qc_unmapped_variants(qc: Column, alternate_allele: Column) -> Column: - """Flag associations with variants not mapped to variantAnnotation. - - Args: - qc (Column): QC column - alternate_allele (Column): alternate allele - - Returns: - Column: Updated QC column with flag. - - Example: - >>> import pyspark.sql.types as t - >>> d = [{'alternate_allele': 'A', 'qc': None}, {'alternate_allele': None, 'qc': None}] - >>> schema = t.StructType([t.StructField('alternate_allele', t.StringType(), True), t.StructField('qc', t.ArrayType(t.StringType()), True)]) - >>> df = spark.createDataFrame(data=d, schema=schema) - >>> df.withColumn("new_qc", StudyLocusGWASCatalog._qc_unmapped_variants(f.col("qc"), f.col("alternate_allele"))).show() - +----------------+----+--------------------+ - |alternate_allele| qc| new_qc| - +----------------+----+--------------------+ - | A|null| []| - | null|null|[No mapping in Gn...| - +----------------+----+--------------------+ - - - """ - return StudyLocus._update_quality_flag( - qc, - alternate_allele.isNull(), - StudyLocusQualityCheck.NON_MAPPED_VARIANT_FLAG, - ) - - @staticmethod - def _qc_palindromic_alleles( - qc: Column, reference_allele: Column, alternate_allele: Column - ) -> Column: - """Flag associations with palindromic variants which effects can not be harmonised. - - Args: - qc (Column): QC column - reference_allele (Column): reference allele - alternate_allele (Column): alternate allele - - Returns: - Column: Updated QC column with flag. - - Example: - >>> import pyspark.sql.types as t - >>> schema = t.StructType([t.StructField('reference_allele', t.StringType(), True), t.StructField('alternate_allele', t.StringType(), True), t.StructField('qc', t.ArrayType(t.StringType()), True)]) - >>> d = [{'reference_allele': 'A', 'alternate_allele': 'T', 'qc': None}, {'reference_allele': 'AT', 'alternate_allele': 'TA', 'qc': None}, {'reference_allele': 'AT', 'alternate_allele': 'AT', 'qc': None}] - >>> df = spark.createDataFrame(data=d, schema=schema) - >>> df.withColumn("qc", StudyLocusGWASCatalog._qc_palindromic_alleles(f.col("qc"), f.col("reference_allele"), f.col("alternate_allele"))).show(truncate=False) - +----------------+----------------+---------------------------------------+ - |reference_allele|alternate_allele|qc | - +----------------+----------------+---------------------------------------+ - |A |T |[Palindrome alleles - cannot harmonize]| - |AT |TA |[] | - |AT |AT |[Palindrome alleles - cannot harmonize]| - +----------------+----------------+---------------------------------------+ - - - """ - return StudyLocus._update_quality_flag( - qc, - StudyLocusGWASCatalog._are_alleles_palindromic( - reference_allele, alternate_allele - ), - StudyLocusQualityCheck.PALINDROMIC_ALLELE_FLAG, - ) - - @classmethod - def from_source( - cls: type[StudyLocusGWASCatalog], - gwas_associations: DataFrame, - variant_annotation: VariantAnnotation, - pvalue_threshold: float = 5e-8, - ) -> StudyLocusGWASCatalog: - """Read GWASCatalog associations. - - It reads the GWAS Catalog association dataset, selects and renames columns, casts columns, and - applies some pre-defined filters on the data: - - Args: - gwas_associations (DataFrame): GWAS Catalog raw associations dataset - variant_annotation (VariantAnnotation): Variant annotation dataset - pvalue_threshold (float): P-value threshold for flagging associations - - Returns: - StudyLocusGWASCatalog: StudyLocusGWASCatalog dataset - """ - return cls( - _df=gwas_associations.withColumn( - "studyLocusId", get_study_locus_id("variantId", "studyId") - ) - .transform( - # Map/harmonise variants to variant annotation dataset: - # This function adds columns: variantId, referenceAllele, alternateAllele, chromosome, position - lambda df: StudyLocusGWASCatalog._map_to_variant_annotation_variants( - df, variant_annotation - ) - ) - .withColumn( - # Perform all quality control checks: - "qualityControls", - StudyLocusGWASCatalog._qc_all( - f.array().alias("qualityControls"), - f.col("CHR_ID"), - f.col("CHR_POS"), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("STRONGEST SNP-RISK ALLELE"), - *StudyLocusGWASCatalog._parse_pvalue(f.col("P-VALUE")), - pvalue_threshold, - ), - ) - .select( - # INSIDE STUDY-LOCUS SCHEMA: - "studyLocusId", - "variantId", - # Mapped genomic location of the variant (; separated list) - "chromosome", - "position", - f.col("STUDY ACCESSION").alias("studyId"), - # beta value of the association - StudyLocusGWASCatalog._harmonise_beta( - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - ).alias("beta"), - # odds ratio of the association - StudyLocusGWASCatalog._harmonise_odds_ratio( - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - ).alias("oddsRatio"), - # CI lower of the beta value - StudyLocusGWASCatalog._harmonise_beta_ci( - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "lower", - ).alias("betaConfidenceIntervalLower"), - # CI upper for the beta value - StudyLocusGWASCatalog._harmonise_beta_ci( - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "upper", - ).alias("betaConfidenceIntervalUpper"), - # CI lower of the odds ratio value - StudyLocusGWASCatalog._harmonise_odds_ratio_ci( - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "lower", - ).alias("oddsRatioConfidenceIntervalLower"), - # CI upper of the odds ratio value - StudyLocusGWASCatalog._harmonise_odds_ratio_ci( - StudyLocusGWASCatalog._normalise_risk_allele( - f.col("STRONGEST SNP-RISK ALLELE") - ), - f.col("referenceAllele"), - f.col("alternateAllele"), - f.col("OR or BETA"), - f.col("95% CI (TEXT)"), - f.col("P-VALUE"), - "upper", - ).alias("oddsRatioConfidenceIntervalUpper"), - # p-value of the association, string: split into exponent and mantissa. - *StudyLocusGWASCatalog._parse_pvalue(f.col("P-VALUE")), - # Capturing phenotype granularity at the association level - StudyLocusGWASCatalog._concatenate_substudy_description( - f.col("DISEASE/TRAIT"), - f.col("P-VALUE (TEXT)"), - f.col("MAPPED_TRAIT_URI"), - ).alias("subStudyDescription"), - # Quality controls (array of strings) - "qualityControls", - ) - ) - - def update_study_id( - self: StudyLocusGWASCatalog, study_annotation: DataFrame - ) -> StudyLocusGWASCatalog: - """Update studyId with a dataframe containing study. - - Args: - study_annotation (DataFrame): Dataframe containing `updatedStudyId` and key columns `studyId` and `subStudyDescription`. - - Returns: - StudyLocusGWASCatalog: Updated study locus. - """ - self.df = ( - self._df.join( - study_annotation, on=["studyId", "subStudyDescription"], how="left" - ) - .withColumn("studyId", f.coalesce("updatedStudyId", "studyId")) - .drop("updatedStudyId") - ) - return self - - def annotate_ld( - self: StudyLocusGWASCatalog, - session: Session, - studies: StudyIndexGWASCatalog, - ld_populations: list[str], - ld_index_template: str, - ld_matrix_template: str, - min_r2: float, + def _qc_unresolved_ld( + self: StudyLocus, ) -> StudyLocus: - """Annotate LD set for every studyLocus using gnomAD. - - Args: - session (Session): Session - studies (StudyIndexGWASCatalog): Study index containing ancestry information - ld_populations (list[str]): List of populations to annotate - ld_index_template (str): Template path of the LD matrix index containing `{POP}` where the population is expected - ld_matrix_template (str): Template path of the LD matrix containing `{POP}` where the population is expected - min_r2 (float): Minimum r2 to include in the LD set - - Returns: - StudyLocus: Study-locus with an annotated credible set. - """ - # LD annotation for all unique lead variants in all populations (study independent). - ld_r = LDAnnotatorGnomad.ld_annotation_by_locus_ancestry( - session, - self, - studies, - ld_populations, - ld_index_template, - ld_matrix_template, - min_r2, - ) - - # Study-locus ld_set - ld_set = ( - self.unique_study_locus_ancestries(studies) - .join(ld_r, on=["chromosome", "variantId", "gnomadPopulation"], how="left") - .withColumn( - "r2Overall", - LDAnnotatorGnomad.weighted_r_overall( - f.col("chromosome"), - f.col("studyId"), - f.col("variantId"), - f.col("tagVariantId"), - f.col("relativeSampleSize"), - f.col("r"), - ), - ) - .groupBy("chromosome", "studyId", "variantId") - .agg( - f.collect_set(f.struct("tagVariantId", "r2Overall")).alias( - "credibleSet" - ) - ) - ) - - self.df = self.df.join( - ld_set, on=["chromosome", "studyId", "variantId"], how="left" - ) - - return self._qc_unresolved_ld() - - def _qc_ambiguous_study(self: StudyLocusGWASCatalog) -> StudyLocusGWASCatalog: - """Flag associations with variants that can not be unambiguously associated with one study. + """Flag associations with variants that are not found in the LD reference. Returns: - StudyLocusGWASCatalog: Updated study locus. + StudyLocusGWASCatalog | StudyLocus: Updated study locus. """ - assoc_ambiguity_window = Window.partitionBy( - f.col("studyId"), f.col("variantId") - ) - - self._df.withColumn( + self.df = self.df.withColumn( "qualityControls", - StudyLocus._update_quality_flag( + self._update_quality_flag( f.col("qualityControls"), - f.count(f.col("variantId")).over(assoc_ambiguity_window) > 1, - StudyLocusQualityCheck.AMBIGUOUS_STUDY, + f.col("ldSet").isNull(), + StudyLocusQualityCheck.UNRESOLVED_LD, ), ) return self - def _qc_unresolved_ld(self: StudyLocusGWASCatalog) -> StudyLocusGWASCatalog: - """Flag associations with variants that are not found in the LD reference. + def _qc_no_population(self: StudyLocus) -> StudyLocus: + """Flag associations where the study doesn't have population information to resolve LD. Returns: - StudyLocusGWASCatalog: Updated study locus. + StudyLocusGWASCatalog | StudyLocus: Updated study locus. """ - self._df.withColumn( + # If the tested column is not present, return self unchanged: + if "ldPopulationStructure" not in self.df.columns: + return self + + self.df = self.df.withColumn( "qualityControls", - StudyLocus._update_quality_flag( + self._update_quality_flag( f.col("qualityControls"), - f.col("credibleSet").isNull(), - StudyLocusQualityCheck.UNRESOLVED_LD, + f.col("ldPopulationStructure").isNull(), + StudyLocusQualityCheck.NO_POPULATION, ), ) return self diff --git a/src/otg/dataset/study_locus_overlap.py b/src/otg/dataset/study_locus_overlap.py index e51b9ce12..97f9e88c7 100644 --- a/src/otg/dataset/study_locus_overlap.py +++ b/src/otg/dataset/study_locus_overlap.py @@ -10,29 +10,36 @@ if TYPE_CHECKING: from pyspark.sql.types import StructType - from otg.common.session import Session + from otg.dataset.study_index import StudyIndex + from otg.dataset.study_locus import StudyLocus @dataclass class StudyLocusOverlap(Dataset): """Study-Locus overlap. - This dataset captures pairs of overlapping `StudyLocus`. + This dataset captures pairs of overlapping `StudyLocus`: that is associations whose credible sets share at least one tagging variant. + + !!! note + This is a helpful dataset for other downstream analyses, such as colocalisation. This dataset will contain the overlapping signals between studyLocus associations once they have been clumped and fine-mapped. """ - _schema: StructType = parse_spark_schema("study_locus_overlap.json") + @classmethod + def get_schema(cls: type[StudyLocusOverlap]) -> StructType: + """Provides the schema for the StudyLocusOverlap dataset.""" + return parse_spark_schema("study_locus_overlap.json") @classmethod - def from_parquet( - cls: type[StudyLocusOverlap], session: Session, path: str + def from_associations( + cls: type[StudyLocusOverlap], study_locus: StudyLocus, study_index: StudyIndex ) -> StudyLocusOverlap: - """Initialise StudyLocusOverlap from parquet file. + """Find the overlapping signals in a particular set of associations (StudyLocus dataset). Args: - session (Session): ETL session - path (str): Path to parquet file + study_locus (StudyLocus): Study-locus associations to find the overlapping signals + study_index (StudyIndex): Study index to find the overlapping signals Returns: StudyLocusOverlap: Study-locus overlap dataset """ - return super().from_parquet(session, path, cls._schema) + return study_locus.find_overlaps(study_index) diff --git a/src/otg/dataset/summary_statistics.py b/src/otg/dataset/summary_statistics.py new file mode 100644 index 000000000..64f2fcc1b --- /dev/null +++ b/src/otg/dataset/summary_statistics.py @@ -0,0 +1,115 @@ +"""Summary satistics dataset.""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f + +from otg.common.schemas import parse_spark_schema +from otg.common.utils import parse_region, split_pvalue +from otg.dataset.dataset import Dataset +from otg.method.window_based_clumping import WindowBasedClumping + +if TYPE_CHECKING: + from pyspark.sql.types import StructType + + from otg.dataset.study_locus import StudyLocus + + +@dataclass +class SummaryStatistics(Dataset): + """Summary Statistics dataset. + + A summary statistics dataset contains all single point statistics resulting from a GWAS. + """ + + @classmethod + def get_schema(cls: type[SummaryStatistics]) -> StructType: + """Provides the schema for the SummaryStatistics dataset.""" + return parse_spark_schema("summary_statistics.json") + + def pvalue_filter(self: SummaryStatistics, pvalue: float) -> SummaryStatistics: + """Filter summary statistics based on the provided p-value threshold. + + Args: + pvalue (float): upper limit of the p-value to be filtered upon. + + Returns: + SummaryStatistics: summary statistics object containing single point associations with p-values at least as significant as the provided threshold. + """ + # Converting p-value to mantissa and exponent: + (mantissa, exponent) = split_pvalue(pvalue) + + # Applying filter: + df = self._df.filter( + (f.col("pValueExponent") < exponent) + | ( + (f.col("pValueExponent") == exponent) + & (f.col("pValueMantissa") <= mantissa) + ) + ) + return SummaryStatistics(_df=df, _schema=self._schema) + + def window_based_clumping( + self: SummaryStatistics, + distance: int, + gwas_significance: float = 5e-8, + with_locus: bool = False, + baseline_significance: float = 0.05, + locus_collect_distance: int | None = None, + ) -> StudyLocus: + """Generate study-locus from summary statistics by distance based clumping + collect locus. + + Args: + distance (int): Distance in base pairs to be used for clumping. + gwas_significance (float, optional): GWAS significance threshold. Defaults to 5e-8. + baseline_significance (float, optional): Baseline significance threshold for inclusion in the locus. Defaults to 0.05. + locus_collect_distance (int, optional): The distance to collect locus around semi-indices. If not provided, defaults to `distance`. + + Returns: + StudyLocus: Clumped study-locus containing variants based on window. + """ + if locus_collect_distance is None: + locus_collect_distance = distance + # Based on if we want to get the locus different clumping function is called: + if with_locus: + clumped_df = WindowBasedClumping.clump_with_locus( + self, + window_length=distance, + p_value_significance=gwas_significance, + p_value_baseline=baseline_significance, + locus_window_length=locus_collect_distance, + ) + else: + clumped_df = WindowBasedClumping.clump( + self, window_length=distance, p_value_significance=gwas_significance + ) + + return clumped_df + + def exclude_region(self: SummaryStatistics, region: str) -> SummaryStatistics: + """Exclude a region from the summary stats dataset. + + Args: + region (str): region given in "chr##:#####-####" format + + Returns: + SummaryStatistics: filtered summary statistics. + """ + (chromosome, start_position, end_position) = parse_region(region) + + return SummaryStatistics( + _df=( + self.df.filter( + ~( + (f.col("chromosome") == chromosome) + & ( + (f.col("position") >= start_position) + & (f.col("position") <= end_position) + ) + ) + ) + ), + _schema=SummaryStatistics.get_schema(), + ) diff --git a/src/otg/dataset/v2g.py b/src/otg/dataset/v2g.py index db0e44d51..9b3adf354 100644 --- a/src/otg/dataset/v2g.py +++ b/src/otg/dataset/v2g.py @@ -10,7 +10,6 @@ if TYPE_CHECKING: from pyspark.sql.types import StructType - from otg.common.session import Session from otg.dataset.gene_index import GeneIndex @@ -21,20 +20,10 @@ class V2G(Dataset): A variant-to-gene (V2G) evidence is understood as any piece of evidence that supports the association of a variant with a likely causal gene. The evidence can sometimes be context-specific and refer to specific `biofeatures` (e.g. cell types) """ - _schema: StructType = parse_spark_schema("v2g.json") - @classmethod - def from_parquet(cls: type[V2G], session: Session, path: str) -> V2G: - """Initialise V2G from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - V2G: V2G dataset - """ - return super().from_parquet(session, path, cls._schema) + def get_schema(cls: type[V2G]) -> StructType: + """Provides the schema for the V2G dataset.""" + return parse_spark_schema("v2g.json") def filter_by_genes(self: V2G, genes: GeneIndex) -> V2G: """Filter V2G dataset by genes. diff --git a/src/otg/dataset/variant_annotation.py b/src/otg/dataset/variant_annotation.py index 1a9bbc3bb..16e9573e3 100644 --- a/src/otg/dataset/variant_annotation.py +++ b/src/otg/dataset/variant_annotation.py @@ -2,14 +2,12 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Optional -import hail as hl import pyspark.sql.functions as f from otg.common.schemas import parse_spark_schema from otg.common.spark_helpers import get_record_with_maximum_value, normalise_column -from otg.common.utils import convert_gnomad_position_to_ensembl from otg.dataset.dataset import Dataset from otg.dataset.v2g import V2G @@ -17,187 +15,17 @@ from pyspark.sql import Column, DataFrame from pyspark.sql.types import StructType - from otg.common.session import Session from otg.dataset.gene_index import GeneIndex @dataclass class VariantAnnotation(Dataset): - """Dataset with variant-level annotations derived from GnomAD.""" - - _schema: StructType = parse_spark_schema("variant_annotation.json") + """Dataset with variant-level annotations.""" @classmethod - def from_parquet( - cls: type[VariantAnnotation], session: Session, path: str - ) -> VariantAnnotation: - """Initialise VariantAnnotation from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - VariantAnnotation: VariantAnnotation dataset - """ - return super().from_parquet(session, path, cls._schema) - - @classmethod - def from_gnomad( - cls: type[VariantAnnotation], - session: Session, - gnomad_file: str, - grch38_to_grch37_chain: str, - populations: list, - path: str | None = None, - ) -> VariantAnnotation: - """Generate variant annotation dataset from gnomAD. - - Some relevant modifications to the original dataset are: - - 1. The transcript consequences features provided by VEP are filtered to only refer to the Ensembl canonical transcript. - 2. Genome coordinates are liftovered from GRCh38 to GRCh37 to keep as annotation. - 3. Field names are converted to camel case to follow the convention. - - Args: - session (Session): ETL session - gnomad_file (str): Path to `gnomad.genomes.vX.X.X.sites.ht` gnomAD dataset - grch38_to_grch37_chain (str): Path to chain file for liftover - populations (list): List of populations to include in the dataset - path (Optional[str], optional): Path to save the dataset to. Defaults to None. - - Returns: - VariantAnnotation: Variant annotation dataset - """ - hl.init(sc=session.spark.sparkContext, log="/tmp/hail.log") - - # Load variants dataset - ht = hl.read_table( - gnomad_file, - _load_refs=False, - ) - # Drop non biallelic variants - ht = ht.filter(ht.alleles.length() == 2) - - # Generate struct for alt. allele frequency in selected populations: - population_indices = ht.globals.freq_index_dict.collect()[0] - population_indices = { - pop: population_indices[f"{pop}-adj"] for pop in populations - } - ht = ht.annotate( - alleleFrequenciesRaw=hl.struct( - **{pop: ht.freq[index].AF for pop, index in population_indices.items()} - ) - ) - - # Liftover - grch37 = hl.get_reference("GRCh37") - grch38 = hl.get_reference("GRCh38") - grch38.add_liftover(grch38_to_grch37_chain, grch37) - ht = ht.annotate(locus_GRCh37=hl.liftover(ht.locus, "GRCh37")) - - # Adding build-specific coordinates to the table: - ht = ( - # Creating a new column called gnomadVariantId which is a concatenation of chromosome, position, - # referenceAllele and alternateAllele. - ht.annotate( - chromosome=ht.locus.contig.replace("chr", ""), - position=ht.locus.position, - chromosomeB37=ht.locus_GRCh37.contig.replace("chr", ""), - positionB37=ht.locus_GRCh37.position, - referenceAllele=ht.alleles[0], - alternateAllele=ht.alleles[1], - alleleType=ht.allele_info.allele_type, - cadd=ht.cadd.rename({"raw_score": "raw"}).drop("has_duplicate"), - vepRaw=ht.vep.drop( - "assembly_name", - "allele_string", - "ancestral", - "context", - "end", - "id", - "input", - "intergenic_consequences", - "seq_region_name", - "start", - "strand", - "variant_class", - ), - ) - .rename({"rsid": "rsIds"}) - .drop("vep") - ) - - df = ( - ht.select_globals() - .to_spark(flatten=False) - # Creating new column based on the transcript_consequences - .withColumn( - "gnomadVariantId", - f.concat_ws( - "-", - "chromosome", - "position", - "referenceAllele", - "alternateAllele", - ), - ) - .withColumn( - "ensembl_position", - convert_gnomad_position_to_ensembl( - f.col("position"), - f.col("referenceAllele"), - f.col("alternateAllele"), - ), - ) - .select( - f.concat_ws( - "_", - "chromosome", - "ensembl_position", - "referenceAllele", - "alternateAllele", - ).alias("variantId"), - "chromosome", - f.col("ensembl_position").alias("position"), - "referenceAllele", - "alternateAllele", - "chromosomeB37", - "positionB37", - "gnomadVariantId", - "alleleType", - "rsIds", - f.array( - *[ - f.struct( - f.col(f"alleleFrequenciesRaw.{pop}").alias( - "alleleFrequency" - ), - f.lit(pop).alias("populationName"), - ) - for pop in populations - ] - ).alias("alleleFrequencies"), - "cadd", - f.struct( - f.col("vepRaw.most_severe_consequence").alias( - "mostSevereConsequence" - ), - f.col("vepRaw.motif_feature_consequences").alias( - "motifFeatureConsequences" - ), - f.col("vepRaw.regulatory_feature_consequences").alias( - "regulatoryFeatureConsequences" - ), - # Non canonical transcripts and gene IDs other than ensembl are filtered out - f.expr( - "filter(vepRaw.transcript_consequences, array -> (array.canonical == 1) and (array.gene_symbol_source == 'HGNC'))" - ).alias("transcriptConsequences"), - ).alias("vep"), - "filters", - ) - ) - return cls(df=df, path=path) + def get_schema(cls: type[VariantAnnotation]) -> StructType: + """Provides the schema for the VariantAnnotation dataset.""" + return parse_spark_schema("variant_annotation.json") def max_maf(self: VariantAnnotation) -> Column: """Maximum minor allele frequency accross all populations. @@ -226,11 +54,11 @@ def filter_by_variant_df( Returns: VariantAnnotation: A filtered variant annotation dataset """ - self._df = self.df.join(f.broadcast(df.select(cols)), on=cols, how="inner") + self.df = self._df.join(f.broadcast(df.select(cols)), on=cols, how="inner") return self def get_transcript_consequence_df( - self: VariantAnnotation, filter_by: GeneIndex = None + self: VariantAnnotation, filter_by: Optional[GeneIndex] = None ) -> DataFrame: """Dataframe of exploded transcript consequences. @@ -240,44 +68,42 @@ def get_transcript_consequence_df( filter_by (GeneIndex): A gene index. Defaults to None. Returns: - DataFrame: A dataframe exploded by transcript consequences + DataFrame: A dataframe exploded by transcript consequences with the columns variantId, chromosome, transcriptConsequence """ - transript_consequences = self.df.select( + # exploding the array removes records without VEP annotation + transript_consequences = self.df.withColumn( + "transcriptConsequence", f.explode("vep.transcriptConsequences") + ).select( "variantId", "chromosome", - # exploding the array removes records without VEP annotation - f.explode("vep.transcriptConsequences").alias("transcriptConsequence"), + "position", + "transcriptConsequence", + f.col("transcriptConsequence.geneId").alias("geneId"), ) if filter_by: transript_consequences = transript_consequences.join( - f.broadcast( - filter_by.df.select( - f.col("geneId").alias("transcriptConsequence.gene_id") - ) - ), - on="transcriptConsequence.gene_id", + f.broadcast(filter_by.df), + on=["chromosome", "geneId"], ) return transript_consequences.persist() def get_most_severe_vep_v2g( self: VariantAnnotation, - variant_consequence_lut_path: str, - filter_by: GeneIndex = None, + vep_consequences: DataFrame, + filter_by: GeneIndex, ) -> V2G: """Creates a dataset with variant to gene assignments based on VEP's predicted consequence on the transcript. Optionally the trancript consequences can be reduced to the universe of a gene index. Args: - variant_consequence_lut_path (str): Path to csv containing variant consequences sorted by severity + vep_consequences (DataFrame): A dataframe of VEP consequences filter_by (GeneIndex): A gene index to filter by. Defaults to None. Returns: V2G: High and medium severity variant to gene assignments """ - variant_consequence_lut = self.etl.spark.read.csv( - variant_consequence_lut_path, sep="\t", header=True - ).select( + vep_lut = vep_consequences.select( f.element_at(f.split("Accession", r"/"), -1).alias( "variantFunctionalConsequenceId" ), @@ -286,18 +112,18 @@ def get_most_severe_vep_v2g( ) return V2G( - df=self.get_transcript_consequence_df(filter_by) - .select( + _df=self.get_transcript_consequence_df(filter_by).select( "variantId", "chromosome", - f.col("transcriptConsequence.gene_id").alias("geneId"), - f.explode("transcriptConsequence.consequence_terms").alias("label"), + "position", + f.col("transcriptConsequence.geneId").alias("geneId"), + f.explode("transcriptConsequence.consequenceTerms").alias("label"), f.lit("vep").alias("datatypeId"), f.lit("variantConsequence").alias("datasourceId"), ) # A variant can have multiple predicted consequences on a transcript, the most severe one is selected .join( - f.broadcast(variant_consequence_lut), + f.broadcast(vep_lut), on="label", how="inner", ) @@ -306,10 +132,13 @@ def get_most_severe_vep_v2g( lambda df: get_record_with_maximum_value( df, ["variantId", "geneId"], "score" ) - ) + ), + _schema=V2G.get_schema(), ) - def get_polyphen_v2g(self: VariantAnnotation, filter_by: GeneIndex = None) -> V2G: + def get_polyphen_v2g( + self: VariantAnnotation, filter_by: Optional[GeneIndex] = None + ) -> V2G: """Creates a dataset with variant to gene assignments with a PolyPhen's predicted score on the transcript. Polyphen informs about the probability that a substitution is damaging. Optionally the trancript consequences can be reduced to the universe of a gene index. @@ -321,80 +150,92 @@ def get_polyphen_v2g(self: VariantAnnotation, filter_by: GeneIndex = None) -> V2 V2G: variant to gene assignments with their polyphen scores """ return V2G( - df=self.get_transcript_consequence_df(filter_by) - .filter(f.col("transcriptConsequence.polyphen_score").isNotNull()) - .select( - "variantId", - "chromosome", - f.col("transcriptConsequence.gene_id").alias("geneId"), - f.col("transcriptConsequence.polyphen_score").alias("score"), - f.col("transcriptConsequence.polyphen_prediction").alias("label"), - f.lit("vep").alias("datatypeId"), - f.lit("polyphen").alias("datasourceId"), - ) + _df=( + self.get_transcript_consequence_df(filter_by) + .filter(f.col("transcriptConsequence.polyphenScore").isNotNull()) + .select( + "variantId", + "chromosome", + "position", + "geneId", + f.col("transcriptConsequence.polyphenScore").alias("score"), + f.col("transcriptConsequence.polyphenPrediction").alias("label"), + f.lit("vep").alias("datatypeId"), + f.lit("polyphen").alias("datasourceId"), + ) + ), + _schema=V2G.get_schema(), ) - def get_sift_v2g(self: VariantAnnotation, filter_by: GeneIndex = None) -> V2G: + def get_sift_v2g(self: VariantAnnotation, filter_by: GeneIndex) -> V2G: """Creates a dataset with variant to gene assignments with a SIFT's predicted score on the transcript. SIFT informs about the probability that a substitution is tolerated so scores nearer zero are more likely to be deleterious. Optionally the trancript consequences can be reduced to the universe of a gene index. Args: - filter_by (GeneIndex): A gene index to filter by. Defaults to None. + filter_by (GeneIndex): A gene index to filter by. Returns: V2G: variant to gene assignments with their SIFT scores """ return V2G( - df=self.get_transcript_consequence_df(filter_by) - .filter(f.col("transcriptConsequence.sift_score").isNotNull()) - .select( - "variantId", - "chromosome", - f.col("transcriptConsequence.gene_id").alias("geneId"), - f.expr("1 - transcriptConsequence.sift_score").alias("score"), - f.col("transcriptConsequence.sift_prediction").alias("label"), - f.lit("vep").alias("datatypeId"), - f.lit("sift").alias("datasourceId"), - ) + _df=( + self.get_transcript_consequence_df(filter_by) + .filter(f.col("transcriptConsequence.siftScore").isNotNull()) + .select( + "variantId", + "chromosome", + "position", + "geneId", + f.expr("1 - transcriptConsequence.siftScore").alias("score"), + f.col("transcriptConsequence.siftPrediction").alias("label"), + f.lit("vep").alias("datatypeId"), + f.lit("sift").alias("datasourceId"), + ) + ), + _schema=V2G.get_schema(), ) - def get_plof_v2g(self: VariantAnnotation, filter_by: GeneIndex = None) -> V2G: + def get_plof_v2g(self: VariantAnnotation, filter_by: GeneIndex) -> V2G: """Creates a dataset with variant to gene assignments with a flag indicating if the variant is predicted to be a loss-of-function variant by the LOFTEE algorithm. Optionally the trancript consequences can be reduced to the universe of a gene index. Args: - filter_by (GeneIndex): A gene index to filter by. Defaults to None. + filter_by (GeneIndex): A gene index to filter by. Returns: V2G: variant to gene assignments from the LOFTEE algorithm """ return V2G( - df=self.get_transcript_consequence_df(filter_by) - .filter(f.col("transcriptConsequence.lof").isNotNull()) - .withColumn( - "isHighQualityPlof", - f.when(f.col("transcriptConsequence.lof") == "HC", True).when( - f.col("transcriptConsequence.lof") == "LC", False - ), - ) - .withColumn( - "score", - f.when(f.col("isHighQualityPlof"), 1.0).when( - ~f.col("isHighQualityPlof"), 0 - ), - ) - .select( - f.col("id").alias("variantId"), - "chromosome", - f.col("transcriptConsequence.gene_id").alias("geneId"), - "isHighQualityPlof", - f.col("score"), - f.lit("vep").alias("datatypeId"), - f.lit("loftee").alias("datasourceId"), - ) + _df=( + self.get_transcript_consequence_df(filter_by) + .filter(f.col("transcriptConsequence.lof").isNotNull()) + .withColumn( + "isHighQualityPlof", + f.when(f.col("transcriptConsequence.lof") == "HC", True).when( + f.col("transcriptConsequence.lof") == "LC", False + ), + ) + .withColumn( + "score", + f.when(f.col("isHighQualityPlof"), 1.0).when( + ~f.col("isHighQualityPlof"), 0 + ), + ) + .select( + "variantId", + "chromosome", + "position", + "geneId", + "isHighQualityPlof", + f.col("score"), + f.lit("vep").alias("datatypeId"), + f.lit("loftee").alias("datasourceId"), + ) + ), + _schema=V2G.get_schema(), ) def get_distance_to_tss( @@ -412,25 +253,31 @@ def get_distance_to_tss( V2G: variant to gene assignments with their distance to the TSS """ return V2G( - df=self.df.alias("variant") - .join( - f.broadcast(filter_by.locations_lut()).alias("gene"), - on=[ - f.col("variant.chromosome") == f.col("gene.chromosome"), - f.abs(f.col("variant.position") - f.col("gene.tss")) - <= max_distance, - ], - how="inner", - ) - .withColumn("inverse_distance", max_distance - f.col("distance")) - .transform(lambda df: normalise_column(df, "inverse_distance", "score")) - .select( - "variantId", - "chromosome", - "position", - "geneId", - "score", - f.lit("distance").alias("datatypeId"), - f.lit("canonical_tss").alias("datasourceId"), - ) + _df=( + self.df.alias("variant") + .join( + f.broadcast(filter_by.locations_lut()).alias("gene"), + on=[ + f.col("variant.chromosome") == f.col("gene.chromosome"), + f.abs(f.col("variant.position") - f.col("gene.tss")) + <= max_distance, + ], + how="inner", + ) + .withColumn( + "inverse_distance", + max_distance - f.abs(f.col("variant.position") - f.col("gene.tss")), + ) + .transform(lambda df: normalise_column(df, "inverse_distance", "score")) + .select( + "variantId", + f.col("variant.chromosome").alias("chromosome"), + "position", + "geneId", + "score", + f.lit("distance").alias("datatypeId"), + f.lit("canonical_tss").alias("datasourceId"), + ) + ), + _schema=V2G.get_schema(), ) diff --git a/src/otg/dataset/variant_index.py b/src/otg/dataset/variant_index.py index 75be38be9..38a0052d4 100644 --- a/src/otg/dataset/variant_index.py +++ b/src/otg/dataset/variant_index.py @@ -13,7 +13,6 @@ if TYPE_CHECKING: from pyspark.sql.types import StructType - from otg.common.session import Session from otg.dataset.variant_annotation import VariantAnnotation @@ -21,31 +20,18 @@ class VariantIndex(Dataset): """Variant index dataset. - Variant index dataset is the result of intersecting the variant annotation (gnomad) dataset with the variants with V2D available information. + Variant index dataset is the result of intersecting the variant annotation dataset with the variants with V2D available information. """ - _schema: StructType = parse_spark_schema("variant_index.json") - @classmethod - def from_parquet( - cls: type[VariantIndex], session: Session, path: str - ) -> VariantIndex: - """Initialise VariantIndex from parquet file. - - Args: - session (Session): ETL session - path (str): Path to parquet file - - Returns: - VariantIndex: VariantIndex dataset - """ - return super().from_parquet(session, path, cls._schema) + def get_schema(cls: type[VariantIndex]) -> StructType: + """Provides the schema for the VariantIndex dataset.""" + return parse_spark_schema("variant_index.json") @classmethod def from_variant_annotation( cls: type[VariantIndex], variant_annotation: VariantAnnotation, - path: str | None = None, ) -> VariantIndex: """Initialise VariantIndex from pre-existing variant annotation dataset.""" unchanged_cols = [ @@ -60,17 +46,16 @@ def from_variant_annotation( "alleleFrequencies", "cadd", ] - vi = cls( - _df=variant_annotation.df.select( - *unchanged_cols, - f.col("vep.mostSevereConsequence").alias("mostSevereConsequence"), - # filters/rsid are arrays that can be empty, in this case we convert them to null - nullify_empty_array(f.col("filters")).alias("filters"), - nullify_empty_array(f.col("rsIds")).alias("rsIds"), - f.lit(True).alias("variantInGnomad"), + return cls( + _df=( + variant_annotation.df.select( + *unchanged_cols, + f.col("vep.mostSevereConsequence").alias("mostSevereConsequence"), + # filters/rsid are arrays that can be empty, in this case we convert them to null + nullify_empty_array(f.col("rsIds")).alias("rsIds"), + ) + .repartition(400, "chromosome") + .sortWithinPartitions("chromosome", "position") ), + _schema=cls.get_schema(), ) - return vi.df.repartition( - 400, - "chromosome", - ).sortWithinPartitions("chromosome", "position") diff --git a/src/otg/datasource/__init__.py b/src/otg/datasource/__init__.py new file mode 100644 index 000000000..ed97f34f3 --- /dev/null +++ b/src/otg/datasource/__init__.py @@ -0,0 +1,3 @@ +"""OTG Data Sources.""" + +from __future__ import annotations diff --git a/src/otg/datasource/finngen/__init__.py b/src/otg/datasource/finngen/__init__.py new file mode 100644 index 000000000..544779b18 --- /dev/null +++ b/src/otg/datasource/finngen/__init__.py @@ -0,0 +1,3 @@ +"""GWAS Catalog Data Source.""" + +from __future__ import annotations diff --git a/src/otg/datasource/finngen/study_index.py b/src/otg/datasource/finngen/study_index.py new file mode 100644 index 000000000..d79a302aa --- /dev/null +++ b/src/otg/datasource/finngen/study_index.py @@ -0,0 +1,81 @@ +"""Study Index for Finngen data source.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f + +from otg.dataset.study_index import StudyIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +class FinnGenStudyIndex(StudyIndex): + """Study index dataset from FinnGen. + + The following information is aggregated/extracted: + + - Study ID in the special format (FINNGEN_R9_*) + - Trait name (for example, Amoebiasis) + - Number of cases and controls + - Link to the summary statistics location + + Some fields are also populated as constants, such as study type and the initial sample size. + """ + + @classmethod + def from_source( + cls: type[FinnGenStudyIndex], + finngen_studies: DataFrame, + finngen_release_prefix: str, + finngen_sumstat_url_prefix: str, + finngen_sumstat_url_suffix: str, + ) -> FinnGenStudyIndex: + """This function ingests study level metadata from FinnGen. + + Args: + finngen_studies (DataFrame): FinnGen raw study table + finngen_release_prefix (str): Release prefix pattern. + finngen_sumstat_url_prefix (str): URL prefix for summary statistics location. + finngen_sumstat_url_suffix (str): URL prefix suffix for summary statistics location. + + Returns: + FinnGenStudyIndex: Parsed and annotated FinnGen study table. + """ + return FinnGenStudyIndex( + _df=finngen_studies.select( + f.concat(f.lit(f"{finngen_release_prefix}_"), f.col("phenocode")).alias( + "studyId" + ), + f.col("phenostring").alias("traitFromSource"), + f.col("num_cases").alias("nCases"), + f.col("num_controls").alias("nControls"), + f.lit(finngen_release_prefix).alias("projectId"), + f.lit("gwas").alias("studyType"), + f.lit(True).alias("hasSumstats"), + f.lit("377,277 (210,870 females and 166,407 males)").alias( + "initialSampleSize" + ), + f.array( + f.struct( + f.lit(377277).cast("long").alias("sampleSize"), + f.lit("Finnish").alias("ancestry"), + ) + ).alias("discoverySamples"), + ) + .withColumn("nSamples", f.col("nCases") + f.col("nControls")) + .withColumn( + "summarystatsLocation", + f.concat( + f.lit(finngen_sumstat_url_prefix), + f.col("studyId"), + f.lit(finngen_sumstat_url_suffix), + ), + ) + .withColumn( + "ldPopulationStructure", + cls.aggregate_and_map_ancestries(f.col("discoverySamples")), + ), + _schema=FinnGenStudyIndex.get_schema(), + ) diff --git a/src/otg/datasource/gnomad/__init__.py b/src/otg/datasource/gnomad/__init__.py new file mode 100644 index 000000000..544779b18 --- /dev/null +++ b/src/otg/datasource/gnomad/__init__.py @@ -0,0 +1,3 @@ +"""GWAS Catalog Data Source.""" + +from __future__ import annotations diff --git a/src/otg/datasource/gnomad/ld.py b/src/otg/datasource/gnomad/ld.py new file mode 100644 index 000000000..ea131203a --- /dev/null +++ b/src/otg/datasource/gnomad/ld.py @@ -0,0 +1,259 @@ +"""Step to import filtered version of a LD matrix (block matrix).""" +from __future__ import annotations + +import sys +from functools import reduce +from typing import TYPE_CHECKING + +import hail as hl +import pyspark.sql.functions as f +from hail.linalg import BlockMatrix +from pyspark.sql import Window + +from otg.common.utils import _liftover_loci, convert_gnomad_position_to_ensembl +from otg.dataset.ld_index import LDIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +class GnomADLDMatrix: + """Importer of LD information from GnomAD. + + The information comes from LD matrices [made available by GnomAD](https://gnomad.broadinstitute.org/downloads/#v2-linkage-disequilibrium) in Hail's native format. We aggregate the LD information across 8 ancestries. + The basic steps to generate the LDIndex are: + + 1. Convert a LD matrix to a Spark DataFrame. + 2. Resolve the matrix indices to variant IDs by lifting over the coordinates to GRCh38. + 3. Aggregate the LD information across populations. + + """ + + @staticmethod + def _aggregate_ld_index_across_populations( + unaggregated_ld_index: DataFrame, + ) -> DataFrame: + """Aggregate LDIndex across populations. + + Args: + unaggregated_ld_index (DataFrame): Unaggregate LDIndex index dataframe each row is a variant pair in a population + + Returns: + DataFrame: Aggregated LDIndex index dataframe each row is a variant with the LD set across populations + + Examples: + >>> data = [("1.0", "var1", "X", "var1", "pop1"), ("1.0", "X", "var2", "var2", "pop1"), + ... ("0.5", "var1", "X", "var2", "pop1"), ("0.5", "var1", "X", "var2", "pop2"), + ... ("0.5", "var2", "X", "var1", "pop1"), ("0.5", "X", "var2", "var1", "pop2")] + >>> df = spark.createDataFrame(data, ["r", "variantId", "chromosome", "tagvariantId", "population"]) + >>> GnomADLDMatrix._aggregate_ld_index_across_populations(df).printSchema() + root + |-- variantId: string (nullable = true) + |-- chromosome: string (nullable = true) + |-- ldSet: array (nullable = false) + | |-- element: struct (containsNull = false) + | | |-- tagVariantId: string (nullable = true) + | | |-- rValues: array (nullable = false) + | | | |-- element: struct (containsNull = false) + | | | | |-- population: string (nullable = true) + | | | | |-- r: string (nullable = true) + + """ + return ( + unaggregated_ld_index + # First level of aggregation: get r/population for each variant/tagVariant pair + .withColumn("r_pop_struct", f.struct("population", "r")) + .groupBy("chromosome", "variantId", "tagVariantId") + .agg( + f.collect_set("r_pop_struct").alias("rValues"), + ) + # Second level of aggregation: get r/population for each variant + .withColumn("r_pop_tag_struct", f.struct("tagVariantId", "rValues")) + .groupBy("variantId", "chromosome") + .agg( + f.collect_set("r_pop_tag_struct").alias("ldSet"), + ) + ) + + @staticmethod + def _convert_ld_matrix_to_table( + block_matrix: BlockMatrix, min_r2: float + ) -> DataFrame: + """Convert LD matrix to table.""" + table = block_matrix.entries(keyed=False) + return ( + table.filter(hl.abs(table.entry) >= min_r2**0.5) + .to_spark() + .withColumnRenamed("entry", "r") + ) + + @staticmethod + def _create_ldindex_for_population( + population_id: str, + ld_matrix_path: str, + ld_index_raw_path: str, + grch37_to_grch38_chain_path: str, + min_r2: float, + ) -> DataFrame: + """Create LDIndex for a specific population.""" + # Prepare LD Block matrix + ld_matrix = GnomADLDMatrix._convert_ld_matrix_to_table( + BlockMatrix.read(ld_matrix_path), min_r2 + ) + + # Prepare table with variant indices + ld_index = GnomADLDMatrix._process_variant_indices( + hl.read_table(ld_index_raw_path), + grch37_to_grch38_chain_path, + ) + + return GnomADLDMatrix._resolve_variant_indices(ld_index, ld_matrix).select( + "*", + f.lit(population_id).alias("population"), + ) + + @staticmethod + def _process_variant_indices( + ld_index_raw: hl.Table, grch37_to_grch38_chain_path: str + ) -> DataFrame: + """Creates a look up table between variants and their coordinates in the LD Matrix. + + !!! info "Gnomad's LD Matrix and Index are based on GRCh37 coordinates. This function will lift over the coordinates to GRCh38 to build the lookup table." + + Args: + ld_index_raw (hl.Table): LD index table from GnomAD + grch37_to_grch38_chain_path (str): Path to the chain file used to lift over the coordinates + + Returns: + DataFrame: Look up table between variants in build hg38 and their coordinates in the LD Matrix + """ + ld_index_38 = _liftover_loci( + ld_index_raw, grch37_to_grch38_chain_path, "GRCh38" + ) + + return ( + ld_index_38.to_spark() + # Filter out variants where the liftover failed + .filter(f.col("`locus_GRCh38.position`").isNotNull()) + .withColumn( + "chromosome", f.regexp_replace("`locus_GRCh38.contig`", "chr", "") + ) + .withColumn( + "position", + convert_gnomad_position_to_ensembl( + f.col("`locus_GRCh38.position`"), + f.col("`alleles`").getItem(0), + f.col("`alleles`").getItem(1), + ), + ) + .select( + "chromosome", + f.concat_ws( + "_", + f.col("chromosome"), + f.col("position"), + f.col("`alleles`").getItem(0), + f.col("`alleles`").getItem(1), + ).alias("variantId"), + f.col("idx"), + ) + # Filter out ambiguous liftover results: multiple indices for the same variant + .withColumn("count", f.count("*").over(Window.partitionBy(["variantId"]))) + .filter(f.col("count") == 1) + .drop("count") + ) + + @staticmethod + def _resolve_variant_indices( + ld_index: DataFrame, ld_matrix: DataFrame + ) -> DataFrame: + """Resolve the `i` and `j` indices of the block matrix to variant IDs (build 38).""" + ld_index_i = ld_index.selectExpr( + "idx as i", "variantId as variantId_i", "chromosome" + ) + ld_index_j = ld_index.selectExpr("idx as j", "variantId as variantId_j") + return ( + ld_matrix.join(ld_index_i, on="i", how="inner") + .join(ld_index_j, on="j", how="inner") + .drop("i", "j") + ) + + @staticmethod + def _transpose_ld_matrix(ld_matrix: DataFrame) -> DataFrame: + """Transpose LD matrix to a square matrix format. + + Args: + ld_matrix (DataFrame): Triangular LD matrix converted to a Spark DataFrame + + Returns: + DataFrame: Square LD matrix without diagonal duplicates + + Examples: + >>> df = spark.createDataFrame( + ... [ + ... (1, 1, 1.0, "1", "AFR"), + ... (1, 2, 0.5, "1", "AFR"), + ... (2, 2, 1.0, "1", "AFR"), + ... ], + ... ["variantId_i", "variantId_j", "r", "chromosome", "population"], + ... ) + >>> GnomADLDMatrix._transpose_ld_matrix(df).show() + +-----------+-----------+---+----------+----------+ + |variantId_i|variantId_j| r|chromosome|population| + +-----------+-----------+---+----------+----------+ + | 1| 2|0.5| 1| AFR| + | 1| 1|1.0| 1| AFR| + | 2| 1|0.5| 1| AFR| + | 2| 2|1.0| 1| AFR| + +-----------+-----------+---+----------+----------+ + + """ + ld_matrix_transposed = ld_matrix.selectExpr( + "variantId_i as variantId_j", + "variantId_j as variantId_i", + "r", + "chromosome", + "population", + ) + return ld_matrix.filter( + f.col("variantId_i") != f.col("variantId_j") + ).unionByName(ld_matrix_transposed) + + @classmethod + def as_ld_index( + cls: type[GnomADLDMatrix], + ld_populations: list[str], + ld_matrix_template: str, + ld_index_raw_template: str, + grch37_to_grch38_chain_path: str, + min_r2: float, + ) -> LDIndex: + """Create LDIndex dataset aggregating the LD information across a set of populations.""" + ld_indices_unaggregated = [] + for pop in ld_populations: + try: + ld_matrix_path = ld_matrix_template.format(POP=pop) + ld_index_raw_path = ld_index_raw_template.format(POP=pop) + pop_ld_index = cls._create_ldindex_for_population( + pop, + ld_matrix_path, + ld_index_raw_path.format(pop), + grch37_to_grch38_chain_path, + min_r2, + ) + ld_indices_unaggregated.append(pop_ld_index) + except Exception as e: + print(f"Failed to create LDIndex for population {pop}: {e}") + sys.exit(1) + + ld_index_unaggregated = ( + GnomADLDMatrix._transpose_ld_matrix( + reduce(lambda df1, df2: df1.unionByName(df2), ld_indices_unaggregated) + ) + .withColumnRenamed("variantId_i", "variantId") + .withColumnRenamed("variantId_j", "tagVariantId") + ) + return LDIndex( + _df=cls._aggregate_ld_index_across_populations(ld_index_unaggregated), + _schema=LDIndex.get_schema(), + ) diff --git a/src/otg/datasource/gnomad/variants.py b/src/otg/datasource/gnomad/variants.py new file mode 100644 index 000000000..d9353a9e2 --- /dev/null +++ b/src/otg/datasource/gnomad/variants.py @@ -0,0 +1,149 @@ +"""Import gnomAD variants dataset.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import hail as hl + +from otg.dataset.variant_annotation import VariantAnnotation + +if TYPE_CHECKING: + from hail.expr.expressions import Int32Expression, StringExpression + + +class GnomADVariants: + """GnomAD variants included in the GnomAD genomes dataset.""" + + @staticmethod + def _convert_gnomad_position_to_ensembl_hail( + position: Int32Expression, + reference: StringExpression, + alternate: StringExpression, + ) -> Int32Expression: + """Convert GnomAD variant position to Ensembl variant position in hail table. + + For indels (the reference or alternate allele is longer than 1), then adding 1 to the position, for SNPs, the position is unchanged. + More info about the problem: https://www.biostars.org/p/84686/ + + Args: + position (Int32Expression): Position of the variant in the GnomAD genome. + reference (StringExpression): The reference allele. + alternate (StringExpression): The alternate allele + + Returns: + The position of the variant according to Ensembl genome. + """ + return hl.if_else( + (reference.length() > 1) | (alternate.length() > 1), position + 1, position + ) + + @classmethod + def as_variant_annotation( + cls: type[GnomADVariants], + gnomad_file: str, + grch38_to_grch37_chain: str, + populations: list, + ) -> VariantAnnotation: + """Generate variant annotation dataset from gnomAD. + + Some relevant modifications to the original dataset are: + + 1. The transcript consequences features provided by VEP are filtered to only refer to the Ensembl canonical transcript. + 2. Genome coordinates are liftovered from GRCh38 to GRCh37 to keep as annotation. + 3. Field names are converted to camel case to follow the convention. + + Args: + gnomad_file (str): Path to `gnomad.genomes.vX.X.X.sites.ht` gnomAD dataset + grch38_to_grch37_chain (str): Path to chain file for liftover + populations (list): List of populations to include in the dataset + + Returns: + VariantAnnotation: Variant annotation dataset + """ + # Load variants dataset + ht = hl.read_table( + gnomad_file, + _load_refs=False, + ) + + # Liftover + grch37 = hl.get_reference("GRCh37") + grch38 = hl.get_reference("GRCh38") + grch38.add_liftover(grch38_to_grch37_chain, grch37) + + # Drop non biallelic variants + ht = ht.filter(ht.alleles.length() == 2) + # Liftover + ht = ht.annotate(locus_GRCh37=hl.liftover(ht.locus, "GRCh37")) + # Select relevant fields and nested records to create class + return VariantAnnotation( + _df=( + ht.select( + gnomad3VariantId=hl.str("-").join( + [ + ht.locus.contig.replace("chr", ""), + hl.str(ht.locus.position), + ht.alleles[0], + ht.alleles[1], + ] + ), + chromosome=ht.locus.contig.replace("chr", ""), + position=GnomADVariants._convert_gnomad_position_to_ensembl_hail( + ht.locus.position, ht.alleles[0], ht.alleles[1] + ), + variantId=hl.str("_").join( + [ + ht.locus.contig.replace("chr", ""), + hl.str( + GnomADVariants._convert_gnomad_position_to_ensembl_hail( + ht.locus.position, ht.alleles[0], ht.alleles[1] + ) + ), + ht.alleles[0], + ht.alleles[1], + ] + ), + chromosomeB37=ht.locus_GRCh37.contig.replace("chr", ""), + positionB37=ht.locus_GRCh37.position, + referenceAllele=ht.alleles[0], + alternateAllele=ht.alleles[1], + rsIds=ht.rsid, + alleleType=ht.allele_info.allele_type, + cadd=hl.struct( + phred=ht.cadd.phred, + raw=ht.cadd.raw_score, + ), + alleleFrequencies=hl.set([f"{pop}-adj" for pop in populations]).map( + lambda p: hl.struct( + populationName=p, + alleleFrequency=ht.freq[ht.globals.freq_index_dict[p]].AF, + ) + ), + vep=hl.struct( + mostSevereConsequence=ht.vep.most_severe_consequence, + transcriptConsequences=hl.map( + lambda x: hl.struct( + aminoAcids=x.amino_acids, + consequenceTerms=x.consequence_terms, + geneId=x.gene_id, + lof=x.lof, + polyphenScore=x.polyphen_score, + polyphenPrediction=x.polyphen_prediction, + siftScore=x.sift_score, + siftPrediction=x.sift_prediction, + ), + # Only keeping canonical transcripts + ht.vep.transcript_consequences.filter( + lambda x: (x.canonical == 1) + & (x.gene_symbol_source == "HGNC") + ), + ), + ), + ) + .key_by("chromosome", "position") + .drop("locus", "alleles") + .select_globals() + .to_spark(flatten=False) + ), + _schema=VariantAnnotation.get_schema(), + ) diff --git a/src/otg/datasource/gwas_catalog/__init__.py b/src/otg/datasource/gwas_catalog/__init__.py new file mode 100644 index 000000000..544779b18 --- /dev/null +++ b/src/otg/datasource/gwas_catalog/__init__.py @@ -0,0 +1,3 @@ +"""GWAS Catalog Data Source.""" + +from __future__ import annotations diff --git a/src/otg/datasource/gwas_catalog/associations.py b/src/otg/datasource/gwas_catalog/associations.py new file mode 100644 index 000000000..4dc148a6a --- /dev/null +++ b/src/otg/datasource/gwas_catalog/associations.py @@ -0,0 +1,1158 @@ +"""Study Locus for GWAS Catalog data source.""" +from __future__ import annotations + +import importlib.resources as pkg_resources +import json +from dataclasses import dataclass +from itertools import chain +from typing import TYPE_CHECKING + +import numpy as np +import pyspark.sql.functions as f +from pyspark.sql.types import DoubleType, IntegerType, LongType +from pyspark.sql.window import Window + +from otg.assets import data +from otg.common.spark_helpers import ( + calculate_neglog_pvalue, + get_record_with_maximum_value, + pvalue_to_zscore, +) +from otg.common.utils import parse_efos +from otg.dataset.study_locus import StudyLocus, StudyLocusQualityCheck + +if TYPE_CHECKING: + from pyspark.sql import Column, DataFrame + + from otg.dataset.variant_annotation import VariantAnnotation + + +@dataclass +class GWASCatalogAssociations(StudyLocus): + """Study-locus dataset derived from GWAS Catalog.""" + + @staticmethod + def _parse_pvalue(pvalue: Column) -> tuple[Column, Column]: + """Parse p-value column. + + Args: + pvalue (Column): p-value [string] + + Returns: + tuple[Column, Column]: p-value mantissa and exponent + + Example: + >>> import pyspark.sql.types as t + >>> d = [("1.0"), ("0.5"), ("1E-20"), ("3E-3"), ("1E-1000")] + >>> df = spark.createDataFrame(d, t.StringType()) + >>> df.select('value',*GWASCatalogAssociations._parse_pvalue(f.col('value'))).show() + +-------+--------------+--------------+ + | value|pValueMantissa|pValueExponent| + +-------+--------------+--------------+ + | 1.0| 1.0| 1| + | 0.5| 0.5| 1| + | 1E-20| 1.0| -20| + | 3E-3| 3.0| -3| + |1E-1000| 1.0| -1000| + +-------+--------------+--------------+ + + + """ + split = f.split(pvalue, "E") + return split.getItem(0).cast("float").alias("pValueMantissa"), f.coalesce( + split.getItem(1).cast("integer"), f.lit(1) + ).alias("pValueExponent") + + @staticmethod + def _normalise_pvaluetext(p_value_text: Column) -> Column: + """Normalised p-value text column to a standardised format. + + For cases where there is no mapping, the value is set to null. + + Args: + p_value_text (Column): `pValueText` column from GWASCatalog + + Returns: + Column: Array column after using GWAS Catalog mappings. There might be multiple mappings for a single p-value text. + + Example: + >>> import pyspark.sql.types as t + >>> d = [("European Ancestry"), ("African ancestry"), ("Alzheimer’s Disease"), ("(progression)"), (""), (None)] + >>> df = spark.createDataFrame(d, t.StringType()) + >>> df.withColumn('normalised', GWASCatalogAssociations._normalise_pvaluetext(f.col('value'))).show() + +-------------------+----------+ + | value|normalised| + +-------------------+----------+ + | European Ancestry| [EA]| + | African ancestry| [AA]| + |Alzheimer’s Disease| [AD]| + | (progression)| null| + | | null| + | null| null| + +-------------------+----------+ + + + """ + # GWAS Catalog to p-value mapping + json_dict = json.loads( + pkg_resources.read_text(data, "gwas_pValueText_map.json", encoding="utf-8") + ) + map_expr = f.create_map(*[f.lit(x) for x in chain(*json_dict.items())]) + + splitted_col = f.split(f.regexp_replace(p_value_text, r"[\(\)]", ""), ",") + mapped_col = f.transform(splitted_col, lambda x: map_expr[x]) + return f.when(f.forall(mapped_col, lambda x: x.isNull()), None).otherwise( + mapped_col + ) + + @staticmethod + def _normalise_risk_allele(risk_allele: Column) -> Column: + """Normalised risk allele column to a standardised format. + + If multiple risk alleles are present, the first one is returned. + + Args: + risk_allele (Column): `riskAllele` column from GWASCatalog + + Returns: + Column: mapped using GWAS Catalog mapping + + Example: + >>> import pyspark.sql.types as t + >>> d = [("rs1234-A-G"), ("rs1234-A"), ("rs1234-A; rs1235-G")] + >>> df = spark.createDataFrame(d, t.StringType()) + >>> df.withColumn('normalised', GWASCatalogAssociations._normalise_risk_allele(f.col('value'))).show() + +------------------+----------+ + | value|normalised| + +------------------+----------+ + | rs1234-A-G| A| + | rs1234-A| A| + |rs1234-A; rs1235-G| A| + +------------------+----------+ + + + """ + # GWAS Catalog to risk allele mapping + return f.split(f.split(risk_allele, "; ").getItem(0), "-").getItem(1) + + @staticmethod + def _collect_rsids( + snp_id: Column, snp_id_current: Column, risk_allele: Column + ) -> Column: + """It takes three columns, and returns an array of distinct values from those columns. + + Args: + snp_id (Column): The original snp id from the GWAS catalog. + snp_id_current (Column): The current snp id field is just a number at the moment (stored as a string). Adding 'rs' prefix if looks good. + risk_allele (Column): The risk allele for the SNP. + + Returns: + An array of distinct values. + """ + # The current snp id field is just a number at the moment (stored as a string). Adding 'rs' prefix if looks good. + snp_id_current = f.when( + snp_id_current.rlike("^[0-9]*$"), + f.format_string("rs%s", snp_id_current), + ) + # Cleaning risk allele: + risk_allele = f.split(risk_allele, "-").getItem(0) + + # Collecting all values: + return f.array_distinct(f.array(snp_id, snp_id_current, risk_allele)) + + @staticmethod + def _map_to_variant_annotation_variants( + gwas_associations: DataFrame, variant_annotation: VariantAnnotation + ) -> DataFrame: + """Add variant metadata in associations. + + Args: + gwas_associations (DataFrame): raw GWAS Catalog associations + variant_annotation (VariantAnnotation): variant annotation dataset + + Returns: + DataFrame: GWAS Catalog associations data including `variantId`, `referenceAllele`, + `alternateAllele`, `chromosome`, `position` with variant metadata + """ + # Subset of GWAS Catalog associations required for resolving variant IDs: + gwas_associations_subset = gwas_associations.select( + "studyLocusId", + f.col("CHR_ID").alias("chromosome"), + f.col("CHR_POS").cast(IntegerType()).alias("position"), + # List of all SNPs associated with the variant + GWASCatalogAssociations._collect_rsids( + f.split(f.col("SNPS"), "; ").getItem(0), + f.col("SNP_ID_CURRENT"), + f.split(f.col("STRONGEST SNP-RISK ALLELE"), "; ").getItem(0), + ).alias("rsIdsGwasCatalog"), + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ).alias("riskAllele"), + ) + + # Subset of variant annotation required for GWAS Catalog annotations: + va_subset = variant_annotation.df.select( + "variantId", + "chromosome", + "position", + f.col("rsIds").alias("rsIdsGnomad"), + "referenceAllele", + "alternateAllele", + "alleleFrequencies", + variant_annotation.max_maf().alias("maxMaf"), + ).join( + f.broadcast( + gwas_associations_subset.select("chromosome", "position").distinct() + ), + on=["chromosome", "position"], + how="inner", + ) + + # Semi-resolved ids (still contains duplicates when conclusion was not possible to make + # based on rsIds or allele concordance) + filtered_associations = ( + gwas_associations_subset.join( + f.broadcast(va_subset), + on=["chromosome", "position"], + how="left", + ) + .withColumn( + "rsIdFilter", + GWASCatalogAssociations._flag_mappings_to_retain( + f.col("studyLocusId"), + GWASCatalogAssociations._compare_rsids( + f.col("rsIdsGnomad"), f.col("rsIdsGwasCatalog") + ), + ), + ) + .withColumn( + "concordanceFilter", + GWASCatalogAssociations._flag_mappings_to_retain( + f.col("studyLocusId"), + GWASCatalogAssociations._check_concordance( + f.col("riskAllele"), + f.col("referenceAllele"), + f.col("alternateAllele"), + ), + ), + ) + .filter( + # Filter out rows where GWAS Catalog rsId does not match with GnomAD rsId, + # but there is corresponding variant for the same association + f.col("rsIdFilter") + # or filter out rows where GWAS Catalog alleles are not concordant with GnomAD alleles, + # but there is corresponding variant for the same association + | f.col("concordanceFilter") + ) + ) + + # Keep only highest maxMaf variant per studyLocusId + fully_mapped_associations = get_record_with_maximum_value( + filtered_associations, grouping_col="studyLocusId", sorting_col="maxMaf" + ).select( + "studyLocusId", + "variantId", + "referenceAllele", + "alternateAllele", + "chromosome", + "position", + ) + + return gwas_associations.join( + fully_mapped_associations, on="studyLocusId", how="left" + ) + + @staticmethod + def _compare_rsids(gnomad: Column, gwas: Column) -> Column: + """If the intersection of the two arrays is greater than 0, return True, otherwise return False. + + Args: + gnomad (Column): rsids from gnomad + gwas (Column): rsids from the GWAS Catalog + + Returns: + A boolean column that is true if the GnomAD rsIDs can be found in the GWAS rsIDs. + + Examples: + >>> d = [ + ... (1, ["rs123", "rs523"], ["rs123"]), + ... (2, [], ["rs123"]), + ... (3, ["rs123", "rs523"], []), + ... (4, [], []), + ... ] + >>> df = spark.createDataFrame(d, ['associationId', 'gnomad', 'gwas']) + >>> df.withColumn("rsid_matches", GWASCatalogAssociations._compare_rsids(f.col("gnomad"),f.col('gwas'))).show() + +-------------+--------------+-------+------------+ + |associationId| gnomad| gwas|rsid_matches| + +-------------+--------------+-------+------------+ + | 1|[rs123, rs523]|[rs123]| true| + | 2| []|[rs123]| false| + | 3|[rs123, rs523]| []| false| + | 4| []| []| false| + +-------------+--------------+-------+------------+ + + + """ + return f.when(f.size(f.array_intersect(gnomad, gwas)) > 0, True).otherwise( + False + ) + + @staticmethod + def _flag_mappings_to_retain( + association_id: Column, filter_column: Column + ) -> Column: + """Flagging mappings to drop for each association. + + Some associations have multiple mappings. Some has matching rsId others don't. We only + want to drop the non-matching mappings, when a matching is available for the given association. + This logic can be generalised for other measures eg. allele concordance. + + Args: + association_id (Column): association identifier column + filter_column (Column): boolean col indicating to keep a mapping + + Returns: + A column with a boolean value. + + Examples: + >>> d = [ + ... (1, False), + ... (1, False), + ... (2, False), + ... (2, True), + ... (3, True), + ... (3, True), + ... ] + >>> df = spark.createDataFrame(d, ['associationId', 'filter']) + >>> df.withColumn("isConcordant", GWASCatalogAssociations._flag_mappings_to_retain(f.col("associationId"),f.col('filter'))).show() + +-------------+------+------------+ + |associationId|filter|isConcordant| + +-------------+------+------------+ + | 1| false| true| + | 1| false| true| + | 2| false| false| + | 2| true| true| + | 3| true| true| + | 3| true| true| + +-------------+------+------------+ + + + """ + w = Window.partitionBy(association_id) + + # Generating a boolean column informing if the filter column contains true anywhere for the association: + aggregated_filter = f.when( + f.array_contains(f.collect_set(filter_column).over(w), True), True + ).otherwise(False) + + # Generate a filter column: + return f.when(aggregated_filter & (~filter_column), False).otherwise(True) + + @staticmethod + def _check_concordance( + risk_allele: Column, reference_allele: Column, alternate_allele: Column + ) -> Column: + """A function to check if the risk allele is concordant with the alt or ref allele. + + If the risk allele is the same as the reference or alternate allele, or if the reverse complement of + the risk allele is the same as the reference or alternate allele, then the allele is concordant. + If no mapping is available (ref/alt is null), the function returns True. + + Args: + risk_allele (Column): The allele that is associated with the risk of the disease. + reference_allele (Column): The reference allele from the GWAS catalog + alternate_allele (Column): The alternate allele of the variant. + + Returns: + A boolean column that is True if the risk allele is the same as the reference or alternate allele, + or if the reverse complement of the risk allele is the same as the reference or alternate allele. + + Examples: + >>> d = [ + ... ('A', 'A', 'G'), + ... ('A', 'T', 'G'), + ... ('A', 'C', 'G'), + ... ('A', 'A', '?'), + ... (None, None, 'A'), + ... ] + >>> df = spark.createDataFrame(d, ['riskAllele', 'referenceAllele', 'alternateAllele']) + >>> df.withColumn("isConcordant", GWASCatalogAssociations._check_concordance(f.col("riskAllele"),f.col('referenceAllele'), f.col('alternateAllele'))).show() + +----------+---------------+---------------+------------+ + |riskAllele|referenceAllele|alternateAllele|isConcordant| + +----------+---------------+---------------+------------+ + | A| A| G| true| + | A| T| G| true| + | A| C| G| false| + | A| A| ?| true| + | null| null| A| true| + +----------+---------------+---------------+------------+ + + + """ + # Calculating the reverse complement of the risk allele: + risk_allele_reverse_complement = f.when( + risk_allele.rlike(r"^[ACTG]+$"), + f.reverse(f.translate(risk_allele, "ACTG", "TGAC")), + ).otherwise(risk_allele) + + # OK, is the risk allele or the reverse complent is the same as the mapped alleles: + return ( + f.when( + (risk_allele == reference_allele) | (risk_allele == alternate_allele), + True, + ) + # If risk allele is found on the negative strand: + .when( + (risk_allele_reverse_complement == reference_allele) + | (risk_allele_reverse_complement == alternate_allele), + True, + ) + # If risk allele is ambiguous, still accepted: < This condition could be reconsidered + .when(risk_allele == "?", True) + # If the association could not be mapped we keep it: + .when(reference_allele.isNull(), True) + # Allele is discordant: + .otherwise(False) + ) + + @staticmethod + def _get_reverse_complement(allele_col: Column) -> Column: + """A function to return the reverse complement of an allele column. + + It takes a string and returns the reverse complement of that string if it's a DNA sequence, + otherwise it returns the original string. Assumes alleles in upper case. + + Args: + allele_col (Column): The column containing the allele to reverse complement. + + Returns: + A column that is the reverse complement of the allele column. + + Examples: + >>> d = [{"allele": 'A'}, {"allele": 'T'},{"allele": 'G'}, {"allele": 'C'},{"allele": 'AC'}, {"allele": 'GTaatc'},{"allele": '?'}, {"allele": None}] + >>> df = spark.createDataFrame(d) + >>> df.withColumn("revcom_allele", GWASCatalogAssociations._get_reverse_complement(f.col("allele"))).show() + +------+-------------+ + |allele|revcom_allele| + +------+-------------+ + | A| T| + | T| A| + | G| C| + | C| G| + | AC| GT| + |GTaatc| GATTAC| + | ?| ?| + | null| null| + +------+-------------+ + + + """ + allele_col = f.upper(allele_col) + return f.when( + allele_col.rlike("[ACTG]+"), + f.reverse(f.translate(allele_col, "ACTG", "TGAC")), + ).otherwise(allele_col) + + @staticmethod + def _effect_needs_harmonisation( + risk_allele: Column, reference_allele: Column + ) -> Column: + """A function to check if the effect allele needs to be harmonised. + + Args: + risk_allele (Column): Risk allele column + reference_allele (Column): Effect allele column + + Returns: + A boolean column indicating if the effect allele needs to be harmonised. + + Examples: + >>> d = [{"risk": 'A', "reference": 'A'}, {"risk": 'A', "reference": 'T'}, {"risk": 'AT', "reference": 'TA'}, {"risk": 'AT', "reference": 'AT'}] + >>> df = spark.createDataFrame(d) + >>> df.withColumn("needs_harmonisation", GWASCatalogAssociations._effect_needs_harmonisation(f.col("risk"), f.col("reference"))).show() + +---------+----+-------------------+ + |reference|risk|needs_harmonisation| + +---------+----+-------------------+ + | A| A| true| + | T| A| true| + | TA| AT| false| + | AT| AT| true| + +---------+----+-------------------+ + + + """ + return (risk_allele == reference_allele) | ( + risk_allele + == GWASCatalogAssociations._get_reverse_complement(reference_allele) + ) + + @staticmethod + def _are_alleles_palindromic( + reference_allele: Column, alternate_allele: Column + ) -> Column: + """A function to check if the alleles are palindromic. + + Args: + reference_allele (Column): Reference allele column + alternate_allele (Column): Alternate allele column + + Returns: + A boolean column indicating if the alleles are palindromic. + + Examples: + >>> d = [{"reference": 'A', "alternate": 'T'}, {"reference": 'AT', "alternate": 'AG'}, {"reference": 'AT', "alternate": 'AT'}, {"reference": 'CATATG', "alternate": 'CATATG'}, {"reference": '-', "alternate": None}] + >>> df = spark.createDataFrame(d) + >>> df.withColumn("is_palindromic", GWASCatalogAssociations._are_alleles_palindromic(f.col("reference"), f.col("alternate"))).show() + +---------+---------+--------------+ + |alternate|reference|is_palindromic| + +---------+---------+--------------+ + | T| A| true| + | AG| AT| false| + | AT| AT| true| + | CATATG| CATATG| true| + | null| -| false| + +---------+---------+--------------+ + + + """ + revcomp = GWASCatalogAssociations._get_reverse_complement(alternate_allele) + return ( + f.when(reference_allele == revcomp, True) + .when(revcomp.isNull(), False) + .otherwise(False) + ) + + @staticmethod + def _harmonise_beta( + risk_allele: Column, + reference_allele: Column, + alternate_allele: Column, + effect_size: Column, + confidence_interval: Column, + ) -> Column: + """A function to extract the beta value from the effect size and confidence interval. + + If the confidence interval contains the word "increase" or "decrease" it indicates, we are dealing with betas. + If it's "increase" and the effect size needs to be harmonized, then multiply the effect size by -1 + + Args: + risk_allele (Column): Risk allele column + reference_allele (Column): Reference allele column + alternate_allele (Column): Alternate allele column + effect_size (Column): GWAS Catalog effect size column + confidence_interval (Column): GWAS Catalog confidence interval column + + Returns: + A column containing the beta value. + """ + return ( + f.when( + GWASCatalogAssociations._are_alleles_palindromic( + reference_allele, alternate_allele + ), + None, + ) + .when( + ( + GWASCatalogAssociations._effect_needs_harmonisation( + risk_allele, reference_allele + ) + & confidence_interval.contains("increase") + ) + | ( + ~GWASCatalogAssociations._effect_needs_harmonisation( + risk_allele, reference_allele + ) + & confidence_interval.contains("decrease") + ), + -effect_size, + ) + .otherwise(effect_size) + .cast(DoubleType()) + ) + + @staticmethod + def _harmonise_beta_ci( + risk_allele: Column, + reference_allele: Column, + alternate_allele: Column, + effect_size: Column, + confidence_interval: Column, + p_value: Column, + direction: str, + ) -> Column: + """Calculating confidence intervals for beta values. + + Args: + risk_allele (Column): Risk allele column + reference_allele (Column): Reference allele column + alternate_allele (Column): Alternate allele column + effect_size (Column): GWAS Catalog effect size column + confidence_interval (Column): GWAS Catalog confidence interval column + p_value (Column): GWAS Catalog p-value column + direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". + + Returns: + The upper and lower bounds of the confidence interval for the beta coefficient. + """ + zscore_95 = f.lit(1.96) + beta = GWASCatalogAssociations._harmonise_beta( + risk_allele, + reference_allele, + alternate_allele, + effect_size, + confidence_interval, + ) + zscore = pvalue_to_zscore(p_value) + return ( + f.when(f.lit(direction) == "upper", beta + f.abs(zscore_95 * beta) / zscore) + .when(f.lit(direction) == "lower", beta - f.abs(zscore_95 * beta) / zscore) + .otherwise(None) + ) + + @staticmethod + def _harmonise_odds_ratio( + risk_allele: Column, + reference_allele: Column, + alternate_allele: Column, + effect_size: Column, + confidence_interval: Column, + ) -> Column: + """Harmonizing odds ratio. + + Args: + risk_allele (Column): Risk allele column + reference_allele (Column): Reference allele column + alternate_allele (Column): Alternate allele column + effect_size (Column): GWAS Catalog effect size column + confidence_interval (Column): GWAS Catalog confidence interval column + + Returns: + A column with the odds ratio, or 1/odds_ratio if harmonization required. + """ + return ( + f.when( + GWASCatalogAssociations._are_alleles_palindromic( + reference_allele, alternate_allele + ), + None, + ) + .when( + ( + GWASCatalogAssociations._effect_needs_harmonisation( + risk_allele, reference_allele + ) + & ~confidence_interval.rlike("|".join(["decrease", "increase"])) + ), + 1 / effect_size, + ) + .otherwise(effect_size) + .cast(DoubleType()) + ) + + @staticmethod + def _harmonise_odds_ratio_ci( + risk_allele: Column, + reference_allele: Column, + alternate_allele: Column, + effect_size: Column, + confidence_interval: Column, + p_value: Column, + direction: str, + ) -> Column: + """Calculating confidence intervals for beta values. + + Args: + risk_allele (Column): Risk allele column + reference_allele (Column): Reference allele column + alternate_allele (Column): Alternate allele column + effect_size (Column): GWAS Catalog effect size column + confidence_interval (Column): GWAS Catalog confidence interval column + p_value (Column): GWAS Catalog p-value column + direction (str): This is the direction of the confidence interval. It can be either "upper" or "lower". + + Returns: + The upper and lower bounds of the 95% confidence interval for the odds ratio. + """ + zscore_95 = f.lit(1.96) + odds_ratio = GWASCatalogAssociations._harmonise_odds_ratio( + risk_allele, + reference_allele, + alternate_allele, + effect_size, + confidence_interval, + ) + odds_ratio_estimate = f.log(odds_ratio) + zscore = pvalue_to_zscore(p_value) + odds_ratio_se = odds_ratio_estimate / zscore + return f.when( + f.lit(direction) == "upper", + f.exp(odds_ratio_estimate + f.abs(zscore_95 * odds_ratio_se)), + ).when( + f.lit(direction) == "lower", + f.exp(odds_ratio_estimate - f.abs(zscore_95 * odds_ratio_se)), + ) + + @staticmethod + def _concatenate_substudy_description( + association_trait: Column, pvalue_text: Column, mapped_trait_uri: Column + ) -> Column: + """Substudy description parsing. Complex string containing metadata about the substudy (e.g. QTL, specific EFO, etc.). + + Args: + association_trait (Column): GWAS Catalog association trait column + pvalue_text (Column): GWAS Catalog p-value text column + mapped_trait_uri (Column): GWAS Catalog mapped trait URI column + + Returns: + A column with the substudy description in the shape trait|pvaluetext1_pvaluetext2|EFO1_EFO2. + + Examples: + >>> df = spark.createDataFrame([ + ... ("Height", "http://www.ebi.ac.uk/efo/EFO_0000001,http://www.ebi.ac.uk/efo/EFO_0000002", "European Ancestry"), + ... ("Schizophrenia", "http://www.ebi.ac.uk/efo/MONDO_0005090", None)], + ... ["association_trait", "mapped_trait_uri", "pvalue_text"] + ... ) + >>> df.withColumn('substudy_description', GWASCatalogAssociations._concatenate_substudy_description(df.association_trait, df.pvalue_text, df.mapped_trait_uri)).show(truncate=False) + +-----------------+-------------------------------------------------------------------------+-----------------+------------------------------------------+ + |association_trait|mapped_trait_uri |pvalue_text |substudy_description | + +-----------------+-------------------------------------------------------------------------+-----------------+------------------------------------------+ + |Height |http://www.ebi.ac.uk/efo/EFO_0000001,http://www.ebi.ac.uk/efo/EFO_0000002|European Ancestry|Height|EA|EFO_0000001/EFO_0000002 | + |Schizophrenia |http://www.ebi.ac.uk/efo/MONDO_0005090 |null |Schizophrenia|no_pvalue_text|MONDO_0005090| + +-----------------+-------------------------------------------------------------------------+-----------------+------------------------------------------+ + + """ + p_value_text = f.coalesce( + GWASCatalogAssociations._normalise_pvaluetext(pvalue_text), + f.array(f.lit("no_pvalue_text")), + ) + return f.concat_ws( + "|", + association_trait, + f.concat_ws( + "/", + p_value_text, + ), + f.concat_ws( + "/", + parse_efos(mapped_trait_uri), + ), + ) + + @staticmethod + def _qc_all( + qc: Column, + chromosome: Column, + position: Column, + reference_allele: Column, + alternate_allele: Column, + strongest_snp_risk_allele: Column, + p_value_mantissa: Column, + p_value_exponent: Column, + p_value_cutoff: float, + ) -> Column: + """Flag associations that fail any QC. + + Args: + qc (Column): QC column + chromosome (Column): Chromosome column + position (Column): Position column + reference_allele (Column): Reference allele column + alternate_allele (Column): Alternate allele column + strongest_snp_risk_allele (Column): Strongest SNP risk allele column + p_value_mantissa (Column): P-value mantissa column + p_value_exponent (Column): P-value exponent column + p_value_cutoff (float): P-value cutoff + + Returns: + Column: Updated QC column with flag. + """ + qc = GWASCatalogAssociations._qc_variant_interactions( + qc, strongest_snp_risk_allele + ) + qc = GWASCatalogAssociations._qc_subsignificant_associations( + qc, p_value_mantissa, p_value_exponent, p_value_cutoff + ) + qc = GWASCatalogAssociations._qc_genomic_location(qc, chromosome, position) + qc = GWASCatalogAssociations._qc_variant_inconsistencies( + qc, chromosome, position, strongest_snp_risk_allele + ) + qc = GWASCatalogAssociations._qc_unmapped_variants(qc, alternate_allele) + qc = GWASCatalogAssociations._qc_palindromic_alleles( + qc, reference_allele, alternate_allele + ) + return qc + + @staticmethod + def _qc_variant_interactions( + qc: Column, strongest_snp_risk_allele: Column + ) -> Column: + """Flag associations based on variant x variant interactions. + + Args: + qc (Column): QC column + strongest_snp_risk_allele (Column): Column with the strongest SNP risk allele + + Returns: + Column: Updated QC column with flag. + """ + return GWASCatalogAssociations._update_quality_flag( + qc, + strongest_snp_risk_allele.contains(";"), + StudyLocusQualityCheck.COMPOSITE_FLAG, + ) + + @staticmethod + def _qc_subsignificant_associations( + qc: Column, + p_value_mantissa: Column, + p_value_exponent: Column, + pvalue_cutoff: float, + ) -> Column: + """Flag associations below significant threshold. + + Args: + qc (Column): QC column + p_value_mantissa (Column): P-value mantissa column + p_value_exponent (Column): P-value exponent column + pvalue_cutoff (float): association p-value cut-off + + Returns: + Column: Updated QC column with flag. + + Examples: + >>> import pyspark.sql.types as t + >>> d = [{'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -7}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 5, 'p_value_exponent': -8}, {'qc': None, 'p_value_mantissa': 1, 'p_value_exponent': -9}] + >>> df = spark.createDataFrame(d, t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('p_value_mantissa', t.IntegerType()), t.StructField('p_value_exponent', t.IntegerType())])) + >>> df.withColumn('qc', GWASCatalogAssociations._qc_subsignificant_associations(f.col("qc"), f.col("p_value_mantissa"), f.col("p_value_exponent"), 5e-8)).show(truncate = False) + +------------------------+----------------+----------------+ + |qc |p_value_mantissa|p_value_exponent| + +------------------------+----------------+----------------+ + |[Subsignificant p-value]|1 |-7 | + |[] |1 |-8 | + |[] |5 |-8 | + |[] |1 |-9 | + +------------------------+----------------+----------------+ + + + """ + return StudyLocus._update_quality_flag( + qc, + calculate_neglog_pvalue(p_value_mantissa, p_value_exponent) + < f.lit(-np.log10(pvalue_cutoff)), + StudyLocusQualityCheck.SUBSIGNIFICANT_FLAG, + ) + + @staticmethod + def _qc_genomic_location( + qc: Column, chromosome: Column, position: Column + ) -> Column: + """Flag associations without genomic location in GWAS Catalog. + + Args: + qc (Column): QC column + chromosome (Column): Chromosome column in GWAS Catalog + position (Column): Position column in GWAS Catalog + + Returns: + Column: Updated QC column with flag. + + Examples: + >>> import pyspark.sql.types as t + >>> d = [{'qc': None, 'chromosome': None, 'position': None}, {'qc': None, 'chromosome': '1', 'position': None}, {'qc': None, 'chromosome': None, 'position': 1}, {'qc': None, 'chromosome': '1', 'position': 1}] + >>> df = spark.createDataFrame(d, schema=t.StructType([t.StructField('qc', t.ArrayType(t.StringType()), True), t.StructField('chromosome', t.StringType()), t.StructField('position', t.IntegerType())])) + >>> df.withColumn('qc', GWASCatalogAssociations._qc_genomic_location(df.qc, df.chromosome, df.position)).show(truncate=False) + +----------------------------+----------+--------+ + |qc |chromosome|position| + +----------------------------+----------+--------+ + |[Incomplete genomic mapping]|null |null | + |[Incomplete genomic mapping]|1 |null | + |[Incomplete genomic mapping]|null |1 | + |[] |1 |1 | + +----------------------------+----------+--------+ + + + """ + return StudyLocus._update_quality_flag( + qc, + position.isNull() | chromosome.isNull(), + StudyLocusQualityCheck.NO_GENOMIC_LOCATION_FLAG, + ) + + @staticmethod + def _qc_variant_inconsistencies( + qc: Column, + chromosome: Column, + position: Column, + strongest_snp_risk_allele: Column, + ) -> Column: + """Flag associations with inconsistencies in the variant annotation. + + Args: + qc (Column): QC column + chromosome (Column): Chromosome column in GWAS Catalog + position (Column): Position column in GWAS Catalog + strongest_snp_risk_allele (Column): Strongest SNP risk allele column in GWAS Catalog + + Returns: + Column: Updated QC column with flag. + """ + return GWASCatalogAssociations._update_quality_flag( + qc, + # Number of chromosomes does not correspond to the number of positions: + (f.size(f.split(chromosome, ";")) != f.size(f.split(position, ";"))) + # Number of chromosome values different from riskAllele values: + | ( + f.size(f.split(chromosome, ";")) + != f.size(f.split(strongest_snp_risk_allele, ";")) + ), + StudyLocusQualityCheck.INCONSISTENCY_FLAG, + ) + + @staticmethod + def _qc_unmapped_variants(qc: Column, alternate_allele: Column) -> Column: + """Flag associations with variants not mapped to variantAnnotation. + + Args: + qc (Column): QC column + alternate_allele (Column): alternate allele + + Returns: + Column: Updated QC column with flag. + + Example: + >>> import pyspark.sql.types as t + >>> d = [{'alternate_allele': 'A', 'qc': None}, {'alternate_allele': None, 'qc': None}] + >>> schema = t.StructType([t.StructField('alternate_allele', t.StringType(), True), t.StructField('qc', t.ArrayType(t.StringType()), True)]) + >>> df = spark.createDataFrame(data=d, schema=schema) + >>> df.withColumn("new_qc", GWASCatalogAssociations._qc_unmapped_variants(f.col("qc"), f.col("alternate_allele"))).show() + +----------------+----+--------------------+ + |alternate_allele| qc| new_qc| + +----------------+----+--------------------+ + | A|null| []| + | null|null|[No mapping in Gn...| + +----------------+----+--------------------+ + + + """ + return GWASCatalogAssociations._update_quality_flag( + qc, + alternate_allele.isNull(), + StudyLocusQualityCheck.NON_MAPPED_VARIANT_FLAG, + ) + + @staticmethod + def _qc_palindromic_alleles( + qc: Column, reference_allele: Column, alternate_allele: Column + ) -> Column: + """Flag associations with palindromic variants which effects can not be harmonised. + + Args: + qc (Column): QC column + reference_allele (Column): reference allele + alternate_allele (Column): alternate allele + + Returns: + Column: Updated QC column with flag. + + Example: + >>> import pyspark.sql.types as t + >>> schema = t.StructType([t.StructField('reference_allele', t.StringType(), True), t.StructField('alternate_allele', t.StringType(), True), t.StructField('qc', t.ArrayType(t.StringType()), True)]) + >>> d = [{'reference_allele': 'A', 'alternate_allele': 'T', 'qc': None}, {'reference_allele': 'AT', 'alternate_allele': 'TA', 'qc': None}, {'reference_allele': 'AT', 'alternate_allele': 'AT', 'qc': None}] + >>> df = spark.createDataFrame(data=d, schema=schema) + >>> df.withColumn("qc", GWASCatalogAssociations._qc_palindromic_alleles(f.col("qc"), f.col("reference_allele"), f.col("alternate_allele"))).show(truncate=False) + +----------------+----------------+---------------------------------------+ + |reference_allele|alternate_allele|qc | + +----------------+----------------+---------------------------------------+ + |A |T |[Palindrome alleles - cannot harmonize]| + |AT |TA |[] | + |AT |AT |[Palindrome alleles - cannot harmonize]| + +----------------+----------------+---------------------------------------+ + + + """ + return StudyLocus._update_quality_flag( + qc, + GWASCatalogAssociations._are_alleles_palindromic( + reference_allele, alternate_allele + ), + StudyLocusQualityCheck.PALINDROMIC_ALLELE_FLAG, + ) + + @classmethod + def from_source( + cls: type[GWASCatalogAssociations], + gwas_associations: DataFrame, + variant_annotation: VariantAnnotation, + pvalue_threshold: float = 5e-8, + ) -> GWASCatalogAssociations: + """Read GWASCatalog associations. + + It reads the GWAS Catalog association dataset, selects and renames columns, casts columns, and + applies some pre-defined filters on the data: + + Args: + gwas_associations (DataFrame): GWAS Catalog raw associations dataset + variant_annotation (VariantAnnotation): Variant annotation dataset + pvalue_threshold (float): P-value threshold for flagging associations + + Returns: + StudyLocusGWASCatalog: StudyLocusGWASCatalog dataset + """ + return GWASCatalogAssociations( + _df=gwas_associations.withColumn( + "studyLocusId", f.monotonically_increasing_id().cast(LongType()) + ) + .transform( + # Map/harmonise variants to variant annotation dataset: + # This function adds columns: variantId, referenceAllele, alternateAllele, chromosome, position + lambda df: GWASCatalogAssociations._map_to_variant_annotation_variants( + df, variant_annotation + ) + ) + .withColumn( + # Perform all quality control checks: + "qualityControls", + GWASCatalogAssociations._qc_all( + f.array().alias("qualityControls"), + f.col("CHR_ID"), + f.col("CHR_POS").cast(IntegerType()), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("STRONGEST SNP-RISK ALLELE"), + *GWASCatalogAssociations._parse_pvalue(f.col("P-VALUE")), + pvalue_threshold, + ), + ) + .select( + # INSIDE STUDY-LOCUS SCHEMA: + "studyLocusId", + "variantId", + # Mapped genomic location of the variant (; separated list) + "chromosome", + "position", + f.col("STUDY ACCESSION").alias("studyId"), + # beta value of the association + GWASCatalogAssociations._harmonise_beta( + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + ).alias("beta"), + # odds ratio of the association + GWASCatalogAssociations._harmonise_odds_ratio( + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + ).alias("oddsRatio"), + # CI lower of the beta value + GWASCatalogAssociations._harmonise_beta_ci( + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + f.col("P-VALUE"), + "lower", + ).alias("betaConfidenceIntervalLower"), + # CI upper for the beta value + GWASCatalogAssociations._harmonise_beta_ci( + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + f.col("P-VALUE"), + "upper", + ).alias("betaConfidenceIntervalUpper"), + # CI lower of the odds ratio value + GWASCatalogAssociations._harmonise_odds_ratio_ci( + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + f.col("P-VALUE"), + "lower", + ).alias("oddsRatioConfidenceIntervalLower"), + # CI upper of the odds ratio value + GWASCatalogAssociations._harmonise_odds_ratio_ci( + GWASCatalogAssociations._normalise_risk_allele( + f.col("STRONGEST SNP-RISK ALLELE") + ), + f.col("referenceAllele"), + f.col("alternateAllele"), + f.col("OR or BETA"), + f.col("95% CI (TEXT)"), + f.col("P-VALUE"), + "upper", + ).alias("oddsRatioConfidenceIntervalUpper"), + # p-value of the association, string: split into exponent and mantissa. + *GWASCatalogAssociations._parse_pvalue(f.col("P-VALUE")), + # Capturing phenotype granularity at the association level + GWASCatalogAssociations._concatenate_substudy_description( + f.col("DISEASE/TRAIT"), + f.col("P-VALUE (TEXT)"), + f.col("MAPPED_TRAIT_URI"), + ).alias("subStudyDescription"), + # Quality controls (array of strings) + "qualityControls", + ), + _schema=GWASCatalogAssociations.get_schema(), + ) + + def update_study_id( + self: GWASCatalogAssociations, study_annotation: DataFrame + ) -> GWASCatalogAssociations: + """Update final studyId and studyLocusId with a dataframe containing study annotation. + + Args: + study_annotation (DataFrame): Dataframe containing `updatedStudyId` and key columns `studyId` and `subStudyDescription`. + + Returns: + StudyLocusGWASCatalog: Updated study locus with new `studyId` and `studyLocusId`. + """ + self.df = ( + self._df.join( + study_annotation, on=["studyId", "subStudyDescription"], how="left" + ) + .withColumn("studyId", f.coalesce("updatedStudyId", "studyId")) + .drop("subStudyDescription", "updatedStudyId") + ).withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id(f.col("studyId"), f.col("variantId")), + ) + return self + + def _qc_ambiguous_study(self: GWASCatalogAssociations) -> GWASCatalogAssociations: + """Flag associations with variants that can not be unambiguously associated with one study. + + Returns: + StudyLocusGWASCatalog: Updated study locus. + """ + assoc_ambiguity_window = Window.partitionBy( + f.col("studyId"), f.col("variantId") + ) + + self._df.withColumn( + "qualityControls", + StudyLocus._update_quality_flag( + f.col("qualityControls"), + f.count(f.col("variantId")).over(assoc_ambiguity_window) > 1, + StudyLocusQualityCheck.AMBIGUOUS_STUDY, + ), + ) + return self diff --git a/src/otg/datasource/gwas_catalog/study_index.py b/src/otg/datasource/gwas_catalog/study_index.py new file mode 100644 index 000000000..34cdb8d09 --- /dev/null +++ b/src/otg/datasource/gwas_catalog/study_index.py @@ -0,0 +1,503 @@ +"""Study Index for GWAS Catalog data source.""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.common.spark_helpers import column2camel_case +from otg.common.utils import parse_efos +from otg.dataset.study_index import StudyIndex + +if TYPE_CHECKING: + from pyspark.sql import Column, DataFrame + + +@dataclass +class GWASCatalogStudyIndex(StudyIndex): + """Study index from GWAS Catalog. + + The following information is harmonised from the GWAS Catalog: + + - All publication related information retained. + - Mapped measured and background traits parsed. + - Flagged if harmonized summary statistics datasets available. + - If available, the ftp path to these files presented. + - Ancestries from the discovery and replication stages are structured with sample counts. + - Case/control counts extracted. + - The number of samples with European ancestry extracted. + + """ + + @staticmethod + def _parse_discovery_samples(discovery_samples: Column) -> Column: + """Parse discovery sample sizes from GWAS Catalog. + + This is a curated field. From publication sometimes it is not clear how the samples were split + across the reported ancestries. In such cases we are assuming the ancestries were evenly presented + and the total sample size is split: + + ["European, African", 100] -> ["European, 50], ["African", 50] + + Args: + discovery_samples (Column): Raw discovery sample sizes + + Returns: + Column: Parsed and de-duplicated list of discovery ancestries with sample size. + + Examples: + >>> data = [('s1', "European", 10), ('s1', "African", 10), ('s2', "European, African, Asian", 100), ('s2', "European", 50)] + >>> df = ( + ... spark.createDataFrame(data, ['studyId', 'ancestry', 'sampleSize']) + ... .groupBy('studyId') + ... .agg( + ... f.collect_set( + ... f.struct('ancestry', 'sampleSize') + ... ).alias('discoverySampleSize') + ... ) + ... .orderBy('studyId') + ... .withColumn('discoverySampleSize', GWASCatalogStudyIndex._parse_discovery_samples(f.col('discoverySampleSize'))) + ... .select('discoverySampleSize') + ... .show(truncate=False) + ... ) + +--------------------------------------------+ + |discoverySampleSize | + +--------------------------------------------+ + |[{African, 10}, {European, 10}] | + |[{European, 83}, {African, 33}, {Asian, 33}]| + +--------------------------------------------+ + + """ + # To initialize return objects for aggregate functions, schema has to be definied: + schema = t.ArrayType( + t.StructType( + [ + t.StructField("ancestry", t.StringType(), True), + t.StructField("sampleSize", t.IntegerType(), True), + ] + ) + ) + + # Splitting comma separated ancestries: + exploded_ancestries = f.transform( + discovery_samples, + lambda sample: f.split(sample.ancestry, r",\s(?![^()]*\))"), + ) + + # Initialize discoverySample object from unique list of ancestries: + unique_ancestries = f.transform( + f.aggregate( + exploded_ancestries, + f.array().cast(t.ArrayType(t.StringType())), + lambda x, y: f.array_union(x, y), + f.array_distinct, + ), + lambda ancestry: f.struct( + ancestry.alias("ancestry"), + f.lit(0).cast(t.LongType()).alias("sampleSize"), + ), + ) + + # Computing sample sizes for ancestries when splitting is needed: + resolved_sample_count = f.transform( + f.arrays_zip( + f.transform(exploded_ancestries, lambda pop: f.size(pop)).alias( + "pop_size" + ), + f.transform(discovery_samples, lambda pop: pop.sampleSize).alias( + "pop_count" + ), + ), + lambda pop: (pop.pop_count / pop.pop_size).cast(t.IntegerType()), + ) + + # Flattening out ancestries with sample sizes: + parsed_sample_size = f.aggregate( + f.transform( + f.arrays_zip( + exploded_ancestries.alias("ancestries"), + resolved_sample_count.alias("sample_count"), + ), + GWASCatalogStudyIndex._merge_ancestries_and_counts, + ), + f.array().cast(schema), + lambda x, y: f.array_union(x, y), + ) + + # Normalize ancestries: + return f.aggregate( + parsed_sample_size, + unique_ancestries, + GWASCatalogStudyIndex._normalize_ancestries, + ) + + @staticmethod + def _normalize_ancestries(merged: Column, ancestry: Column) -> Column: + """Normalize ancestries from a list of structs. + + As some ancestry label might be repeated with different sample counts, + these counts need to be collected. + + Args: + merged (Column): Resulting list of struct with unique ancestries. + ancestry (Column): One ancestry object coming from raw. + + Returns: + Column: Unique list of ancestries with the sample counts. + """ + # Iterating over the list of unique ancestries and adding the sample size if label matches: + return f.transform( + merged, + lambda a: f.when( + a.ancestry == ancestry.ancestry, + f.struct( + a.ancestry.alias("ancestry"), + (a.sampleSize + ancestry.sampleSize) + .cast(t.LongType()) + .alias("sampleSize"), + ), + ).otherwise(a), + ) + + @staticmethod + def _merge_ancestries_and_counts(ancestry_group: Column) -> Column: + """Merge ancestries with sample sizes. + + After splitting ancestry annotations, all resulting ancestries needs to be assigned + with the proper sample size. + + Args: + ancestry_group (Column): Each element is a struct with `sample_count` (int) and `ancestries` (list) + + Returns: + Column: a list of structs with `ancestry` and `sampleSize` fields. + + Examples: + >>> data = [(12, ['African', 'European']),(12, ['African'])] + >>> ( + ... spark.createDataFrame(data, ['sample_count', 'ancestries']) + ... .select(GWASCatalogStudyIndex._merge_ancestries_and_counts(f.struct('sample_count', 'ancestries')).alias('test')) + ... .show(truncate=False) + ... ) + +-------------------------------+ + |test | + +-------------------------------+ + |[{African, 12}, {European, 12}]| + |[{African, 12}] | + +-------------------------------+ + + """ + # Extract sample size for the ancestry group: + count = ancestry_group.sample_count + + # We need to loop through the ancestries: + return f.transform( + ancestry_group.ancestries, + lambda ancestry: f.struct( + ancestry.alias("ancestry"), + count.alias("sampleSize"), + ), + ) + + @classmethod + def _parse_study_table( + cls: type[GWASCatalogStudyIndex], catalog_studies: DataFrame + ) -> GWASCatalogStudyIndex: + """Harmonise GWASCatalog study table with `StudyIndex` schema. + + Args: + catalog_studies (DataFrame): GWAS Catalog study table + + Returns: + GWASCatalogStudyIndex: Parsed and annotated GWAS Catalog study table. + """ + return GWASCatalogStudyIndex( + _df=catalog_studies.select( + f.coalesce( + f.col("STUDY ACCESSION"), f.monotonically_increasing_id() + ).alias("studyId"), + f.lit("GCST").alias("projectId"), + f.lit("gwas").alias("studyType"), + f.col("PUBMED ID").alias("pubmedId"), + f.col("FIRST AUTHOR").alias("publicationFirstAuthor"), + f.col("DATE").alias("publicationDate"), + f.col("JOURNAL").alias("publicationJournal"), + f.col("STUDY").alias("publicationTitle"), + f.coalesce(f.col("DISEASE/TRAIT"), f.lit("Unreported")).alias( + "traitFromSource" + ), + f.col("INITIAL SAMPLE SIZE").alias("initialSampleSize"), + parse_efos(f.col("MAPPED_TRAIT_URI")).alias("traitFromSourceMappedIds"), + parse_efos(f.col("MAPPED BACKGROUND TRAIT URI")).alias( + "backgroundTraitFromSourceMappedIds" + ), + ), + _schema=GWASCatalogStudyIndex.get_schema(), + ) + + @classmethod + def from_source( + cls: type[GWASCatalogStudyIndex], + catalog_studies: DataFrame, + ancestry_file: DataFrame, + sumstats_lut: DataFrame, + ) -> StudyIndex: + """Ingests study level metadata from the GWAS Catalog. + + Args: + catalog_studies (DataFrame): GWAS Catalog raw study table + ancestry_file (DataFrame): GWAS Catalog ancestry table. + sumstats_lut (DataFrame): GWAS Catalog summary statistics list. + + Returns: + GWASCatalogStudyIndex: Parsed and annotated GWAS Catalog study table. + """ + # Read GWAS Catalogue raw data + return ( + cls._parse_study_table(catalog_studies) + ._annotate_ancestries(ancestry_file) + ._annotate_sumstats_info(sumstats_lut) + ._annotate_discovery_sample_sizes() + ) + + def update_study_id( + self: GWASCatalogStudyIndex, study_annotation: DataFrame + ) -> GWASCatalogStudyIndex: + """Update studyId with a dataframe containing study. + + Args: + study_annotation (DataFrame): Dataframe containing `updatedStudyId`, `traitFromSource`, `traitFromSourceMappedIds` and key column `studyId`. + + Returns: + GWASCatalogStudyIndex: Updated study table. + """ + self.df = ( + self._df.join( + study_annotation.select( + *[ + f.col(c).alias(f"updated{c}") + if c not in ["studyId", "updatedStudyId"] + else f.col(c) + for c in study_annotation.columns + ] + ), + on="studyId", + how="left", + ) + .withColumn( + "studyId", + f.coalesce(f.col("updatedStudyId"), f.col("studyId")), + ) + .withColumn( + "traitFromSource", + f.coalesce(f.col("updatedtraitFromSource"), f.col("traitFromSource")), + ) + .withColumn( + "traitFromSourceMappedIds", + f.coalesce( + f.col("updatedtraitFromSourceMappedIds"), + f.col("traitFromSourceMappedIds"), + ), + ) + .select(self._df.columns) + ) + + return self + + def _annotate_ancestries( + self: GWASCatalogStudyIndex, ancestry_lut: DataFrame + ) -> GWASCatalogStudyIndex: + """Extracting sample sizes and ancestry information. + + This function parses the ancestry data. Also get counts for the europeans in the same + discovery stage. + + Args: + ancestry_lut (DataFrame): Ancestry table as downloaded from the GWAS Catalog + + Returns: + GWASCatalogStudyIndex: Slimmed and cleaned version of the ancestry annotation. + """ + ancestry = ( + ancestry_lut + # Convert column headers to camelcase: + .transform( + lambda df: df.select( + *[f.expr(column2camel_case(x)) for x in df.columns] + ) + ).withColumnRenamed( + "studyAccession", "studyId" + ) # studyId has not been split yet + ) + + # Get a high resolution dataset on experimental stage: + ancestry_stages = ( + ancestry.groupBy("studyId") + .pivot("stage") + .agg( + f.collect_set( + f.struct( + f.col("broadAncestralCategory").alias("ancestry"), + f.col("numberOfIndividuals") + .cast(t.LongType()) + .alias("sampleSize"), + ) + ) + ) + .withColumn( + "discoverySamples", self._parse_discovery_samples(f.col("initial")) + ) + .withColumnRenamed("replication", "replicationSamples") + # Mapping discovery stage ancestries to LD reference: + .withColumn( + "ldPopulationStructure", + self.aggregate_and_map_ancestries(f.col("discoverySamples")), + ) + .drop("initial") + .persist() + ) + + # Generate information on the ancestry composition of the discovery stage, and calculate + # the proportion of the Europeans: + europeans_deconvoluted = ( + ancestry + # Focus on discovery stage: + .filter(f.col("stage") == "initial") + # Sorting ancestries if European: + .withColumn( + "ancestryFlag", + # Excluding finnish: + f.when( + f.col("initialSampleDescription").contains("Finnish"), + f.lit("other"), + ) + # Excluding Icelandic population: + .when( + f.col("initialSampleDescription").contains("Icelandic"), + f.lit("other"), + ) + # Including European ancestry: + .when(f.col("broadAncestralCategory") == "European", f.lit("european")) + # Exclude all other population: + .otherwise("other"), + ) + # Grouping by study accession and initial sample description: + .groupBy("studyId") + .pivot("ancestryFlag") + .agg( + # Summarizing sample sizes for all ancestries: + f.sum(f.col("numberOfIndividuals")) + ) + # Do arithmetics to make sure we have the right proportion of european in the set: + .withColumn( + "initialSampleCountEuropean", + f.when(f.col("european").isNull(), f.lit(0)).otherwise( + f.col("european") + ), + ) + .withColumn( + "initialSampleCountOther", + f.when(f.col("other").isNull(), f.lit(0)).otherwise(f.col("other")), + ) + .withColumn( + "initialSampleCount", + f.col("initialSampleCountEuropean") + f.col("other"), + ) + .drop( + "european", + "other", + "initialSampleCount", + "initialSampleCountEuropean", + "initialSampleCountOther", + ) + ) + + parsed_ancestry_lut = ancestry_stages.join( + europeans_deconvoluted, on="studyId", how="outer" + ) + + self.df = self.df.join(parsed_ancestry_lut, on="studyId", how="left") + return self + + def _annotate_sumstats_info( + self: GWASCatalogStudyIndex, sumstats_lut: DataFrame + ) -> GWASCatalogStudyIndex: + """Annotate summary stat locations. + + Args: + sumstats_lut (DataFrame): listing GWAS Catalog summary stats paths + + Returns: + GWASCatalogStudyIndex: including `summarystatsLocation` and `hasSumstats` columns + """ + gwas_sumstats_base_uri = ( + "ftp://ftp.ebi.ac.uk/pub/databases/gwas/summary_statistics/" + ) + + parsed_sumstats_lut = sumstats_lut.withColumn( + "summarystatsLocation", + f.concat( + f.lit(gwas_sumstats_base_uri), + f.regexp_replace(f.col("_c0"), r"^\.\/", ""), + ), + ).select( + f.regexp_extract(f.col("summarystatsLocation"), r"\/(GCST\d+)\/", 1).alias( + "studyId" + ), + "summarystatsLocation", + f.lit(True).alias("hasSumstats"), + ) + + self.df = ( + self.df.drop("hasSumstats") + .join(parsed_sumstats_lut, on="studyId", how="left") + .withColumn("hasSumstats", f.coalesce(f.col("hasSumstats"), f.lit(False))) + ) + return self + + def _annotate_discovery_sample_sizes( + self: GWASCatalogStudyIndex, + ) -> GWASCatalogStudyIndex: + """Extract the sample size of the discovery stage of the study as annotated in the GWAS Catalog. + + For some studies that measure quantitative traits, nCases and nControls can't be extracted. Therefore, we assume these are 0. + + Returns: + GWASCatalogStudyIndex: object with columns `nCases`, `nControls`, and `nSamples` per `studyId` correctly extracted. + """ + sample_size_lut = ( + self.df.select( + "studyId", + f.explode_outer(f.split(f.col("initialSampleSize"), r",\s+")).alias( + "samples" + ), + ) + # Extracting the sample size from the string: + .withColumn( + "sampleSize", + f.regexp_extract( + f.regexp_replace(f.col("samples"), ",", ""), r"[0-9,]+", 0 + ).cast(t.IntegerType()), + ) + .select( + "studyId", + "sampleSize", + f.when(f.col("samples").contains("cases"), f.col("sampleSize")) + .otherwise(f.lit(0)) + .alias("nCases"), + f.when(f.col("samples").contains("controls"), f.col("sampleSize")) + .otherwise(f.lit(0)) + .alias("nControls"), + ) + # Aggregating sample sizes for all ancestries: + .groupBy("studyId") # studyId has not been split yet + .agg( + f.sum("nCases").alias("nCases"), + f.sum("nControls").alias("nControls"), + f.sum("sampleSize").alias("nSamples"), + ) + ) + self.df = self.df.join(sample_size_lut, on="studyId", how="left") + return self diff --git a/src/otg/common/gwas_catalog_splitter.py b/src/otg/datasource/gwas_catalog/study_splitter.py similarity index 83% rename from src/otg/common/gwas_catalog_splitter.py rename to src/otg/datasource/gwas_catalog/study_splitter.py index 9a0566579..f31d147be 100644 --- a/src/otg/common/gwas_catalog_splitter.py +++ b/src/otg/datasource/gwas_catalog/study_splitter.py @@ -10,11 +10,11 @@ if TYPE_CHECKING: from pyspark.sql import Column - from otg.dataset.study_index import StudyIndexGWASCatalog - from otg.dataset.study_locus import StudyLocusGWASCatalog + from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations + from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex -class GWASCatalogSplitter: +class GWASCatalogStudySplitter: """Splitting multi-trait GWAS Catalog studies.""" @staticmethod @@ -33,7 +33,7 @@ def _resolve_trait( """ return ( f.when( - p_value_text.isNotNull(), + (p_value_text.isNotNull()) & (p_value_text != ("no_pvalue_text")), f.concat( association_trait, f.lit(" ["), @@ -59,7 +59,7 @@ def _resolve_efo(association_efo: Column, study_efo: Column) -> Column: Returns: Column: Consolidated EFO column. """ - return f.coalesce(f.split(association_efo, "_"), study_efo) + return f.coalesce(f.split(association_efo, r"\/"), study_efo) @staticmethod def _resolve_study_id(study_id: Column, sub_study_description: Column) -> Column: @@ -81,17 +81,17 @@ def _resolve_study_id(study_id: Column, sub_study_description: Column) -> Column @classmethod def split( - cls: type[GWASCatalogSplitter], - studies: StudyIndexGWASCatalog, - associations: StudyLocusGWASCatalog, - ) -> Tuple[StudyIndexGWASCatalog, StudyLocusGWASCatalog]: + cls: type[GWASCatalogStudySplitter], + studies: GWASCatalogStudyIndex, + associations: GWASCatalogAssociations, + ) -> Tuple[GWASCatalogStudyIndex, GWASCatalogAssociations]: """Splitting multi-trait GWAS Catalog studies. If assigned disease of the study and the association don't agree, we assume the study needs to be split. Then disease EFOs, trait names and study ID are consolidated Args: - studies (StudyIndexGWASCatalog): GWAS Catalog studies. + studies (GWASCatalogStudyIndex): GWAS Catalog studies. associations (StudyLocusGWASCatalog): GWAS Catalog associations. Returns: @@ -108,11 +108,11 @@ def split( ).alias("updatedStudyId"), cls._resolve_trait( f.col("traitFromSource"), - f.split("subStudyDescription", "|").getItem(0), - f.split("subStudyDescription", "|").getItem(1), + f.split("subStudyDescription", r"\|").getItem(0), + f.split("subStudyDescription", r"\|").getItem(1), ).alias("traitFromSource"), cls._resolve_efo( - f.split("subStudyDescription", "|").getItem(2), + f.split("subStudyDescription", r"\|").getItem(2), f.col("traitFromSourceMappedIds"), ).alias("traitFromSourceMappedIds"), ) diff --git a/src/otg/datasource/gwas_catalog/summary_statistics.py b/src/otg/datasource/gwas_catalog/summary_statistics.py new file mode 100644 index 000000000..046c88810 --- /dev/null +++ b/src/otg/datasource/gwas_catalog/summary_statistics.py @@ -0,0 +1,88 @@ +"""GWAS Catalog Summary Statistics reader.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.common.utils import ( + calculate_confidence_interval, + convert_odds_ratio_to_beta, + parse_pvalue, +) +from otg.dataset.summary_statistics import SummaryStatistics + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +@dataclass +class GWASCatalogSummaryStatistics(SummaryStatistics): + """GWAS Catalog Summary Statistics reader.""" + + @classmethod + def from_gwas_harmonized_summary_stats( + cls: type[GWASCatalogSummaryStatistics], + sumstats_df: DataFrame, + study_id: str, + ) -> GWASCatalogSummaryStatistics: + """Create summary statistics object from summary statistics flatfile, harmonized by the GWAS Catalog. + + Args: + sumstats_df (DataFrame): Harmonized dataset read as a spark dataframe from GWAS Catalog. + study_id (str): GWAS Catalog study accession. + + Returns: + SummaryStatistics + """ + # The effect allele frequency is an optional column, we have to test if it is there: + allele_frequency_expression = ( + f.col("hm_effect_allele_frequency").cast(t.FloatType()) + if "hm_effect_allele_frequency" in sumstats_df.columns + else f.lit(None) + ) + + # Processing columns of interest: + processed_sumstats_df = ( + sumstats_df + # Dropping rows which doesn't have proper position: + .filter(f.col("hm_pos").cast(t.IntegerType()).isNotNull()) + .select( + # Adding study identifier: + f.lit(study_id).cast(t.StringType()).alias("studyId"), + # Adding variant identifier: + f.col("hm_variant_id").alias("variantId"), + f.col("hm_chrom").alias("chromosome"), + f.col("hm_pos").cast(t.IntegerType()).alias("position"), + # Parsing p-value mantissa and exponent: + *parse_pvalue(f.col("p_value")), + # Converting/calculating effect and confidence interval: + *convert_odds_ratio_to_beta( + f.col("hm_beta").cast(t.DoubleType()), + f.col("hm_odds_ratio").cast(t.DoubleType()), + f.col("standard_error").cast(t.DoubleType()), + ), + allele_frequency_expression.alias("effectAlleleFrequencyFromSource"), + ) + # The previous select expression generated the necessary fields for calculating the confidence intervals: + .select( + "*", + *calculate_confidence_interval( + f.col("pValueMantissa"), + f.col("pValueExponent"), + f.col("beta"), + f.col("standardError"), + ), + ) + .repartition(200, "chromosome") + .sortWithinPartitions("position") + ) + + # Initializing summary statistics object: + return cls( + _df=processed_sumstats_df, + _schema=cls.get_schema(), + ) diff --git a/src/otg/datasource/intervals/__init__.py b/src/otg/datasource/intervals/__init__.py new file mode 100644 index 000000000..ff72b4fb2 --- /dev/null +++ b/src/otg/datasource/intervals/__init__.py @@ -0,0 +1,3 @@ +"""Docs for intervals.""" + +from __future__ import annotations diff --git a/src/otg/datasource/intervals/andersson.py b/src/otg/datasource/intervals/andersson.py new file mode 100644 index 000000000..67a3f01d7 --- /dev/null +++ b/src/otg/datasource/intervals/andersson.py @@ -0,0 +1,133 @@ +"""Interval dataset from Andersson et al. 2014.""" +from __future__ import annotations + +import importlib.resources as pkg_resources +import json +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.assets import schemas +from otg.dataset.intervals import Intervals + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, SparkSession + + from otg.common.Liftover import LiftOverSpark + from otg.dataset.gene_index import GeneIndex + + +class IntervalsAndersson(Intervals): + """Interval dataset from Andersson et al. 2014.""" + + @staticmethod + def read_andersson(spark: SparkSession, path: str): + """Read andersson2014 dataset.""" + input_schema = t.StructType.fromJson( + json.loads( + pkg_resources.read_text(schemas, "andersson2014.json", encoding="utf-8") + ) + ) + return ( + spark.read.option("delimiter", "\t") + .option("mode", "DROPMALFORMED") + .option("header", "true") + .schema(input_schema) + .csv(path) + ) + + @classmethod + def parse( + cls: type[IntervalsAndersson], + raw_anderson_df: DataFrame, + gene_index: GeneIndex, + lift: LiftOverSpark, + ) -> Intervals: + """Parse Andersson et al. 2014 dataset. + + Args: + session (Session): session + path (str): Path to dataset + gene_index (GeneIndex): Gene index + lift (LiftOverSpark): LiftOverSpark instance + + Returns: + Intervals: Intervals dataset + """ + # Constant values: + dataset_name = "andersson2014" + experiment_type = "fantom5" + pmid = "24670763" + bio_feature = "aggregate" + twosided_threshold = 2.45e6 # <- this needs to phased out. Filter by percentile instead of absolute value. + + # Read the anderson file: + parsed_anderson_df = ( + raw_anderson_df + # Parsing score column and casting as float: + .withColumn("score", f.col("score").cast("float") / f.lit(1000)) + # Parsing the 'name' column: + .withColumn("parsedName", f.split(f.col("name"), ";")) + .withColumn("gene_symbol", f.col("parsedName")[2]) + .withColumn("location", f.col("parsedName")[0]) + .withColumn( + "chrom", + f.regexp_replace(f.split(f.col("location"), ":|-")[0], "chr", ""), + ) + .withColumn( + "start", f.split(f.col("location"), ":|-")[1].cast(t.IntegerType()) + ) + .withColumn( + "end", f.split(f.col("location"), ":|-")[2].cast(t.IntegerType()) + ) + # Select relevant columns: + .select("chrom", "start", "end", "gene_symbol", "score") + # Drop rows with non-canonical chromosomes: + .filter( + f.col("chrom").isin([str(x) for x in range(1, 23)] + ["X", "Y", "MT"]) + ) + # For each region/gene, keep only one row with the highest score: + .groupBy("chrom", "start", "end", "gene_symbol") + .agg(f.max("score").alias("resourceScore")) + .orderBy("chrom", "start") + ) + + return cls( + _df=( + # Lift over the intervals: + lift.convert_intervals(parsed_anderson_df, "chrom", "start", "end") + .drop("start", "end") + .withColumnRenamed("mapped_start", "start") + .withColumnRenamed("mapped_end", "end") + .distinct() + # Joining with the gene index + .alias("intervals") + .join( + gene_index.symbols_lut().alias("genes"), + on=[ + f.col("intervals.gene_symbol") == f.col("genes.geneSymbol"), + # Drop rows where the TSS is far from the start of the region + f.abs( + (f.col("intervals.start") + f.col("intervals.end")) / 2 + - f.col("tss") + ) + <= twosided_threshold, + ], + how="left", + ) + # Select relevant columns: + .select( + f.col("chrom").alias("chromosome"), + f.col("intervals.start").alias("start"), + f.col("intervals.end").alias("end"), + "geneId", + "resourceScore", + f.lit(dataset_name).alias("datasourceId"), + f.lit(experiment_type).alias("datatypeId"), + f.lit(pmid).alias("pmid"), + f.lit(bio_feature).alias("biofeature"), + ) + ), + _schema=Intervals.get_schema(), + ) diff --git a/src/otg/datasource/intervals/javierre.py b/src/otg/datasource/intervals/javierre.py new file mode 100644 index 000000000..7fc7e858e --- /dev/null +++ b/src/otg/datasource/intervals/javierre.py @@ -0,0 +1,172 @@ +"""Interval dataset from Javierre et al. 2016.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.dataset.intervals import Intervals + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, SparkSession + + from otg.common.Liftover import LiftOverSpark + from otg.dataset.gene_index import GeneIndex + + +class IntervalsJavierre(Intervals): + """Interval dataset from Javierre et al. 2016.""" + + @staticmethod + def read_javierre(spark: SparkSession, path: str): + """Read Javierre dataset. + + Args: + spark (SparkSession): Spark session + path (str): Path to dataset + + Returns: + DataFrame: DataFrame with raw Javierre data + """ + return spark.read.parquet(path) + + @classmethod + def parse( + cls: type[IntervalsJavierre], + javierre_raw: DataFrame, + gene_index: GeneIndex, + lift: LiftOverSpark, + ) -> Intervals: + """Parse Javierre et al. 2016 dataset. + + Args: + session (Session): session + path (str): Path to dataset + gene_index (GeneIndex): Gene index + lift (LiftOverSpark): LiftOverSpark instance + + Returns: + Intervals: Javierre et al. 2016 interval data + """ + # Constant values: + dataset_name = "javierre2016" + experiment_type = "pchic" + pmid = "27863249" + twosided_threshold = 2.45e6 + + # Read Javierre data: + javierre_parsed = ( + javierre_raw + # Splitting name column into chromosome, start, end, and score: + .withColumn("name_split", f.split(f.col("name"), r":|-|,")) + .withColumn( + "name_chr", + f.regexp_replace(f.col("name_split")[0], "chr", "").cast( + t.StringType() + ), + ) + .withColumn("name_start", f.col("name_split")[1].cast(t.IntegerType())) + .withColumn("name_end", f.col("name_split")[2].cast(t.IntegerType())) + .withColumn("name_score", f.col("name_split")[3].cast(t.FloatType())) + # Cleaning up chromosome: + .withColumn( + "chrom", + f.regexp_replace(f.col("chrom"), "chr", "").cast(t.StringType()), + ) + .drop("name_split", "name", "annotation") + # Keep canonical chromosomes and consistent chromosomes with scores: + .filter( + (f.col("name_score").isNotNull()) + & (f.col("chrom") == f.col("name_chr")) + & f.col("name_chr").isin( + [f"{x}" for x in range(1, 23)] + ["X", "Y", "MT"] + ) + ) + ) + + # Lifting over intervals: + javierre_remapped = ( + javierre_parsed + # Lifting over to GRCh38 interval 1: + .transform(lambda df: lift.convert_intervals(df, "chrom", "start", "end")) + .drop("start", "end") + .withColumnRenamed("mapped_chrom", "chrom") + .withColumnRenamed("mapped_start", "start") + .withColumnRenamed("mapped_end", "end") + # Lifting over interval 2 to GRCh38: + .transform( + lambda df: lift.convert_intervals( + df, "name_chr", "name_start", "name_end" + ) + ) + .drop("name_start", "name_end") + .withColumnRenamed("mapped_name_chr", "name_chr") + .withColumnRenamed("mapped_name_start", "name_start") + .withColumnRenamed("mapped_name_end", "name_end") + ) + + # Once the intervals are lifted, extracting the unique intervals: + unique_intervals_with_genes = ( + javierre_remapped.select( + f.col("chrom"), + f.col("start").cast(t.IntegerType()), + f.col("end").cast(t.IntegerType()), + ) + .distinct() + .alias("intervals") + .join( + gene_index.locations_lut().alias("genes"), + on=[ + f.col("intervals.chrom") == f.col("genes.chromosome"), + ( + (f.col("intervals.start") >= f.col("genes.start")) + & (f.col("intervals.start") <= f.col("genes.end")) + ) + | ( + (f.col("intervals.end") >= f.col("genes.start")) + & (f.col("intervals.end") <= f.col("genes.end")) + ), + ], + how="left", + ) + .select( + f.col("intervals.chrom").alias("chrom"), + f.col("intervals.start").alias("start"), + f.col("intervals.end").alias("end"), + f.col("genes.geneId").alias("geneId"), + f.col("genes.tss").alias("tss"), + ) + ) + + # Joining back the data: + return cls( + _df=( + javierre_remapped.join( + unique_intervals_with_genes, + on=["chrom", "start", "end"], + how="left", + ) + .filter( + # Drop rows where the TSS is far from the start of the region + f.abs((f.col("start") + f.col("end")) / 2 - f.col("tss")) + <= twosided_threshold + ) + # For each gene, keep only the highest scoring interval: + .groupBy("name_chr", "name_start", "name_end", "geneId", "bio_feature") + .agg(f.max(f.col("name_score")).alias("resourceScore")) + # Create the output: + .select( + f.col("name_chr").alias("chromosome"), + f.col("name_start").alias("start"), + f.col("name_end").alias("end"), + f.col("resourceScore").cast(t.DoubleType()), + f.col("geneId"), + f.col("bio_feature").alias("biofeature"), + f.lit(dataset_name).alias("datasourceId"), + f.lit(experiment_type).alias("datatypeId"), + f.lit(pmid).alias("pmid"), + ) + ), + _schema=Intervals.get_schema(), + ) diff --git a/src/otg/datasource/intervals/jung.py b/src/otg/datasource/intervals/jung.py new file mode 100644 index 000000000..3ca26f026 --- /dev/null +++ b/src/otg/datasource/intervals/jung.py @@ -0,0 +1,103 @@ +"""Interval dataset from Jung et al. 2019.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.dataset.intervals import Intervals + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, SparkSession + + from otg.common.Liftover import LiftOverSpark + from otg.dataset.gene_index import GeneIndex + + +class IntervalsJung(Intervals): + """Interval dataset from Jung et al. 2019.""" + + @staticmethod + def read_jung(spark: SparkSession, path: str): + """Read jung dataset. + + Args: + spark (SparkSession): Spark session + path (str): Path to dataset + + Returns: + DataFrame: DataFrame with raw jung data + """ + return spark.read.csv(path, sep=",", header=True) + + @classmethod + def parse( + cls: type[IntervalsJung], + jung_raw: DataFrame, + gene_index: GeneIndex, + lift: LiftOverSpark, + ) -> Intervals: + """Parse the Jung et al. 2019 dataset. + + Args: + jung_raw (DataFrame): raw Jung et al. 2019 dataset + gene_index (GeneIndex): gene index + lift (LiftOverSpark): LiftOverSpark instance + + Returns: + Intervals: Interval dataset containing Jung et al. 2019 data + """ + dataset_name = "jung2019" + experiment_type = "pchic" + pmid = "31501517" + + # Lifting over the coordinates: + return cls( + _df=( + jung_raw.withColumn( + "interval", f.split(f.col("Interacting_fragment"), r"\.") + ) + .select( + # Parsing intervals: + f.regexp_replace(f.col("interval")[0], "chr", "").alias("chrom"), + f.col("interval")[1].cast(t.IntegerType()).alias("start"), + f.col("interval")[2].cast(t.IntegerType()).alias("end"), + # Extract other columns: + f.col("Promoter").alias("gene_name"), + f.col("Tissue_type").alias("tissue"), + ) + # Lifting over to GRCh38 interval 1: + .transform( + lambda df: lift.convert_intervals(df, "chrom", "start", "end") + ) + .select( + "chrom", + f.col("mapped_start").alias("start"), + f.col("mapped_end").alias("end"), + f.explode(f.split(f.col("gene_name"), ";")).alias("gene_name"), + "tissue", + ) + .alias("intervals") + # Joining with genes: + .join( + gene_index.symbols_lut().alias("genes"), + on=[f.col("intervals.gene_name") == f.col("genes.geneSymbol")], + how="inner", + ) + # Finalize dataset: + .select( + "chromosome", + f.col("intervals.start").alias("start"), + f.col("intervals.end").alias("end"), + "geneId", + f.col("tissue").alias("biofeature"), + f.lit(1.0).alias("score"), + f.lit(dataset_name).alias("datasourceId"), + f.lit(experiment_type).alias("datatypeId"), + f.lit(pmid).alias("pmid"), + ) + .drop_duplicates() + ), + _schema=Intervals.get_schema(), + ) diff --git a/src/otg/datasource/intervals/thurnman.py b/src/otg/datasource/intervals/thurnman.py new file mode 100644 index 000000000..18587066d --- /dev/null +++ b/src/otg/datasource/intervals/thurnman.py @@ -0,0 +1,104 @@ +"""Interval dataset from Thurman et al. 2019.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t + +from otg.dataset.intervals import Intervals + +if TYPE_CHECKING: + from pyspark.sql import DataFrame, SparkSession + + from otg.common.Liftover import LiftOverSpark + from otg.dataset.gene_index import GeneIndex + + +class IntervalsThurnman(Intervals): + """Interval dataset from Thurman et al. 2012.""" + + @staticmethod + def read_thurnman(spark: SparkSession, path: str): + """Read thurnman dataset. + + Args: + spark (SparkSession): Spark session + path (str): Path to dataset + + Returns: + DataFrame: DataFrame with raw thurnman data + """ + thurman_schema = t.StructType( + [ + t.StructField("gene_chr", t.StringType(), False), + t.StructField("gene_start", t.IntegerType(), False), + t.StructField("gene_end", t.IntegerType(), False), + t.StructField("gene_name", t.StringType(), False), + t.StructField("chrom", t.StringType(), False), + t.StructField("start", t.IntegerType(), False), + t.StructField("end", t.IntegerType(), False), + t.StructField("score", t.FloatType(), False), + ] + ) + return spark.read.csv(path, sep="\t", header=True, schema=thurman_schema) + + @classmethod + def parse( + cls: type[IntervalsThurnman], + thurnman_raw: DataFrame, + gene_index: GeneIndex, + lift: LiftOverSpark, + ) -> Intervals: + """Parse the Thurman et al. 2012 dataset. + + Args: + thurnman_raw (DataFrame): raw Thurman et al. 2019 dataset + gene_index (GeneIndex): gene index + lift (LiftOverSpark): LiftOverSpark instance + + Returns: + Intervals: Interval dataset containing Thurnman et al. 2012 data + """ + dataset_name = "thurman2012" + experiment_type = "dhscor" + pmid = "22955617" + + return cls( + _df=( + thurnman_raw.select( + f.regexp_replace(f.col("chrom"), "chr", "").alias("chrom"), + "start", + "end", + "gene_name", + "score", + ) + # Lift over to the GRCh38 build: + .transform( + lambda df: lift.convert_intervals(df, "chrom", "start", "end") + ) + .alias("intervals") + # Map gene names to gene IDs: + .join( + gene_index.symbols_lut().alias("genes"), + on=[ + f.col("intervals.gene_name") == f.col("genes.geneSymbol"), + f.col("intervals.chrom") == f.col("genes.chromosome"), + ], + how="inner", + ) + # Select relevant columns and add constant columns: + .select( + f.col("chrom").alias("chromosome"), + f.col("mapped_start").alias("start"), + f.col("mapped_end").alias("end"), + "geneId", + f.col("score").cast(t.DoubleType()).alias("resourceScore"), + f.lit(dataset_name).alias("datasourceId"), + f.lit(experiment_type).alias("datatypeId"), + f.lit(pmid).alias("pmid"), + ) + .distinct() + ), + _schema=cls.get_schema(), + ) diff --git a/src/otg/datasource/open_targets/__init__.py b/src/otg/datasource/open_targets/__init__.py new file mode 100644 index 000000000..755db88ad --- /dev/null +++ b/src/otg/datasource/open_targets/__init__.py @@ -0,0 +1,3 @@ +"""Docs for open targets data sources.""" + +from __future__ import annotations diff --git a/src/otg/datasource/open_targets/target.py b/src/otg/datasource/open_targets/target.py new file mode 100644 index 000000000..3d334d34d --- /dev/null +++ b/src/otg/datasource/open_targets/target.py @@ -0,0 +1,65 @@ +"""Parser for OTPlatform target dataset.""" +from __future__ import annotations + +import pyspark.sql.functions as f +from pyspark.sql import Column, DataFrame + +from otg.dataset.gene_index import GeneIndex + + +class OpenTargetsTarget: + """Parser for OTPlatform target dataset.""" + + @staticmethod + def _get_gene_tss(strand_col: Column, start_col: Column, end_col: Column) -> Column: + """Returns the TSS of a gene based on its orientation. + + Args: + strand_col (Column): Column containing 1 if the coding strand of the gene is forward, and -1 if it is reverse. + start_col (Column): Column containing the start position of the gene. + end_col (Column): Column containing the end position of the gene. + + Returns: + Column: Column containing the TSS of the gene. + + Examples: + >>> df = spark.createDataFrame([{"strand": 1, "start": 100, "end": 200}, {"strand": -1, "start": 100, "end": 200}]) + >>> df.withColumn("tss", OpenTargetsTarget._get_gene_tss(f.col("strand"), f.col("start"), f.col("end"))).show() + +---+-----+------+---+ + |end|start|strand|tss| + +---+-----+------+---+ + |200| 100| 1|100| + |200| 100| -1|200| + +---+-----+------+---+ + + + """ + return f.when(strand_col == 1, start_col).when(strand_col == -1, end_col) + + @classmethod + def as_gene_index(cls: type[GeneIndex], target_index: DataFrame) -> GeneIndex: + """Initialise GeneIndex from source dataset. + + Args: + target_index (DataFrame): Target index dataframe + + Returns: + GeneIndex: Gene index dataset + """ + return GeneIndex( + _df=target_index.select( + f.coalesce(f.col("id"), f.lit("unknown")).alias("geneId"), + f.coalesce(f.col("genomicLocation.chromosome"), f.lit("unknown")).alias( + "chromosome" + ), + OpenTargetsTarget._get_gene_tss( + f.col("genomicLocation.strand"), + f.col("genomicLocation.start"), + f.col("genomicLocation.end"), + ).alias("tss"), + f.col("genomicLocation.start").alias("start"), + f.col("genomicLocation.end").alias("end"), + f.col("genomicLocation.strand").alias("strand"), + ), + _schema=GeneIndex.get_schema(), + ) diff --git a/src/otg/datasource/ukbiobank/__init__.py b/src/otg/datasource/ukbiobank/__init__.py new file mode 100644 index 000000000..544779b18 --- /dev/null +++ b/src/otg/datasource/ukbiobank/__init__.py @@ -0,0 +1,3 @@ +"""GWAS Catalog Data Source.""" + +from __future__ import annotations diff --git a/src/otg/datasource/ukbiobank/study_index.py b/src/otg/datasource/ukbiobank/study_index.py new file mode 100644 index 000000000..46322df92 --- /dev/null +++ b/src/otg/datasource/ukbiobank/study_index.py @@ -0,0 +1,110 @@ +"""Study Index for ukbiobank data source.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f + +from otg.dataset.study_index import StudyIndex + +if TYPE_CHECKING: + from pyspark.sql import DataFrame + + +class UKBiobankStudyIndex(StudyIndex): + """Study index dataset from UKBiobank. + + The following information is extracted: + + - studyId + - pubmedId + - publicationDate + - publicationJournal + - publicationTitle + - publicationFirstAuthor + - traitFromSource + - ancestry_discoverySamples + - ancestry_replicationSamples + - initialSampleSize + - nCases + - replicationSamples + + Some fields are populated as constants, such as projectID, studyType, and initial sample size. + """ + + @classmethod + def from_source( + cls: type[UKBiobankStudyIndex], + ukbiobank_studies: DataFrame, + ) -> UKBiobankStudyIndex: + """This function ingests study level metadata from UKBiobank. + + The University of Michigan SAIGE analysis (N=1281) utilized PheCode derived phenotypes and a novel method that ensures accurate P values, even with highly unbalanced case-control ratios (Zhou et al., 2018). + + The Neale lab Round 2 study (N=2139) used GWAS with imputed genotypes from HRC to analyze all data fields in UK Biobank, excluding ICD-10 related traits to reduce overlap with the SAIGE results. + + Args: + ukbiobank_studies (DataFrame): UKBiobank study manifest file loaded in spark session. + + Returns: + UKBiobankStudyIndex: Annotated UKBiobank study table. + """ + return StudyIndex( + _df=( + ukbiobank_studies.select( + f.col("code").alias("studyId"), + f.lit("UKBiobank").alias("projectId"), + f.lit("gwas").alias("studyType"), + f.col("trait").alias("traitFromSource"), + # Make publication and ancestry schema columns. + f.when(f.col("code").startswith("SAIGE_"), "30104761").alias( + "pubmedId" + ), + f.when( + f.col("code").startswith("SAIGE_"), + "Efficiently controlling for case-control imbalance and sample relatedness in large-scale genetic association studies", + ) + .otherwise(None) + .alias("publicationTitle"), + f.when(f.col("code").startswith("SAIGE_"), "Wei Zhou").alias( + "publicationFirstAuthor" + ), + f.when(f.col("code").startswith("NEALE2_"), "2018-08-01") + .otherwise("2018-10-24") + .alias("publicationDate"), + f.when(f.col("code").startswith("SAIGE_"), "Nature Genetics").alias( + "publicationJournal" + ), + f.col("n_total").cast("string").alias("initialSampleSize"), + f.col("n_cases").cast("long").alias("nCases"), + f.array( + f.struct( + f.col("n_total").cast("long").alias("sampleSize"), + f.concat(f.lit("European="), f.col("n_total")).alias( + "ancestry" + ), + ) + ).alias("discoverySamples"), + f.col("in_path").alias("summarystatsLocation"), + f.lit(True).alias("hasSumstats"), + ) + .withColumn( + "traitFromSource", + f.when( + f.col("traitFromSource").contains(":"), + f.concat( + f.initcap( + f.split(f.col("traitFromSource"), ": ").getItem(1) + ), + f.lit(" | "), + f.lower(f.split(f.col("traitFromSource"), ": ").getItem(0)), + ), + ).otherwise(f.col("traitFromSource")), + ) + .withColumn( + "ldPopulationStructure", + cls.aggregate_and_map_ancestries(f.col("discoverySamples")), + ) + ), + _schema=StudyIndex.get_schema(), + ) diff --git a/src/otg/finngen.py b/src/otg/finngen.py new file mode 100644 index 000000000..a4d0fef63 --- /dev/null +++ b/src/otg/finngen.py @@ -0,0 +1,37 @@ +"""Step to run FinnGen study table ingestion.""" + +from __future__ import annotations + +from dataclasses import dataclass +from urllib.request import urlopen + +from otg.common.session import Session +from otg.config import FinnGenStepConfig +from otg.datasource.finngen.study_index import FinnGenStudyIndex + + +@dataclass +class FinnGenStep(FinnGenStepConfig): + """FinnGen study table ingestion step.""" + + session: Session = Session() + + def run(self: FinnGenStep) -> None: + """Run FinnGen study table ingestion step.""" + # Read the JSON data from the URL. + json_data = urlopen(self.finngen_phenotype_table_url).read().decode("utf-8") + rdd = self.session.spark.sparkContext.parallelize([json_data]) + df = self.session.spark.read.json(rdd) + + # Parse the study index data. + finngen_studies = FinnGenStudyIndex.from_source( + df, + self.finngen_release_prefix, + self.finngen_sumstat_url_prefix, + self.finngen_sumstat_url_suffix, + ) + + # Write the output. + finngen_studies.df.write.mode(self.session.write_mode).parquet( + self.finngen_study_index_out + ) diff --git a/src/otg/gene_index.py b/src/otg/gene_index.py index 8f6ba1784..90d23553e 100644 --- a/src/otg/gene_index.py +++ b/src/otg/gene_index.py @@ -1,30 +1,27 @@ -"""Step to generate variant index dataset.""" +"""Step to generate gene index dataset.""" from __future__ import annotations -from typing import TYPE_CHECKING - -from pyspark.sql import SparkSession +from dataclasses import dataclass +from otg.common.session import Session from otg.config import GeneIndexStepConfig -from otg.dataset.gene_index import GeneIndex - -if TYPE_CHECKING: - from otg.common.session import Session +from otg.datasource.open_targets.target import OpenTargetsTarget +@dataclass class GeneIndexStep(GeneIndexStepConfig): """Gene index step. This step generates a gene index dataset from an Open Targets Platform target dataset. """ - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() - def run(self: GeneIndexStepConfig) -> None: + def run(self: GeneIndexStep) -> None: """Run Target index step.""" # Extract - platform_target = self.etl.spark.read.parquet(self.target_path) + platform_target = self.session.spark.read.parquet(self.target_path) # Transform - gene_index = GeneIndex.from_source(platform_target) + gene_index = OpenTargetsTarget.as_gene_index(platform_target) # Load - gene_index.df.write.mode(self.etl.write_mode).parquet(self.gene_index_path) + gene_index.df.write.mode(self.session.write_mode).parquet(self.gene_index_path) diff --git a/src/otg/gwas_catalog.py b/src/otg/gwas_catalog.py index 0d69da7e1..a81c7c5f4 100644 --- a/src/otg/gwas_catalog.py +++ b/src/otg/gwas_catalog.py @@ -2,75 +2,70 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING -from pyspark.sql import SparkSession +import hail as hl -from otg.common.gwas_catalog_splitter import GWASCatalogSplitter +from otg.common.session import Session from otg.config import GWASCatalogStepConfig -from otg.dataset.study_index import StudyIndexGWASCatalog -from otg.dataset.study_locus import StudyLocusGWASCatalog +from otg.dataset.ld_index import LDIndex from otg.dataset.variant_annotation import VariantAnnotation +from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations +from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex +from otg.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter +from otg.method.ld import LDAnnotator from otg.method.pics import PICS -if TYPE_CHECKING: - from otg.common.session import Session - @dataclass class GWASCatalogStep(GWASCatalogStepConfig): """GWAS Catalog step.""" - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() def run(self: GWASCatalogStep) -> None: - """Run variant annotation step.""" + """Run GWAS Catalog ingestion step to extract GWASCatalog Study and StudyLocus tables.""" + hl.init(sc=self.session.spark.sparkContext, log="/dev/null") # All inputs: # Variant annotation dataset - va = VariantAnnotation.from_parquet(self.etl, self.variant_annotation_path) + va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) # GWAS Catalog raw study information - catalog_studies = self.etl.spark.read.csv( + catalog_studies = self.session.spark.read.csv( self.catalog_studies_file, sep="\t", header=True ) # GWAS Catalog ancestry information - ancestry_lut = self.etl.spark.read.csv( + ancestry_lut = self.session.spark.read.csv( self.catalog_ancestry_file, sep="\t", header=True ) # GWAS Catalog summary statistics information - sumstats_lut = self.etl.spark.read.csv( + sumstats_lut = self.session.spark.read.csv( self.catalog_sumstats_lut, sep="\t", header=False ) # GWAS Catalog raw association information - catalog_associations = self.etl.spark.read.csv( + catalog_associations = self.session.spark.read.csv( self.catalog_associations_file, sep="\t", header=True ) + # LD index dataset + ld_index = LDIndex.from_parquet(self.session, self.ld_index_path) # Transform: # GWAS Catalog study index and study-locus splitted - study_index, study_locus = GWASCatalogSplitter.split( - StudyIndexGWASCatalog.from_source( + study_index, study_locus = GWASCatalogStudySplitter.split( + GWASCatalogStudyIndex.from_source( catalog_studies, ancestry_lut, sumstats_lut ), - StudyLocusGWASCatalog.from_source(catalog_associations, va), + GWASCatalogAssociations.from_source(catalog_associations, va), ) - # Annotate LD information - study_locus = study_locus.annotate_ld( - self.etl, - catalog_studies, - self.ld_populations, - self.ld_index_template, - self.ld_matrix_template, - self.self.min_r2, - ) + # Annotate LD information and clump associations dataset + study_locus_ld = LDAnnotator.ld_annotate(study_locus, study_index, ld_index) # Fine-mapping LD-clumped study-locus using PICS - finemapped_study_locus = ( - PICS.finemap(study_locus).annotate_credible_sets().clump() - ) + finemapped_study_locus = PICS.finemap(study_locus_ld).annotate_credible_sets() # Write: - study_index.df.write.mode(self.etl.write_mode).parquet(self.catalog_studies_out) - finemapped_study_locus.df.write.mode(self.etl.write_mode).parquet( + study_index.df.write.mode(self.session.write_mode).parquet( + self.catalog_studies_out + ) + finemapped_study_locus.df.write.mode(self.session.write_mode).parquet( self.catalog_associations_out ) diff --git a/src/otg/gwas_catalog_sumstat_preprocess.py b/src/otg/gwas_catalog_sumstat_preprocess.py new file mode 100644 index 000000000..2a3584f78 --- /dev/null +++ b/src/otg/gwas_catalog_sumstat_preprocess.py @@ -0,0 +1,36 @@ +"""Step to generate variant annotation dataset.""" +from __future__ import annotations + +from dataclasses import dataclass + +from otg.common.session import Session +from otg.config import GWASCatalogSumstatsPreprocessConfig +from otg.datasource.gwas_catalog.summary_statistics import GWASCatalogSummaryStatistics + + +@dataclass +class GWASCatalogSumstatsPreprocessStep(GWASCatalogSumstatsPreprocessConfig): + """Step to preprocess GWAS Catalog harmonised summary stats.""" + + session: Session = Session() + + def run(self: GWASCatalogSumstatsPreprocessStep) -> None: + """Run Step.""" + # Extract + self.session.logger.info(self.raw_sumstats_path) + self.session.logger.info(self.out_sumstats_path) + self.session.logger.info(self.study_id) + + # Reading dataset: + raw_dataset = self.session.spark.read.csv( + self.raw_sumstats_path, header=True, sep="\t" + ) + self.session.logger.info( + f"Number of single point associations: {raw_dataset.count()}" + ) + + # Processing dataset: + GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( + raw_dataset, self.study_id + ).df.write.mode(self.session.write_mode).parquet(self.out_sumstats_path) + self.session.logger.info("Processing dataset successfully completed.") diff --git a/src/otg/l2g.py b/src/otg/l2g.py index 7f8cd4ba4..61063aa63 100644 --- a/src/otg/l2g.py +++ b/src/otg/l2g.py @@ -2,53 +2,60 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING -from pyspark.sql import SparkSession from xgboost.spark import SparkXGBClassifier # type: ignore +from otg.common.session import Session from otg.common.spark_helpers import _convert_from_long_to_wide from otg.config import LocusToGeneConfig +from otg.dataset.colocalisation import Colocalisation from otg.dataset.l2g.feature_matrix import L2GFeatureMatrix from otg.dataset.l2g.gold_standard import L2GGoldStandard from otg.dataset.l2g.predictions import L2GPredictions +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import StudyLocus +from otg.dataset.study_locus_overlap import StudyLocusOverlap +from otg.dataset.v2g import V2G from otg.method.locus_to_gene import LocusToGeneModel, LocusToGeneTrainer -if TYPE_CHECKING: - from otg.common.session import Session - @dataclass class LocusToGeneStep(LocusToGeneConfig): """Locus to gene step.""" - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() def run(self: LocusToGeneStep) -> None: """Run Locus to Gene step.""" self.session.logger.info(f"Executing {self.id} step") - print("Config for the L2G step: ", self) - if self.run_mode == "train": # Process gold standard and L2G features - # gold_standards = L2GGoldStandard.from_curation( - # session=self.session, - # study_locus_path=self.study_locus_path, - # v2g_path=self.variant_gene_path, - # study_locus_overlap_path=self.study_locus_overlap_path, - # gold_standard_curation=self.gold_standard_curation_path, - # interactions_path=self.gene_interactions_path, - # ) - - # fm = L2GFeatureMatrix.generate_features( - # session=self.session, - # study_locus_path=self.study_locus_path, - # study_index_path=self.study_index_path, - # variant_gene_path=self.variant_gene_path, - # colocalisation_path=self.colocalisation_path, - # ) + # Load data + study_locus = StudyLocus.from_parquet(self.session, self.study_locus_path) + study_locus_overlap = StudyLocusOverlap.from_parquet( + self.session, self.study_locus_overlap_path + ) + studies = StudyIndex.from_parquet(self.session, self.study_index_path) + v2g = V2G.from_parquet(self.session, self.variant_gene_path) + coloc = Colocalisation.from_parquet(self.session, self.colocalisation_path) + gs_curation = self.session.spark.read.json(self.gold_standard_curation_path) + interactions = self.session.spark.read.parquet(self.gene_interactions_path) + + gold_standards = L2GGoldStandard.from_curation( + gold_standard_curation=gs_curation, + v2g=v2g, + study_locus_overlap=study_locus_overlap, + interactions=interactions, + ) + + fm = L2GFeatureMatrix.generate_features( + study_locus=study_locus, + study_index=studies, + variant_gene=v2g, + colocalisation=coloc, + ) gold_standards = L2GGoldStandard( _df=self.session.spark.read.parquet(self.gold_standard_processed_path) @@ -77,12 +84,13 @@ def run(self: LocusToGeneStep) -> None: l2g_model = LocusToGeneModel( features_list=list(self.features_list), estimator=estimator ) - if self.hyperparameters.cross_validation_folds: + if self.perform_cross_validation: # Perform cross validation to extract what are the best hyperparameters + cv_folds = self.hyperparameters.get("cross_validation_folds", 5) LocusToGeneTrainer.cross_validate( l2g_model=l2g_model, data=data, - num_folds=self.hyperparameters.cross_validation_folds, + num_folds=cv_folds, ) # self.wandb_run_name = f"{self.wandb_run_name}_cv_best_params" else: @@ -90,13 +98,13 @@ def run(self: LocusToGeneStep) -> None: LocusToGeneTrainer.train( data=data, l2g_model=l2g_model, - feature_cols=list(self.features_list), + features_list=list(self.features_list), model_path=self.model_path, wandb_run_name=self.wandb_run_name, **self.hyperparameters, ) - if self.run_mode == "predict": + if self.run_mode == "predict" and self.model_path and self.predictions_path: predictions = L2GPredictions.from_study_locus( self.session, self.feature_matrix_path, self.model_path ) diff --git a/src/otg/ld_index.py b/src/otg/ld_index.py index 7c80849ba..ccc416df5 100644 --- a/src/otg/ld_index.py +++ b/src/otg/ld_index.py @@ -1,37 +1,39 @@ -"""Step to generate variant index dataset.""" +"""Step to dump a filtered version of a LD matrix (block matrix) as Parquet files.""" from __future__ import annotations -from typing import TYPE_CHECKING +from dataclasses import dataclass -from pyspark.sql import SparkSession +import hail as hl +from otg.common.session import Session from otg.config import LDIndexStepConfig -from otg.dataset.ld_index import LDIndex - -if TYPE_CHECKING: - from otg.common.session import Session +from otg.datasource.gnomad.ld import GnomADLDMatrix +@dataclass class LDIndexStep(LDIndexStepConfig): - """LD index step.""" - - session: Session = SparkSession.builder.getOrCreate() - - def run(self: LDIndexStepConfig) -> None: - """Run LD index step.""" - for population in self.ld_populations: - self.etl.logger.info(f"Processing population: {population}") - ld_index = LDIndex.create( - self.ld_index_raw_template.format(POP=population), - self.ld_radius, - self.grch37_to_grch38_chain_path, - ) - - self.etl.logger.info( - f"Writing ls index to: {self.ld_index_template.format(POP=population)}" - ) - ( - ld_index.df.write.partitionBy("chromosome") - .mode(self.session.write_mode) - .parquet(self.ld_index_template.format(POP=population)) # noqa: FS002 - ) + """LD index step. + + !!! warning "This step is resource intensive" + Suggested params: high memory machine, 5TB of boot disk, no SSDs. + + """ + + session: Session = Session() + + def run(self: LDIndexStep) -> None: + """Run LD index dump step.""" + hl.init(sc=self.session.spark.sparkContext, log="/dev/null") + ld_index = GnomADLDMatrix.as_ld_index( + self.ld_populations, + self.ld_matrix_template, + self.ld_index_raw_template, + self.grch37_to_grch38_chain_path, + self.min_r2, + ) + self.session.logger.info(f"Writing LD index to: {self.ld_index_out}") + ( + ld_index.df.write.partitionBy("chromosome") + .mode(self.session.write_mode) + .parquet(f"{self.ld_index_out}") + ) diff --git a/src/otg/method/clump.py b/src/otg/method/clump.py new file mode 100644 index 000000000..abf0c6e2b --- /dev/null +++ b/src/otg/method/clump.py @@ -0,0 +1,75 @@ +"""Clumps GWAS significant variants to generate a studyLocus dataset of independent variants.""" + + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +from pyspark.sql import Window + +if TYPE_CHECKING: + from pyspark.sql import Column + + from otg.dataset.study_locus import StudyLocus + + +class LDclumping: + """LD clumping reports the most significant genetic associations in a region in terms of a smaller number of “clumps” of genetically linked SNPs.""" + + @staticmethod + def _is_lead_linked( + study_id: Column, + variant_id: Column, + p_value_exponent: Column, + p_value_mantissa: Column, + ld_set: Column, + ) -> Column: + """Evaluates whether a lead variant is linked to a tag (with lowest p-value) in the same studyLocus dataset. + + Args: + study_id (Column): studyId + variant_id (Column): Lead variant id + p_value_exponent (Column): p-value exponent + p_value_mantissa (Column): p-value mantissa + locus (Column): Credible set + + Returns: + Column: Boolean in which True indicates that the lead is linked to another tag in the same dataset. + """ + leads_in_study = f.collect_set(variant_id).over(Window.partitionBy(study_id)) + tags_in_studylocus = f.array_union( + # Get all tag variants from the credible set per studyLocusId + f.transform(ld_set, lambda x: x.tagVariantId), + # And append the lead variant so that the intersection is the same for all studyLocusIds in a study + f.array(variant_id), + ) + intersect_lead_tags = f.array_sort( + f.array_intersect(leads_in_study, tags_in_studylocus) + ) + return ( + # If the lead is in the credible set, we rank the peaks by p-value + f.when( + f.size(intersect_lead_tags) > 0, + f.row_number().over( + Window.partitionBy(study_id, intersect_lead_tags).orderBy( + p_value_exponent, p_value_mantissa + ) + ) + > 1, + ) + # If the intersection is empty (lead is not in the credible set or cred set is empty), the association is not linked + .otherwise(f.lit(False)) + ) + + @classmethod + def clump(cls: type[LDclumping], associations: StudyLocus) -> StudyLocus: + """Perform clumping on studyLocus dataset. + + Args: + associations (StudyLocus): StudyLocus dataset + + Returns: + StudyLocus: including flag and removing locus information for LD clumped loci. + """ + return associations.clump() diff --git a/src/otg/method/colocalisation.py b/src/otg/method/colocalisation.py index 0a475d836..5787b61d6 100644 --- a/src/otg/method/colocalisation.py +++ b/src/otg/method/colocalisation.py @@ -13,6 +13,7 @@ from otg.dataset.colocalisation import Colocalisation if TYPE_CHECKING: + from numpy import ndarray from pyspark.sql import Column from otg.dataset.study_locus_overlap import StudyLocusOverlap @@ -37,6 +38,19 @@ def _get_clpp(left_pp: Column, right_pp: Column) -> Column: Returns: Column: CLPP + + Examples: + >>> d = [{"left_pp": 0.5, "right_pp": 0.5}, {"left_pp": 0.25, "right_pp": 0.75}] + >>> df = spark.createDataFrame(d) + >>> df.withColumn("clpp", ECaviar._get_clpp(f.col("left_pp"), f.col("right_pp"))).show() + +-------+--------+------+ + |left_pp|right_pp| clpp| + +-------+--------+------+ + | 0.5| 0.5| 0.25| + | 0.25| 0.75|0.1875| + +-------+--------+------+ + + """ return left_pp * right_pp @@ -57,17 +71,18 @@ def colocalise( overlapping_signals.df.withColumn( "clpp", ECaviar._get_clpp( - f.col("left_posteriorProbability"), - f.col("right_posteriorProbability"), + f.col("statistics.left_posteriorProbability"), + f.col("statistics.right_posteriorProbability"), ), ) - .groupBy("left_studyLocusId", "right_studyLocusId", "chromosome") + .groupBy("leftStudyLocusId", "rightStudyLocusId", "chromosome") .agg( - f.count("*").alias("coloc_n_vars"), + f.count("*").alias("numberColocalisingVariants"), f.sum(f.col("clpp")).alias("clpp"), ) .withColumn("colocalisationMethod", f.lit("eCAVIAR")) - ) + ), + _schema=Colocalisation.get_schema(), ) @@ -90,14 +105,14 @@ class Coloc: """ @staticmethod - def _get_logsum(log_abf: VectorUDT) -> float: + def _get_logsum(log_abf: ndarray) -> float: """Calculates logsum of vector. This function calculates the log of the sum of the exponentiated logs taking out the max, i.e. insuring that the sum is not Inf Args: - log_abf (VectorUDT): log approximate bayes factor + log_abf (ndarray): log approximate bayes factor Returns: float: logsum @@ -112,14 +127,19 @@ def _get_logsum(log_abf: VectorUDT) -> float: return float(result) @staticmethod - def _get_posteriors(all_abfs: VectorUDT) -> DenseVector: + def _get_posteriors(all_abfs: ndarray) -> DenseVector: """Calculate posterior probabilities for each hypothesis. Args: - all_abfs (VectorUDT): h0-h4 bayes factors + all_abfs (ndarray): h0-h4 bayes factors Returns: DenseVector: Posterior + + Example: + >>> l = np.array([0.2, 0.1, 0.05, 0]) + >>> Coloc._get_posteriors(l) + DenseVector([0.279, 0.2524, 0.2401, 0.2284]) """ diff = all_abfs - Coloc._get_logsum(all_abfs) abfs_posteriors = np.exp(diff) @@ -151,19 +171,22 @@ def colocalise( _df=( overlapping_signals.df # Before summing log_abf columns nulls need to be filled with 0: - .fillna(0, subset=["left_logABF", "right_logABF"]) + .fillna(0, subset=["statistics.left_logABF", "statistics.right_logABF"]) # Sum of log_abfs for each pair of signals - .withColumn("sum_log_abf", f.col("left_logABF") + f.col("right_logABF")) + .withColumn( + "sum_log_abf", + f.col("statistics.left_logABF") + f.col("statistics.right_logABF"), + ) # Group by overlapping peak and generating dense vectors of log_abf: - .groupBy("chromosome", "left_studyLocusId", "right_studyLocusId") + .groupBy("chromosome", "leftStudyLocusId", "rightStudyLocusId") .agg( - f.count("*").alias("coloc_n_vars"), - fml.array_to_vector(f.collect_list(f.col("left_logABF"))).alias( - "left_logABF" - ), - fml.array_to_vector(f.collect_list(f.col("right_logABF"))).alias( - "right_logABF" - ), + f.count("*").alias("numberColocalisingVariants"), + fml.array_to_vector( + f.collect_list(f.col("statistics.left_logABF")) + ).alias("left_logABF"), + fml.array_to_vector( + f.collect_list(f.col("statistics.right_logABF")) + ).alias("right_logABF"), fml.array_to_vector(f.collect_list(f.col("sum_log_abf"))).alias( "sum_log_abf" ), @@ -227,18 +250,18 @@ def colocalise( .withColumn( "posteriors", fml.vector_to_array(posteriors(f.col("allABF"))) ) - .withColumn("coloc_h0", f.col("posteriors").getItem(0)) - .withColumn("coloc_h1", f.col("posteriors").getItem(1)) - .withColumn("coloc_h2", f.col("posteriors").getItem(2)) - .withColumn("coloc_h3", f.col("posteriors").getItem(3)) - .withColumn("coloc_h4", f.col("posteriors").getItem(4)) - .withColumn("coloc_h4_h3", f.col("coloc_h4") / f.col("coloc_h3")) - .withColumn("coloc_log2_h4_h3", f.log2(f.col("coloc_h4_h3"))) + .withColumn("h0", f.col("posteriors").getItem(0)) + .withColumn("h1", f.col("posteriors").getItem(1)) + .withColumn("h2", f.col("posteriors").getItem(2)) + .withColumn("h3", f.col("posteriors").getItem(3)) + .withColumn("h4", f.col("posteriors").getItem(4)) + .withColumn("h4h3", f.col("h4") / f.col("h3")) + .withColumn("log2h4h3", f.log2(f.col("h4h3"))) # clean up .drop( "posteriors", "allABF", - "coloc_h4_h3", + "h4h3", "lH0abf", "lH1abf", "lH2abf", @@ -246,5 +269,6 @@ def colocalise( "lH4abf", ) .withColumn("colocalisationMethod", f.lit("COLOC")) - ) + ), + _schema=Colocalisation.get_schema(), ) diff --git a/src/otg/method/ld.py b/src/otg/method/ld.py index 63dc21f6a..09c42c4ba 100644 --- a/src/otg/method/ld.py +++ b/src/otg/method/ld.py @@ -1,373 +1,134 @@ """Performing linkage disequilibrium (LD) operations.""" from __future__ import annotations -from functools import reduce from typing import TYPE_CHECKING -from pyspark.sql import DataFrame, Window from pyspark.sql import functions as f -from otg.dataset.ld_index import LDIndex +from otg.dataset.study_locus import StudyLocus if TYPE_CHECKING: - from otg.common.session import Session from pyspark.sql import Column - from otg.dataset.study_index import StudyIndexGWASCatalog - from otg.dataset.study_locus import ( - StudyLocus, - StudyLocusGWASCatalog, - ) -from hail.linalg import BlockMatrix + from otg.dataset.ld_index import LDIndex + from otg.dataset.study_index import StudyIndex -class LDAnnotatorGnomad: - """Class to annotate linkage disequilibrium (LD) operations from GnomAD.""" - - @staticmethod - def _query_block_matrix( - bm: BlockMatrix, - idxs: list[int], - starts: list[int], - stops: list[int], - min_r2: float, - ) -> DataFrame: - """Query block matrix for idxs rows sparsified by start/stop columns. - - Args: - bm (BlockMatrix): LD matrix containing r values - idxs (List[int]): Row indexes to query (distinct and incremenetal) - starts (List[int]): Interval start column indexes (same size as idxs) - stops (List[int]): Interval start column indexes (same size as idxs) - min_r2 (float): Minimum r2 to keep - - Returns: - DataFrame: i,j,r where i and j are the row and column indexes and r is the LD - - Examples: - >>> import numpy as np - >>> r = np.array([[1, 0.8, 0.7, 0.2], - ... [0.8, 1, 0.6, 0.1], - ... [0.7, 0.6, 1, 0.3], - ... [0.2, 0.1, 0.3, 1]]) - >>> bm_r = BlockMatrix.from_numpy(r) # doctest: +SKIP - >>> LDAnnotatorGnomad._query_block_matrix(bm_r, [1, 2], [0, 1], [3, 4], 0.5).show() # doctest: +SKIP - +---+---+---+ - | i| j| r| - +---+---+---+ - | 0| 0|0.8| - | 0| 1|1.0| - | 1| 2|1.0| - +---+---+---+ - - """ - bm_sparsified = bm.filter_rows(idxs).sparsify_row_intervals( - starts, stops, blocks_only=True - ) - entries = bm_sparsified.entries(keyed=False) - - return ( - entries.rename({"entry": "r"}) - .to_spark() - .filter(f.col("r") ** 2 >= min_r2) - .withColumn("r", f.when(f.col("r") >= 1, f.lit(1)).otherwise(f.col("r"))) - ) - - @staticmethod - def _variant_coordinates_in_ldindex( - variants_df: DataFrame, - ld_index: LDIndex, - ) -> DataFrame: - """Idxs for variants, first variant in the region and last variant in the region in precomputed ld index. - - Args: - variants_df (DataFrame): Lead variants from `_annotate_index_intervals` output - ld_index (LDIndex): LD index precomputed - Returns: - DataFrame: LD coordinates [i, idxs, start_idx and stop_idx] - """ - w = Window.orderBy("chromosome", "idx") - return ( - variants_df.join( - ld_index.df, - on=["chromosome", "position", "referenceAllele", "alternateAllele"], - ) # start idx > stop idx in rare occasions due to liftover - .filter(f.col("start_idx") < f.col("stop_idx")) - .groupBy("chromosome", "idx") - .agg( - f.min("start_idx").alias("start_idx"), - f.max("stop_idx").alias("stop_idx"), - ) - # necessary to resolve return of .entries() function - .withColumn("i", f.row_number().over(w)) - ) +class LDAnnotator: + """Class to annotate linkage disequilibrium (LD) operations from GnomAD.""" @staticmethod - def _weighted_r_overall( - chromosome: Column, - study_id: Column, - variant_id: Column, - tag_variant_id: Column, - relative_sample_size: Column, - r: Column, - ) -> Column: - """Aggregation of weighted R information using ancestry proportions. - - The method implements a simple average weighted by the relative population sizes. - - Args: - chromosome (Column): Chromosome - study_id (Column): Study identifier - variant_id (Column): Variant identifier - tag_variant_id (Column): Tag variant identifier - relative_sample_size (Column): Relative sample size - r (Column): Correlation - - Returns: - Column: Estimates weighted R information - - Exmples: - >>> data = [('t3', 0.25, 0.2), ('t3', 0.25, 0.2), ('t3', 0.5, 0.99)] - >>> columns = ['tag_variant_id', 'relative_sample_size', 'r'] - >>> ( - ... spark.createDataFrame(data, columns) - ... .withColumn('chr', f.lit('chr1')) - ... .withColumn('study_id', f.lit('s1')) - ... .withColumn('variant_id', f.lit('v1')) - ... .withColumn( - ... 'r_overall', - ... LDAnnotatorGnomad._weighted_r_overall( - ... f.col('chr'), - ... f.col('study_id'), - ... f.col('variant_id'), - ... f.col('tag_variant_id'), - ... f.col('relative_sample_size'), - ... f.col('r') - ... ) - ... ) - ... .show() - ... ) - +--------------+--------------------+----+----+--------+----------+---------+ - |tag_variant_id|relative_sample_size| r| chr|study_id|variant_id|r_overall| - +--------------+--------------------+----+----+--------+----------+---------+ - | t3| 0.25| 0.2|chr1| s1| v1| 0.595| - | t3| 0.25| 0.2|chr1| s1| v1| 0.595| - | t3| 0.5|0.99|chr1| s1| v1| 0.595| - +--------------+--------------------+----+----+--------+----------+---------+ - - """ - pseudo_r = f.when(r >= 1, 0.9999995).otherwise(r) - return f.round( - f.sum(pseudo_r * relative_sample_size).over( - Window.partitionBy(chromosome, study_id, variant_id, tag_variant_id) + def _calculate_weighted_r_overall(ld_set: Column) -> Column: + """Aggregation of weighted R information using ancestry proportions.""" + return f.transform( + ld_set, + lambda x: f.struct( + x["tagVariantId"].alias("tagVariantId"), + # r2Overall is the accumulated sum of each r2 relative to the population size + f.aggregate( + x["rValues"], + f.lit(0.0), + lambda acc, y: acc + + f.coalesce( + f.pow(y["r"], 2) * y["relativeSampleSize"], f.lit(0.0) + ), # we use coalesce to avoid problems when r/relativeSampleSize is null + ).alias("r2Overall"), ), - 6, ) @staticmethod - def _flag_partial_mapped( - study_id: Column, variant_id: Column, tag_variant_id: Column - ) -> Column: - """Generate flag for lead/tag pairs. - - Some lead variants can be resolved in one population but not in other. Those rows interfere with PICS calculation, so they needs to be dropped. + def _add_population_size(ld_set: Column, study_populations: Column) -> Column: + """Add population size to each rValues entry in the ldSet. Args: - study_id (Column): Study identifier column - variant_id (Column): Identifier of the lead variant - tag_variant_id (Column): Identifier of the tag variant + ld_set (Column): LD set + study_populations (Column): Study populations Returns: - Column: Boolean - - Examples: - >>> data = [ - ... ('study_1', 'lead_1', 'tag_1'), # <- keep row as tag available. - ... ('study_1', 'lead_1', 'tag_2'), # <- keep row as tag available. - ... ('study_1', 'lead_2', 'tag_3'), # <- keep row as tag available - ... ('study_1', 'lead_2', None), # <- drop row as lead 2 is resolved. - ... ('study_1', 'lead_3', None) # <- keep row as lead 3 is not resolved. - ... ] - >>> ( - ... spark.createDataFrame(data, ['studyId', 'variantId', 'tagVariantId']) - ... .withColumn("flag_to_keep_tag", LDAnnotatorGnomad._flag_partial_mapped(f.col('studyId'), f.col('variantId'), f.col('tagVariantId'))) - ... .show() - ... ) - +-------+---------+------------+----------------+ - |studyId|variantId|tagVariantId|flag_to_keep_tag| - +-------+---------+------------+----------------+ - |study_1| lead_3| null| true| - |study_1| lead_1| tag_1| true| - |study_1| lead_1| tag_2| true| - |study_1| lead_2| tag_3| true| - |study_1| lead_2| null| false| - +-------+---------+------------+----------------+ - + Column: LD set with added 'relativeSampleSize' field """ - return tag_variant_id.isNotNull() | ~f.array_contains( - f.collect_set(tag_variant_id.isNotNull()).over( - Window.partitionBy(study_id, variant_id) + # Create a population to relativeSampleSize map from the struct + populations_map = f.map_from_arrays( + study_populations["ldPopulation"], + study_populations["relativeSampleSize"], + ) + return f.transform( + ld_set, + lambda x: f.struct( + x["tagVariantId"].alias("tagVariantId"), + f.transform( + x["rValues"], + lambda y: f.struct( + y["population"].alias("population"), + y["r"].alias("r"), + populations_map[y["population"]].alias("relativeSampleSize"), + ), + ).alias("rValues"), ), - True, ) @classmethod - def variants_in_ld_in_gnomad_pop( - cls: type[LDAnnotatorGnomad], - variants_df: DataFrame, - ld_matrix: BlockMatrix, + def ld_annotate( + cls: type[LDAnnotator], + associations: StudyLocus, + studies: StudyIndex, ld_index: LDIndex, - min_r2: float, - ) -> DataFrame: - """Return LD annotation for variants in specific gnomad population. - - Args: - variants_df (DataFrame): variants to annotate - ld_matrix (BlockMatrix): LD matrix - ld_index (LDIndex): LD index precomputed - min_r2 (float): minimum r2 to keep - - Returns: - DataFrame: LD information in the columns ["variantId", "chromosome", "gnomadPopulation", "tagVariantId", "r"] - """ - # map variants to precomputed LD indexes from gnomAD - variants_ld_coordinates = LDAnnotatorGnomad._variant_coordinates_in_ldindex( - variants_df, ld_index - ).persist() - - # idxs for lead, first variant in the region and last variant in the region - entries = LDAnnotatorGnomad._query_block_matrix( - ld_matrix + ld_matrix.T, - variants_ld_coordinates.rdd.map(lambda x: x.idxs).collect(), - variants_ld_coordinates.rdd.map(lambda x: x.starts).collect(), - variants_ld_coordinates.rdd.map(lambda x: x.stops).collect(), - min_r2, - ) - - return ( - entries.join( - f.broadcast(variants_ld_coordinates), - on="i", - how="inner", - ) - .select("variantId", "chromosome", "gnomadPopulation", "j", "r") - .alias("left") - .join( - ld_index.df.select( - f.col("chromosome"), - f.col("variantId").alias("tagVariantId"), - f.col("idx").alias("tag_idx"), - ).alias("tags"), - on=[ - f.col("left.chromosome") == f.col("tags.chromosome"), - f.col("left.j") == f.col("tags.tag_idx"), - ], - ) - .select( - "variantId", "leads.chromosome", "gnomadPopulation", "tagVariantId", "r" - ) - ) + ) -> StudyLocus: + """Annotate linkage disequilibrium (LD) information to a set of studyLocus. - @classmethod - def ld_annotation_by_locus_ancestry( - cls: type[LDAnnotatorGnomad], - session: Session, - associations: StudyLocusGWASCatalog, - studies: StudyIndexGWASCatalog, - ld_populations: list[str], - ld_index_template: str, - ld_matrix_template: str, - min_r2: float, - ) -> DataFrame: - """LD information for all locus and ancestries. + This function: + 1. Annotates study locus with population structure information from the study index + 2. Joins the LD index to the StudyLocus + 3. Adds the population size of the study to each rValues entry in the ldSet + 4. Calculates the overall R weighted by the ancestry proportions in every given study. Args: - session (Session): Session - associations (StudyLocusGWASCatalog): GWAS associations - studies (StudyIndexGWASCatalog): study metadata of the associations - ld_populations (list[str]): List of populations to annotate - ld_index_template (str): Template path of the LD matrix index containing `{POP}` where the population is expected - ld_matrix_template (str): Template path of the LD matrix containing `{POP}` where the population is expected - min_r2 (float): minimum r2 to keep + associations (StudyLocus): Dataset to be LD annotated + studies (StudyIndex): Dataset with study information + ld_index (LDIndex): Dataset with LD information for every variant present in LD matrix Returns: - DataFrame: LD annotation ["variantId", "chromosome", "gnomadPopulation", "tagVariantId", "r"] + StudyLocus: including additional column with LD information. """ - # Unique lead - population pairs: - locus_ancestry = ( - associations.unique_study_locus_ancestries(studies) - # Ignoring study information / relativeSampleSize to get unique lead-ancestry pairs - .drop("studyId", "relativeSampleSize") - .distinct() - .persist() - ) - - # All gnomad populations captured in associations: - assoc_populations = locus_ancestry.rdd.map( - lambda x: x.gnomadPopulation - ).collect() - - # Retrieve LD information from gnomAD - ld_annotated_assocs = [] - for population in ld_populations: - if population in assoc_populations: - pop_parsed_ldindex_path = ld_index_template.format(POP=population) - pop_matrix_path = ld_matrix_template.format(POP=population) - variants_in_pop = locus_ancestry.filter( - f.col("gnomadPopulation") == population - ) - ld_annotated_assocs.append( - LDAnnotatorGnomad.variants_in_ld_in_gnomad_pop( - variants_df=variants_in_pop, - ld_matrix=BlockMatrix.read(pop_matrix_path), - ld_index=LDIndex.from_parquet(session, pop_parsed_ldindex_path), - min_r2=min_r2, + return ( + StudyLocus( + _df=( + associations.df + # Drop ldSet column if already available + .select(*[col for col in associations.df.columns if col != "ldSet"]) + # Annotate study locus with population structure from study index + .join( + studies.df.select("studyId", "ldPopulationStructure"), + on="studyId", + how="left", ) - ) - return reduce(DataFrame.unionByName, ld_annotated_assocs) - - -class LDclumping: - """LD clumping reports the most significant genetic associations in a region in terms of a smaller number of “clumps” of genetically linked SNPs.""" - - @staticmethod - def _is_lead_linked( - study_id: Column, - variant_id: Column, - p_value_exponent: Column, - p_value_mantissa: Column, - credible_set: Column, - ) -> Column: - """Evaluates whether a lead variant is linked to a tag (with lowest p-value) in the same studyLocus dataset. - - Args: - study_id (Column): studyId - variant_id (Column): Lead variant id - p_value_exponent (Column): p-value exponent - p_value_mantissa (Column): p-value mantissa - credible_set (Column): Credible set - - Returns: - Column: Boolean in which True indicates that the lead is linked to another tag in the same dataset. - """ - leads_in_study = f.collect_set(variant_id).over(Window.partitionBy(study_id)) - tags_in_study_locus = f.transform(credible_set, lambda x: x.tagVariantId) - intersect_lead_tags = f.array_intersect(leads_in_study, tags_in_study_locus) - rank = f.row_number().over( - Window.partitionBy(study_id, intersect_lead_tags).orderBy( - p_value_exponent, p_value_mantissa + # Bring LD information from LD Index + .join( + ld_index.df, + on=["variantId", "chromosome"], + how="left", + ) + # Add population size to each rValues entry in the ldSet if population structure available: + .withColumn( + "ldSet", + f.when( + f.col("ldPopulationStructure").isNotNull(), + cls._add_population_size( + f.col("ldSet"), f.col("ldPopulationStructure") + ), + ), + ) + # Aggregate weighted R information using ancestry proportions + .withColumn( + "ldSet", + f.when( + f.col("ldPopulationStructure").isNotNull(), + cls._calculate_weighted_r_overall(f.col("ldSet")), + ), + ).drop("ldPopulationStructure") + ), + _schema=StudyLocus.get_schema(), ) + ._qc_no_population() + ._qc_unresolved_ld() ) - return rank > 1 - - @classmethod - def clump(cls: type[LDclumping], associations: StudyLocus) -> StudyLocus: - """Perform clumping on studyLocus dataset. - - Args: - associations (StudyLocus): StudyLocus dataset - - Returns: - StudyLocus: including flag and removing credibleSet information for LD clumped loci. - """ - return associations.clump() diff --git a/src/otg/method/locus_to_gene.py b/src/otg/method/locus_to_gene.py index c34e7a745..4476f243c 100644 --- a/src/otg/method/locus_to_gene.py +++ b/src/otg/method/locus_to_gene.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any, List, Optional, Type +import wandb from pyspark.ml import Pipeline, PipelineModel from pyspark.ml.evaluation import ( BinaryClassificationEvaluator, @@ -14,7 +15,6 @@ from pyspark.ml.tuning import CrossValidator, ParamGridBuilder from wandb.wandb_run import Run -import wandb from otg.method.l2g_utils.evaluator import WandbEvaluator if TYPE_CHECKING: @@ -30,7 +30,7 @@ class LocusToGeneModel: """Wrapper for the Locus to Gene classifier.""" features_list: List[str] - _estimator: Any = None + estimator: Any = None pipeline: Pipeline = Pipeline(stages=[]) model: Optional[PipelineModel] = None @@ -57,7 +57,7 @@ def save(self: LocusToGeneModel, path: str) -> None: @property def classifier(self: LocusToGeneModel) -> Any: """Return the model.""" - return self._estimator + return self.estimator @staticmethod def features_vector_assembler(features_cols: List[str]) -> VectorAssembler: @@ -114,14 +114,14 @@ def load_from_disk( @classifier.setter # type: ignore def classifier(self: LocusToGeneModel, new_estimator: Any) -> None: """Set the model.""" - self._estimator = new_estimator + self.estimator = new_estimator def get_param_grid(self: LocusToGeneModel) -> list: """Return the parameter grid for the model.""" return ( ParamGridBuilder() - .addGrid(self._estimator.max_depth, [3, 5, 7]) - .addGrid(self._estimator.learning_rate, [0.01, 0.1, 1.0]) + .addGrid(self.estimator.max_depth, [3, 5, 7]) + .addGrid(self.estimator.learning_rate, [0.01, 0.1, 1.0]) .build() ) @@ -235,6 +235,7 @@ def train( cls: type[LocusToGeneTrainer], data: L2GFeatureMatrix, l2g_model: LocusToGeneModel, + features_list: List[str], wandb_run_name: Optional[str] = None, model_path: Optional[str] = None, **hyperparams: dict, @@ -244,6 +245,8 @@ def train( Args: l2g_model (LocusToGeneModel): Model to fit to the data on data (L2GFeatureMatrix): Feature matrix containing the data + l2g_model (LocusToGeneModel): Model to fit to the data on + features_list (List[str]): List of features to use for the model wandb_run_name (str): Descriptive name for the run to be tracked with W&B model_path (str): Path to save the model to hyperparams (dict): Hyperparameters to use for the model @@ -251,9 +254,9 @@ def train( Returns: LocusToGeneModel: Trained model """ - train, test = data.train_test_split(fraction=0.8) + train, test = data.select_features(features_list).train_test_split(fraction=0.8) - model = l2g_model.add_pipeline_stage(l2g_model._estimator).fit(train.df) + model = l2g_model.add_pipeline_stage(l2g_model.estimator).fit(train.df) l2g_model.evaluate( results=model.predict(test.df), @@ -290,7 +293,7 @@ def cross_validate( params_grid = param_grid or l2g_model.get_param_grid() cv = CrossValidator( numFolds=num_folds, - estimator=l2g_model._estimator, + estimator=l2g_model.estimator, estimatorParamMaps=params_grid, evaluator=evaluator, parallelism=2, diff --git a/src/otg/method/pics.py b/src/otg/method/pics.py index e5fa3a127..c7a259ee1 100644 --- a/src/otg/method/pics.py +++ b/src/otg/method/pics.py @@ -6,171 +6,176 @@ import pyspark.sql.functions as f import pyspark.sql.types as t -from pyspark.sql import Window from scipy.stats import norm -if TYPE_CHECKING: - from pyspark.sql import Column +from otg.dataset.study_locus import StudyLocus - from otg.dataset.study_locus import StudyLocus +if TYPE_CHECKING: + from pyspark.sql import Row class PICS: """Probabilistic Identification of Causal SNPs (PICS), an algorithm estimating the probability that an individual variant is causal considering the haplotype structure and observed pattern of association at the genetic locus.""" @staticmethod - @f.udf(t.DoubleType()) - def _norm_sf(mu: float, std: float, neglog_p: float) -> float | None: - """Returns the survival function of the normal distribution for the p-value. + def _pics_relative_posterior_probability( + neglog_p: float, pics_snp_mu: float, pics_snp_std: float + ) -> float: + """Compute the PICS posterior probability for a given SNP. + + !!! info "This probability needs to be scaled to take into account the probabilities of the other variants in the locus." Args: - mu (float): mean - std (float): standard deviation - neglog_p (float): negative log p-value + neglog_p (float): Negative log p-value of the lead variant + pics_snp_mu (float): Mean P value of the association between a SNP and a trait + pics_snp_std (float): Standard deviation for the P value of the association between a SNP and a trait Returns: - float: survival function + Relative posterior probability of a SNP being causal in a locus Examples: - >>> d = [{"mu": 0, "neglog_p": 0, "std": 1}, {"mu": 1, "neglog_p": 10, "std": 10}] - >>> spark.createDataFrame(d).withColumn("norm_sf", PICS._norm_sf(f.col("mu"), f.col("std"), f.col("neglog_p"))).show() - +---+--------+---+-------------------+ - | mu|neglog_p|std| norm_sf| - +---+--------+---+-------------------+ - | 0| 0| 1| 1.0| - | 1| 10| 10|0.36812025069351895| - +---+--------+---+-------------------+ - + >>> rel_prob = PICS._pics_relative_posterior_probability(neglog_p=10.0, pics_snp_mu=1.0, pics_snp_std=10.0) + >>> round(rel_prob, 3) + 0.368 """ - try: - return float(norm(mu, std).sf(neglog_p) * 2) - except TypeError: - return None + return float(norm(pics_snp_mu, pics_snp_std).sf(neglog_p) * 2) @staticmethod - def _is_in_credset( - chromosome: Column, - study_id: Column, - variant_id: Column, - pics_postprob: Column, - credset_probability: float, - ) -> Column: - """Check whether a variant is in the XX% credible set. - - Args: - chromosome (Column): Chromosome column - study_id (Column): Study ID column - variant_id (Column): Variant ID column - pics_postprob (Column): PICS posterior probability column - credset_probability (float): Credible set probability - - Returns: - Column: Whether the variant is in the credible set - """ - w_cumlead = ( - Window.partitionBy(chromosome, study_id, variant_id) - .orderBy(f.desc(pics_postprob)) - .rowsBetween(Window.unboundedPreceding, Window.currentRow) - ) - pics_postprob_cumsum = f.sum(pics_postprob).over(w_cumlead) - w_credset = Window.partitionBy(chromosome, study_id, variant_id).orderBy( - pics_postprob_cumsum - ) - return ( - # If posterior probability is null, credible set flag is False: - f.when(pics_postprob.isNull(), False) - # If the posterior probability meets the criteria the flag is True: - .when( - f.lag(pics_postprob_cumsum, 1).over(w_credset) >= credset_probability, - False, - ) - # IF criteria is not met, flag is False: - .otherwise(True) - ) + def _pics_standard_deviation(neglog_p: float, r2: float, k: float) -> float | None: + """Compute the PICS standard deviation. - @staticmethod - def _pics_posterior_probability( - study_locus_id: Column, - neglog_p: Column, - r: Column, - k: float, - ) -> Column: - """Compute the PICS posterior probability. + This distribution is obtained after a series of permutation tests described in the PICS method, and it is only + valid when the SNP is highly linked with the lead (r2 > 0.5). Args: - study_locus_id (Column): Study-Locus ID required for windowing purposes - neglog_p (Column): Negative log p-value - r (Column): R-squared + neglog_p (float): Negative log p-value of the lead variant + r2 (float): LD score between a given SNP and the lead variant k (float): Empiric constant that can be adjusted to fit the curve, 6.4 recommended. Returns: - Column: PICS posterior probability - """ - w_lead = Window.partitionBy(study_locus_id) - - pics_mu = PICS._pics_mu(neglog_p, r) - pics_std = PICS._pics_standard_deviation(neglog_p, r, k) + Standard deviation for the P value of the association between a SNP and a trait - pics_relative_prob = f.when(pics_std == 0, 1.0).otherwise( - PICS._norm_sf(pics_mu, pics_std, neglog_p) + Examples: + >>> PICS._pics_standard_deviation(neglog_p=1.0, r2=1.0, k=6.4) + 0.0 + >>> round(PICS._pics_standard_deviation(neglog_p=10.0, r2=0.5, k=6.4), 3) + 1.493 + >>> print(PICS._pics_standard_deviation(neglog_p=1.0, r2=0.0, k=6.4)) + None + """ + return ( + abs(((1 - (r2**0.5) ** k) ** 0.5) * (neglog_p**0.5) / 2) + if r2 >= 0.5 + else None ) - return pics_relative_prob / f.sum(pics_relative_prob).over(w_lead) @staticmethod - def _pics_standard_deviation(neglog_p: Column, r: Column, k: float) -> Column: - """Compute the PICS standard deviation. + def _pics_mu(neglog_p: float, r2: float) -> float | None: + """Compute the PICS mu that estimates the probability of association between a given SNP and the trait. + + This distribution is obtained after a series of permutation tests described in the PICS method, and it is only + valid when the SNP is highly linked with the lead (r2 > 0.5). Args: - neglog_p (Column): Negative log p-value - r (Column): R-squared - k (float): Empiric constant that can be adjusted to fit the curve, 6.4 recommended. + neglog_p (float): Negative log p-value of the lead variant + r2 (float): LD score between a given SNP and the lead variant Returns: - Column: PICS standard deviation + Mean P value of the association between a SNP and a trait Examples: - >>> k = 6.4 - >>> d = [(1.0, 1.0), (10.0, 1.0), (10.0, 0.5), (100.0, 0.5), (1.0, 0.0)] - >>> spark.createDataFrame(d).toDF("neglog_p", "r").withColumn("std", PICS._pics_standard_deviation(f.col("neglog_p"), f.col("r"), k)).show() - +--------+---+-----------------+ - |neglog_p| r| std| - +--------+---+-----------------+ - | 1.0|1.0| 0.0| - | 10.0|1.0| 0.0| - | 10.0|0.5|1.571749395040553| - | 100.0|0.5|4.970307999319905| - | 1.0|0.0| 0.5| - +--------+---+-----------------+ - + >>> PICS._pics_mu(neglog_p=1.0, r2=1.0) + 1.0 + >>> PICS._pics_mu(neglog_p=10.0, r2=0.5) + 5.0 + >>> print(PICS._pics_mu(neglog_p=10.0, r2=0.3)) + None """ - return f.sqrt(1 - f.abs(r) ** k) * f.sqrt(neglog_p) / 2 + return neglog_p * r2 if r2 >= 0.5 else None @staticmethod - def _pics_mu(neglog_p: Column, r: Column) -> Column: - """Compute the PICS mu. + def _finemap(ld_set: list[Row], lead_neglog_p: float, k: float) -> list | None: + """Calculates the probability of a variant being causal in a study-locus context by applying the PICS method. + + It is intended to be applied as an UDF in `PICS.finemap`, where each row is a StudyLocus association. + The function iterates over every SNP in the `ldSet` array, and it returns an updated locus with + its association signal and causality probability as of PICS. Args: - neglog_p (Column): Negative log p-value - r (Column): R + ld_set (list): list of tagging variants after expanding the locus + lead_neglog_p (float): P value of the association signal between the lead variant and the study in the form of -log10. + k (float): Empiric constant that can be adjusted to fit the curve, 6.4 recommended. Returns: - Column: PICS mu + List of tagging variants with an estimation of the association signal and their posterior probability as of PICS. Examples: - >>> d = [(1.0, 1.0), (10.0, 1.0), (10.0, 0.5), (100.0, 0.5), (1.0, 0.0)] - >>> spark.createDataFrame(d).toDF("neglog_p", "r").withColumn("mu", PICS._pics_mu(f.col("neglog_p"), f.col("r"))).show() - +--------+---+----+ - |neglog_p| r| mu| - +--------+---+----+ - | 1.0|1.0| 1.0| - | 10.0|1.0|10.0| - | 10.0|0.5| 2.5| - | 100.0|0.5|25.0| - | 1.0|0.0| 0.0| - +--------+---+----+ - + >>> from pyspark.sql import Row + >>> ld_set = [ + ... Row(variantId="var1", r2Overall=0.8), + ... Row(variantId="var2", r2Overall=1), + ... ] + >>> PICS._finemap(ld_set, lead_neglog_p=10.0, k=6.4) + [{'variantId': 'var1', 'r2Overall': 0.8, 'standardError': 0.07420896512708416, 'posteriorProbability': 0.07116959886882368}, {'variantId': 'var2', 'r2Overall': 1, 'standardError': 0.9977000638225533, 'posteriorProbability': 0.9288304011311763}] + >>> empty_ld_set = [] + >>> PICS._finemap(empty_ld_set, lead_neglog_p=10.0, k=6.4) + [] + >>> ld_set_with_no_r2 = [ + ... Row(variantId="var1", r2Overall=None), + ... Row(variantId="var2", r2Overall=None), + ... ] + >>> PICS._finemap(ld_set_with_no_r2, lead_neglog_p=10.0, k=6.4) + [{'variantId': 'var1', 'r2Overall': None}, {'variantId': 'var2', 'r2Overall': None}] """ - return neglog_p * (r**2) + if ld_set is None: + return None + elif not ld_set: + return [] + tmp_credible_set = [] + new_credible_set = [] + # First iteration: calculation of mu, standard deviation, and the relative posterior probability + for tag_struct in ld_set: + tag_dict = ( + tag_struct.asDict() + ) # tag_struct is of type pyspark.Row, we'll represent it as a dict + if ( + not tag_dict["r2Overall"] + or tag_dict["r2Overall"] < 0.5 + or not lead_neglog_p + ): + # If PICS cannot be calculated, we'll return the original credible set + new_credible_set.append(tag_dict) + continue + + pics_snp_mu = PICS._pics_mu(lead_neglog_p, tag_dict["r2Overall"]) + pics_snp_std = PICS._pics_standard_deviation( + lead_neglog_p, tag_dict["r2Overall"], k + ) + pics_snp_std = 0.001 if pics_snp_std == 0 else pics_snp_std + if pics_snp_mu is not None and pics_snp_std is not None: + posterior_probability = PICS._pics_relative_posterior_probability( + lead_neglog_p, pics_snp_mu, pics_snp_std + ) + tag_dict["standardError"] = 10**-pics_snp_std + tag_dict["relativePosteriorProbability"] = posterior_probability + + tmp_credible_set.append(tag_dict) + + # Second iteration: calculation of the sum of all the posteriors in each study-locus, so that we scale them between 0-1 + total_posteriors = sum( + tag_dict.get("relativePosteriorProbability", 0) + for tag_dict in tmp_credible_set + ) + + # Third iteration: calculation of the final posteriorProbability + for tag_dict in tmp_credible_set: + if total_posteriors != 0: + tag_dict["posteriorProbability"] = float( + tag_dict.get("relativePosteriorProbability", 0) / total_posteriors + ) + tag_dict.pop("relativePosteriorProbability") + new_credible_set.append(tag_dict) + return new_credible_set @classmethod def finemap( @@ -188,26 +193,52 @@ def finemap( Returns: StudyLocus: Study locus with PICS results """ - associations.df = ( - associations.df.withColumn("neglog_pvalue", associations.neglog_pvalue()) - .withColumn( - "credibleSet", - f.when( - f.col("credibleSet").isNotNull(), - f.transform( - f.col("credibleSet"), - lambda x: x.withField( - "posteriorProbability", - PICS._pics_posterior_probability( - f.col("studyLocusId"), - f.col("neglog_pvalue"), - x.r2Overall, - k, - ), + # Register UDF by defining the structure of the output locus array of structs + # it also renames tagVariantId to variantId + + picsed_ldset_schema = t.ArrayType( + t.StructType( + [ + t.StructField("tagVariantId", t.StringType(), True), + t.StructField("r2Overall", t.DoubleType(), True), + t.StructField("posteriorProbability", t.DoubleType(), True), + t.StructField("standardError", t.DoubleType(), True), + ] + ) + ) + picsed_study_locus_schema = t.ArrayType( + t.StructType( + [ + t.StructField("variantId", t.StringType(), True), + t.StructField("r2Overall", t.DoubleType(), True), + t.StructField("posteriorProbability", t.DoubleType(), True), + t.StructField("standardError", t.DoubleType(), True), + ] + ) + ) + _finemap_udf = f.udf( + lambda locus, neglog_p: PICS._finemap(locus, neglog_p, k), + picsed_ldset_schema, + ) + return StudyLocus( + _df=( + associations.df + # Old locus column will be dropped if available + .select(*[col for col in associations.df.columns if col != "locus"]) + # Estimate neglog_pvalue for the lead variant + .withColumn("neglog_pvalue", associations.neglog_pvalue()) + # New locus containing the PICS results + .withColumn( + "locus", + f.when( + f.col("ldSet").isNotNull(), + _finemap_udf(f.col("ldSet"), f.col("neglog_pvalue")).cast( + picsed_study_locus_schema ), ), - ), - ) - .drop("neglog_pvalue") + ) + # Rename tagVariantId to variantId + .drop("neglog_pvalue") + ), + _schema=StudyLocus.get_schema(), ) - return associations diff --git a/src/otg/method/window_based_clumping.py b/src/otg/method/window_based_clumping.py new file mode 100644 index 000000000..890b54ca7 --- /dev/null +++ b/src/otg/method/window_based_clumping.py @@ -0,0 +1,333 @@ +"""Clumps GWAS significant variants from summary statistics with a distance based method.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np +import pyspark.sql.functions as f +import pyspark.sql.types as t +from pyspark.ml import functions as fml +from pyspark.ml.linalg import DenseVector, VectorUDT +from pyspark.sql.window import Window + +from otg.dataset.study_locus import StudyLocus + +if TYPE_CHECKING: + from numpy import ndarray + from pyspark.sql import Column + + from otg.dataset.summary_statistics import SummaryStatistics + + +class WindowBasedClumping: + """Get semi-lead snps from summary statistics using a window based function.""" + + @staticmethod + def _cluster_peaks( + study: Column, chromosome: Column, position: Column, window_length: int + ) -> Column: + """Cluster GWAS significant variants, were clusters are separated by a defined distance. + + !! Important to note that the length of the clusters can be arbitrarily big. + + Args: + study (Column): study identifier + chromosome (Column): chromosome identifier + position (Column): position of the variant + window_length (int): window length in basepair + + Returns: + Column: containing cluster identifier + + Examples: + >>> data = [ + ... # Cluster 1: + ... ('s1', 'chr1', 2), + ... ('s1', 'chr1', 4), + ... ('s1', 'chr1', 12), + ... # Cluster 2 - Same chromosome: + ... ('s1', 'chr1', 31), + ... ('s1', 'chr1', 38), + ... ('s1', 'chr1', 42), + ... # Cluster 3 - New chromosome: + ... ('s1', 'chr2', 41), + ... ('s1', 'chr2', 44), + ... ('s1', 'chr2', 50), + ... # Cluster 4 - other study: + ... ('s2', 'chr2', 55), + ... ('s2', 'chr2', 62), + ... ('s2', 'chr2', 70), + ... ] + >>> window_length = 10 + >>> ( + ... spark.createDataFrame(data, ['studyId', 'chromosome', 'position']) + ... .withColumn("cluster_id", + ... WindowBasedClumping._cluster_peaks( + ... f.col('studyId'), + ... f.col('chromosome'), + ... f.col('position'), + ... window_length + ... ) + ... ).show() + ... ) + +-------+----------+--------+----------+ + |studyId|chromosome|position|cluster_id| + +-------+----------+--------+----------+ + | s1| chr1| 2| s1_chr1_2| + | s1| chr1| 4| s1_chr1_2| + | s1| chr1| 12| s1_chr1_2| + | s1| chr1| 31|s1_chr1_31| + | s1| chr1| 38|s1_chr1_31| + | s1| chr1| 42|s1_chr1_31| + | s1| chr2| 41|s1_chr2_41| + | s1| chr2| 44|s1_chr2_41| + | s1| chr2| 50|s1_chr2_41| + | s2| chr2| 55|s2_chr2_55| + | s2| chr2| 62|s2_chr2_55| + | s2| chr2| 70|s2_chr2_55| + +-------+----------+--------+----------+ + + + """ + # By adding previous position, the cluster boundary can be identified: + previous_position = f.lag(position).over( + Window.partitionBy(study, chromosome).orderBy(position) + ) + # We consider a cluster boudary if subsequent snps are further than the defined window: + cluster_id = f.when( + (previous_position.isNull()) + | (position - previous_position > window_length), + f.concat_ws("_", study, chromosome, position), + ) + # The cluster identifier is propagated across every variant of the cluster: + return f.when( + cluster_id.isNull(), + f.last(cluster_id, ignorenulls=True).over( + Window.partitionBy(study, chromosome) + .orderBy(position) + .rowsBetween(Window.unboundedPreceding, Window.currentRow) + ), + ).otherwise(cluster_id) + + @staticmethod + def _prune_peak(position: ndarray, window_size: int) -> DenseVector: + """Establish lead snps based on their positions listed by p-value. + + The function `find_peak` assigns lead SNPs based on their positions listed by p-value within a specified window size. + + Args: + position (ndarray): positions of the SNPs sorted by p-value. + window_size (int): the distance in bp within which associations are clumped together around the lead snp. + + Returns: + DenseVector: binary vector where 1 indicates a lead SNP and 0 indicates a non-lead SNP. + + Examples: + >>> from pyspark.ml import functions as fml + >>> from pyspark.ml.linalg import DenseVector + >>> WindowBasedClumping._prune_peak(np.array((3, 9, 8, 4, 6)), 2) + DenseVector([1.0, 1.0, 0.0, 0.0, 1.0]) + + """ + # Initializing the lead list with zeroes: + is_lead: ndarray = np.zeros(len(position)) + + # List containing indices of leads: + lead_indices: list = [] + + # Looping through all positions: + for index in range(len(position)): + # Looping through leads to find out if they are within a window: + for lead_index in lead_indices: + # If any of the leads within the window: + if abs(position[lead_index] - position[index]) < window_size: + # Skipping further checks: + break + else: + # None of the leads were within the window: + lead_indices.append(index) + is_lead[index] = 1 + + return DenseVector(is_lead) + + @classmethod + def clump( + cls: type[WindowBasedClumping], + summary_stats: SummaryStatistics, + window_length: int, + p_value_significance: float = 5e-8, + ) -> StudyLocus: + """Clump summary statistics by distance. + + Args: + summary_stats (SummaryStatistics): summary statistics to clump + window_length (int): window length in basepair + p_value_significance (float): only more significant variants are considered + + Returns: + StudyLocus: clumped summary statistics + """ + # Create window for locus clusters + # - variants where the distance between subsequent variants is below the defined threshold. + # - Variants are sorted by descending significance + cluster_window = Window.partitionBy( + "studyId", "chromosome", "cluster_id" + ).orderBy(f.col("pValueExponent").asc(), f.col("pValueMantissa").asc()) + + return StudyLocus( + _df=( + summary_stats + # Dropping snps below significance - all subsequent steps are done on significant variants: + .pvalue_filter(p_value_significance) + .df + # Clustering summary variants for efficient windowing (complexity reduction): + .withColumn( + "cluster_id", + WindowBasedClumping._cluster_peaks( + f.col("studyId"), + f.col("chromosome"), + f.col("position"), + window_length, + ), + ) + # Within each cluster variants are ranked by significance: + .withColumn("pvRank", f.row_number().over(cluster_window)) + # Collect positions in cluster for the most significant variant (complexity reduction): + .withColumn( + "collectedPositions", + f.when( + f.col("pvRank") == 1, + f.collect_list(f.col("position")).over( + cluster_window.rowsBetween( + Window.currentRow, Window.unboundedFollowing + ) + ), + ).otherwise(f.array()), + ) + # Get semi indices only ONCE per cluster: + .withColumn( + "semiIndices", + f.when( + f.size(f.col("collectedPositions")) > 0, + fml.vector_to_array( + f.udf(WindowBasedClumping._prune_peak, VectorUDT())( + fml.array_to_vector(f.col("collectedPositions")), + f.lit(window_length), + ) + ), + ), + ) + # Propagating the result of the above calculation for all rows: + .withColumn( + "semiIndices", + f.when( + f.col("semiIndices").isNull(), + f.first(f.col("semiIndices"), ignorenulls=True).over( + cluster_window + ), + ).otherwise(f.col("semiIndices")), + ) + # Keeping semi indices only: + .filter(f.col("semiIndices")[f.col("pvRank") - 1] > 0) + .drop("pvRank", "collectedPositions", "semiIndices", "cluster_id") + # Adding study-locus id: + .withColumn( + "studyLocusId", + StudyLocus.assign_study_locus_id("studyId", "variantId"), + ) + # Initialize QC column as array of strings: + .withColumn( + "qualityControls", f.array().cast(t.ArrayType(t.StringType())) + ) + ), + _schema=StudyLocus.get_schema(), + ) + + @classmethod + def clump_with_locus( + cls: type[WindowBasedClumping], + summary_stats: SummaryStatistics, + window_length: int, + p_value_significance: float = 5e-8, + p_value_baseline: float = 0.05, + locus_window_length: int | None = None, + ) -> StudyLocus: + """Clump significant associations while collecting locus around them. + + Args: + summary_stats (SummaryStatistics): Input summary statistics dataset + window_length (int): Window size in bp, used for distance based clumping. + p_value_significance (float, optional): GWAS significance threshold used to filter peaks. Defaults to 5e-8. + p_value_baseline (float, optional): Least significant threshold. Below this, all snps are dropped. Defaults to 0.05. + locus_window_length (int, optional): The distance for collecting locus around the semi indices. + + Returns: + StudyLocus: StudyLocus after clumping with information about the `locus` + """ + # If no locus window provided, using the same value: + if locus_window_length is None: + locus_window_length = window_length + + # Run distance based clumping on the summary stats: + clumped_dataframe = WindowBasedClumping.clump( + summary_stats, + window_length=window_length, + p_value_significance=p_value_significance, + ).df.alias("clumped") + + # Get list of columns from clumped dataset for further propagation: + clumped_columns = clumped_dataframe.columns + + # Dropping variants not meeting the baseline criteria: + sumstats_baseline = summary_stats.pvalue_filter(p_value_baseline).df + + # Renaming columns: + sumstats_baseline_renamed = sumstats_baseline.selectExpr( + *[f"{col} as tag_{col}" for col in sumstats_baseline.columns] + ).alias("sumstat") + + study_locus_df = ( + sumstats_baseline_renamed + # Joining the two datasets together: + .join( + f.broadcast(clumped_dataframe), + on=[ + (f.col("sumstat.tag_studyId") == f.col("clumped.studyId")) + & (f.col("sumstat.tag_chromosome") == f.col("clumped.chromosome")) + & ( + f.col("sumstat.tag_position") + >= (f.col("clumped.position") - locus_window_length) + ) + & ( + f.col("sumstat.tag_position") + <= (f.col("clumped.position") + locus_window_length) + ) + ], + how="right", + ) + .withColumn( + "locus", + f.struct( + f.col("tag_variantId").alias("variantId"), + f.col("tag_beta").alias("beta"), + f.col("tag_pValueMantissa").alias("pValueMantissa"), + f.col("tag_pValueExponent").alias("pValueExponent"), + f.col("tag_standardError").alias("standardError"), + ), + ) + .groupby("studyLocusId") + .agg( + *[ + f.first(col).alias(col) + for col in clumped_columns + if col != "studyLocusId" + ], + f.collect_list(f.col("locus")).alias("locus"), + ) + ) + + return StudyLocus( + _df=study_locus_df, + _schema=StudyLocus.get_schema(), + ) diff --git a/src/otg/overlaps.py b/src/otg/overlaps.py new file mode 100644 index 000000000..7e46ff069 --- /dev/null +++ b/src/otg/overlaps.py @@ -0,0 +1,36 @@ +"""Step to generate the dataset of overlapping studyLocus associations.""" +from __future__ import annotations + +from dataclasses import dataclass + +from otg.common.session import Session +from otg.config import StudyLocusOverlapStepConfig +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import StudyLocus +from otg.dataset.study_locus_overlap import StudyLocusOverlap + + +@dataclass +class OverlapsIndexStep(StudyLocusOverlapStepConfig): + """StudyLocus overlaps step. + + This step generates a dataset of overlapping studyLocus associations. + """ + + session: Session = Session() + + def run(self: OverlapsIndexStep) -> None: + """Run Overlaps index step. + + !!! note + This dataset is defined to contain the overlapping signals between studyLocus associations once they have been clumped and fine-mapped. + """ + # Extract + study_locus = StudyLocus.from_parquet(self.session, self.study_locus_path) + study_index = StudyIndex.from_parquet(self.session, self.study_index_path) + # Transform + overlaps_index = StudyLocusOverlap.from_associations(study_locus, study_index) + # Load + overlaps_index.df.write.mode(self.session.write_mode).parquet( + self.overlaps_index_out + ) diff --git a/src/otg/ukbiobank.py b/src/otg/ukbiobank.py new file mode 100644 index 000000000..6fe8a6ab2 --- /dev/null +++ b/src/otg/ukbiobank.py @@ -0,0 +1,31 @@ +"""Step to run UKBiobank study table ingestion.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from otg.common.session import Session +from otg.config import UKBiobankStepConfig +from otg.datasource.ukbiobank.study_index import UKBiobankStudyIndex + + +@dataclass +class UKBiobankStep(UKBiobankStepConfig): + """UKBiobank study table ingestion step.""" + + session: Session = Session() + + def run(self: UKBiobankStep) -> None: + """Run UKBiobank study table ingestion step.""" + # Read in the UKBiobank manifest tsv file. + df = self.session.spark.read.csv( + self.ukbiobank_manifest, sep="\t", header=True, inferSchema=True + ) + + # Parse the study index data. + ukbiobank_study_index = UKBiobankStudyIndex.from_source(df) + + # Write the output. + ukbiobank_study_index.df.write.mode(self.session.write_mode).parquet( + self.ukbiobank_study_index_out + ) diff --git a/src/otg/v2g.py b/src/otg/v2g.py index 1e82cd764..ce0c1541b 100644 --- a/src/otg/v2g.py +++ b/src/otg/v2g.py @@ -3,20 +3,18 @@ from dataclasses import dataclass from functools import reduce -from typing import TYPE_CHECKING - -from pyspark.sql import SparkSession from otg.common.Liftover import LiftOverSpark +from otg.common.session import Session from otg.config import V2GStepConfig from otg.dataset.gene_index import GeneIndex -from otg.dataset.intervals import Intervals from otg.dataset.v2g import V2G from otg.dataset.variant_annotation import VariantAnnotation from otg.dataset.variant_index import VariantIndex - -if TYPE_CHECKING: - from otg.common.session import Session +from otg.datasource.intervals.andersson import IntervalsAndersson +from otg.datasource.intervals.javierre import IntervalsJavierre +from otg.datasource.intervals.jung import IntervalsJung +from otg.datasource.intervals.thurnman import IntervalsThurnman @dataclass @@ -31,53 +29,63 @@ class V2GStep(V2GStepConfig): """ - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() def run(self: V2GStep) -> None: """Run V2G dataset generation.""" # Filter gene index by approved biotypes to define V2G gene universe gene_index_filtered = GeneIndex.from_parquet( - self.etl, self.gene_index_path + self.session, self.gene_index_path ).filter_by_biotypes(self.approved_biotypes) - vi = VariantIndex.from_parquet(self.etl, self.variant_index_path).persist() - va = VariantAnnotation.from_parquet(self.etl, self.variant_annotation_path) + vi = VariantIndex.from_parquet(self.session, self.variant_index_path).persist() + va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) + vep_consequences = self.session.spark.read.csv( + self.vep_consequences_path, sep="\t", header=True + ) # Variant annotation reduced to the variant index to define V2G variant universe - va_slimmed = va.filter_by_variant_df(vi, ["id", "chromosome"]).persist() + va_slimmed = va.filter_by_variant_df(vi.df, ["id", "chromosome"]).persist() # lift over variants to hg38 lift = LiftOverSpark( self.liftover_chain_file_path, self.liftover_max_length_difference ) + # Expected andersson et al. schema: v2g_datasets = [ va_slimmed.get_distance_to_tss(gene_index_filtered, self.max_distance), # variant effects - va_slimmed.get_most_severe_variant_consequence( - self.vep_consequences_path, gene_index_filtered - ), + va_slimmed.get_most_severe_vep_v2g(vep_consequences, gene_index_filtered), va_slimmed.get_polyphen_v2g(gene_index_filtered), va_slimmed.get_sift_v2g(gene_index_filtered), va_slimmed.get_plof_v2g(gene_index_filtered), # intervals - Intervals.parse_andersson( - self.etl, self.anderson_path, gene_index_filtered, lift + IntervalsAndersson.parse( + IntervalsAndersson.read_andersson(self.session, self.anderson_path), + gene_index_filtered, + lift, ).v2g(vi), - Intervals.parse_javierre( - self.etl, self.javierre_path, gene_index_filtered, lift + IntervalsJavierre.parse( + IntervalsJavierre.read_javierre(self.session, self.javierre_path), + gene_index_filtered, + lift, ).v2g(vi), - Intervals.parse_jung( - self.etl, self.jung_path, gene_index_filtered, lift + IntervalsJung.parse( + IntervalsJung.read_jung(self.session, self.jung_path), + gene_index_filtered, + lift, ).v2g(vi), - Intervals.parse_thurnman( - self.etl, self.thurnman_path, gene_index_filtered, lift + IntervalsThurnman.parse( + IntervalsThurnman.read_thurnman(self.session, self.thurnman_path), + gene_index_filtered, + lift, ).v2g(vi), ] # merge all V2G datasets v2g = V2G( - df=reduce( + _df=reduce( lambda x, y: x.unionByName(y, allowMissingColumns=True), [dataset.df for dataset in v2g_datasets], ).repartition("chromosome") @@ -85,6 +93,6 @@ def run(self: V2GStep) -> None: # write V2G dataset ( v2g.df.write.partitionBy("chromosome") - .mode(self.etl.write_mode) + .mode(self.session.write_mode) .parquet(self.v2g_path) ) diff --git a/src/otg/variant_annotation.py b/src/otg/variant_annotation.py index f656fdb2f..ceb6ffe92 100644 --- a/src/otg/variant_annotation.py +++ b/src/otg/variant_annotation.py @@ -2,15 +2,12 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING -from pyspark.sql import SparkSession +import hail as hl +from otg.common.session import Session from otg.config import VariantAnnotationStepConfig -from otg.dataset.variant_annotation import VariantAnnotation - -if TYPE_CHECKING: - from otg.common.session import Session +from otg.datasource.gnomad.variants import GnomADVariants @dataclass @@ -20,22 +17,24 @@ class VariantAnnotationStep(VariantAnnotationStepConfig): Variant annotation step produces a dataset of the type `VariantAnnotation` derived from gnomADs `gnomad.genomes.vX.X.X.sites.ht` Hail's table. This dataset is used to validate variants and as a source of annotation. """ - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() def run(self: VariantAnnotationStep) -> None: """Run variant annotation step.""" - variant_annotation = VariantAnnotation.from_gnomad( - self.etl, + # init hail session + hl.init(sc=self.session.spark.sparkContext, log="/dev/null") + + """Run variant annotation step.""" + variant_annotation = GnomADVariants.as_variant_annotation( self.gnomad_genomes, self.chain_38_to_37, self.populations, - self.variant_annotation_path, ) # Writing data partitioned by chromosome and position: ( variant_annotation.df.repartition(400, "chromosome") .sortWithinPartitions("chromosome", "position") .write.partitionBy("chromosome") - .mode(self.etl.overwrite_mode) + .mode(self.session.write_mode) .parquet(self.variant_annotation_path) ) diff --git a/src/otg/variant_index.py b/src/otg/variant_index.py index 2a363d87a..a75c91a71 100644 --- a/src/otg/variant_index.py +++ b/src/otg/variant_index.py @@ -2,18 +2,13 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING - -from pyspark.sql import SparkSession +from otg.common.session import Session from otg.config import VariantIndexStepConfig from otg.dataset.study_locus import StudyLocus from otg.dataset.variant_annotation import VariantAnnotation from otg.dataset.variant_index import VariantIndex -if TYPE_CHECKING: - from otg.common.session import Session - @dataclass class VariantIndexStep(VariantIndexStepConfig): @@ -22,15 +17,15 @@ class VariantIndexStep(VariantIndexStepConfig): Using a `VariantAnnotation` dataset as a reference, this step creates and writes a dataset of the type `VariantIndex` that includes only variants that have disease-association data with a reduced set of annotations. """ - session: Session = SparkSession.builder.getOrCreate() + session: Session = Session() def run(self: VariantIndexStep) -> None: """Run variant index step.""" # Variant annotation dataset - va = VariantAnnotation.from_parquet(self.etl, self.variant_annotation_path) + va = VariantAnnotation.from_parquet(self.session, self.variant_annotation_path) # Study-locus dataset - study_locus = StudyLocus.from_parquet(self.etl, self.study_locus_path) + study_locus = StudyLocus.from_parquet(self.session, self.study_locus_path) # Reduce scope of variant annotation dataset to only variants in study-locus sets: va_slimmed = va.filter_by_variant_df( @@ -51,6 +46,6 @@ def run(self: VariantIndexStep) -> None: self.session.logger.info(f"Writing variant index to: {self.variant_index_path}") ( vi.df.write.partitionBy("chromosome") - .mode(self.etl.write_mode) + .mode(self.session.write_mode) .parquet(self.variant_index_path) ) diff --git a/src/scripts/schemadocs.py b/src/scripts/schemadocs.py index 7d76a7935..5ecd737b2 100644 --- a/src/scripts/schemadocs.py +++ b/src/scripts/schemadocs.py @@ -4,18 +4,31 @@ import json import os +from pathlib import Path +import mkdocs.plugins import pyspark.sql.types as t +from mkdocs.config import Config as MkdocsConfig from pyspark.sql import SparkSession -# Create SparkSession -spark = SparkSession.builder.master("local[1]").appName("schemas").getOrCreate() +def spark_connect() -> SparkSession: + """Create SparkSession. -def generate_schema_assets(assets_dir: str, schema_dir: str) -> None: + Returns: + SparkSession: SparkSession object. + """ + spark = SparkSession.builder.master("local[1]").appName("schemas").getOrCreate() + return spark + + +def generate_schema_assets( + spark: SparkSession, assets_dir: Path, schema_dir: str +) -> None: """Generate schema assets for mkdocs documentation. Args: + spark: SparkSession object. assets_dir: Path to assets directory. schema_dir: Path to schema directory. """ @@ -26,16 +39,27 @@ def generate_schema_assets(assets_dir: str, schema_dir: str) -> None: input_schema = t.StructType.fromJson(d) df = spark.createDataFrame([], input_schema) outfilename = i.replace("json", "md") - if not os.path.exists(assets_dir): - os.makedirs(assets_dir) - with open(f"{assets_dir}/{outfilename}", "w") as out: - tree = df._jdf.schema().treeString() + with (assets_dir / outfilename).open("w") as out: + tree = df._jdf.schema().treeString() # type: ignore out.write(f"```\n{tree}\n```") -def main(config: dict) -> None: - """Main function.""" +@mkdocs.plugins.event_priority(50) +def on_pre_build(config: MkdocsConfig, **kwargs) -> None: + """Main function. + + Args: + config: MkdocsConfig object. + **kwargs: Arbitrary keyword arguments. + """ + # Create schema dir if not exist: + assets_dir = Path("docs/assets/schemas") + assets_dir.mkdir(exist_ok=True) + + spark = spark_connect() generate_schema_assets( - assets_dir="docs/assets/schemas", schema_dir="src/otg/dataset/schemas" + spark=spark, + assets_dir=assets_dir, + schema_dir="src/otg/assets/schemas", ) print(f"Schema assests generated for {config['site_name']}") diff --git a/tests/airflow/test_dag.py b/tests/airflow/test_dag.py new file mode 100644 index 000000000..0e0697531 --- /dev/null +++ b/tests/airflow/test_dag.py @@ -0,0 +1,48 @@ +"""Check for airflow import errors. Inspiration from https://garystafford.medium.com/devops-for-dataops-building-a-ci-cd-pipeline-for-apache-airflow-dags-975e4a622f83.""" +from __future__ import annotations + +import pytest +from airflow.models import DagBag + + +@pytest.fixture(params=["./src/airflow/dags"]) +def dag_bag(request): + """Return a DAG bag for testing.""" + return DagBag(dag_folder=request.param, include_examples=False) + + +def test_no_import_errors(dag_bag): + """Test for import errors.""" + assert ( + not dag_bag.import_errors + ), f"DAG import failures. Errors: {dag_bag.import_errors}" + + +def test_requires_tags(dag_bag): + """Tags should be defined for each DAG.""" + for _, dag in dag_bag.dags.items(): + assert dag.tags + + +def test_owner_len_greater_than_five(dag_bag): + """Owner should be defined for each DAG and be longer than 5 characters.""" + for _, dag in dag_bag.dags.items(): + assert len(dag.owner) > 5 + + +def test_desc_len_greater_than_fifteen(dag_bag): + """Description should be defined for each DAG and be longer than 30 characters.""" + for _, dag in dag_bag.dags.items(): + assert len(dag.description) > 30 + + +def test_owner_not_airflow(dag_bag): + """Owner should not be 'airflow'.""" + for _, dag in dag_bag.dags.items(): + assert str.lower(dag.owner) != "airflow" + + +def test_three_or_less_retries(dag_bag): + """Retries should be 3 or less.""" + for _, dag in dag_bag.dags.items(): + assert dag.default_args["retries"] <= 3 diff --git a/tests/common/test_gwas_catalog_splitter.py b/tests/common/test_gwas_catalog_splitter.py deleted file mode 100644 index 1db778fe1..000000000 --- a/tests/common/test_gwas_catalog_splitter.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Tests GWAS Catalog study splitter.""" -from __future__ import annotations - -from otg.common.gwas_catalog_splitter import GWASCatalogSplitter -from otg.dataset.study_index import StudyIndexGWASCatalog -from otg.dataset.study_locus import StudyLocusGWASCatalog - - -def test_gwas_catalog_splitter_split( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, - mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, -) -> None: - """Test v2g creation with mock data.""" - d1, d2 = GWASCatalogSplitter.split( - mock_study_index_gwas_catalog, mock_study_locus_gwas_catalog - ) - - assert isinstance(d1, StudyIndexGWASCatalog) - assert isinstance(d2, StudyLocusGWASCatalog) diff --git a/tests/conftest.py b/tests/conftest.py index 6917f6ba9..3004bda13 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,7 +5,7 @@ import pytest from pyspark.sql import DataFrame, SparkSession -from otg.common.schemas import parse_spark_schema +from otg.common.Liftover import LiftOverSpark from otg.dataset.colocalisation import Colocalisation from otg.dataset.gene_index import GeneIndex from otg.dataset.intervals import Intervals @@ -13,23 +13,50 @@ from otg.dataset.l2g.gold_standard import L2GGoldStandard from otg.dataset.l2g.predictions import L2GPredictions from otg.dataset.ld_index import LDIndex -from otg.dataset.study_index import StudyIndex, StudyIndexGWASCatalog -from otg.dataset.study_locus import StudyLocus, StudyLocusGWASCatalog +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import StudyLocus from otg.dataset.study_locus_overlap import StudyLocusOverlap +from otg.dataset.summary_statistics import SummaryStatistics from otg.dataset.v2g import V2G +from otg.dataset.variant_annotation import VariantAnnotation from otg.dataset.variant_index import VariantIndex +from otg.datasource.finngen.study_index import FinnGenStudyIndex +from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations +from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex +from otg.datasource.ukbiobank.study_index import UKBiobankStudyIndex -@pytest.fixture(scope="session") -def spark() -> SparkSession: +@pytest.fixture(scope="session", autouse=True) +def spark(tmp_path_factory) -> SparkSession: """Local spark session for testing purposes. Returns: SparkSession: local spark session """ return ( - SparkSession.builder.config("spark.driver.bindAddress", "127.0.0.1") - .master("local") + SparkSession.builder.master("local[1]") + .config("spark.driver.bindAddress", "127.0.0.1") + .config("spark.executor.cores", "1") + .config("spark.executor.instances", "1") + # no shuffling + .config("spark.sql.shuffle.partitions", "1") + # ui settings + .config("spark.ui.showConsoleProgress", "false") + .config("spark.ui.enabled", "false") + .config("spark.ui.dagGraph.retainedRootRDDs", "1") + .config("spark.ui.retainedJobs", "1") + .config("spark.ui.retainedStages", "1") + .config("spark.ui.retainedTasks", "1") + .config("spark.sql.ui.retainedExecutions", "1") + .config("spark.worker.ui.retainedExecutors", "1") + .config("spark.worker.ui.retainedDrivers", "1") + # fixed memory + .config("spark.driver.memory", "2g") + .config("spark.sql.warehouse.dir", tmp_path_factory.mktemp("warehouse")) + .config( + "spark.driver.extraJavaOptions", + "-Dderby.system.home={tmp_path_factory.mktemp('derby')}", + ) .appName("test") .getOrCreate() ) @@ -38,7 +65,7 @@ def spark() -> SparkSession: @pytest.fixture() def mock_colocalisation(spark: SparkSession) -> Colocalisation: """Mock colocalisation dataset.""" - schema = parse_spark_schema("colocalisation.json") + coloc_schema = Colocalisation.get_schema() data_spec = ( dg.DataGenerator( @@ -47,22 +74,21 @@ def mock_colocalisation(spark: SparkSession) -> Colocalisation: partitions=4, randomSeedMethod="hash_fieldname", ) - .withSchema(schema) - .withColumnSpec("coloc_h0", percentNulls=0.1) - .withColumnSpec("coloc_h1", percentNulls=0.1) - .withColumnSpec("coloc_h2", percentNulls=0.1) - .withColumnSpec("coloc_h3", percentNulls=0.1) - .withColumnSpec("coloc_h4", percentNulls=0.1) - .withColumnSpec("coloc_log2_h4_h3", percentNulls=0.1) + .withSchema(coloc_schema) + .withColumnSpec("h0", percentNulls=0.1) + .withColumnSpec("h1", percentNulls=0.1) + .withColumnSpec("h2", percentNulls=0.1) + .withColumnSpec("h3", percentNulls=0.1) + .withColumnSpec("h4", percentNulls=0.1) + .withColumnSpec("log2h4h3", percentNulls=0.1) .withColumnSpec("clpp", percentNulls=0.1) ) - - return Colocalisation(_df=data_spec.build(), _schema=schema) + return Colocalisation(_df=data_spec.build(), _schema=coloc_schema) def mock_study_index_data(spark: SparkSession) -> DataFrame: - """Mock study index dataset.""" - schema = parse_spark_schema("studies.json") + """Mock v2g dataset.""" + si_schema = StudyIndex.get_schema() data_spec = ( dg.DataGenerator( @@ -71,7 +97,7 @@ def mock_study_index_data(spark: SparkSession) -> DataFrame: partitions=4, randomSeedMethod="hash_fieldname", ) - .withSchema(schema) + .withSchema(si_schema) .withColumnSpec( "traitFromSourceMappedIds", expr="array(cast(rand() AS string))", @@ -112,44 +138,55 @@ def mock_study_index(spark: SparkSession) -> StudyIndex: """Mock StudyIndex dataset.""" return StudyIndex( _df=mock_study_index_data(spark), - _schema=parse_spark_schema("studies.json"), + _schema=StudyIndex.get_schema(), + ) + + +@pytest.fixture() +def mock_study_index_gwas_catalog(spark: SparkSession) -> GWASCatalogStudyIndex: + """Mock GWASCatalogStudyIndex dataset.""" + return GWASCatalogStudyIndex( + _df=mock_study_index_data(spark), + _schema=StudyIndex.get_schema(), + ) + + +@pytest.fixture() +def mock_study_index_finngen(spark: SparkSession) -> FinnGenStudyIndex: + """Mock StudyIndexFinnGen dataset.""" + return FinnGenStudyIndex( + _df=mock_study_index_data(spark), + _schema=StudyIndex.get_schema(), ) @pytest.fixture() -def mock_study_index_gwas_catalog(spark: SparkSession) -> StudyIndexGWASCatalog: - """Mock StudyIndexGWASCatalog dataset.""" - return StudyIndexGWASCatalog( +def mock_study_index_ukbiobank(spark: SparkSession) -> UKBiobankStudyIndex: + """Mock StudyIndexUKBiobank dataset.""" + return UKBiobankStudyIndex( _df=mock_study_index_data(spark), - _schema=parse_spark_schema("studies.json"), + _schema=UKBiobankStudyIndex.get_schema(), ) @pytest.fixture() def mock_study_locus_overlap(spark: SparkSession) -> StudyLocusOverlap: """Mock StudyLocusOverlap dataset.""" - schema = parse_spark_schema("study_locus_overlap.json") + overlap_schema = StudyLocusOverlap.get_schema() - data_spec = ( - dg.DataGenerator( - spark, - rows=400, - partitions=4, - randomSeedMethod="hash_fieldname", - ) - .withSchema(schema) - .withColumnSpec("right_logABF", percentNulls=0.1) - .withColumnSpec("left_logABF", percentNulls=0.1) - .withColumnSpec("right_posteriorProbability", percentNulls=0.1) - .withColumnSpec("left_posteriorProbability", percentNulls=0.1) - ) + data_spec = dg.DataGenerator( + spark, + rows=400, + partitions=4, + randomSeedMethod="hash_fieldname", + ).withSchema(overlap_schema) - return StudyLocusOverlap(_df=data_spec.build(), _schema=schema) + return StudyLocusOverlap(_df=data_spec.build(), _schema=overlap_schema) def mock_study_locus_data(spark: SparkSession) -> DataFrame: """Mock study_locus dataset.""" - schema = parse_spark_schema("study_locus.json") + sl_schema = StudyLocus.get_schema() data_spec = ( dg.DataGenerator( @@ -158,7 +195,7 @@ def mock_study_locus_data(spark: SparkSession) -> DataFrame: partitions=4, randomSeedMethod="hash_fieldname", ) - .withSchema(schema) + .withSchema(sl_schema) .withColumnSpec("chromosome", percentNulls=0.1) .withColumnSpec("position", percentNulls=0.1) .withColumnSpec("beta", percentNulls=0.1) @@ -167,9 +204,11 @@ def mock_study_locus_data(spark: SparkSession) -> DataFrame: .withColumnSpec("oddsRatioConfidenceIntervalUpper", percentNulls=0.1) .withColumnSpec("betaConfidenceIntervalLower", percentNulls=0.1) .withColumnSpec("betaConfidenceIntervalUpper", percentNulls=0.1) + .withColumnSpec("effectAlleleFrequencyFromSource", percentNulls=0.1) + .withColumnSpec("standardError", percentNulls=0.1) .withColumnSpec("subStudyDescription", percentNulls=0.1) - .withColumnSpec("pValueMantissa", percentNulls=0.1) - .withColumnSpec("pValueExponent", percentNulls=0.1) + .withColumnSpec("pValueMantissa", minValue=1, percentNulls=0.1) + .withColumnSpec("pValueExponent", minValue=1, percentNulls=0.1) .withColumnSpec( "qualityControls", expr="array(cast(rand() as string))", @@ -177,8 +216,8 @@ def mock_study_locus_data(spark: SparkSession) -> DataFrame: ) .withColumnSpec("finemappingMethod", percentNulls=0.1) .withColumnSpec( - "credibleSet", - expr='array(named_struct("is95CredibleSet", cast(rand() > 0.5 as boolean), "is99CredibleSet", cast(rand() > 0.5 as boolean), "logABF", rand(), "posteriorProbability", rand(), "tagVariantId", cast(rand() as string), "tagPValue", rand(), "tagPValueConditioned", rand(), "tagBeta", rand(), "tagStandardError", rand(), "tagBetaConditioned", rand(), "tagStandardErrorConditioned", rand(), "r2Overall", rand()))', + "locus", + expr='array(named_struct("is95CredibleSet", cast(rand() > 0.5 as boolean), "is99CredibleSet", cast(rand() > 0.5 as boolean), "logABF", rand(), "posteriorProbability", rand(), "variantId", cast(rand() as string), "beta", rand(), "standardError", rand(), "betaConditioned", rand(), "standardErrorConditioned", rand(), "r2Overall", rand(), "pValueMantissaConditioned", rand(), "pValueExponentConditioned", rand(), "pValueMantissa", rand(), "pValueExponent", rand()))', percentNulls=0.1, ) ) @@ -190,23 +229,23 @@ def mock_study_locus(spark: SparkSession) -> StudyLocus: """Mock study_locus dataset.""" return StudyLocus( _df=mock_study_locus_data(spark), - _schema=parse_spark_schema("study_locus.json"), + _schema=StudyLocus.get_schema(), ) @pytest.fixture() def mock_study_locus_gwas_catalog(spark: SparkSession) -> StudyLocus: """Mock study_locus dataset.""" - return StudyLocusGWASCatalog( + return GWASCatalogAssociations( _df=mock_study_locus_data(spark), - _schema=parse_spark_schema("study_locus.json"), + _schema=GWASCatalogAssociations.get_schema(), ) @pytest.fixture() def mock_intervals(spark: SparkSession) -> Intervals: """Mock intervals dataset.""" - interval_schema = parse_spark_schema("intervals.json") + interval_schema = Intervals.get_schema() data_spec = ( dg.DataGenerator( @@ -228,7 +267,7 @@ def mock_intervals(spark: SparkSession) -> Intervals: @pytest.fixture() def mock_v2g(spark: SparkSession) -> V2G: """Mock v2g dataset.""" - v2g_schema = parse_spark_schema("v2g.json") + v2g_schema = V2G.get_schema() data_spec = ( dg.DataGenerator( @@ -251,10 +290,49 @@ def mock_v2g(spark: SparkSession) -> V2G: return V2G(_df=data_spec.build(), _schema=v2g_schema) +@pytest.fixture() +def mock_variant_annotation(spark: SparkSession) -> VariantAnnotation: + """Mock variant annotation.""" + va_schema = VariantAnnotation.get_schema() + + data_spec = ( + dg.DataGenerator( + spark, + rows=400, + partitions=4, + randomSeedMethod="hash_fieldname", + ) + .withSchema(va_schema) + .withColumnSpec("alleleType", percentNulls=0.1) + .withColumnSpec("chromosomeB37", percentNulls=0.1) + .withColumnSpec("positionB37", percentNulls=0.1) + # Nested column handling workaround + # https://github.com/databrickslabs/dbldatagen/issues/135 + # It's a workaround for nested column handling in dbldatagen. + .withColumnSpec( + "alleleFrequencies", + expr='array(named_struct("alleleFrequency", rand(), "populationName", cast(rand() as string)))', + percentNulls=0.1, + ) + .withColumnSpec( + "cadd", + expr='named_struct("phred", cast(rand() as float), "raw", cast(rand() as float))', + percentNulls=0.1, + ) + .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) + .withColumnSpec( + "vep", + expr='named_struct("mostSevereConsequence", cast(rand() as string), "transcriptConsequences", array(named_struct("aminoAcids", cast(rand() as string), "consequenceTerms", array(cast(rand() as string)), "geneId", cast(rand() as string), "lof", cast(rand() as string), "polyphenPrediction", cast(rand() as string), "polyphenScore", cast(rand() as float), "siftPrediction", cast(rand() as string), "siftScore", cast(rand() as float))))', + percentNulls=0.1, + ) + ) + return VariantAnnotation(_df=data_spec.build(), _schema=va_schema) + + @pytest.fixture() def mock_variant_index(spark: SparkSession) -> VariantIndex: """Mock gene index.""" - vi_schema = parse_spark_schema("variant_index.json") + vi_schema = VariantIndex.get_schema() data_spec = ( dg.DataGenerator( @@ -280,26 +358,63 @@ def mock_variant_index(spark: SparkSession) -> VariantIndex: expr='named_struct("phred", cast(rand() AS float), "raw", cast(rand() AS float))', percentNulls=0.1, ) - .withColumnSpec( - "filters", expr="array(cast(rand() AS string))", percentNulls=0.1 - ) .withColumnSpec("rsIds", expr="array(cast(rand() AS string))", percentNulls=0.1) ) return VariantIndex(_df=data_spec.build(), _schema=vi_schema) +@pytest.fixture() +def mock_summary_statistics(spark: SparkSession) -> SummaryStatistics: + """Generating a mock summary statistics dataset.""" + ss_schema = SummaryStatistics.get_schema() + + data_spec = ( + dg.DataGenerator( + spark, + rows=400, + partitions=4, + randomSeedMethod="hash_fieldname", + name="summaryStats", + ) + .withSchema(ss_schema) + # Allowing missingness in effect allele frequency and enforce upper limit: + .withColumnSpec( + "effectAlleleFrequencyFromSource", percentNulls=0.1, maxValue=1.0 + ) + # Allowing missingness: + .withColumnSpec("betaConfidenceIntervalLower", percentNulls=0.1) + .withColumnSpec("betaConfidenceIntervalUpper", percentNulls=0.1) + .withColumnSpec("standardError", percentNulls=0.1) + # Making sure p-values are below 1: + ).build() + + # Because some of the columns are not strictly speaking required, they are dropped now: + data_spec = data_spec.drop( + "betaConfidenceIntervalLower", "betaConfidenceIntervalUpper" + ) + + return SummaryStatistics(_df=data_spec, _schema=ss_schema) + + @pytest.fixture() def mock_ld_index(spark: SparkSession) -> LDIndex: """Mock gene index.""" - ld_schema = parse_spark_schema("ld_index.json") + ld_schema = LDIndex.get_schema() - data_spec = dg.DataGenerator( - spark, - rows=400, - partitions=4, - randomSeedMethod="hash_fieldname", - ).withSchema(ld_schema) + data_spec = ( + dg.DataGenerator( + spark, + rows=400, + partitions=4, + randomSeedMethod="hash_fieldname", + ) + .withSchema(ld_schema) + .withColumnSpec( + "ldSet", + expr="array(named_struct('tagVariantId', cast(rand() as string), 'rValues', array(named_struct('population', cast(rand() as string), 'r', cast(rand() as double)))))", + ) + ) return LDIndex(_df=data_spec.build(), _schema=ld_schema) @@ -326,6 +441,16 @@ def sample_gwas_catalog_ancestries_lut(spark: SparkSession) -> DataFrame: @pytest.fixture() def sample_gwas_catalog_harmonised_sumstats(spark: SparkSession) -> DataFrame: + """Sample GWAS harmonised sumstats sample data.""" + return spark.read.csv( + "tests/data_samples/gwas_summary_stats_sample.tsv.gz", + sep="\t", + header=True, + ) + + +@pytest.fixture() +def sample_gwas_catalog_harmonised_sumstats_list(spark: SparkSession) -> DataFrame: """Sample GWAS harmonised sumstats sample data.""" return spark.read.csv( "tests/data_samples/gwas_catalog_harmonised_list.txt", @@ -344,6 +469,38 @@ def sample_gwas_catalog_associations(spark: SparkSession) -> DataFrame: ) +@pytest.fixture() +def sample_summary_satistics(spark: SparkSession) -> SummaryStatistics: + """Sample GWAS raw associations sample data.""" + return SummaryStatistics( + _df=spark.read.parquet("tests/data_samples/GCST005523_chr18.parquet"), + _schema=SummaryStatistics.get_schema(), + ) + + +@pytest.fixture() +def sample_finngen_studies(spark: SparkSession) -> DataFrame: + """Sample FinnGen studies.""" + # For reference, the sample file was generated with the following command: + # curl https://r9.finngen.fi/api/phenos | jq '.[:10]' > tests/data_samples/finngen_studies_sample.json + with open("tests/data_samples/finngen_studies_sample.json") as finngen_studies: + json_data = finngen_studies.read() + rdd = spark.sparkContext.parallelize([json_data]) + return spark.read.json(rdd) + + +@pytest.fixture() +def sample_ukbiobank_studies(spark: SparkSession) -> DataFrame: + """Sample UKBiobank manifest.""" + # Sampled 10 rows of the UKBB manifest tsv + return spark.read.csv( + "tests/data_samples/neale2_saige_study_manifest.samples.tsv", + sep="\t", + header=True, + inferSchema=True, + ) + + @pytest.fixture() def sample_target_index(spark: SparkSession) -> DataFrame: """Sample target index sample data.""" @@ -353,9 +510,9 @@ def sample_target_index(spark: SparkSession) -> DataFrame: @pytest.fixture() -def mock_gene_index(spark: SparkSession) -> Colocalisation: - """Mock colocalisation dataset.""" - schema = parse_spark_schema("targets.json") +def mock_gene_index(spark: SparkSession) -> GeneIndex: + """Mock gene index dataset.""" + gi_schema = GeneIndex.get_schema() data_spec = ( dg.DataGenerator( @@ -364,20 +521,23 @@ def mock_gene_index(spark: SparkSession) -> Colocalisation: partitions=4, randomSeedMethod="hash_fieldname", ) - .withSchema(schema) + .withSchema(gi_schema) .withColumnSpec("approvedSymbol", percentNulls=0.1) .withColumnSpec("biotype", percentNulls=0.1) .withColumnSpec("approvedName", percentNulls=0.1) .withColumnSpec("tss", percentNulls=0.1) + .withColumnSpec("start", percentNulls=0.1) + .withColumnSpec("end", percentNulls=0.1) + .withColumnSpec("strand", percentNulls=0.1) ) - return GeneIndex(_df=data_spec.build(), _schema=schema) + return GeneIndex(_df=data_spec.build(), _schema=gi_schema) @pytest.fixture() def mock_l2g_feature_matrix(spark: SparkSession) -> L2GFeatureMatrix: """Mock l2g feature matrix dataset.""" - schema = parse_spark_schema("l2g_feature_matrix.json") + schema = L2GFeatureMatrix.get_schema() data_spec = ( dg.DataGenerator( @@ -409,7 +569,7 @@ def mock_l2g_feature_matrix(spark: SparkSession) -> L2GFeatureMatrix: @pytest.fixture() def mock_l2g_gold_standard(spark: SparkSession) -> L2GGoldStandard: """Mock l2g gold standard dataset.""" - schema = parse_spark_schema("l2g_gold_standard.json") + schema = L2GGoldStandard.get_schema() data_spec = dg.DataGenerator( spark, rows=400, partitions=4, randomSeedMethod="hash_fieldname" ).withSchema(schema) @@ -420,9 +580,15 @@ def mock_l2g_gold_standard(spark: SparkSession) -> L2GGoldStandard: @pytest.fixture() def mock_l2g_predictions(spark: SparkSession) -> L2GPredictions: """Mock l2g predictions dataset.""" - schema = parse_spark_schema("l2g_predictions.json") + schema = L2GPredictions.get_schema() data_spec = dg.DataGenerator( spark, rows=400, partitions=4, randomSeedMethod="hash_fieldname" ).withSchema(schema) return L2GPredictions(_df=data_spec.build(), _schema=schema) + + +@pytest.fixture() +def liftover_chain_37_to_38(spark: SparkSession) -> DataFrame: + """Sample liftover chain file.""" + return LiftOverSpark("tests/data_samples/grch37_to_grch38.over.chain") diff --git a/tests/data_samples/GCST005523_chr18.parquet b/tests/data_samples/GCST005523_chr18.parquet new file mode 100644 index 0000000000000000000000000000000000000000..f8257c1098aec913d6915fe48861afb30768bc48 GIT binary patch literal 80416 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 literal 0 HcmV?d00001 diff --git a/tests/data_samples/finngen_studies_sample.json b/tests/data_samples/finngen_studies_sample.json new file mode 100644 index 000000000..c4f72ca75 --- /dev/null +++ b/tests/data_samples/finngen_studies_sample.json @@ -0,0 +1,212 @@ +[ + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_ACTINOMYCOSIS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 0.95659, + "0.01": 0.97328, + "0.1": 0.84074, + "0.5": 0.48072 + }, + "num_cases": 93, + "num_cases_prev": 87, + "num_controls": 332343, + "num_controls_prev": 303314, + "num_gw_significant": 0, + "num_gw_significant_prev": 0, + "phenocode": "AB1_ACTINOMYCOSIS", + "phenostring": "Actinomycosis" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_AMOEBIASIS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 0.96504, + "0.01": 0.98154, + "0.1": 0.88697, + "0.5": 0.60005 + }, + "num_cases": 149, + "num_cases_prev": 136, + "num_controls": 336396, + "num_controls_prev": 305879, + "num_gw_significant": 0, + "num_gw_significant_prev": 2, + "phenocode": "AB1_AMOEBIASIS", + "phenostring": "Amoebiasis" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_ANOGENITAL_HERPES_SIMPLEX.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 1.0064, + "0.01": 0.98809, + "0.1": 0.96277, + "0.5": 1.0215 + }, + "num_cases": 1812, + "num_cases_prev": 1613, + "num_controls": 366340, + "num_controls_prev": 332788, + "num_gw_significant": 0, + "num_gw_significant_prev": 0, + "phenocode": "AB1_ANOGENITAL_HERPES_SIMPLEX", + "phenostring": "Anogenital herpesviral [herpes simplex] infection" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_ASPERGILLOSIS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 0.98319, + "0.01": 0.98926, + "0.1": 0.91198, + "0.5": 0.6823 + }, + "num_cases": 194, + "num_cases_prev": 177, + "num_controls": 369098, + "num_controls_prev": 335444, + "num_gw_significant": 0, + "num_gw_significant_prev": 0, + "phenocode": "AB1_ASPERGILLOSIS", + "phenostring": "Aspergillosis" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_ATYPICAL_CNS_VIRUS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 0.97397, + "0.01": 0.98375, + "0.1": 0.91187, + "0.5": 0.73702 + }, + "num_cases": 260, + "num_cases_prev": 238, + "num_controls": 375157, + "num_controls_prev": 340582, + "num_gw_significant": 2, + "num_gw_significant_prev": 1, + "phenocode": "AB1_ATYPICAL_CNS_VIRUS", + "phenostring": "Atypical virus infections of central nervous system" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_BACTINF_NOS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 1.0229, + "0.01": 0.99941, + "0.1": 1.0176, + "0.5": 1.0292 + }, + "num_cases": 18576, + "num_cases_prev": 16018, + "num_controls": 332343, + "num_controls_prev": 303314, + "num_gw_significant": 1, + "num_gw_significant_prev": 1, + "phenocode": "AB1_BACTINF_NOS", + "phenostring": "Bacterial infection, other or unspecified" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_BACT_BIR_OTHER_INF_AGENTS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 1.0053, + "0.01": 0.98369, + "0.1": 0.96289, + "0.5": 1.0155 + }, + "num_cases": 2591, + "num_cases_prev": 2307, + "num_controls": 374686, + "num_controls_prev": 340192, + "num_gw_significant": 0, + "num_gw_significant_prev": 0, + "phenocode": "AB1_BACT_BIR_OTHER_INF_AGENTS", + "phenostring": "Bacterial, viral and other infectious agents" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_BACT_INTEST_OTH.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 1.0267, + "0.01": 0.98919, + "0.1": 0.98714, + "0.5": 1.0187 + }, + "num_cases": 5631, + "num_cases_prev": 5016, + "num_controls": 336396, + "num_controls_prev": 305879, + "num_gw_significant": 1, + "num_gw_significant_prev": 1, + "phenocode": "AB1_BACT_INTEST_OTH", + "phenostring": "Other bacterial intestinal infections" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_CANDIDIASIS.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 1.0093, + "0.01": 0.99043, + "0.1": 0.98666, + "0.5": 1.026 + }, + "num_cases": 3974, + "num_cases_prev": 3475, + "num_controls": 369098, + "num_controls_prev": 335444, + "num_gw_significant": 0, + "num_gw_significant_prev": 0, + "phenocode": "AB1_CANDIDIASIS", + "phenostring": "Candidiasis" + }, + { + "assoc_files": [ + "/cromwell_root/pheweb/generated-by-pheweb/pheno_gz/AB1_CHLAMYDIA_OTHER.gz" + ], + "category": "I Certain infectious and parasitic diseases (AB1_)", + "category_index": 1, + "gc_lambda": { + "0.001": 1.0181, + "0.01": 0.99507, + "0.1": 0.97656, + "0.5": 1.0302 + }, + "num_cases": 2011, + "num_cases_prev": 1777, + "num_controls": 366340, + "num_controls_prev": 332788, + "num_gw_significant": 2, + "num_gw_significant_prev": 1, + "phenocode": "AB1_CHLAMYDIA_OTHER", + "phenostring": "Other sexually transmitted chlamydial diseases" + } +] diff --git a/tests/data_samples/grch37_to_grch38.over.chain b/tests/data_samples/grch37_to_grch38.over.chain new file mode 100644 index 000000000..bbabe2638 --- /dev/null +++ b/tests/data_samples/grch37_to_grch38.over.chain @@ -0,0 +1,56001 @@ +chain 20851231461 1 249250621 + 10000 249240621 chr1 248956422 + 10000 248946422 2 +167376 50041 80290 +40302 253649 288020 +1044699 1 2 +3716 0 3 +1134 4 18 +3377 0 1 +7258 1 1 +27 1 1 +1275 1680 5595 +715 1 1 +52 8 0 +70 1 1 +208 1 1 +44 1 1 +1672 1 1 +25 0 4 +1990 1 1 +44 1 1 +233 11 0 +905 1 1 +48 1 1 +1293 1 1 +25 1 1 +2304 0 1 +641 1 22 +1014 12 12 +1038353 50000 64892 +2716 1 2 +5539 11 11 +1747 1 0 +1084 0 4 +3732 2 0 +2453 10 0 +30 10 0 +185398 0 1 +958314 150000 6505 +1324 1 0 +3430184 1 0 +15819 0 1 +1121911 0 1 +1037710 0 1 +844703 0 1 +1971071 0 1 +6015 0 1 +12423 1 1 +39 1 1 +1404 0 1 +4094 5 0 +10630 0 4 +3447 2 0 +4964 0 4 +26278 3 0 +29394 0 1 +32032 0 1 +21855 0 2 +7070 0 8 +4761 0 2 +8554 0 1 +367 0 1 +950 13 13 +81 0 1 +1867 1 1 +58 1 1 +246 0 1 +338 0 14 +1845 4 0 +210 2 0 +2168 16 20 +5863 17 17 +942 8 0 +399 1 1 +32 1 1 +567 1 1 +34 1 1 +1694 0 4 +1536 0 1 +172 0 1 +1008 0 1 +154 3 0 +9082 0 1 +8461 1 1 +69 1 1 +66 21 18 +61 0 4 +6985 1 1 +48 1 1 +6541 5 1 +542 0 4 +72 0 4 +93 0 4 +1371 0 4 +1860 4 0 +894 0 5 +514 0 3 +1146 1 0 +8641 1 1 +17 1 1 +340 0 1 +3778 0 7 +2901 1 0 +1058 0 2 +173 1 0 +8391 0 1 +2131 1 0 +686 1 0 +268 0 1 +70 1 0 +15776 0 1 +5192 16 0 +4620 0 2 +14658 0 8 +23128 0 1 +4957 1 0 +34 1 1 +346 1 0 +1000 2 0 +3175 2 0 +3047 6 0 +741 1 1 +30 1 1 +2282 1 1 +21 1 1 +5274 0 21 +37 1 1 +248 1 0 +8734 1 1 +78 1 1 +237 6 5 +4290 1 1 +36 1 1 +2493 1 1 +17 0 1 +3980 0 10 +782 1 1 +41 1 1 +613 1 0 +86 0 26 +179 1 1 +2369 1 1 +26 1 1 +4187 1 1 +26 0 1 +57 2 2 +2492 0 3 +3088 0 4 +361 0 1 +131 15 15 +1233 1 0 +667 1 1 +32 1 1 +286 0 2 +1649 1 0 +182 0 4 +648 0 1 +81 0 4 +1260 8 8 +387 0 1 +283 1 1 +31 1 1 +1231 1 1 +20 2 2 +7692 1 0 +2849 1 0 +943 1 1 +72 1 1 +922 31 48 +4152 2 0 +616 213 0 +191 0 1 +538 1 0 +2148 11 9 +162 1 0 +4212 8 8 +314 0 9 +2420 4 4 +175 1 0 +15651 0 2 +1338 0 4 +114 12 0 +1145 1 1 +44 1 1 +766 17 17 +4252 11 11 +4876 5 6 +1140 181 193 +7441 3 0 +1835 1 1 +22 1 0 +512 2 1 +1105 1 0 +2752 1 1 +21 1 1 +471 0 280 +995 1 1 +71 2 2 +2181 14 14 +657 16 16 +2017 1 1 +38 1 1 +144 1 0 +1457 1 0 +153 0 6 +1863 1 0 +751 1 1 +49 1 1 +916 1 1 +29 1 1 +273 1 0 +748 0 1 +238 1 1 +40 1 1 +289 0 4 +1684 0 1 +1495 1 1 +10 1 1 +802 1 1 +37 1 1 +400 1 1 +54 1 1 +60 0 1 +45 1 1 +468 1 3 +1702 2 0 +2507 1 1 +26 1 1 +181 1 1 +18 1 1 +336 1 1 +46 1 1 +15733 1 0 +1800 1 0 +10054 0 12 +703 3 9 +157 0 8 +103 0 8 +18236 3 0 +2894 2 0 +27 4 0 +1926 1 0 +24 1 1 +4236 1 1 +30 1 1 +462 1 1 +30 1 1 +6701 16 4 +261 11 11 +122 1 1 +37 1 1 +718 13 13 +121 6 6 +746 1 1 +30 1 1 +165 10 9 +758 1 1 +38 1 1 +10071 0 16 +69 0 4 +34 0 9 +4 1 0 +17 8 0 +33 1 5 +679 10 10 +3943 6 6 +1769 1 1 +46 1 1 +1211 2 2 +39 1 1 +1086 1 1 +64 1 1 +437 9 9 +865 8 0 +3076 3 1 +12645 100 100 +4318 0 4 +8400 22931 50000 +422 1 1 +32 1 1 +225 1 1 +53 1 1 +147 4 4 +35 1 1 +136 2 2 +18 1 1 +458 0 7 +288 1 1 +61 3 0 +12 1 1 +51 4 4 +131 1 1 +90 3 3 +13 9 0 +538 13 13 +122 1 1 +24 1 1 +102 2 3 +178 1 1 +53 4 4 +411 147 29937 +52 35 69 +1268 1 1 +94 1 1 +886 1 1 +18 1 1 +537 1 1 +30 1 1 +127 3 3 +21 1 1 +437 1 1 +44 1 1 +389 9 9 +345 12 12 +221 79 79 +176 10 10 +269 4 4 +105 78 78 +234 59 59 +347 50 50 +52 43 43 +232 12 12 +113 96 96 +64 5 5 +1247 112 111 +355 22 37 +361 60 60 +527 27 26 +136 80 80 +614 0 6 +320 1 1 +16 1 1 +73 1 1 +16 1 1 +133 1 1 +29 1 1 +172 1 1 +52 1 1 +212 4 4 +453 1 1 +49 1 1 +281 1 1 +35 1 1 +58 56112 0 +47 2 2 +16 1 1 +392 1 1 +85 1 1 +115 1 1 +47 1 1 +77 6 8 +13 1 0 +30 1 1 +155 31 31 +82 1 1 +31 3 1 +49 1 1 +80 11 11 +74 121 121 +66 103 106 +63 4 4 +113 195 195 +96 20 20 +403 34 34 +99 48 48 +51 127 128 +52 27 27 +270 102 102 +215 45 45 +74 21 21 +230 101 101 +108 45 17 +320 156 156 +208 191 191 +50 27 27 +117 26 26 +62 184 190 +89 2241 80 +54 49 0 +185 128 123 +85 23 23 +74 30 34 +58 4044 3638 +52 20843 15060 +459 1 1 +24 1 1 +138 34 34 +66 3 3 +19 9 9 +59 1 1 +29 3 3 +72 1 1 +140 1 3 +36 1 1 +309 7 6 +48 1 1 +2333 15 15 +231 1 1 +41 1 1 +1812 15 0 +211 1 1 +85 1 1 +484 1 1 +45 1 1 +153 1 1 +47 1 1 +3709 0 1 +3509 0 15 +2169 9 9 +150 24 0 +1799 10 10 +1256 1 1 +19 1 1 +1971 1 0 +2048 3 0 +698 1 0 +2068 2 10 +5077 4 0 +3060 22 22 +7442 1 1 +39 1 1 +2102 1 0 +731 1 1 +18 1 1 +5312 14 38 +2717 3 0 +3890 1 0 +5418 0 1 +25 1 1 +135 0 1 +7232 1 1 +47 1 1 +4237 4 4 +3423 100000 32104 +75 51 51 +193 43 43 +52 50 50 +67 79 79 +494 78 78 +564 1 1 +77 1 1 +221 12 12 +345 9 9 +389 1 1 +44 1 1 +437 1 1 +21 3 3 +127 1 1 +30 1 1 +492 1 1 +63 1 1 +2275 18 8 +52 127 29995 +411 4 4 +232 2 3 +102 26 26 +87 48 48 +304 58 58 +52 27 27 +70 52 43 +90 3015 2953 +594 116 114 +70 149 147 +74 339 336 +100 1 1 +38 1 1 +219 1 1 +43 1 1 +154 1 1 +26 1 1 +65 17 17 +305 15 7 +74 1 1 +96 10 8 +344 0 1 +123 1 1 +36 2 0 +34 1 1 +338 1 1 +59 1 0 +95 8 8 +313 1 1 +42 1 1 +157 1 1 +6 1 0 +187 1 1 +93 1 1 +76 1 1 +53 2 2 +187 3 3 +88 8 10 +144 1 1 +43 0 1 +17 2 2 +96 19 19 +152 1 1 +38 1 1 +468 1 1 +30 1 1 +616 5 2 +158 12 12 +345 12 0 +224 1 1 +22 6 3 +60 2 0 +762 19 19 +71 11 11 +80 5 0 +27 1 16 +86 14 14 +215 15 24 +988 1 0 +630 12 12 +1095 1 0 +1513 1 0 +235 11 11 +589 1 0 +411 1 0 +286 51 1 +86 31 41 +1082 2 1 +678 15 15 +784 0 2 +931 2 0 +1491 44 47 +304 0 1 +2629 16 15 +926 1 0 +7001 1 0 +11037 0 1 +4695 0 11 +6554 17 17 +621 1 1 +26 1 1 +258 22 22 +221 1 0 +112 1 1 +27 1 1 +2099 1 1 +47 1 1 +4619 1 13 +73 0 3 +47 2 0 +36 1 1 +686 1 1 +21 1 1 +5277 21 21 +1831 0 3 +3028 1 0 +939 5 5 +5389 1 1 +16 1 1 +4163 10 11 +757 21 21 +4686 48 48 +1137 39 39 +6827 4 4 +4482 0 5 +520 3 0 +1281 13 0 +1108 5 0 +188 19 18 +358 8 57 +838 3 0 +6560 9 41 +738 0 12 +11535 51 51 +108 184 137 +13561 53 0 +13211 1 1 +62 1 1 +61 1 1 +20 1 1 +445 1 1 +8 4 0 +31 1 1 +416 6 6 +351 1 1 +43 1 1 +984 13 13 +915 1 0 +560 10 7 +1108 0 3 +592 1 1 +26 1 1 +216 15 15 +78 1 1 +46 220834 1 +4679 1 0 +454 0 1 +13090 0 4 +6791 1 0 +10828 19 1 +12743 0 1 +6129 1 0 +195 10 10 +291 0 5 +211 6 6 +262 0 3 +981 1 1 +67 1 1 +19661 1 0 +11693 4 4 +11224 2 0 +355 11 27 +6252 0 2 +12220 0 2 +1003 1 1 +47 1 1 +288 4 0 +498 1 0 +2141 1 0 +538 11 1 +91 6 0 +1088 23 0 +864010 1 0 +1073417 0 1 +1355782 50000 50000 +543013 1 0 +140051 0 1 +312408 1 0 +25689 0 1 +831 0 1 +1780132 0 1 +3846517 0 1 +42416 0 1 +20637 0 1 +982015 1 0 +2833931 1 0 +1685 0 1 +262 0 1 +3770 1 1 +23 1 1 +5553 1 0 +1109 13 0 +16383 0 10 +12299 7 0 +2606 1 0 +2099 6 5 +1157 2 0 +755 1 0 +1308 3 0 +675 1 0 +2645 6 7 +3482 3 0 +485 7 7 +2163 2 0 +6451 1 0 +1237 0 1 +316 0 1 +430 8 8 +3035 0 1 +3410 0 1 +1022657 1 0 +1078720 150000 3665 +1921292 1 1 +54 0 1 +290 10 10 +535 1 1 +19 1 1 +3588 1 0 +13767 5 0 +108 0 1 +4 1 3 +10 4 0 +82 1 0 +20 2 1 +15 29 20 +15 0 22 +3218 0 1 +386 0 7241 +163 3 2 +1975093 0 1 +243157 1 0 +3887391 71 0 +3814234 0 1 +2384900 1 0 +9621806 1 0 +2651550 0 1 +466472 1 0 +725983 0 1 +5028031 0 1 +1663741 1 0 +107234 1 1 +61 1 1 +1104 1 1 +68 1 1 +2898 1 0 +1918 21 12 +1640 1 1 +23 1 1 +161 2 1 +2195 21 21 +9888195 1 0 +1130971 1 0 +2860027 0 1 +399989 1 0 +3542435 0 1 +382233 0 1 +7064868 1 125 +686924 0 1 +332214 0 1 +3255312 0 1 +9671739 1 0 +6203 3 1 +43 1 1 +365 1 0 +200 4 0 +1061 0 3 +495 1 6 +81 1 1 +543 1 1 +15 1 0 +170 1 1 +30 1 1 +101 17 16 +228 1 1 +17 1 1 +1007 1 1 +16 1 1 +826 1 1 +255 1 1 +250 1 1 +47 1 1 +557 19 20 +395 1 1 +30 1 1 +666 1 1 +33 1 1 +159 1 1 +25 1 1 +1482 1 1 +38 1 1 +2368 1 0 +31 1 1 +1053 128641 51577 +11134716 0 1 +1675433 1 0 +1738463 1 0 +2121172 3 2 +4399 0 1 +2974 0 1 +2782 0 8 +21239 0 7 +6419 0 6 +17278 1 0 +1158 1 0 +1318 1 1 +35 1 1 +1463 0 16 +4207 0 2 +1688 1 1 +29 1 1 +158 0 1 +349 2 0 +3113 0 1 +7134 1 1 +20 1 1 +9576 12 10 +79 1 0 +2356 0 3 +1101 1 0 +2886 1 16 +4095 0 1 +485 1 1 +54 1 1 +1135 26 27 +745 0 1 +724 0 4 +3025 1 1 +46 1 1 +936 0 1 +1184 0 1 +2239 1 1 +37 1 1 +610 9 9 +608 1 1 +49 1 1 +1605 11 11 +1272 4 1 +18 4 2 +1396 25 25 +1325 389539 1190240 +9432 0 4 +131 1 0 +909 0 2 +20011 1 0 +1805 0 1 +17352 6 7 +37976 0 1 +8177 0 1 +11049 0 2 +6893 0 3 +428 1 0 +14150 0 56 +270417 22385568 22079239 +1663 0 10 +531 30 30 +1457 21 21 +1005 1 0 +534 6 0 +3369 90 90 +113 38 38 +128 15 106965 +197 0 2 +11481 0 1 +3581 0 12 +124 6 6 +479 2 0 +803 18 19 +3623 2 0 +820 1 0 +426 0 3 +315 0 2 +62 75 75 +1158 1 0 +314 12 13 +1472 0 1 +1377 6 0 +255 11 11 +440 0 7 +989 1 1 +132 1 1 +257 7 7 +197 0 2 +3322 1 1 +37 1 1 +3172 6 4 +190 1 1 +34 1 1 +380 0 1 +2099 0 1 +1136 0 4 +1186 1 0 +460 0 2 +1242 28 28 +566 1 1 +29 1 1 +1460 1 1 +105 1 1 +701 3 0 +239 0 1 +970 11 11 +2365 1 1 +21 1 1 +384 8 8 +996 2 0 +2961 0 1 +405 1 1 +155 3 3 +479 0 3 +866 1 0 +1365 1 1 +37 1 0 +2245 1 0 +676 1 0 +83 0 1 +1078 4 0 +37 29 1 +41 1 1 +593 1 1 +32 1 15 +1516 8 8 +1353 1 1 +16 1 1 +12971 1 1 +35 1 1 +5137 0 6 +20 1 1 +534 0 1 +1307 0 2 +593 5 0 +15 12 0 +77 1 1 +370 0 1 +2712 1 0 +434 7 29 +398 0 1 +1177 1 0 +729 1 0 +310 1 0 +140 18 18 +1946 0 2 +393 0 6 +4109 0 1 +202 1 1 +914 13 5 +401 13 13 +3258 1 0 +358 1 0 +800 0 1 +918 1 1 +46 1 1 +1157 1 1 +28 1 1 +558 1 0 +22 107456 0 +1501 49 49 +820 217203 1140886 +136 1 1 +63 3 10 +257 1 1 +22 1 1 +258 7 5 +337 1 1 +29 1 1 +263 1 1 +115 1 6 +312 1 1 +32 1 1 +85 0 12 +92 1 0 +95 1 1 +165 1 1 +44 1 0 +609 4 0 +199 0 1 +368 1 1 +25 1 1 +1022 0 1 +498 1 1 +21 1 1 +316 13 15 +123 1 6 +122 126 126 +434 10 10 +306 48 48 +72 63 63 +141 1 3 +59 33 33 +258 29 28 +87 64 64 +819 5 5 +169 0 4 +514 2 0 +209 26 26 +134 54 54 +155 80 80 +163 8 8 +513 0 19 +797 0 2 +499 1290 1290 +209 1 0 +1037 1 1 +36 1 1 +1493 1 0 +197 0 1 +449 1 1 +21 1 1 +526 17 17 +318 0 1 +158 7 0 +37 83 82 +1072 13 13 +663 13 17 +109 77 76 +208 37 37 +91 173 173 +132 1 0 +40 1 1 +342 18 18 +308 0 5 +1080 12 12 +1194 0 1 +567 4 4 +276 12 11 +1154 47 47 +334 3 0 +1306 84 84 +89 9 9 +218 19 19 +73 23 23 +581 19 1 +80 65 65 +54 53 53 +631 294 294 +286 30 30 +82 41 41 +145 59 59 +133 30 30 +74 96 98 +111 20 20 +237 4 4 +211 24 24 +52 3 1 +158 4 4 +126 43 43 +300 77 77 +403 41 41 +50 84 84 +82 16 16 +310 5 4 +258 0 1 +48 0 2 +222 18 18 +51 5 5 +84 17 17 +271 26 26 +284 2 6 +83 77 77 +50 19 20 +273 132 132 +55 58 58 +72 50 61 +342 46 46 +236 13 12 +59 83 83 +175 108 108 +114 0 1 +226 11 11 +70 235 238 +536 55 55 +68 18 18 +327 33 29 +72 71 73 +56 62 62 +52 23 23 +53 13 13 +62 123 123 +54 76 76 +58 52 52 +296 20 20 +63 114 114 +433 122 122 +70 62 72 +76 20 20 +247 124 124 +50 84 84 +70 34 34 +321 107 107 +238 29 28 +427 43 43 +720 40 39 +125 5 3 +141 98 103 +123 44 44 +65 83 83 +205 55 55 +71 11 11 +741 38 38 +161 67 60 +56 39 40 +82 28 28 +190 28 28 +335 50 3007 +278 66 66 +593 17 17 +81 47 47 +362 39 40 +345 102 102 +57 0 1 +79 23 23 +216 6 6 +93 25 25 +151 187 187 +220 51 63 +79 74 74 +68 43 43 +104 17 18 +167 8 8 +126 15 16 +778 20 20 +84 172 33 +76 23 23 +765 40 40 +344 81 81 +125 11 11 +109 194 194 +66 1 0 +78 118 117 +283 38 38 +198 40 40 +136 24 24 +237 354 354 +50 72 70 +696 3 1 +114 20 20 +88 27 27 +112 55 55 +105 107 108 +704 210 138 +283 42 42 +89 23 23 +85 32 32 +309 50 50 +153 57 57 +103 16 17 +112 35 35 +459 152 153 +93 10 10 +62 0 5 +211 11 11 +354 1 0 +160 56 56 +69 66 68 +458 101 101 +289 26 26 +144 4 4 +245 33 33 +59 22 22 +223 47 47 +347 15 10 +54 0 2 +263 484 40 +123 0 1 +121 48 48 +91 38 40 +385 75 75 +118 7 7 +119 14 14 +231 241 246 +93 52 52 +158 135 136 +62 48 48 +876 20 20 +576 34 34 +77 124 123 +167 65 65 +102 97 101 +195 86 86 +139 4 3 +102 35 35 +195 8 8 +258 82 94 +1618 42 42 +681 7 7 +73 77 78 +686 40 40 +118 107 106 +129 8 7 +615 26 29 +181 32 32 +561 65 65 +954 26 25 +421 48 48 +55 41 41 +254 87 86 +583 36 32 +533 1 0 +103 30 30 +60 57 57 +941 53 53 +237 2 6 +278 31 31 +869 8 8 +741 0 1 +65 189 190 +823 15 15 +743 16 16 +91 49 49 +617 4 0 +500 43 43 +97 82 82 +201 64 64 +54 0 1 +270 12 12 +324 93 93 +209 26 26 +359 16 16 +394 1 0 +155 0 3 +180 12 12 +736 20 21 +593 27 27 +386 23 25 +152 95 95 +51 0 10 +91 37 37 +78 9 9 +168 37 36 +531 100 100 +670 109 109 +478 110 105 +104 1 0 +202 3 0 +141 98980 64 +251 27 27 +50 62 62 +245 1 0 +142 5 5 +180 1442782 150825 +984 8 8 +416 0 28 +80 15 15 +225 10 2 +280 1 1 +43 1 1 +685 1 1 +20 1 1 +337 16 0 +28 1 0 +60 1 1 +102 1 1 +38 1 1 +86 3 3 +48 1 1 +371 11 0 +608 2 2 +49 0 2 +240 0 12 +195 1 1 +58 1 1 +52 0 6 +489 1 1 +113 0 1 +72 1 1 +44 1 1 +990 4 0 +43 2 1 +88 1 1 +39 1 1 +237 1 0 +233 1 1 +136 1 1 +221 1 1 +38 1 1 +420 0 317 +896 7 7 +344 2 0 +1526 8 8 +136 0 2 +40 6 0 +198 3 0 +237 4 1 +1190 2 3 +916 34 9587 +308 59 59 +341 6 6 +75 70 0 +290 56 56 +170 59 41 +3062 14 9 +182 96 88 +1143 15 15 +439 51 51 +281 49 49 +786 1 2 +248 26 26 +767 2 2 +31 1 1 +74 1 1 +44 1 1 +289 1 0 +88 17 17 +466 1 1 +65 1 1 +168 6 0 +86 1 1 +925 1 1 +30 0 4 +59 1 1 +69 8 3 +72 1 1 +2983 0 1 +330 28 28 +293 23 19 +417 12 15 +459 10 10 +218 13 14 +286 0 2 +295 17 17 +2981 3 0 +132 43 43 +492 43 43 +132 37 37 +408 26 26 +177 10 10 +1388 17 12 +165 17 17 +873 44 44 +679 37 46 +426 39 55 +575 17 17 +520 39 39 +1397 16 16 +331 1 0 +508 34 34 +51 47 47 +97 25 25 +1602 51 51 +455 23 23 +349 4 0 +245 1 1 +36 1 1 +207 1 1 +21 1 1 +195 4 4 +1177 1 1 +48 1 1 +563 0 21 +186 8 0 +1624 0 4 +57 1 1 +507 1 0 +28 1 1 +1239 43 38 +1178 17 18 +680 0 12 +231 30 30 +254 49 36 +253 82 82 +315 81 81 +102 21 21 +1740 59 50 +375 27 27 +212 14 0 +64 0 4 +798 0 1 +5376 2 0 +8233 1 1 +16 4 4 +132 1 1 +35 1 1 +484 1 1 +47 2 0 +133 57 22 +329 1 1 +48 1 1 +193 1 1 +25 1 1 +604 1 1 +36 4 4 +83 14 14 +50 27 26 +51 4 4 +1703 1 1 +76 1 1 +435 0 1 +104 1 1 +47 1 1 +354 23 23 +236 1 1 +39 1 1 +371 7778 51251 +52 0 4 +212 1 0 +125 1 1 +193 1 1 +86 1 1 +123 1 1 +43 1 1 +86 1 1 +29 1 0 +12 1 1 +347 1 1 +70 1 1 +184 0 1 +10 0 6 +57 1 1 +767 1 1 +58 0 1 +285 62 62 +120 69 69 +85 93 84 +292 8 20 +195 151 151 +287 7 7 +73 43 40 +56 43 44 +583 43 43 +88 7 7 +175 58 58 +78 1464 1449 +47 131 135 +91 16 16 +50 16 16 +93 61 43 +151 78 78 +151 18 18 +338 22 22 +120 53 53 +96 29 29 +54 96 96 +52 45 45 +60 12 12 +139 43 65 +142 43 43 +62 21 21 +300 44 44 +58 46 46 +65 165 165 +51 35 35 +54 19 19 +111 10 10 +148 14 14 +117 86 92 +194 80 81 +72 52 52 +175 97 97 +455 32 32 +351 62 62 +190 61 61 +635 16 16 +541 26 26 +138 96 106 +234 21 21 +135 5 5 +134 109 109 +178 58 58 +64 19 19 +138 52 52 +460 7 7 +106 48 45 +52 25 25 +225 17 17 +559 1 0 +55 1 1 +253 5 0 +26 1 1 +105 1 1 +75 1 1 +95 1 1 +73 1 1 +61 1 1 +32 1 1 +414 1 1 +80 1 1 +457 12 12 +81 24 24 +36 6213 0 +284 1 1 +66 1 1 +293 1 1 +61 1 1 +198 4 4 +34 1 1 +133 1 1 +49 1 1 +142 1 1 +34 1 1 +194 1073 1078 +110 50 50 +182 293 294 +189 201 201 +131 31 48 +84 49 49 +169 49 49 +94 0 7 +362 156715 474340 +56 23 23 +73 27 27 +62 164 164 +80 69 69 +64 191 3329 +638 128 9586 +95 44 44 +58 67 67 +60 5 5 +51 45 45 +263 19 18 +144 9 9 +574 240 240 +71 46 46 +79 142 142 +371 0 1 +191 33 33 +70 1048 13675 +358 64 64 +72 21 21 +273 109 109 +131 55 4777 +74 1 9429 +238 137 137 +67 47 46 +58 97 75 +281 12 12 +80 59 59 +206 128 128 +95 44 44 +58 67 67 +60 5 5 +359 18 18 +94 116 90 +375 53 53 +101 6 6 +135 99 99 +57 60 60 +79 142 142 +235 1540 0 +328 33 33 +68 461 463 +86 121 121 +238 137 4863 +99 15 14 +424 12 12 +345 160 160 +63 44 44 +58 67 67 +60 5 5 +75 21 21 +263 18 18 +94 114 94 +264 31 31 +234 6 6 +76 158 158 +57 60 60 +79 142 142 +306 360 368 +200 7 7 +116 82 82 +159 113 113 +223 232 222 +91 92 98 +84 80 80 +73 58 58 +145 18 15 +813 99 99 +163 11 11 +421 34 34 +116 21 21 +145 56 56 +394 40 40 +69 41 41 +140 8 8 +161 0 1 +66 59 45 +100 48 48 +430 1 2 +159 4 4 +73 58 58 +119 17 17 +56 81 81 +460 27 27 +963 84 84 +222 107 90 +255 183 183 +88 51 51 +118 32 32 +135 87 87 +114 50 50 +51 33 33 +52 5 5 +53 85 85 +142 158 162 +125 44 44 +82 42 42 +136 27 27 +154 18 18 +196 29 29 +74 73 73 +72 38 38 +116 76 76 +235 50 46 +58 35 35 +50 219 219 +113 65 65 +127 29 29 +83 128 125 +108 70 70 +89 43 48 +51 48 48 +77 186 204 +162 26 28 +73 210 210 +185 88 88 +222 240 240 +72 149 161 +75 71 68 +51 175 175 +233 13 13 +114 18 18 +63 109 109 +54 371 371 +103 8 8 +363 14 14 +116 156 153 +51 72 72 +233 181 181 +66 27 27 +174 217 221 +64 179 175 +69 185 185 +51 54094 725126 +15867 15 15 +400 0 1 +483 1 0 +187 1 0 +12144 0 1 +587 5 0 +525 91 94 +3161 1 0 +11832 26 26 +3522 1 0 +4615 0 12 +7349 5 0 +5569 1 0 +1532 0 8 +2580 88 0 +1408 0 1 +571 0 1 +1199 4 3 +3148 0 120 +1486 0 1 +7876 1 0 +624 2 0 +2881 5 0 +1339 1 1 +97 1 1 +4743 1 1 +31 1 1 +1683 9 0 +6115 17 18 +162 1 0 +6174 2 0 +3030 5 4 +3283 0 4 +332 22135 0 +2820 4683 0 +1833 1 0 +1245 1 1 +39 1 1 +1582 2 0 +177 0 1 +567 4760 0 +920 4760 0 +2206 12 0 +4409 1 1 +56 1 0 +2793 1 1 +19 1 1 +813 9 9 +2174 1 1 +35 1 1 +730 15 15 +3192 1 1 +68 1 1 +2066 0 1 +3099 0 1 +1627 2 0 +1237 11 11 +6918 0 2 +343 1 1 +24 1 1 +1185 1 1 +40 1 1 +1861 0 4 +698 1 1 +47 1 1 +443 5 5 +2825 1 0 +234 1 1 +102 1 1 +1715 16 16 +170 1 1 +18 1 1 +643 2 0 +2275 1 1 +87 1 0 +307 7 7 +1339 0 1 +1830 2 0 +10 1 1 +552 2 0 +1352 0 1 +567 2 0 +1546 2 0 +784 1 1 +41 1 1 +2820 3 4 +9849 0 12 +1899 0 6 +11162 4 0 +6319 1 0 +5852 3 5 +6177 7 0 +492 12 0 +3203 1 0 +2023 16 0 +125 1 0 +4379 0 2 +31321 1 0 +2153 0 1 +2670 0 2 +4730 0 1 +38421 1 0 +2216 0 1 +6004 1 0 +714 1 1 +34 0 1 +7321 10 10 +2262 9 7 +1721 1 0 +1717 2 2 +36 2 4 +25 5 5 +730 3 2 +2894 4 4 +140 0 1 +89 1 1 +575 1 22 +1598 1 0 +6 2 0 +993 6 0 +3481 0 1 +1546 4 1 +1752 1 1 +47 1 1 +971 11 11 +994 1 0 +170 15 14 +102 1 1 +20 1 1 +341 15 15 +495 2 1 +38 1 1 +388 15 10 +153 1 1 +132 1 1 +817 2 0 +169 13 1 +4981 17 12 +731 2 0 +1171 2 0 +347 1 1 +50 1 1 +1607 1 1 +213 2 0 +31 1 2 +205 0 3 +29 0 1 +81 5 5 +1952 1 1 +38 1 1 +537 1 1 +17 1 1 +244 49 0 +92 0 1 +1616 2 0 +807 1 1 +20 1 1 +1126 1 0 +3952 1 0 +1610 1 1 +25 1 1 +1855 1 0 +315 1 0 +895 2 0 +2514 2 0 +1194 3 0 +504 0 4 +6595 0 1 +4905 3 0 +561 1 1 +16 1 1 +203 1 0 +1233 1 0 +5547 1 0 +1546 1 0 +2382 2 0 +2893 2 1 +547 5 0 +1878 3 0 +301 3 2 +3872 1 1 +31 1 1 +660 1 1 +19 1 1 +1438 4 0 +2430 2 0 +1344 27 24 +1541 1 1 +32 1 1 +1810 1 1 +22 1 1 +92 13 13 +350 1 1 +35 1 1 +127 15 15 +743 1 0 +177 1 0 +1075 0 2 +645 0 1 +771 9 9 +1161 3 0 +32 1 0 +215 1 1 +35 1 1 +849 1 1 +37 1 1 +295 1 0 +156 1 1 +56 1 1 +50 0 5 +216 1 1 +73 0 7 +85 3 0 +646 1 1 +43 5 0 +23 1 1 +192 24 14 +62 6 0 +266 1 1 +40 1 1 +41 1 0 +1034 1 1 +36 0 6 +221 0 4 +216 15 15 +378 2 0 +405 1 1 +32 1 1 +301 19 14 +1265 2 0 +162 1 0 +43 1 1 +2601 13 14 +205 12 12 +369 25 10 +2312 1 1 +42 2 0 +25 1 1 +792 12 11 +1549 1 1 +32 1 1 +150 1 1 +44 1 1 +93 8 4 +1649 0 4 +10 1 1 +284 0 3 +1156 5 5 +2804 5 0 +2002 1 0 +836 3 0 +214 2 0 +824 1 1 +17 3 0 +1242 6 6 +1912 1 1 +43 1 1 +1971 3 0 +207 1 1 +20 1 0 +3780 0 1 +664 1 0 +540 1 0 +1858 1 0 +701 2 0 +489 3 0 +2019 8 0 +763 9 0 +15 2 0 +99 0 7 +6294 1 0 +1975 1 1 +57 1 1 +2216 1 1 +109 1 1 +2221 0 4 +124 0 1 +36 1 1 +227 8 8 +2015 0 5 +163 0 31 +1087 1 0 +3365 1 0 +3111 1 1 +29 1 1 +815 1 1 +31 1 1 +446 1 0 +277 14 14 +1143 2 0 +1629 1 1 +36 1 1 +3426 14 14 +681 1 1 +44 1 1 +2207 2 0 +1333 1 1 +18 1 1 +1640 1 1 +71 1 1 +582 2 0 +69 4 2 +4290 3 2 +4502 2 0 +861 6 0 +118 0 4 +735 1 0 +384 1 0 +3725 1 1 +36 1 1 +458 0 2 +724 1 0 +639 4 2 +1172 1 0 +37 1 1 +5104 1 1 +36 1 1 +3675 1 1 +56 1 0 +1259 1 1 +26 0 1 +4130 3 1 +5323 0 8 +4553 3 0 +1618 1 1 +47 1 1 +2767 1 1 +47 1 1 +384 12 12 +286 17 17 +418 1 1 +16 4 0 +23 1 1 +704 0 2 +1589 2 0 +11 3 3 +125 14 14 +783 9 9 +381 1 1 +76 2 2 +3100 44 44 +439 10 9 +1040 0 2 +6543 0 1 +298 2 0 +120 1 0 +2858 1 1 +27 1 1 +907 1 0 +141 1 1 +22 1 1 +2536 1 1 +27 1 1 +2222 1 1 +30 1 1 +1393 1 1 +34 1 1 +2222 1 1 +33 1 1 +612 1 0 +1052 2 0 +1215 1 1 +45 1 1 +658 3 0 +213 1 1 +33 1 1 +2014 10 4 +32 0 1 +342 2 0 +3507 1 1 +27 0 3 +149 1 1 +32 1 0 +29 1 1 +124 0 4 +967 2 0 +100 1 1 +35 1 1 +150 1 0 +2516 1 0 +8 1 0 +1139 1 1 +47 1 1 +1450 1 1 +40 1 1 +1468 1 1 +22 1 1 +500 1 0 +2670 1 0 +188 13 13 +1343 12 12 +2584 3 0 +40 1 1 +4642 1 1 +39 1 1 +892 1 1 +40 1 1 +526 3 1 +412 1 1 +33 1 1 +63 1 1 +40 1 1 +616 1 1 +19 1 1 +239 6 4 +233 1 1 +49 1 1 +858 0 1 +788 1 1 +36 1 1 +1147 1 1 +74 1 1 +31 0 2 +1674 72 0 +163 2 0 +173 1 0 +124 2 0 +1304 0 12 +2554 0 12 +2364 6 0 +699 1 0 +6551 2 0 +292 1 1 +23 0 2 +1868 4 0 +813 1 0 +348 1 1 +30 1 1 +2044 1 0 +1738 2 0 +2460 1 0 +1548 2 0 +674 3 2 +2030 1 0 +1930 1 0 +301 3 2 +1614 4 6 +1675 1 0 +1269 0 2 +428 1 0 +965 1 0 +3699 1 0 +1753 26 22 +131 35 36 +879 4 0 +948 0 16 +90 1 0 +1987 3 0 +4945 6 0 +852 7 62 +31 0 2 +5823 1 0 +1977 2 0 +1138 1 0 +2858 1 0 +3309 1 0 +2856 1 0 +25 1 0 +1441 1 0 +6160 1 0 +1716 2 0 +1006 17 14 +171 1 0 +961 21 19 +1430 3 0 +3798 1 0 +1954 6 0 +1030 2 0 +5199 1 0 +75 1 1 +246 1 0 +91 4 4 +2513 1 1 +42 5 1 +230 0 1 +487 0 6 +2845 0 10 +5793 9 6 +29 1 1 +134 1 0 +2909 3 5 +4 1 0 +17 1 1 +1276 1 0 +792 0 2 +637 3 2 +50 1 1 +1402 1 0 +4652 4 0 +1846 2 0 +4668 1 0 +1928 1 0 +744 30 26 +1093 1 0 +2638 0 5 +1690 1 0 +294 0 1 +1729 1 1 +33 1 1 +6788 0 3 +376 0 2 +1311 2 0 +354 0 1 +575 3 0 +1655 1 1 +72 1 1 +125 0 1 +6193 1 0 +2496 2 0 +4470 1 0 +3302 3 0 +84 1 0 +132 306 0 +474 2 0 +7872 1 0 +1975 1 0 +626 1 0 +3308 1 0 +764 1 0 +1104 1 0 +179 1 0 +1971 2 0 +169 14 13 +1937 0 9 +4017 1 1 +57 3 0 +1949 29 23 +3933 1 0 +3084 0 1 +2241 0 7 +440 1 0 +428 3 1 +6783 0 1 +1738 11 6 +141 1 1 +69 1 1 +240 1 0 +1340 1 1 +46 1 1 +5050 33 26 +7976 1 0 +12085 2 0 +2416 1 0 +40 1 1 +217 0 4 +4059 2 0 +1938 2 0 +6 1 0 +644 1 1 +33 1 1 +1597 3 9 +21 1 5 +44 1 1 +2742 1 1 +27 1 1 +2586 0 4 +2025 4 0 +1632 4 0 +1044 1 1 +48 1 1 +911 7 7 +3110 6 6 +1680 0 1 +3148 2 0 +2426 0 25 +6293 1 0 +1010 0 9 +2700 1 1 +26 7 4 +2872 1 0 +3654 8 0 +1080 10 12 +788 2 1 +1596 0 1 +1232 1 0 +7650 1 0 +26 1 1 +3314 1 0 +283 1 0 +22288 0 2 +5231 1 1 +55 3 0 +7603 19 0 +1218 1 0 +346 3 0 +2301 0 1 +92 1 0 +3169 1 0 +321 0 1 +1413 0 3 +5026 0 31 +156 15 0 +56 15 0 +4890 2 0 +8268 0 4 +21787 1 1 +41 1 1 +483 0 1 +35 1 1 +2263 0 1 +2418 3 11 +176 3 0 +7160 2 0 +5020 1 1 +22 1 1 +478 2 0 +2036 1 0 +5439 0 4 +4005 1 0 +1850 1 1 +20 1 1 +12230 1 0 +2443 2 30 +25 4 0 +7 4 6 +23 12 0 +4624 0 1 +4595 1 0 +19658 118 0 +62850 1 1 +20 1 1 +2973 0 2 +2453 10 0 +7775 1 0 +3595 2 0 +2080 1 0 +1002 4 0 +1826 3 0 +17813 6 0 +4160 0 4 +3101 0 3 +1893 1 0 +176 72 34 +695 1 0 +1645 33 33 +689 1 0 +2297 0 1 +537 36 51 +559 6 6 +1880 1 0 +203 0 2 +622 14 0 +64 0 4 +798 0 1 +867 0 1 +687 1 1 +21 5 5 +1628 1 2 +135 4 4 +2026 0 14 +339 30 30 +425 74 71 +1526 37 37 +64 38 38 +3798 4 5 +2749 6 0 +50 2 0 +18290 6 0 +1611 2 0 +3121 2 0 +6322 0 4 +17555 0 4 +31382 0 1 +18987 0 1 +32541 1 0 +4993 0 8 +1450 41 41 +120 1 0 +5555 1 0 +6145 18 18 +1475 1 1 +36 1 1 +4114 0 1 +15962 1 1 +19 1 1 +4331 1 1 +25 4 0 +4869 0 1 +684 21 172 +3125 0 2 +2527 9 0 +2503 1 0 +3266 0 2 +50 0 10 +723 1 2 +2156 13 25 +1599 1 1 +49 1 1 +1207 1 0 +774 1 1 +38 1 1 +483 6 6 +96 0 1 +1758 2 2 +28 1 1 +277 39 39 +155 1 1 +95 1 1 +56 1 1 +62 1 1 +111 34 34 +7431 1 0 +5459 3 0 +885 1 1 +33 1 1 +505 1 0 +1217 1 1 +49 1 1 +858 21 25 +357 0 2 +958 3 0 +9144 8 0 +1061 1 1 +23 1 1 +2512 9 9 +291 1 1 +44 1 1 +100 11 11 +1422 1 1 +19 1 0 +1779 0 18 +1500 1 2 +640 1 0 +84 0 10 +3793 5 5 +1123 85 50 +7 1 0 +45 1 1 +4692 1 1 +28 1 1 +318 0 1 +1294 7 7 +3981 4 0 +19290 1 0 +833 0 2 +148 6 0 +966 0 1 +5348 1 0 +340 4 0 +2299 8 0 +817 9 9 +1477 0 2 +3568 1 0 +5611 41 41 +259 1 0 +306 6 0 +1682 1 0 +164 21 17 +4382 16 16 +865 36 38 +37 0 2 +6255 1 0 +22875 0 1 +110 0 1 +846 0 1 +255 17 17 +2143 0 2 +5735 6 6 +136 12 12 +2137 0 1 +1782 1 0 +290 0 10 +1148 0 1 +1540 1 0 +1681 0 2 +149 0 2 +568 0 24 +5991 0 1 +1992 0 2 +1384 0 5 +793 9 9 +267 0 1 +353 4 0 +1871 1 0 +52 30 29 +126 43 43 +343 0 1 +603 17 19 +318 0 1 +282 0 1 +214 8 8 +336 35 35 +890 21 2 +4692 4 4 +3036 1 0 +73 84 84 +89 9 9 +417 22 22 +162 22 22 +242 244308 53 +199 53 53 +1211 30 30 +176 122 122 +317 3 0 +233 114 114 +517 62 62 +304 44 44 +347 58 58 +281 29 29 +78 40 40 +294 16 17 +776 1 0 +494 5 2 +197 0 9 +362 8 8 +453 7 7 +84 15 15 +533 25 25 +593 18 18 +56 148 149 +77 39 42 +397 5 5 +475 2 0 +111 20 26 +84 70 69 +56 35 35 +216 86 86 +105 36 36 +149 27 27 +466 32 32 +122 1 0 +459 82 72 +69 33 33 +468 37 37 +422 91 91 +303 1 2 +78 37 37 +278 16 16 +1040 0 2 +249 44 44 +109 21 21 +220 1 0 +175 27 27 +1292 42 42 +330 1 0 +80 2958 1 +956 12 12 +67 93 93 +722 41 41 +97 1 0 +593 69 69 +382 19 12 +221 49 49 +83 33 32 +394 105 105 +700 33 172 +76 79 79 +845 5 0 +243 80 80 +274 166 166 +66 0 1 +78 20 20 +101 8 3 +283 43 43 +997 74 75 +91 38 38 +505 6 7 +89 1 3 +375 41 41 +86 151 150 +650 37 32 +55 0 2 +598 1 1 +19 1 1 +508 0 2 +96 12 12 +603 1 1 +21 1 1 +64 16 16 +105 1 1 +30 1 0 +165 1 0 +389 1 1 +71 1 1 +118 0 1 +772 1 1 +65 1 1 +362 1 1 +59 1 1 +1099 0 5 +54 1 0 +756 7 7 +57 1 1 +39 1 1 +292 1 1 +73 1 1 +149 0 1 +300 1 1 +10 0 16 +7 5 1 +17 3 0 +59 2 0 +10 4 0 +27 4 0 +23 0 1 +11 3 42 +52 0 5 +101 1 1 +41 1 1 +301 4 4 +343 14 14 +842 0 1 +414 14 14 +83 19 20 +303 14 14 +104 38 38 +481 3 4 +102 35 35 +411 101 97 +659 12 12 +990 1 1 +19 1 1 +110 1 1 +37 2 2 +325 1 1 +114 1 0 +111 7 7 +281 9 9 +120 13 13 +76 57 57 +238 254 254 +189 1 0 +79 0 1 +515 21 21 +209 32 32 +289 8 0 +165 35 35 +82 47 47 +136 50 50 +466 55 363 +208 64 65 +302 46 46 +73 48 48 +342 110 111 +448 25 25 +68 82 86 +127 43 42 +1342 15 15 +86 25 25 +113 24 24 +199 4 0 +260 50 50 +701 5 0 +1069 1 1 +113 2 2 +751 1 1 +22 1 1 +579 1 1 +21 1 1 +976 0 1 +389 1 1 +24 1 1 +85 1 1 +41 1 1 +501 0 3 +604 1 1 +47 1 1 +561 14 14 +78 42 39 +222 63 62 +96 26 26 +432 42 42 +91 48 48 +29 1 1 +691 3 0 +1045 10 0 +91 1 1 +35 1 1 +178 0 2 +21 1 1 +52 0 1 +1269 1 1 +103 1 1 +762 0 1 +202 0 15 +840 0 1 +286 1 1 +24 1 0 +63 1 1 +97 2 2 +25 3 0 +359 10 10 +82 1 1 +19 1 1 +193 33 34 +60 10 11 +40 19 19 +81 14 27 +7 13 0 +17 1 1 +114 1 1 +63 3 3 +160 7 7 +135 20 21 +296 163 163 +1280 27 20 +128 10 10 +619 17 17 +334 1 1 +63 1 1 +677 0 12 +704 0 1 +527 44 44 +408 11 11 +155 40 40 +337 32 31 +158 27 27 +91 8 8 +131 33 33 +116 0 2 +164 59 57 +98 0 2 +77 33 33 +306 162 160 +81 71 71 +76 4 4 +393 25 19 +156 1 1 +41 1 1 +83 3 0 +177 1 1 +16 7 4 +574 1 1 +36 1 1 +469 40 40 +69 54 54 +174 38 38 +77 4833 92 +61 22 0 +317 75 75 +378 52 51 +67 12 12 +54 46 46 +63 1753 166 +269 40 40 +74 44 32 +89 86 86 +66 26 26 +615 11 11 +104 25 25 +477 27 13 +313 12 12 +1317 17 9 +705 59 59 +253 65 65 +449 44 32 +241 6 6 +470 7 7 +51 160 160 +62 24 24 +475 14 0 +10 6 0 +313 12 12 +308 1 1 +35 1 1 +107 30 30 +52 9 9 +772 31 5 +705 59 59 +297 21 21 +449 44 32 +241 6 6 +291 255 255 +89 53 53 +62 24 24 +478 29 7 +313 12 12 +1307 35 5 +707 1 1 +56 2 2 +297 1 1 +19 1 1 +447 4 0 +33 1 1 +261 309 309 +147 7 7 +51 18 18 +89 15 15 +100 24 24 +478 29 7 +313 12 12 +669 15 15 +623 430 402 +310 59 59 +288 30 30 +449 3511 1869 +1305 3228 3 +414 35 35 +116 53 53 +91 59 59 +279 39 39 +449 44 32 +241 6 6 +213 0 2 +243 1 1 +40 1 0 +45 1 1 +373 28 28 +52 75 75 +190 17 7 +313 12 12 +439 14 14 +427 37 37 +384 39 35 +414 34 34 +117 12 12 +132 59 59 +297 21 21 +449 44 32 +241 6 6 +213 0 2 +315 51 51 +56 53 53 +62 24 24 +478 27 7 +313 12 12 +439 14 14 +643 250 226 +155 17 17 +236 34 34 +117 12 12 +132 59 59 +260 58 58 +449 44 32 +241 6 6 +213 0 2 +315 51 51 +56 53 53 +62 44 44 +430 55 41 +313 12 12 +439 14 14 +276 11 11 +124 53 53 +402 459 453 +261 59 59 +297 21 21 +234 1552 0 +178 55 41 +69 21 21 +89 1063 1063 +398 25 17 +414 4800 34 +261 59 59 +297 21 21 +449 74 64 +144 73 73 +213 0 2 +315 16 16 +646 0 478550 +68 53 31 +962 14 14 +630 4777 23 +572 5 5 +478 18 18 +458 1664 86 +290 84 84 +169 54 54 +65 46 46 +248 19 19 +493 5 5 +71 65 41 +82 58 58 +383 32 32 +276 15 15 +53 72 72 +50 112 112 +102 8 8 +199 95 91 +242 22 22 +573 75 75 +89 449 449 +41 76 64 +222 45 45 +406 21 22 +131 53 53 +275 29 29 +275 4 4 +75 33 33 +219 48 48 +291 39 39 +97 30 30 +955 27 21 +435 123 123 +196 164 164 +109 63 63 +151 31 34 +399 97 97 +202 19 19 +408 1 0 +480 15 15 +65 36 38 +112 24 24 +79 131 131 +105 31 30 +152 31 31 +286 35 35 +93 119 119 +118 7 7 +237 29 29 +408 95 96 +32 4544 4557 +384 1 1 +17 1 1 +78 1 1 +50 1 1 +220 1 1 +24 1 1 +53 1 1 +122 1 1 +842 1 1 +100 1 1 +267 9 9 +114 1 1 +103 3 3 +89 17 17 +101 25 25 +61 1 1 +81 1 1 +260 1 1 +35 1 1 +273 1 1 +62 1 1 +345 34 2 +305 34 30 +148 1 1 +27 1 1 +255 1 1 +49 1 1 +50 1 1 +26 1 1 +81 5 5 +79 0 2 +90 0 4 +95 1 1 +291 1 0 +37 2 2 +447 1 0 +10 4 0 +127 22 35 +100 14 14 +1208 30 0 +44 2 0 +85 0 2 +16 2 2 +111 1 1 +33 1 1 +215 0 1 +229 1 1 +84 4 4 +108 3 0 +43 0 1 +34 1 1 +215 5 5 +50 1 1 +26 0 4 +77 1 1 +602 0 2 +328 0 4 +200 20 20 +66 36 36 +230 308 1 +57 233 141 +98 0 1 +306 36 28 +32 0 1 +386 2 1564 +439 1 1 +126 1 0 +7 1 1 +74 1 1 +24 4 6 +95 1 1 +49 1 1 +868 1 1 +34 1 1 +1464 1 1 +37 1 1 +321 15 15 +755 1 1 +37 3 1 +859 218578 380336 +202 48 48 +79 35 35 +88 56 56 +110 60 60 +113 22 22 +121 130 130 +68 270 270 +57 671 727 +108 172 172 +73 12 12 +58 19 19 +62 502 499 +53 0 4 +115 205 205 +224 507 510 +72 95 98 +537 69 69 +331 43 43 +143 29 29 +176 21 21 +64 60 60 +216 3 6 +1104 30 30 +185 61 61 +367 0 3 +318 26 26 +60 42 42 +119 102 102 +51 91 91 +334 29 29 +75 13 3 +126 35 35 +335 111 111 +1323 81 81 +69 54 54 +91 119 119 +218 1 0 +234 45 42 +167 83 83 +142 87 101 +61 12 12 +437 57 57 +672 9 9 +161 25 25 +52 64 72 +239 12 12 +318 39 39 +318 32 32 +545 71 59 +86 5 5 +296 71 71 +115 22 22 +247 121 121 +163 56 59 +180 105 105 +76 39 65 +68 157310 47524 +64 25 26 +185 31 31 +169 89 89 +317 22 22 +301 9 9 +161 25 25 +52 20 32 +234 61 61 +572 22 22 +81 32 32 +532 52 26 +415 44 44 +97 46 46 +268 121 121 +163 56 59 +223 62 62 +76 39 61 +72 3644 13111 +60 59 52 +172 176 177 +73 55 55 +128 30 29 +378 49 49 +611 8 0 +208 117 117 +87 0 1 +173 42 42 +90 59 59 +251 88 118 +483 12 0 +94 1 0 +68 1 1 +58 1 1 +239 10 0 +65 1 1 +285 1 1 +27 1 1 +164 1 1 +174 1 1 +112 0 1 +9 0 3 +66 3 3 +58 7 7 +413 20406 66 +849 47 47 +289 26 26 +59 10 10 +137 51 51 +99 67 67 +386 63 62 +681 24 17 +63 155 155 +399 29 28 +59 45 45 +309 1 1 +37 1 1 +326 1 1 +19 2 0 +13 1 1 +472 1 0 +276 24 24 +1162 1 1 +37 1 1 +585 1 1 +42 1 1 +437 1 0 +510 1 1 +48 1 1 +1594 3 7 +58 7 11 +92 84 81 +295 0 1 +154 1 1 +39 1 1 +326 1 1 +39 1 1 +872 0 5 +113 1 1 +28 1 1 +917 1 1 +40 1 1 +422 1 1 +45 1 1 +314 27 27 +216 29 28 +167 19 23 +102 60 60 +433 157 171 +208 27 25 +398 8 8 +129 1 0 +159 49 52 +1079 15 15 +143 279 279 +349 101 100 +105 41 41 +375 1 3 +362 3 0 +361 0 1 +407 90 90 +81 80 80 +681 168 234 +91 0 1 +71 35 35 +86 13 13 +306 80 80 +626 40 40 +489 142 281 +627 58 58 +82 22 22 +161 66 66 +167 18 17 +215 20 20 +53 18 18 +62 19 14 +271 29 29 +82 69 69 +586 3 2 +412 39 39 +66 1 0 +393 115 115 +1597 1 1 +61 1 1 +585 1 1 +15 1 1 +65 1 1 +42 1 1 +63 1 0 +34 1 1 +178 3 3 +35 1 1 +589 1 1 +68 1 1 +203 1 0 +15 1 1 +1039 1 1 +39 1 1 +492 13 13 +148 41 39 +570 22 23 +390 189 249 +134 94 94 +644 62 62 +92 98 98 +51 37 37 +63 21 21 +75 29 30 +233 69 69 +179 0 4 +84 42 42 +175 33 33 +81 28 28 +241 47 47 +304 0 7 +190 1 1 +121 1 1 +308 2 2 +47 0 4 +22 1 1 +193 1 1 +104 1 1 +1010 8 8 +148 747188 0 +180 1 1 +18 0 3 +126 1 1 +63 0 13 +185 1 1 +44 1 1 +285 1 1 +32 1 1 +51 1 1 +15 1 1 +84 5 5 +51 18 18 +195 1 1 +24 0 2 +46 0 1 +310 1 1 +18 1 1 +200 1 1 +61 1 1 +216 16 16 +86 1 1 +46 1 1 +87 1 1 +42 1 1 +163 1 1 +15 1 1 +402 1 1 +42 0 2 +35 1 1 +206 6 0 +287 4 4 +194 1 1 +61 1 1 +63 1 1 +74 1 3 +75 1 1 +66 14 14 +337 0 10 +46 1 1 +111 1 1 +45 1 1 +266 5 5 +151 1 1 +181 1 1 +34 1 1 +76 15 15 +246 8 8 +267 1 1 +119 1 1 +40 0 3 +310 14 14 +237 12 12 +293 1 1 +37 1 1 +118 1 1 +39 1 1 +545 1 1 +26 1 1 +53 4 4 +599 9 9 +376 2 0 +88 1 1 +158 1 1 +49 1 1 +167 1 1 +79 1 1 +229 1 1 +79 1 1 +414 1 0 +77 14 14 +769 16 17 +65 1 1 +44 1 1 +1046 1 0 +33 1 1 +108 1 1 +22 0 5 +132 1 1 +37 0 4 +55 1 1 +23 2 0 +8 0 1 +20 1 1 +306 1 1 +34 1 1 +63 10 10 +223 1 1 +20 0 5 +510 1 1 +21 1 1 +182 1 1 +24 1 1 +62 0 1 +66 1 1 +103 1 1 +136 1 1 +34 1 1 +149 1 1 +8 0 3 +70 1 0 +4 1 1 +89 1 1 +43 30 1 +275 2 0 +25 19 0 +522 5 5 +16 1 1 +517 1 1 +32 1 1 +389 3 3 +45 1 1 +233 1 0 +19 1 1 +242 1 1 +44 1 3 +14 1 1 +538 1 1 +49 1 1 +228 1 1 +30 1 1 +156 0 1 +94 1 1 +19 1 1 +88 0 1 +39 1 1 +1243 5 9 +1196 1 1 +18 1 1 +430 5 5 +183 1 1 +29 1 1 +879 1 1 +29 1 1 +499 0 2 +440 9 9 +337 0 19 +91 1 1 +39 1 1 +563 1 1 +78 1 1 +357 1 1 +173 2 0 +35 3 0 +59 1 1 +29 1 1 +238 1 1 +31 2 1 +143 4 0 +31 1 1 +657 1 1 +25 1 1 +137 1 1 +14 1 1 +264 1 1 +32 17 1 +75 1 1 +43 1 1 +50 1 1 +52 3 3 +145 12 11 +368 0 5 +662 1 1 +65 1 1 +187 1 1 +28 0 2 +14 1 1 +100 25 38 +141 4 4 +55 1 1 +112 1 1 +38 1 1 +481 5 8 +80 0 4 +165 1 1 +19 1 1 +560 1 1 +42 1 1 +547 5 6 +493 1 1 +48 1 1 +304 1 1 +250 1 1 +95 0 1 +858 4 0 +178 1 1 +66 4 4 +77 1 0 +163 1 1 +22 1 1 +370 19 26 +474 15 15 +171 1 1 +54 1 1 +720 1 1 +117 1 1 +112 1 1 +82 1 1 +106 1 1 +61 1 1 +50 1 1 +34 1 1 +159 1 1 +51 1 1 +442 3 3 +32 1 0 +19 1 1 +181 7 7 +463 4 0 +164 1 1 +45 1 1 +86 15 15 +50 1 1 +19 1 1 +111 2 2 +33 1 1 +558 1 1 +35 1 1 +380 1 1 +48 2 1 +473 1 1 +21 1 1 +246 1 3 +7 3 0 +14 1 1 +95 1 1 +26 1 0 +8 4 4 +275 1 1 +70 3 3 +67 1 1 +48 1 1 +390 1 1 +53 4 4 +267 1 1 +47 3 3 +378 1 1 +31 1 1 +1300 4 0 +225 13469 11007 +56 110 109 +56 20 19 +91 229 231 +143 58 73 +134 1 1 +52 1 1 +173 1 1 +81 1 1 +586 1 1 +46 1 1 +62 1 0 +60 1 1 +163 14 14 +724 23 24 +77 0 7 +425 1 1 +35 1 1 +485 1 1 +39 1 1 +524 1 1 +39 1 1 +58 0 1 +77 1 0 +40 1 1 +558 1 1 +5 0 1 +44 1 1 +90 1 1 +33 1 1 +219 13 13 +822 1 1 +33 1 1 +471 1 1 +43 1 1 +222 1 1 +72 1 1 +71 1 1 +108 1 1 +474 1 1 +25 1 1 +342 1 1 +45 1 1 +511 12 12 +113 17 17 +507 0 1 +266 1 1 +165 1 1 +71 7 6 +147 1 1 +41 1 1 +851 13 13 +594 1 1 +23 1 1 +87 1 1 +26 1 1 +283 1 1 +130 3 3 +299 1 0 +50 1 1 +100 1 1 +58 1 1 +43 1 1 +401 1 1 +26 1 1 +207 1 1 +31 1 1 +106 1 1 +24 1 1 +129 1 1 +6 0 2 +27 1 1 +121 1 1 +32 1 1 +201 1 1 +25 1 1 +268 4 4 +97 5 5 +30 1 1 +202 1 1 +35 13 0 +128 1 1 +32 1 1 +126 15 15 +114 1 1 +21 1 1 +71 0 1 +445 1 1 +47 1 1 +610 110 107 +110 0 26 +586 55 55 +394 44 44 +570 119 119 +152 32 32 +150 45 65 +75 53 53 +90 24 24 +59 128 128 +197 125 126 +133 7 2 +48 1 1 +149 13 0 +322 13 13 +100 1 1 +41 1 1 +160 30 30 +626 73 73 +247 347 347 +525 1 1 +76 0 1 +132 1 1 +49 1 1 +279 0 1 +882 1 1 +22 0 1 +1152 1 1 +35 1 1 +929 1 1 +41 1 1 +530 21 22 +942 1 1 +29 1 1 +762 1 1 +41 1 1 +39 3 0 +2475 5 5 +683 1 1 +32 5 0 +41 1 1 +1357 12 12 +611 0 2 +38 1 1 +455 0 13 +245 11 11 +441 41 41 +56 13 14 +340 5 9 +1054 47 67 +57 1 1 +32 1 1 +91 1 1 +20 1 1 +869 19 20 +149 1 1 +24 1 1 +316 1 1 +21 1 0 +1326 24 25 +248 6 6 +1050 49 49 +225 22 25 +1177 21 23 +181 51 51 +119 71 25 +137 0 12 +86 4 0 +69 52 48 +439 1 9 +429 15 15 +96 0 4 +114 101 104 +133 15 14 +279 0 1 +179 77 77 +60 55 55 +128 10 10 +283 67 67 +62 20 20 +582 27 27 +165 54 54 +794 45 45 +1084 23 28 +182 18 18 +849 19 19 +838 1 0 +91 31 31 +50 24 24 +224 46 46 +276 48 48 +231 25 25 +1427 0 6 +29 0 12 +852 41 41 +92 108 108 +56 0 5 +655 3 0 +674 0 1 +124 39 39 +83 4 0 +171 20 24 +1076 43 43 +802 111 121 +38 1 1 +178 2 2 +40 1 1 +348 9 8 +1036 1 1 +21 1 1 +1484 1 1 +21 1 1 +869 2 0 +215 70 74 +1187 14 8 +222 1 0 +168 13 13 +75 92 95 +407 54 60 +1331 1 0 +184 42 42 +742 31 31 +769 19 19 +1135 99 99 +218 29 29 +386 32 32 +552 5 5 +692 24 24 +857 56 56 +248 75 75 +75 91 90 +776 3 1 +166 1 1 +30 1 1 +1207 1 1 +45 1 1 +980 98 95 +172 1 0 +117 21 21 +728 87 89 +290 36 36 +125 20 20 +674 56 55 +74 34 34 +440 5 0 +94 26 26 +196 29 25 +97 57 57 +547 8 8 +806 53 55 +413 26 26 +87 20 20 +401 160 158 +427 0 2 +141 3 0 +876 1 1 +22 1 1 +182 0 1 +25 1 1 +485 1 1 +20 1 1 +21076 1 0 +5849 1 0 +7611 2 0 +3944 2 0 +24179 8 8 +6563 0 1 +7719 0 1 +4227 1 0 +4584 0 2 +3814 1 0 +6 10 0 +5372 2 0 +1896 0 4 +3256 10 0 +3709 0 5 +9566 0 5 +3706 4 0 +384 1 3 +4782 2 0 +5402 0 20 +2121 1 0 +3815 0 1 +848 4 0 +18850 4 0 +4529 0 1 +5837 0 1 +18152 341 0 +2140 0 1 +10686 1 0 +5524 6 2 +272 32 29 +1252 0 1 +6027 1 0 +696 4 3 +1613 1 0 +1086 1 0 +1326 17 11 +155 0 1 +46 3 0 +892 1 0 +6429 3 0 +425 1 0 +164 1 0 +328 3 1 +1142 35 31 +510 1 0 +2636 1 0 +4703 2 0 +1955 1 0 +87 1 0 +32 0 1 +3521 1 0 +673 38 37 +297 1 0 +1170 3 1 +574 25 23 +2380 3 0 +2001 0 5 +1233 1 0 +586 4 3 +1401 1 0 +1504 1 0 +3725 1 0 +265 1 0 +112 1 0 +1143 1 0 +1502 6 3 +2110 1 0 +990 1 0 +787 1 0 +5825 1 0 +1058 4 4 +2392 1 0 +8273 6 2 +169 4 4 +131 1 0 +155 1 0 +525 1 0 +353 21 16 +1156 0 1 +5947 33 35 +9896 1 0 +161 6 1 +161 1 0 +2491 6 5 +813 2 0 +305 2 0 +987 2 0 +2137 3 1 +447 1 1 +20 1 1 +855 4 2 +1391 0 4 +2104 1 0 +693 1 0 +189 2 0 +1350 0 2 +168 1 0 +1339 1 0 +1677 4 3 +1283 1 0 +313 2 0 +1594 2 0 +1985 4 0 +233 2 0 +343 1 0 +3926 11 5 +59 1 0 +1681 2 0 +1653 1 0 +2382 1 0 +758 56 0 +585 1 0 +3026 5 0 +164 1 0 +1013 2 0 +1151 2 0 +883 6 2 +1336 8 8 +939 1 0 +183 3 0 +778 1 0 +147 2 0 +3049 3 0 +1037 1 0 +2365 2 0 +1141 2 0 +3325 3 1 +1453 8 0 +27 0 1 +19 0 1 +1291 1 1 +41 1 1 +3021 1 0 +173 1 0 +1259 1 0 +276 1 0 +1069 1 0 +1382 1 0 +93 3 1 +2419 1 0 +323 1 0 +1436 2 0 +467 1 0 +346 2 0 +173 2 1 +292 2 0 +521 3 1 +7330 1 0 +4068 0 1 +125 2 0 +3 1 0 +308 1 0 +5212 1 0 +4 1 0 +744 0 2 +2122 1 0 +1563 4 1 +164 4 0 +579 0 1 +395 0 1 +1629 1 0 +981 7 0 +440 1 0 +242 18 0 +870 1 0 +344 3 0 +1472 1 0 +6 5 0 +4571 4 2 +522 0 1 +1143 1 0 +1642 1 0 +829 14 0 +3162 1 1 +50 0 2 +517 1 0 +365 1 0 +1108 12 0 +396 0 4 +238 4 0 +6360 0 1 +95 6 3 +804 1 0 +425 1 0 +4614 1 0 +1939 3 0 +2926 0 2 +3004 3 1 +97 1 1 +74 0 1 +1105 1 0 +1148 1 0 +2367 20 0 +194 1 0 +539 1 0 +933 0 1 +1824 1 0 +241 6 5 +838 4 2 +283 2 0 +998 3 1 +147 5 0 +158 5 3 +1081 0 3 +1402 1 0 +361 2 0 +1343 5 0 +732 1 0 +5 1 0 +450 2 0 +16 0 1 +1087 1 0 +1912 2 0 +381 1 0 +18 0 2 +6 5 0 +724 2 1 +240 2 0 +103 0 1 +197 2 0 +14 3 1 +350 1 0 +628 2 0 +232 1 0 +1703 1 0 +1297 1 0 +152 27 25 +813 3 1 +1012 0 1 +30 1 0 +1 0 1 +25 3 5 +628 26 25 +2896 4 0 +323 5 0 +178 2 0 +4868 1 0 +260 7 5 +1322 19 16 +430 1 0 +55 1 0 +176 1 0 +893 2 0 +157 1 0 +593 1 0 +2040 1 0 +354 3 0 +459 1 0 +45 1 0 +1759 4 0 +724 0 8 +1726 6 0 +2838 1 0 +161 1 0 +1281 1 0 +344 1 0 +1922 3 0 +56 0 1 +852 2 0 +321 0 1 +168 24 0 +813 0 1 +1282 4 4 +16 1 0 +859 1 0 +1085 6 3 +339 1 0 +2706 1 0 +19 1 1 +565 2 0 +1419 1 0 +29 2 0 +1612 6 2 +113 19 16 +1808 1 0 +129 2 0 +4317 1 0 +451 1 0 +99 3 0 +1659 3 1 +224 4 1 +492 1 0 +1654 5 1 +602 1 0 +711 3 2 +2028 40 35 +306 7 3 +467 11 4 +349 2 0 +689 4 0 +299 0 1 +122 3 1 +607 2 0 +2610 0 1 +285 2 0 +1615 3 0 +171 12 12 +1450 1 0 +5056 7 3 +3161 1 0 +6280 1 0 +800 2 0 +3604 2 0 +313 2 0 +132 1 0 +291 1 0 +802 0 1 +1361 5 3 +603 1 0 +4404 0 1 +3012 15 13 +2651 1 0 +1419 1 0 +212 4 3 +148 4 0 +141 1 0 +5683 1 0 +178 2 0 +1319 15 14 +635 1 0 +1491 1 0 +1911 1 0 +284 1 0 +3131 2 0 +451 1 0 +1844 3 0 +295 28 28 +1304 1 0 +318 1 0 +303 20 22 +1616 3 0 +281 12 9 +159 6 2 +2269 0 8 +1171 5 0 +1710 2 0 +640 1 0 +1175 3 0 +438 1 0 +177 1 0 +11 1 0 +46 0 2 +2270 1 0 +1572 1 0 +297 3 0 +452 0 2 +167 2 0 +50 1 1 +722 3 2 +311 4 0 +1806 1 0 +1861 4 0 +485 11 5 +1685 1 0 +1514 1 0 +3527 1 0 +1277 3 0 +722 18 18 +294 1 0 +4850736 0 425 +190 0 180 +143 0 2080 +22437 11 11 +299 15 15 +1169966 1 0 +774149 0 1 +8999 0 1 +6456345 0 1 +4260 0 62 +11625 4 0 +22479 0 2 +4801 3 7 +9378 1 0 +1199 7 8 +5425 1 0 +42 1 1 +242 1 1 +42 1 0 +1334 1 0 +5400 0 2 +1967 1 1 +29 1 1 +807 4 0 +11717 1 0 +10068 0 534 +73 38 2 +1205 0 1 +268 5 0 +4095365 1 0 +1858931 0 96 +138 0 1 +1441277 0 1 +15458 0 1 +467357 1 0 +1522533 0 1 +661760 0 1 +1103965 0 1 +115472 0 1 +2509562 0 1 +3005241 1 0 +1292744 0 1 +1982893 0 1 +1106832 0 1 +25005 0 1 +2777211 0 1 +1609107 0 1 +9337049 0 1 +472403 0 1 +6836129 559514 355298 +5186 1 1 +40 3 0 +13 0 2 +3559 3 8 +961 1 1 +42 1 1 +598 17 17 +3273 1 0 +989 6 0 +4240 4 0 +1002 4 4 +21 1 1 +6016 1 0 +4147 8 8 +1262 2 0 +15736 0 1 +1576 1 0 +2216 1 0 +1802 0 5 +10131 4 0 +1222 9 10 +1051 2 0 +3424 10 10 +9672 2 0 +6913 2 0 +13127 1 0 +11722 43 51 +869 0 1 +4141 0 1 +19847 0 4 +4099 1 1 +15 0 1 +1369 1 0 +161 0 1 +1499 0 2 +166 1 0 +1794 3 1 +522 1 1 +95 1 1 +7299 0 1 +1071 0 4 +1244 0 1 +2944 1 3 +446 1 0 +554 4 0 +13525 0 1 +3473 0 5 +5270 1 5 +46340 0 4 +10370 0 1 +28763 0 1 +2124 1 0 +1255 4 0 +8032 1 1 +38 1 1 +1048 9 9 +5748 1 0 +376 4 0 +22 12 0 +3426 1 0 +1704 2 0 +204 2 0 +4003 4 4 +1411 1 1 +45 1 1 +425 0 1 +8216 0 9 +287 1 0 +3713349 0 1 +334634 4 0 +1126 0 1 +2353 1 0 +1626 1 1 +20 1 1 +628 0 3 +417 5 9 +6174 0 1 +382 3 1 +2447929 1 0 +2467219 0 1 +7949538 1 0 +2438 20 0 +788 1 0 +384 0 2 +3036 1 1 +41 1 1 +471 4 0 +168 0 1 +2253 0 1 +1038 0 1 +3018 72182 57843 +2209636 0 1 +37007 0 1 +117226 1 0 +2582395 0 51954 +1552074 0 1 +4528060 1 0 +367965 50000 22433 +1932 0 8 +33 0 2 +19 11 0 +370581 0 1 +546 0 1 +527 0 1 +4563 0 4 +3001 4 0 +1391 2 0 +2825 3 0 +1898 0 1 +1252 0 1 +966 0 1 +275 0 1 +1848 1 0 +4413 3 1 +447 6 6 +10648 0 1 +2532 0 8 +88 0 2 +22 1 1 +726 1 0 +758 1 1 +54 1 1 +800 1 0 +3201 2 0 +171 1 0 +4387 0 10 +1020 1 1 +41 1 1 +3953 1 1 +65 1 1 +1757 3 0 +5524 0 1 +5077 0 4 +5089 36 27 +1967 1 1 +21 1 1 +358 0 6 +3709 1 1 +19 1 1 +1236 0 1 +6047288 1 0 +691 1 0 +6791827 0 1 +376366 151989 21091 +180422 + +chain 51897113 1 249250621 + 144274511 149034137 chr1 248956422 - 99285234 105680422 98 +365 72 72 +494 23 23 +114 15 15 +57 103 103 +139 61 49 +178 36 36 +97 4 4 +496 34 34 +137 9 11 +139 26 26 +106 33 33 +207 28 28 +504 102 102 +50 1 0 +299 134 134 +283 50 50 +684 13 13 +1041 7 6 +71 1 1 +165 1 1 +258 0 1 +645 12 12 +511 1 1 +45 1 1 +342 1 1 +25 1 1 +385 199 199 +71 74 74 +222 45 45 +471 35 35 +822 13 13 +219 50 50 +75 53 52 +558 42 41 +77 0 1 +58 41 41 +356 76 76 +92 41 41 +485 37 37 +423 0 7 +79 23 24 +129 9 9 +586 14 14 +111 893 892 +173 54 54 +137 55 70 +143 229 231 +91 20 19 +56 110 109 +56 13350 10907 +65 35 35 +81 5 5 +128 4 0 +930 4 4 +348 1 1 +99 1 1 +339 1 1 +37 0 1 +282 1 1 +46 1 1 +397 1 1 +48 3 3 +90 1 1 +47 1 1 +275 4 4 +8 1 0 +71 2 1 +65 11 10 +742 2 1 +48 1 1 +380 37 37 +240 57 57 +231 65 65 +112 86 86 +86 47 47 +164 4 0 +463 7 7 +181 53 55 +654 149 149 +106 107 107 +116 162 162 +383 43 43 +224 56 56 +171 8 8 +298 5653 5692 +70 1 1 +55 750 755 +48 336 336 +33 374 374 +64 2087 2078 +80 2011 2032 +879 31 31 +183 5 5 +161 6955 6953 +95 8026 8025 +34 1 1 +30 54 54 +53 631 631 +111 25 25 +59 385 385 +30 1610 1607 +43 780 780 +41 50 50 +84 1387 1390 +26 1851 1875 +32 4 3 +47 800 801 +59 1229 1242 +31 321 321 +64 113 113 +75 59 59 +26 25 25 +1 1523 1521 +61 623 623 +52 292 292 +29 1831 1815 +82 2471 2464 +31 691 691 +47 746 746 +61 691 691 +102 72 72 +13 350 357 +74 68 68 +43 1319 1320 +82 26 26 +64 864 864 +40 344 344 +81 256 256 +183 782 854 +40 813 813 +60 921 918 +27 113 113 +53 106 106 +99 1444 1372 +32 309 309 +50 935 934 +28 25 25 +99 1551 1556 +35 41 41 +25 708 708 +33 2352 1912 +43 489 490 +27 307 319 +41 169 169 +37 82 82 +16 1583 1583 +33 87 86 +75 227 227 +44 1221 1225 +81 1619 1626 +42 762 761 +76 686 687 +40 977 975 +26 181 184 +32 594 594 +32 117776 369196 +130 118 115 +109 112 112 +1328 2 0 +91 28 30 +499 31 31 +733 48 43 +335 44 44 +368 12 12 +267 1 0 +734 65 65 +1247 12 12 +368 0 1 +421 51 51 +526 18 17 +318 1 0 +282 0 2 +1490 19 39 +87 88 88 +63 38 67 +84 53 53 +58 45 42 +946 18 18 +346 14 14 +269 36 36 +442 17 17 +235 41 41 +266 40 40 +110 5 5 +861 80 81 +399 4 4 +287 1 0 +653 50 50 +1546 0 1 +813 48 49 +148 31 31 +225 10 10 +251 61 61 +105 85 103 +63 52 53 +179 60 60 +168 48 49 +1192 1 0 +109 5 5 +144 1 0 +90 4 4 +279 84 84 +1015 11 11 +124 75 75 +153 0 19 +222 64 64 +79 47 47 +153 7 7 +1282 15 15 +1253 2 0 +520 15 15 +391 1 1 +47 1 1 +57 0 1 +852 1 1 +30 1 1 +862 0 2 +15 1 2 +29 1 0 +1102 0 7 +16 3 3 +1466 3 0 +117 16 16 +201 1 1 +36 1 1 +151 1 1 +53 5 5 +538 1 1 +28 1 1 +209 0 1 +80 1 1 +537 1 1 +66 1 1 +455 1 2 +248 1 1 +55 1 1 +286 2 0 +203 4 4 +256 1 1 +19 1 1 +320 1 0 +957 1 1 +47 1 1 +933 1 1 +29 1 1 +1191 1 1 +18 1 1 +1219 1 1 +31 4 0 +693 4 4 +725 1 1 +30 6 0 +133 1 1 +10 1 1 +388 7 6 +609 1 1 +98 1 1 +74 1 1 +20 1 1 +527 1 1 +19 1 1 +627 0 5 +84 2 0 +343 1 1 +46 1 1 +193 1 1 +47 3 3 +203 2 1 +96 1 1 +32 0 1 +144 1 1 +30 1 0 +53 1 1 +44 1 1 +99 6 6 +413 1 0 +749 1 1 +42 1 1 +89 0 12 +203 9 9 +199 1 0 +36 1 1 +373 19 28 +81 1 1 +21 1 1 +258 1 1 +40 1 1 +124 4 4 +118 2 0 +289 2 0 +10 1 1 +137 1 1 +19 1 1 +612 1 1 +37 1 1 +678 9 9 +115 1 1 +31 1 1 +416 1 1 +62 1 1 +61 1 2 +133 1 0 +24 1 1 +320 34 34 +150 37 38 +91 50 50 +256 16 16 +676 41 41 +109 23 19 +210 0 6 +181 1 3 +98 62 62 +113 26 26 +142 60 60 +313 19 19 +718 30 30 +82 41 41 +122 42 42 +284 17 17 +50 17 13 +104 17 17 +608 4 4 +213 0 1 +91 14 14 +62 0 2 +195 6 6 +73 115 115 +409 54 51 +334 40 40 +275 36 36 +81 0 4 +488 38 38 +196 56 54 +105 16 16 +214 28 28 +146 40 46 +69 70 69 +105 6 4 +257 87 87 +101 109 109 +202 39 39 +135 22 21 +195 10 10 +150 37 37 +274 5 5 +143 0 1 +864 18 26 +769 38 38 +139 27 26 +157 8 8 +60 16 16 +59 17 17 +406 71 71 +509 1 1 +59 1 1 +164 322 0 +68 5 5 +2169 1 1 +31 1 1 +224 1 1 +36 1 1 +76 0 6 +24 0 1 +90 6 6 +139 3 5 +66 20 0 +366 0 1 +39 2 0 +252 1 1 +42 1 1 +76 1 1 +53 1 0 +196 1 1 +36 1 1 +798 41 41 +314 48 48 +89 65 65 +80 44 44 +138 29 29 +442 57 57 +287 36 36 +327 22 22 +217 55 46 +142 46 48 +399 0 4 +93 62 62 +160 89 89 +237 29 25 +1430 180 180 +283 27 26 +124 29 111 +946 1 0 +106 0 1 +505 2 0 +443 9 9 +519 87 87 +421 28 28 +225 59 59 +502 0 1 +485 108 106 +146 43 43 +203 47 47 +62 1 0 +854 58 58 +736 23 20 +2337 1 1 +34 1 1 +148 0 1 +159 1 1 +32 1 1 +66 4 0 +847 1 1 +34 1 1 +610 1 1 +83 1 0 +8 1 1 +276 13 13 +610 18 18 +1054 6 5 +105 1 1 +39 1 1 +423 4 4 +121 1 1 +43 1 1 +184 10 6 +188 6 6 +300 1 1 +18 1 1 +106 1 1 +34 1 1 +95 1 1 +42 1 1 +157 1 1 +27 1 1 +88 1 1 +46 1 1 +76 1 0 +585 0 3 +18 1 1 +51 1 1 +16 2 2 +352 15 15 +202 107 108 +74 6 7 +79 0 1 +58 69 69 +198 23 23 +95 23 47 +56 46 46 +85 75 75 +600 136 134 +461 97 97 +455 51 51 +725 62 64 +248 44 45 +202 0 2 +113 16 16 +62 1 1 +21 9 0 +187 1 1 +65 1 1 +395 1 1 +17 1 1 +229 1 1 +85 1 1 +129 1 1 +80 1 1 +232 1 1 +38 1 1 +316 1 1 +83 1 1 +140 1 1 +42 1 1 +62 63 15 +1456 0 2 +183 0 1 +1314 1 1 +49 1 1 +58 1 1 +34 1 1 +557 9 9 +97 1 1 +40 1 1 +267 14 14 +1199 1 1 +34 1 1 +1140 1 1 +30 1 1 +65 3 0 +80 1 1 +29 1 1 +124 1 1 +32 1 1 +344 95 95 +1123 29 29 +226 10 10 +648 46 46 +416 7 7 +57 58 46 +57 12 12 +254 27 27 +52 13 13 +1233 1 1 +60 1 1 +178 1 1 +79 0 1 +35 3 0 +111 1 1 +43 1 1 +264 0 1 +119 25 25 +211 1 1 +70 1 1 +73 2 4 +40 2 0 +159 1 1 +56 0 2 +911 1 1 +63 1 1 +84 1 7 +149 1 1 +21 0 1 +606 1 1 +21 3 3 +132 10 12 +368 1 1 +26 1 1 +50 1 1 +65 1 1 +57 1 1 +44 1 1 +279 1 0 +33 4 0 +8 1 1 +309 32 0 +330 1 1 +84 1 1 +286 1 1 +35 1 1 +59 8 8 +146 1 1 +237 1 1 +52 1 1 +35 0 2 +40 1 1 +53 3 3 +103 1 1 +397 1 1 +59 0 1 +33 1 1 +587 11 11 +219 26 26 +55 5 5 +62 1 1 +38 1 1 +240 1 1 +70 1 1 +85 12 12 +384 2 2 +31 1 1 +71 190321 10 +207 0 1 +5021 16 16 +1298 0 1 +3024 16 17 +124 1 1 +20 1 1 +3103 1 1 +16 6 0 +27 2 0 +1912 0 3168 +430 745 755 +1709 1 1 +49 1 1 +390 13 13 +2662 1 0 +2392 2 0 +3493 1 1 +19 1 1 +562 4 3 +164 1 1 +85 1 1 +11190 0 1 +4915 1 1 +102 1 1 +73 10 10 +6071 0 56 +63 28 0 +27 57 1 +9882 1 0 +19209 2 0 +19592 6 6 +3040 1 0 +11309 14 0 +37050 2 3 +3446 4 0 +21 1 0 +1473 6 0 +11524 1 0 +1249 1 1 +56 1 1 +624 0 2 +2436 20 26 +843 13 13 +2760 13 13 +237 1 1 +25 1 1 +5742 0 4 +761 1 1 +36 0 2 +7 1 0 +125 1 1 +47 1 1 +1341 0 2 +3144 0 1 +972 8 8 +728 7 7 +4322 0 2 +4561 0 1 +2270 15 15 +4798 1 0 +3251 2 1 +33 0 70 +1488 4 0 +1709 11 11 +1727 3 0 +1826 0 4 +135 1 1 +46 1 1 +1196 1 1 +23 0 2 +827 13 13 +281 11 11 +293 1 1 +34 3 3 +4509 9 7 +4526 0 19 +1417 5 18 +2910 0 1 +13108 0 1 +1394 0 2 +2866 1 0 +2181 0 1 +3131 4 0 +286 2 0 +635 0 4 +51 1 1 +31 5 5 +1474 5 0 +2812 0 1 +429 8 0 +1845 0 3 +2444 0 24 +2695 1 1 +42 1 1 +692 4 0 +1318 1 1 +42 0 2 +869 0 3 +60 1 1 +506 0 3 +850 0 1 +604 1 1 +69 1 1 +3173 2 0 +682 2 1 +2783 0 1 +1584 1 3 +1006 1 1 +39 1 1 +784 1 1 +32 1 1 +414 16 16 +88 1 1 +18 1 1 +64 3 0 +147 1 1 +46 1 1 +399 1 1 +49 1 1 +76 9 10 +137 1 0 +81 4146 12 +174 1 1 +103 1 1 +1246 1 1 +36 1 1 +7771 14 0 +1746 1 0 +35 2 2 +676 11 0 +2260 4 0 +5015 1 0 +117 17 20 +3317 1 1 +17 1 1 +1438 2 0 +4708 1 1 +106 1 1 +1016 1 1 +29 1 1 +318 1 1 +31 0 1 +7 1 1 +556 15 15 +4006 1 1 +25 1 1 +1290 0 10 +728 1 1 +18 1 1 +240 1 1 +18 1 0 +1176 1 1 +42 1 1 +478 1 0 +173 9 10 +351 3 0 +1063 1 1 +26 1 1 +229 1 0 +1306 0 1 +513 0 20 +484 2 0 +1834 1 1 +24 1 1 +122 12 11 +206 1 1 +41 1 1 +376 18 0 +3 698 0 +110 1 1 +43 1 1 +2082 0 1 +321 0 1 +47 1 1 +4214 1 0 +2363 22 11 +87 0 328 +9294 5 6 +285 1 1 +64 1 1 +5044 0 1 +8983 0 2450753 +4529 0 1 +2399 0 1 +1478 4 2 +10987 1 0 +2691 0 4 +2301 2 4 +2249 5 0 +240 1 1 +30 1 1 +4699 0 3 +832 8 8 +770 20 0 +4401 1 0 +4315 5 1 +11990 18 1 +665 0 1 +1487 0 2 +810 2 0 +1616 1 0 +2795 4 0 +37 1 1 +569 1 0 +881 1 1 +32 1 1 +3721 1 1 +29 1 1 +114 2 0 +1313 9 0 +517 14 14 +373 0 8 +2060 0 1 +6335 1 0 +152 0 2 +6938 1 0 +2913 1 0 +14429 1 0 +547 0 8 +88 0 4 +5289 0 6 +2715 0 1 +2496 0 1 +2280 0 1 +3389 13 13 +5069 10 10 +5145 7 0 +6299 12 0 +2339 15 15 +754 0 12 +2790 42 42 +1119 15 15 +75 18 18 +223 23 23 +416 41 57 +883 41 41 +334 0 2 +342 49 39 +1595 667 667 +766 1 3 +1622 6 0 +237 1 1 +23 1 1 +1001 150 150 +235 1868 1853 +1209 6 0 +698 34 34 +529 208 208 +1626 19 25 +1597 0 6 +1500 48 4770 +1544 5 1 +1623 0 6 +2845 256 244 +1624 0 6 +692 72 72 +782 7 7 +667 1 0 +656 68 66 +144 6 0 +1629 0 6 +3107 107 117 +1506 12 0 +1336 9 9 +199 2 0 +923 223 223 +403 3 21 +1281 3043 1501 +384 0 2 +1551 17 17 +1636 53 49 +661 15 15 +600 24 24 +18 257 257 +7082 4 0 +1243 5 6 +2723 1 0 +199 2 2 +41 0 3 +146 1 1 +49 1 1 +3715 2 1 +237 0 4 +465 1 1 +37 2 2 +71 1 0 +817 1 0 +8 1 1 +2654 1 0 +959 1 0 +285 0 4 +155 17 17 +1212 0 2 +477 1 0 +392 0 1 +3485 0 2 +1188 0 1 +2191 1 0 +3020 0 1 +900 5 0 +1880 1 0 +1441 1 0 +2398 0 1 +3253 13 9 +2921 8 0 +6983 0 1 +154 0 8 +1222 2 0 +684 1 1 +30 3 3 +761 0 2 +864 4 0 +27 1 0 +674 14 0 +542 1 0 +182 2 0 +667 0 1 +354 1 0 +561 2 0 +325 1 0 +1492 27 21 +283 1 1 +35 1 1 +267 1 0 +10 2 0 +157 1 0 +2223 4 0 +309 1 0 +447 1 0 +274 8 0 +417 22 22 +757 9 8 +613 6 6 +310 3 1 +294 4 0 +497 2 0 +1603 1 0 +310 9 3 +1683 4 4 +3259 1 0 +412 11 11 +1368 2 1 +38 1 1 +1204 6 4 +2414 1 0 +814 1 0 +1019 6 0 +4324 2 0 +1244 1 0 +2023 3 0 +1764 1 0 +5380 2 0 +8549 0 3 +127 1 0 +3631 0 2 +12679 1 0 +899 1 0 +4047 0 1 +744 4 0 +1202 1 0 +2149 0 4 +2588 7 0 +409 0 2 +10875 0 1 +2418 0 3 +62 1 1 +7183 0 2 +589 0 7 +3326 1 0 +206 0 4 +1705 1 0 +4722 0 2 +12551 0 1 +5770 1 0 +4861 4 0 +2610 1 1 +21 1 0 +734 1 1 +27 1 1 +778 1 1 +66 1 1 +4919 2 0 +352 1 1 +35 1 1 +225 3 0 +3560 1 0 +1230 1 0 +912 0 4 +2263 0 16 +1330 1 0 +2285 0 1 +15128 3 0 +565 39 0 +7648 1 0 +310 1 1 +45 1 1 +284 1 0 +2994 1 0 +1316 0 1 +2434 1 0 +5201 0 4 +249 0 1 +843 0 3 +418 1 1 +44 1 1 +1715 0 13 +3203 1 0 +3412 0 1 +760 0 9 +527 2 0 +1866 2 0 +305 0 3 +1143 0 2 +33 1 1 +3485 4 8 +8087 0 1 +1855 1 1 +58 2 0 +666 1 0 +2352 1 1 +40 1 1 +101 1 0 +3775 0 2 +11407 2 0 +84 1 0 +72 0 6 +445 0 1 +1260 2 0 +511 1 0 +3145 2 0 +15 1 1 +864 1 0 +608 1 1 +38 1 1 +1171 0 6 +1151 9 22 +4306 1 0 +5618 1 0 +43 8 0 +356 1 0 +12 1 1 +2081 0 1 +1756 13 0 +3709 1 0 +2479 1 0 +6821 0 1 +1826 1 0 +7322 1 1 +36 1 1 +892 1 0 +995 0 2 +1171 0 1 +8491 1 0 +179 0 20 +315 1 1 +49 1 1 +14181 0 1 +6312 1 0 +2879 0 1 +7372 0 1 +5494 0 2 +4111 0 3 +15077 1 0 +8306 5 2 +4562 1 0 +1171 23 22 +298 2 0 +587 0 4 +57 12 36 +4753 1 0 +2366 6 4 +407 1 0 +57 1 0 +467 1 0 +975 1 0 +2444 1 0 +920 2 0 +1324 2 0 +2071 1 0 +1672 1 0 +3405 3 2 +1593 2 0 +3436 1 0 +2600 4 2 +800 1 0 +2874 1 0 +3946 1 0 +492 1 0 +8708 1 0 +551 587001 23091 +173 35 35 +51 120 120 +110 148 148 +300 21 21 +247 43 65 +139 12 12 +60 37711 1346 +159 16 16 +273 37 37 +191 5528 765 +134 1718077 965715 +25 892 894 +39 1533 1537 +24 290 290 +27 466 466 +32 733 729 +33 468 468 +37 895 896 +37 2153 2144 +27 1293 1293 +40 4405 1449 +93 722 722 +41 691 690 +68 623 626 +49 83 81 +33 394 394 +105 700 700 +33 76 76 +79 1093 1093 +80 274 274 +166 556 553 +43 997 997 +74 91 92 +38 976 976 +41 86 86 +44 1 1 +26 1 1 +79 650 650 +37 10879 10869 +50 2941 2937 +57 238 238 +53 4 4 +153 1 1 +43 1023 1024 +23 462 462 +35 83 83 +46 136 136 +12 1 1 +25 1 1 +11 24431 4150 +44 574 572 +40 263696 61744 +17478 0 1 +5057 10 0 +13007 5 0 +7127 0 15 +3551 0 1 +14379 0 3 +294 2 0 +85 6 0 +3133 15 19 +1546 202 202 +48 79 79 +35 88 88 +56 110 110 +60 256 256 +130 68 68 +270 57 57 +671 108 108 +172 224 224 +502 168 172 +205 224 224 +507 72 72 +95 537 537 +69 331 331 +43 143 143 +29 261 261 +60 1323 1322 +30 185 185 +61 685 685 +26 60 60 +42 119 119 +102 51 51 +91 334 334 +29 214 213 +35 335 335 +111 1323 1323 +81 69 69 +54 91 91 +119 453 453 +45 167 167 +83 142 142 +87 510 510 +57 842 842 +25 52 52 +64 569 569 +39 318 318 +32 545 545 +13 2 0 +56 387 387 +71 384 384 +121 163 163 +56 180 180 +105 76 76 +39 68 68 +2494 1 0 +2950 4 0 +210 16 16 +785 0 2 +604 0 8 +12699 0 1 +3530 9 9 +6274 1 1 +58 0 3 +107 7 7 +58 1 1 +54 1 1 +1893 15 15 +127 2 2 +24 1 1 +187 14 7 +76 13 13 +119 2 2 +31 1 1 +489 19 19 +412 19 20 +392 4 4 +384 51 51 +143 52 52 +1537 11 11 +813 1 1 +30 1 1 +92 2 2 +41 1 1 +1904 1 0 +1926 0 1 +2217 10 10 +279 44 44 +450 119 106 +969 0 1 +1174 0 1 +804 28 28 +547 2 0 +696 14 16 +1404 21 12 +3316 2 0 +342 10 13 +382 1 1 +111 2 2 +541 3 2 +1000 0 1 +19 1 1 +744 11 11 +869 1 1 +40 1 1 +459 588 588 +840 10 0 +351 0 1 +387 9 9 +127 1 1 +40 1 1 +1940 2 0 +66 0 4 +7085 0 1 +18637 0 1 +431 0 4 +1851 140740 805485 +97 1 1 +38 1 1 +110 7 0 +30 3 3 +379 12 13 +52 12 12 +167 1 1 +94 12 12 +53 38 38 +235 1 1 +61 1 1 +63 1 1 +157 1 1 +210 14 14 +100 1 1 +69 1 1 +313 1 1 +50 1 1 +63 1 1 +95 1 1 +1506 1 1 +29 0 4 +205 17 17 +1677 2 0 +259 1 0 +1301 16 16 +2421 137 137 +4396 22 22 +252 16 16 +60 30 31 +372 43 43 +3352 2 0 +439 44 32 +224 108 101 +96 2 0 +901 26 26 +3187 14 11 +167 0 5 +330 0 13 +318 0 3 +143 0 5 +367 0 10 +160 0 5 +107 5 0 +368 0 8 +464 0 5 +1111 0 1 +864 0 1 +940 6 5 +1257 15 38 +74 49 15 +244 1 1 +33 1 0 +361 28 0 +3956 0 1 +3638 1 0 +77 1 1 +24 1 1 +577 2 0 +2370 1 1 +36 1 0 +932 1 1 +33 1 1 +146 14 14 +1595 3 0 +116 1 0 +1065 1 1 +37 1 1 +6895 1 0 +508 3 0 +159 2 1 +1506 1 1 +49 1 1 +558 1 1 +55 1 1 +156 1 1 +39 3 0 +866 2 2 +18 1 1 +185 1 0 +1517 6 4 +3050 2 0 +13 1 1 +2253 0 2 +121 25 0 +1108 1 0 +628 5 6 +1023 1 1 +85 1 1 +186 8 8 +1191 1 0 +641 0 3 +3242 6 0 +162 0 3 +807 1 1 +45 1 1 +146 1 1 +22 1 0 +470 1 1 +26 1 1 +263 1 0 +2978 20 20 +80 1 1 +25 1 1 +97 14 14 +126 1 1 +46 4 4 +58 1 1 +39 1 1 +389 15 15 +1100 1 1 +30 1 1 +514 0 5 +4617 1 0 +4721 2 0 +754 1 0 +475 1 1 +52 2 0 +861 4 0 +2585 17 17 +2805 1 1 +45 1 1 +532 1 1 +30 1 0 +503 1 0 +2561 3 0 +32 1 1 +495 1 7 +1511 2 0 +4190 0 1 +47 1 1 +547 0 3 +45 1 1 +2077 1 0 +732 1 0 +1091 4 0 +2547 11 11 +875 1 1 +36 1 1 +1866 0 2 +2351 20 0 +322 0 1 +1010 7 7 +1048 5 0 +1186 2 0 +374 2 0 +527 1 1 +42 1 1 +6478 3 0 +336 50017 92736 +1412 1 0 +2830 18 18 +1053 0 224 +112 4 4 +534 0 4 +350 1 1 +41 1 1 +394 1 1 +32 1 1 +609 1 1 +35 1 1 +596 1 1 +48 1 1 +212 11 11 +59 1 0 +44 1 1 +1824 4 4 +65 1 1 +712 1 1 +40 1 1 +77 12 12 +64 1 1 +23 1 1 +559 1 1 +37 1 1 +484 1 1 +87 0 2 +101 0 1 +1793 4 0 +36 1 1 +331 2 1 +702 1 1 +21 1 1 +1676 1 1 +48 1 1 +132 1 1 +46 1 1 +821 2 0 +282 1 1 +22 1 1 +55 1 0 +14 1 1 +56 1 1 +38 1 1 +1004 1 1 +139 1 1 +1063 1 1 +40 1 1 +422 15 15 +529 1 1 +39 1 1 +76 10 10 +1035 4 3 +944 1 1 +49 1 1 +127 1 1 +47 1 1 +387 40 84 +67 1 1 +27 1 1 +53 4 0 +113 1 0 +792 2 1 +201 1 1 +19 1 1 +94 0 1 +197 14 14 +78 1 1 +27 1 1 +212 1 1 +32 1 0 +328 1 1 +62 1 1 +176 2 4 +243 1 1 +31 1 1 +338 5 5 +19 1 1 +57 0 8 +412 2 0 +606 59 0 +114 1 1 +25 1 1 +225 1 1 +25 1 1 +103 4 4 +63 1 1 +60 26 0 +45 10 0 +40 1 1 +52 + +chain 24611930 1 249250621 + 206072707 206332221 chr1 248956422 - 42687778 42947276 254 +33374 0 21 +6406 0 1 +95162 1 0 +39481 2 0 +4456 0 1 +25212 55 16 +10374 0 1 +1898 0 2 +43093 + +chain 19082683 1 249250621 + 143342816 143544525 chr14_GL000009v2_random 201709 + 0 201709 318 +201709 + +chain 18966774 1 249250621 + 142535434 143239339 chr4_GL000008v2_random 209709 + 0 207491 319 +195580 496428 0 +354 2 2 +16 1 1 +118 5 5 +61 1 1 +127 1 1 +106 1 1 +96 1 1 +60 21 21 +289 1 1 +53 1 1 +371 1 1 +25 1 1 +122 5 0 +91 1 1 +283 1 1 +35 1 1 +70 11 11 +103 1 1 +16 1 1 +135 4 4 +57 1 1 +26 0 1 +339 13 13 +374 1 1 +92 1 1 +251 15 15 +565 1 0 +275 1 1 +20 1 1 +96 6 10 +145 1 1 +63 1 1 +971 0 12 +51 1 1 +63 1 1 +66 1 1 +58 1 1 +294 1 1 +17 1 1 +74 5 5 +91 1 1 +51 1 1 +52 1 1 +248 2 2 +41 1 1 +120 4 4 +161 23 23 +73 5 5 +67 0 1 +193 1 0 +247 1 1 +19 1 1 +103 16 16 +62 1 1 +42 1 1 +351 5 5 +193 0 1 +122 1 1 +46 1 1 +269 1 1 +81 0 3 +399 1 1 +26 1 1 +255 1 1 +48 1 1 +188 8 8 +67 1 1 +18 1 1 +367 1 1 +20 1 1 +212 1 1 +49 5 5 +86 3 3 +33 1 1 +124 1 1 +31 1 1 +118 1 1 +92 1 1 +125 1 1 +105 1 1 +184 1 1 +18 1 0 +56 + +chain 17644093 1 249250621 + 142781022 142967761 chrUn_KI270742v1 186739 + 0 186739 358 +186739 + +chain 14571217 1 249250621 + 317719 471368 chr1 248956422 - 248454805 248608454 495 +153649 + +chain 9964536 1 249250621 + 143117761 143292816 chr1_KI270706v1_random 175055 + 0 175055 394 +31588 52 52 +213 170 170 +376 259 259 +98 67 67 +26 307 307 +53 111 111 +108 158 158 +54 249 249 +81 62 62 +78 54 54 +42 86 86 +28 147 147 +788 50 50 +2025 290 290 +55 373 373 +89 236 236 +54 317 317 +127 56 56 +92 128 128 +70 57 57 +354 52 52 +1232 59 59 +45067 584 584 +71 166 166 +172 138 138 +172 164 164 +47 96 96 +38 409 409 +91 137 137 +53 116 116 +278 61 61 +189 80 80 +32 76 76 +124 112 112 +66 211 211 +29 55 55 +37 282 282 +72 81 81 +34 985 985 +134 64 64 +58 138 138 +73 282 282 +106 162 162 +119 69 69 +81 51 51 +42 301 301 +129 51 51 +38 57 57 +76 84 84 +46 141 141 +264 89 89 +88 61 61 +101 68 68 +172 221 221 +40 51 51 +41 74 74 +90 106 106 +117 58 58 +157 475 475 +140 57 57 +258 149 149 +108 171 171 +1379 101 101 +62 167 167 +80 116 116 +47 22872 22872 +12685 18521 18521 +4072 16779 16779 +65 1298 1298 +57 + +chain 9885505 1 249250621 + 145883118 146465493 chr1 248956422 + 147952585 149554116 218 +5944 0 1 +4845 0 1 +7115 0 4 +6738 0 1 +21646 0 1 +6005 0 4 +5161 0 1 +2173 22 22 +51 56 55 +1532 13775 13774 +34 308 308 +59 422 422 +70 290 290 +56 170 170 +50 0 1 +9 3258 3265 +96 1597 1594 +51 281 281 +49 1035 1035 +26 6589 6589 +28 5159 5158 +43 492 492 +43 132 132 +37 408 408 +26 2647 2659 +44 679 679 +37 426 426 +39 1112 1112 +39 2253 2253 +34 51 51 +47 97 97 +25 1602 1602 +51 6985 6993 +43 2106 2106 +30 254 267 +49 253 253 +82 315 315 +81 1863 1862 +59 375 375 +27 15556 15549 +4 7 3 +46 1391 1391 +27 3449 3449 +2244 58 58 +35 963 963 +126 206 206 +65 2413 2413 +46 70 70 +50 971 972 +521 4929 4929 +43 270 270 +58 78 78 +276 6 0 +1182 47 47 +131 266 264 +43 4 0 +14 151 151 +78 649 649 +53 96 96 +29 54 54 +96 52 52 +45 211 211 +43 142 142 +43 383 383 +44 58 58 +46 65 65 +165 51 51 +35 473 469 +86 194 194 +80 72 72 +52 175 175 +97 455 455 +32 351 351 +62 190 190 +61 1192 1192 +26 138 138 +96 529 529 +109 178 178 +58 221 221 +52 573 573 +48 52 52 +25 2696 2711 +6184 0 51 +29 1501 1501 +1073 110 110 +50 182 182 +293 189 189 +201 131 131 +31 84 84 +49 169 169 +49 456 456 +5127 0 3 +23633 0 2 +202 1 0 +2104 1 0 +143 16 12 +4721 0 1 +565 0 1 +51529 1 0 +12120 47 48 +6398 55765 315144 +31 2087 2070 +71 908 868 +29 375 375 +53 537 537 +33 1854 314 +30 429 429 +2 201 201 +95 109 109 +53 133 133 +60 253 253 +27 192507 933164 +34 282 282 +66 5797 5797 +64 117 117 +79 30 30 +87 62 62 +66 30 30 +76 6 6 +271 6421 49147 +246 83 87 +110 1555 15 +45 3225 0 +54 126 126 +162 163 163 +185 82 82 +300 30 30 +53 43 43 +142 20 32 +49 18480 1201 +99 56 56 +132 517 477 +37 2718 2735 +432 62 62 +190 68 68 +66 30 30 +76 6 6 +234 37 37 +99 56 56 +132 89 43 +375 21 21 +375 46 46 +75 36 36 +446 4 4 +46 + +chain 8349940 1 249250621 + 120766205 120936695 chr1 248956422 - 104911647 105082431 310 +1744 1 1 +30 1 1 +927 0 1 +62 1 1 +39 1 1 +691 13 12 +356 0 3 +26 1 1 +2949 1 1 +15 1 1 +679 11 15 +835 1 1 +96 1 1 +121 1 1 +52 0 2 +3906 0 1 +184 0 6 +232 1 1 +25 1 0 +332 0 3 +18 1 1 +446 1 1 +22 1 1 +1427 1 0 +311 1 0 +276 0 10 +435 0 2 +1067 0 41 +77 0 1 +402 11 1 +16 45 0 +424 0 3 +513 1 1 +38 1 1 +185 1 1 +48 1 1 +1941 9 12 +419 0 5 +373 2 0 +125 0 7 +101 0 6 +59 1 1 +17 1 1 +1242 0 1 +555 0 18 +1531 1 1 +10 1 1 +789 5 5 +20 1 1 +1242 1 1 +45 1 1 +817 1 0 +661 1 1 +35 1 1 +1933 34 34 +318 3 2 +901 18 18 +678 0 1 +55 28 28 +661 19 1 +255 39 39 +332 82 81 +72 0 2 +57 14 14 +283 1 1 +29 1 1 +220 1 1 +27 1 1 +207 0 4 +330 11 11 +2274 1 1 +39 1 1 +64 4 4 +419 0 1 +785 10 10 +2623 14 14 +139 1 1 +16 1 1 +1311 1 1 +48 1 1 +533 1 1 +42 1 0 +616 76 76 +223 0 19 +684 68 38 +205 14 15 +166 40 40 +636 100 102 +251 19 19 +154 5 5 +250 34 33 +713 13 13 +1485 1 0 +491 1 1 +24 1 1 +390 1 1 +39 1 1 +446 1 0 +859 0 1 +478 1 1 +129 1 1 +280 0 1 +1721 1 0 +138 24 24 +194 13 13 +133 6 6 +101 7 6 +236 64 64 +487 2 0 +1377 98 98 +85 29 29 +358 48 48 +108 12 12 +635 1 9 +1332 0 1 +424 27 27 +206 0 3 +254 3 0 +272 37 33 +469 1 1 +87 1 1 +1407 1 1 +29 1 1 +64 3 1 +1747 13 10 +216 9 0 +248 0 1 +393 1 1 +39 1 1 +848 1 1 +36 1 1 +242 1 1 +17 1 1 +734 4 0 +792 0 1 +346 11 11 +966 0 1 +612 4 1 +1359 1 1 +22 9 0 +276 7 7 +64 1 1 +72 1 1 +937 1 0 +703 1 0 +2064 0 3 +471 1 0 +553 2 3 +198 44 44 +220 22 22 +631 6 6 +452 0 2 +457 76 76 +147 9 6 +267 51 51 +915 1 0 +171 0 2 +1504 61 60 +231 2 0 +74 29 29 +1068 73 75 +46 0 3 +310 0 1 +434 1 0 +436 1 1 +35 1 1 +321 1 1 +38 2 0 +1396 1 1 +92 1 1 +1173 1 1 +30 1 1 +841 0 1 +80 0 1 +509 24 24 +774 6 6 +105 0 12 +933 48 48 +1360 2 0 +572 1 1 +25 1 1 +650 14 25 +129 1 1 +31 1 1 +954 1 1 +21 1 1 +701 1 1 +25 1 1 +644 1 1 +19 1 1 +183 3 5 +42 1 1 +531 4 4 +74 5 0 +231 0 3 +2960 1 1 +21 1 1 +393 1 1 +75 1 1 +820 1 1 +49 1 1 +3325 31 31 +165 0 1 +50 37 37 +137 21 21 +434 45 45 +506 323 0 +31 2 0 +271 19 20 +269 1 1 +40 1 1 +530 1 1 +72 1 1 +482 1 1 +20 1 1 +82 1 1 +36 1 1 +399 0 2 +313 1 1 +18 1 1 +318 1 1 +36 1 1 +1035 1 1 +37 1 1 +839 1 1 +28 1 1 +1228 1 1 +9 0 4 +30 1 2 +45 1 1 +106 0 1 +791 5 5 +306 19 19 +1289 0 1 +218 0 2 +206 0 1 +487 5 5 +71 1 1 +42 1 1 +270 13 13 +559 1 1 +93 1 1 +534 1 0 +1359 1 2 +459 1 0 +1125 1 1 +26 0 323 +254 1 1 +28 1 1 +125 1 0 +1110 1 0 +798 15 15 +101 1 1 +39 1 1 +70 1 1 +146 7 0 +51 1 1 +132 3 0 +1648 1 1 +30 1 1 +414 0 2 +56 12 12 +761 1 1 +26 1 1 +336 0 317 +289 1 1 +54 0 6 +43 1 1 +693 1 1 +33 1 1 +112 13 13 +976 1 0 +397 1 2 +108 14 14 +666 1 1 +20 16 0 +252 1 1 +43 1 1 +337 0 1 +43 0 7 +220 1 1 +19 1 0 +46 1 1 +328 3 3 +39 1 1 +158 1 1 +53 1 1 +63 2 1 +46 2 2 +113 14 14 +59 1 1 +24 1 1 +1057 1 1 +43 1 1 +458 1 1 +73 1 1 +77 1 1 +81 1 1 +302 4 4 +126 1 0 +947 1 1 +37 1 1 +623 1 1 +52 1 1 +72 2 0 +494 1 1 +42 0 1 +85 3 0 +473 2 0 +62 1 1 +36 1 1 +69 2 4 +408 1 1 +12 0 1 +34 1 1 +68 1 1 +37 6 0 +19 1 1 +111 1 1 +37 1 1 +219 1 1 +32 1 1 +397 1 1 +33 1 1 +509 7 7 +371 1 1 +17 1 1 +726 15 0 +820 9 9 +731 0 3 +39 0 2 +294 17 17 +764 3 5 +183 1 1 +25 1 1 +607 1 1 +28 1 1 +71 1 1 +55 1 1 +45 0 8 +165 1 1 +17 2 0 +66 1 1 +53 1 1 +373 1 1 +62 1 1 +133 1 1 +44 10 11 +172 1 1 +42 4 4 +1752 0 3 +129 1 1 +17 1 1 +453 1 1 +42 1 1 +1003 1 1 +85 0 4 +695 1 0 +716 1 0 +72 1 1 +255 86 0 +92 14 14 +665 12 12 +396 5 5 +64 13 13 +858 0 3 +196 1 1 +37 1 1 +1863 0 4 +20 1 1 +293 16 16 +926 1 1 +29 1 1 +250 23 35 +846 1 1 +87 1 1 +56 1 0 +798 1 1 +31 1 1 +308 9 9 +73 1 1 +59 1 1 +547 2 0 +882 1 1 +28 1 1 +628 1 1 +29 1 1 +206 6 4 +97 17 0 +210 6 10 +34 1 1 +203 1 0 +146 1 1 +28 1 1 +228 1 1 +32 1 1 +351 3 0 +122 0 1 +598 13 13 +167 1 1 +29 1 1 +1611 2 2 +16 1 0 +40 1 1 +442 1 1 +33 1 1 +797 0 29 +505 10 10 +174 1 15 +58 0 2 +79 4 4 +87 0 1 +95 1 1 +46 2 0 +1366 6 6 +495 1 1 +45 1 1 +487 + +chain 7452972 1 249250621 + 13613426 13707544 chr1 248956422 + 13287031 13381082 778 +7129 0 3 +3028 1 0 +939 5 5 +5389 18 18 +4163 10 11 +751 27 27 +3072 302 302 +177 106 106 +75 726 726 +228 1 1 +46 1 1 +15 79 79 +74 95 95 +276 572 572 +94 91 91 +276 71 71 +122 196 196 +95 225 225 +49 304 304 +359 126 126 +119 137 137 +110 72 72 +84 115 115 +107 105 105 +323 103 103 +49 195 195 +51 157 157 +101 110 110 +38 103 103 +86 664 664 +128 229 229 +75 124 124 +43 188 188 +204 79 79 +428 164 164 +189 158 158 +46 4 4 +11 134 134 +32 100 100 +99 448 448 +28 65 65 +68 146 146 +114 280 280 +55 53 53 +55 59 59 +102 62 62 +201 354 354 +52 153 153 +1811 0 5 +1801 13 0 +1108 5 0 +189 23 22 +506 1 1 +28 1 1 +712 3 0 +2362 219 219 +43 132 132 +57 91 91 +53 429 429 +681 75 75 +46 85 85 +158 242 242 +306 89 89 +43 116 116 +231 74 74 +279 431 431 +105 103 103 +118 9 29 +136 78 78 +80 82 82 +167 61 61 +138 0 12 +91 51 51 +48 72 72 +1085 65 65 +322 153 153 +8757 56 56 +27 151 151 +115 542 542 +100 8 0 +171 24 4 +21 267 267 +128 61 61 +97 142 142 +83 157 157 +51 177 177 +108 55 55 +190 88 88 +47 328 328 +25 284 284 +90 175 175 +40 404 404 +46 59 59 +104 206 206 +56 171 171 +49 69 69 +49 65 65 +60 164 164 +3792 831 831 +32 94 94 +39 82 82 +26 68 68 +32 122 122 +4348 53 0 +12169 1 0 +1042 64 64 +61 22 22 +229 45 45 +171 41 41 +416 52 53 +304 45 45 +984 13 13 +751 65 65 +99 1 0 +560 10 7 +236 19 19 +679 7 7 +167 + +chain 7406387 1 249250621 + 103785265 103863906 chr1 248956422 + 103382376 103461016 877 +11009 1 0 +67631 + +chain 7305920 1 249250621 + 144324517 149570238 chr1 248956422 + 120325666 144609984 125 +31 879 879 +31 4860 4859 +83 2155 2202 +37 91 91 +78 5236 5233 +47 182110 1861 +48 665 665 +61 105 105 +85 63 64 +51 197 197 +43 168 168 +48 1825 1824 +84 1150 1152 +32 1 1 +28 1 1 +13 375 375 +64 80 80 +45 27632 27645 +34 150 150 +37 91 91 +50 948 948 +41 622 622 +62 281 281 +60 1162 1162 +41 122 122 +42 1755 1753 +115 409 408 +14 1 0 +38 335 335 +40 275 275 +36 569 569 +38 196 196 +31 2 0 +23 509 509 +40 90 89 +49 368 368 +87 101 101 +109 202 202 +39 512 512 +37 2073 2073 +38 889 888 +71 734 734 +275 2 0 +14 0 5 +31 4827 4826 +41 314 314 +48 89 89 +65 80 80 +44 609 609 +57 288 288 +35 566 566 +34 0 7 +14 1 1 +6 142 142 +12 0 1 +33 493 495 +62 160 160 +33 27 27 +29 1696 1692 +47 9 9 +124 2994 3078 +87 674 674 +59 987 1289 +106 148 146 +43 203 203 +47 917 917 +31 1 1 +25 10479 10476 +27 1 1 +78 217 217 +49 1 1 +18 396 396 +46 85 85 +75 600 600 +2 7 8 +127 461 461 +97 455 453 +51 725 725 +62 248 248 +44 2538 2538 +63 7172 7171 +60 1 1 +33 2037 2037 +46 480 534 +31 2 0 +25 6442 6447 +32 3874 3875 +220 1 0 +1017 2 2 +54 1 1 +101 204150 20197 +158 6 6 +580 34033 34022 +57 466215 328345 +41 69 69 +40 4590 1401 +73 26 26 +91 13386 7807 +71 11207 1747 +178 3271780 35680 +37 8866 9291 +44 450 446 +119 13514 13725 +126 6 6 +456 191931 22408790 +66 189115 231730 +59 798 798 +1787 5 0 +1407 1 1 +32 1 1 +5733 3 0 +6585 1 1 +33 1 1 +969 7 8 +8527 1 1 +37 1 1 +174 9 17 +7148 1 0 +11501 1 0 +3926 0 10 +1634 6 0 +1051 2 0 +2143 0 2 +13655 1 1 +33 0 1 +9277 2 0 +4125 1 0 +16920 3 0 +3376 0 7 +54 0 2 +2544 0 1 +3852 10 0 +14875 0 18 +1206 0 6 +21990 0 1 +6827 4 0 +83 8 0 +4053 0 1 +9018 0 2 +545 1 0 +4060 0 1 +3984 1 0 +1332 8 0 +3191 0 1 +5575 0 1 +978 0 8 +92 4 0 +5672 1 1 +88 0 4 +2080 1 0 +2648 1 1 +42 1 1 +399 3 0 +418 0 1 +4374 1 1 +49 1 1 +269 5 0 +3051 0 4 +7256 0 1 +3882 0 1 +1965 1 1 +18 1 1 +6857 0 1 +3067 0 2 +8675 0 1 +1877 0 1 +3262 0 4 +8984 45 49 +322 0 1 +8341 10 10 +1427 0 6 +29 0 4 +982 1 1 +105 1 1 +73 0 68 +1561 0 1 +2129 5 0 +3420 1 0 +21 0 1 +1614 1 0 +550 0 8 +575 0 3 +2021 1 1 +37 1 1 +71 1 1 +15 1 1 +5439 0 3 +410 1 1 +29 1 1 +3641 8 0 +2704 5 0 +3587 3 0 +1087 1 1 +20 1 1 +7283 0 10 +3136 13 13 +3239 3 0 +1433 5 0 +2517 5 0 +451 1 1 +22 1 1 +2023 0 1 +1784 0 1 +836 1 0 +4426 4 4 +541 1 1 +39 1 1 +299 0 3 +151 2 0 +526 0 3 +4212 0 15 +2684 0 2 +197 0 3 +1030 9 0 +10410 0 1 +220 16 0 +716 0 5 +6194 9 0 +34 1 1 +946 17 17 +1114 16 16 +1556 4 0 +6090 1 0 +40 4 0 +3105 0 3 +15140 1 0 +308 0 13 +2518 1 0 +3727 1 0 +2284 4 0 +127 0 1 +1044 1 0 +3462 2 0 +13811 0 1 +11482 0 1 +14565 50000 604551 +319 0 20 +80 7 7 +59 33 33 +219 11 11 +141 20 44 +87 125 125 +545 74 74 +253 49 49 +136 21 28 +181 30 30 +338 19731 87 +176 98 101 +87 27 27 +58 56 56 +873 67 70 +221 8 8 +257 4 4 +91 24 24 +106 25 24 +106 134 134 +117 27 27 +270 13 13 +128 25 25 +183 77 77 +143 105 105 +824 4 4 +560 70 70 +365 7 7 +267 1 9 +339 8 8 +552 9 9 +195 98 102 +133 13 13 +163 148 147 +176 44 44 +272 37 38 +158 20 20 +876 48 48 +78 82 82 +340 241 250 +231 14 14 +119 7 7 +118 75 75 +385 38 40 +91 48 48 +121 0 1 +123 484 40 +255 0 2 +62 15 10 +617 22 22 +59 33 33 +245 4 4 +144 20 20 +307 153 153 +269 27 27 +82 27 29 +105 75 75 +119 4 0 +123 45 45 +224 11 11 +211 118 109 +50 121 121 +487 35 35 +112 16 17 +103 59 62 +510 32 32 +85 23 23 +89 42 42 +283 239 138 +720 91 92 +105 55 55 +112 27 27 +222 3 1 +696 74 71 +398 6 6 +237 22 22 +138 40 40 +198 38 38 +126 17 17 +191 38 46 +102 1 0 +71 194 194 +109 11 11 +125 40 40 +1190 23 23 +76 172 33 +84 20 20 +633 160 161 +126 8 8 +167 52 51 +191 21 21 +121 52 66 +227 78 78 +145 35 35 +73 25 25 +93 6 6 +216 23 23 +136 102 102 +354 15 16 +423 99 100 +593 126 126 +218 50 50 +335 15 15 +134 16 16 +53 149 150 +56 67 60 +161 20 20 +228 6 6 +525 11 11 +71 55 55 +205 39 39 +114 6 6 +232 100 90 +61 28 22 +134 1 2 +468 9 9 +127 42 42 +83 43 43 +348 47 47 +298 48 50 +484 84 84 +50 95 88 +283 33 33 +61 72 86 +58 122 122 +269 9 9 +122 147 147 +63 20 20 +94 136 136 +70 48 48 +188 136 135 +190 62 62 +87 51 52 +61 29 31 +82 100 100 +117 50 50 +90 25 25 +180 42 42 +345 71 80 +87 156 156 +309 74 70 +182 100 99 +90 1 0 +236 44 44 +50 100 100 +125 9 9 +51 59 70 +56 261 261 +93 + +chain 6539544 1 249250621 + 13487691 13557162 chr1 248956422 + 13382062 13454938 939 +280 134 134 +140 1 0 +134 12 13 +98 40 40 +2327 0 1 +1512 0 1 +1086 14 14 +1163 0 1 +3591 2 0 +2507 66 66 +334 9 9 +3257 2 0 +1516 0 4 +664 0 1 +338 1 0 +5788 0 9 +672 0 1 +1554 1 0 +416 0 1 +1040 9 9 +3425 2 0 +3526 0 1 +175 0 2 +18871 1 0 +195 10 10 +291 0 5 +479 0 3 +981 69 69 +8689 38 3414 +2581 24 33 +405 1 0 +1000 + +chain 6006074 1 249250621 + 144274481 145143425 chr1 248956422 - 127976928 128823039 173 +30 365 365 +72 703 703 +103 139 139 +61 178 178 +36 597 597 +34 285 285 +26 106 106 +33 207 207 +28 504 504 +102 350 350 +134 283 283 +50 4210 4210 +199 71 71 +74 222 222 +45 471 471 +35 1054 1054 +50 75 75 +29 0 1 +24 558 558 +42 135 135 +41 356 356 +76 92 92 +41 485 485 +37 1374 1374 +893 173 173 +54 137 137 +55 143 143 +229 167 167 +110 56 56 +13350 65 65 +35 4506 4505 +37 240 240 +57 231 231 +65 112 112 +86 86 86 +47 819 819 +53 654 654 +149 106 106 +107 116 116 +162 383 383 +43 224 224 +56 7126 7126 +63 492 492 +16 1 0 +12 1869 1870 +26 134 134 +54 9969 9969 +55 7362 7362 +84 2025 2007 +25 59 59 +99 398 398 +41 145 145 +59 133 133 +30 74 74 +96 1293 1292 +77 2360 2360 +77 342 342 +132 55 55 +58 72 72 +35 357 357 +46 566 566 +108 421 421 +96 59 59 +80 536 536 +55 413 413 +33 72 72 +40 105 105 +44 267 267 +59 214 214 +25 380 380 +114 433 433 +122 70 70 +62 404 404 +63 50 50 +84 70 70 +34 374 374 +54 694 694 +43 720 720 +40 271 274 +98 123 123 +44 353 353 +55 823 823 +38 161 161 +67 56 56 +39 82 82 +28 553 553 +50 278 278 +35 1131 1131 +39 406 406 +41 474 474 +25 253 253 +72 233 233 +35 1681 1681 +26 1995 1995 +95 2 25 +3 283 283 +38 635 635 +354 2153 2153 +210 283 283 +42 741 741 +57 231 231 +35 487 487 +25 1001 1001 +56 69 69 +66 493 493 +41 1070 1070 +47 679 679 +484 244 244 +48 91 91 +38 385 385 +32 559 559 +214 340 340 +82 78 78 +48 1668 1668 +39 334 334 +97 195 195 +86 245 245 +35 3885 3886 +107 1552 1552 +33 986 986 +26 421 421 +48 55 55 +41 254 254 +87 583 583 +36 637 637 +30 60 60 +57 941 941 +53 517 517 +31 1683 1683 +189 1688 1688 +49 1121 1121 +43 97 97 +82 201 201 +64 660 660 +93 209 209 +26 2466 2466 +27 561 561 +95 142 142 +37 255 255 +37 531 532 +100 670 670 +109 478 478 +110 451 451 +15 80370 8181 +71 102 102 +66 26 26 +445 41 41 +66 3 0 +59 189468 518750 +1957 21 21 +534 1 3 +501 303 625 +328 20 20 +625 48 48 +108 69 69 +431 98 98 +924 9 9 +71 95 96 +75 107 102 +69 64 62 +187 101 101 +132 779 31 +1179 2 0 +1284 1 0 +1637 1 1 +27 1 0 +33 1 1 +1366 1 0 +4927 2 0 +658 0 1 +34 1 1 +2586 16 16 +5113 1 1 +45 1 1 +7468 0 24 +969 8 8 +3198 382318 106681 +987 2 0 +3157 45633 41752 +698 + +chain 4541543 1 249250621 + 144451744 144517796 chr1 248956422 - 127973946 128039994 913 +2543 0 1 +173 1 2 +7158 19 19 +1477 39 40 +294 60 60 +2176 0 5 +494 46 46 +1685 10 10 +150 12 13 +826 26 25 +702 35 35 +1338 0 2 +597 2 1 +222 9 7 +2212 71 71 +507 38 38 +1383 1 9 +145 0 2 +1570 38 38 +1795 4 4 +425 43 43 +1996 71 71 +102 66 66 +26 614 614 +257 58 58 +996 0 1 +2120 2 0 +2232 32 32 +4752 2 0 +1748 12 0 +399 1 0 +2224 3 0 +2654 20 16 +204 251 251 +27 50 50 +62 573 573 +503 1 0 +224 130 130 +118 109 109 +112 1421 1421 +28 499 499 +31 733 733 +48 335 335 +44 1382 1383 +65 2048 2048 +51 2741 2743 +88 63 63 +38 84 84 +53 58 58 +45 1593 1593 +36 694 694 +41 266 266 +40 976 976 +80 1344 1344 +50 + +chain 4430836 1 249250621 + 143644525 144223871 chr1 248956422 + 148359880 149554357 487 +96 0 1 +10290 0 1 +3569 0 1 +6216 0 3 +13455 1 0 +385 567 567 +51 59 59 +67 273 273 +46 145 145 +47 235 235 +98 259 259 +72 164 164 +44 1518 1518 +27 551 551 +9 4 0 +296 292 292 +498 96 96 +46 334 334 +43 539 539 +34 173 173 +43 50 50 +15814 0 1 +110 0 1 +846 0 1 +255 17 17 +2143 0 2 +164 6 6 +5565 6 6 +136 12 12 +2137 0 1 +1782 1 0 +290 0 10 +1148 0 1 +1540 1 0 +1681 0 2 +149 0 2 +568 0 24 +5997 117 117 +62 266 266 +195 571 571 +26 842 842 +31 499 499 +31 623 623 +35 555 555 +37 232 232 +50 1625 1625 +34 496 496 +47 472 472 +76 344 344 +67 1713 1715 +25 900 900 +29 255 255 +37 68 68 +137 149 149 +36 209 209 +99 51 51 +63 177 177 +50 697 697 +34 50 50 +36 723 723 +33 1839 1839 +43 1073 1073 +51 180 180 +47 1839 1839 +64 127 127 +38 244 244 +44 383 383 +86 617 616 +33 76 76 +41 899 899 +65 265 265 +29 281 281 +33 585 585 +27 121 121 +30 544 544 +71 375 375 +91 520 520 +33 458 458 +25 369 369 +127 0 1 +5647 0 4 +2878 1 0 +12208 377010 990706 +57 304 359 +108 49 49 +50 73 73 +143 30 30 +51 502 499 +121 293 294 +186 506 510 +54 74 77 +531 114 114 +738 69 69 +277 3 5 +1002 34 34 +283 20 20 +168 40 40 +172 28 31 +59 43 43 +224 21 21 +57 36 36 +125 35 35 +149 60 60 +334 29 29 +72 13 6 +140 21 21 +935 39 39 +666 4 4 +125 99 99 +51 54 54 +433 22 21 +208 45 42 +167 31 31 +275 32 20 +52 49 49 +227 13 13 +123 2200 2204 +391 69 61 +86 5 5 +366 11 11 +746 41 41 +341 9 11 +127 31 32 +179 16 16 +138 1943 1949 +202 149 149 +297 64 58 +95 5 5 +366 11 11 +897 341 365 +68 178 178 +117 1453 6213 +211 55 55 +431 3225 34 +412 66 58 +95 5 5 +366 11 11 +348 875 2453 +493 69 69 +417 34 34 +414 56 56 +99 53 53 +205 40 40 +69 11 11 +897 65 1643 +152 671 671 +417 34 34 +412 25 15 +435 3 2 +67 11 11 +324 16 16 +557 5 5 +220 21 17 +82 76 77 +179 16 16 +138 653 653 +122 295 285 +669 1 1 +10 1 1 +854 49 51 +465 11 11 +295 1 1 +28 21 4778 +773 8 0 +143 0 1 +211 16 16 +139 133 133 +346 4 4 +291 291 283 +371 310 310 +658 42 42 +154 10 0 +498 11 11 +1261 0 1 +211 16 16 +138 19 19 +114 2 2 +640 293 285 +655 26 26 +850 17 13 +400 40 40 +69 11 11 +1122 22 18 +125 0 1 +211 16 16 +138 254 254 +198 32 32 +291 9 9 +258 0 2 +671 26 26 +852 27 17 +505 5 5 +57 71 71 +167 30 30 +450 3204 11 +331 2 0 +144 0 1 +211 16 16 +138 135 135 +317 32 32 +291 3196 9 +277 1 5 +222 30 30 +417 3186 1 +185 22 22 +515 44 44 +99 37 13 +114 57 57 +320 5 5 +57 71 71 +167 30 30 +23 489 2063 +277 1 5 +222 30 30 +603 22 22 +515 44 44 +99 37 13 +114 57 57 +320 5 5 +57 71 71 +167 30 30 +572 5 5 +359 0 1 +211 16 16 +112 161 161 +640 9 9 +249 33 33 +197 54 55 +603 22 22 +515 44 44 +97 47 15 +114 57 57 +205 40 40 +75 5 5 +57 71 71 +167 30 30 +572 5 5 +216 22 0 +71 + +chain 4364590 1 249250621 + 143149349 143292759 chr21 46709983 - 37606215 37912395 390 +52 213 212 +170 376 382 +51 14 14 +194 98 100 +67 26 26 +217 23 23 +67 53 53 +111 108 106 +95 1 0 +62 54 355 +249 81 82 +62 78 78 +54 42 41 +86 28 28 +147 788 353 +50 2025 5208 +290 55 55 +373 89 90 +73 6 6 +157 54 54 +317 127 127 +56 92 93 +128 70 70 +57 354 354 +52 1232 417 +59 45067 205575 +584 71 71 +166 172 172 +138 172 172 +164 47 47 +96 38 49 +409 91 91 +137 53 53 +116 278 283 +61 189 189 +80 32 32 +76 124 123 +112 66 66 +211 29 29 +55 37 37 +282 72 68 +81 34 34 +184 18 18 +294 13 13 +178 7 7 +291 134 134 +64 58 59 +138 73 73 +282 106 101 +162 119 120 +69 81 81 +51 42 37 +69 19 19 +46 0 2 +167 129 129 +51 38 38 +57 76 76 +84 46 46 +141 264 260 +89 88 88 +61 101 101 +68 172 172 +54 24 24 +143 40 40 +51 41 41 +74 90 90 +106 117 117 +58 157 139 +475 140 135 +57 258 262 +64 2 0 +83 108 104 +171 1379 1378 +101 62 61 +167 80 80 +116 47 47 +279 7 7 +149 1 1 +27 1 1 +316 1 1 +25 2 1 +348 1 1 +24 1 1 +116 16 16 +884 1 1 +22 5 5 +156 1 1 +25 1 1 +107 1 1 +15 1 1 +429 1 0 +305 1 1 +21 1 0 +56 1 1 +1091 1 0 +9 1 1 +181 5 5 +80 1 1 +141 1 1 +39 1 1 +235 1 1 +23 1 1 +645 0 6 +79 1 1 +17 1 1 +1351 1 1 +30 1 1 +592 0 1 +115 1 1 +27 1 1 +59 1 1 +16 1 1 +591 1 1 +21 1 1 +698 12 12 +92 3 0 +164 1 1 +77 1 1 +823 1 1 +49 12 0 +330 24582 24465 +114 13 13 +149 1 1 +72 1 1 +393 1 1 +47 1 1 +258 1 1 +28 1 1 +323 1 1 +77 8 6 +25 1 1 +70 1 1 +105 1 1 +138 4 0 +128 1 1 +66 1 1 +65 1 1 +18 1 1 +50 1 1 +41 1 1 +247 1 1 +140 1 1 +565 4 4 +18 1 1 +610 1 0 +55 1 1 +67 1 1 +369 1 1 +21 1 1 +242 5 5 +392 1 1 +49 1 1 +300 1 1 +143 1 1 +1121 10 10 +92 1 1 +36 0 2 +19 1 1 +113 5 5 +232 1 1 +73 1 1 +339 1 0 +160 0 1 +679 14 14 +132 0 1 +56 8 8 +532 1 0 +635 14 0 +170 4 4 +93 1 1 +32 1 1 +68 1 1 +67 1 1 +109 1 1 +20 1 1 +285 0 1 +65 1 1 +169 0 2 +757 0 1 +66 1 1 +146 1 1 +40 1 1 +298 1 1 +40 1 1 +62 1 1 +31 10 6 +59 15 15 +641 9 6 +280 9 9 +332 1 1 +42 1 1 +126 3 3 +56 1 1 +291 1 1 +77 1 1 +202 11 0 +91 1 1 +27 1 1 +88 18 18 +506 1 1 +32 1 1 +71 1 2 +67 1 1 +117 1 1 +44 1 1 +116 1 1 +29 1 1 +242 1 1 +34 1 1 +590 14 14 +466 1 1 +21 1 1 +358 1 1 +27 1 1 +132 1 1 +78 1 1 +94 13 13 +131 9 9 +307 1 1 +50 1 1 +60 1 1 +101 1 1 +62 13 13 +65 4072 4086 +124 1 1 +48 1 1 +259 0 29 +52 9 9 +212 1 1 +49 0 5 +42 1 1 +168 3 0 +24 1 1 +252 17 17 +230 1 1 +27 1 1 +268 1 1 +38 3 0 +64 4 3 +47 1 1 +83 1 1 +60 0 38 +106 1 1 +89 0 1 +16 1 1 +185 1 0 +232 0 1 +17 1 1 +110 1 1 +69 7 10 +150 1 1 +94 1 1 +114 8 10 +112 14 14 +79 8 7 +109 1 1 +88 0 3 +127 1 1 +29 1 1 +438 1 1 +59 1 1 +295 9 9 +72 1 0 +448 1 148 +93 3 3 +250 1 1 +90 1 1 +127 1 1 +18 1 1 +200 4 4 +43 1 1 +319 10 9 +107 1 1 +54 1 1 +40 1 1 +143 1 1 +162 1 1 +93 1 1 +42 1 1 +307 1 1 +19 1 1 +101 1 1 +43 1 1 +60 12 12 +145 1 1 +39 1 1 +133 14 14 +349 7 7 +158 15 15 +68 1 1 +40 1 1 +172 23 15 +116 0 4 +25 1 1 +109 2 2 +56 6 6 +227 1 1 +35 1 1 +164 1 1 +26 1 1 +147 23 23 +300 1 1 +29 1 1 +81 22 22 +105 1 1 +38 2 2 +825 1 1 +38 1 1 +161 11 11 +88 17 17 +110 1 0 +232 1 1 +42 1 1 +784 9 9 +106 5 5 +440 1 1 +45 1 1 +307 1 1 +49 1 1 +116 5 5 +48 1 1 +109 12 12 +257 1 1 +70 1 1 +210 1 1 +59 1 1 +75 1 1 +21 0 2 +41 1 1 +54 1 1 +128 1 1 +137 6 0 +45 1 1 +374 1 1 +26 1 1 +51 1 1 +87 1 1 +99 1 1 +49 1 1 +847 1 1 +17 1 1 +70 1 1 +26 5 5 +203 65 7 +14 0 44 +109 1 1 +205 1 1 +34 1 1 +152 9 9 +312 1 1 +62 1 1 +396 + +chain 3124434 1 249250621 + 143678537 144483260 chr1 248956422 - 103761161 104390598 205 +334 0 3 +233 51 51 +59 67 67 +212 10 10 +51 46 46 +145 47 47 +70 18 18 +73 17 17 +57 98 98 +61 19 17 +96 4 27 +79 72 72 +164 44 44 +466 19 8 +83 1 0 +221 2 0 +726 27 27 +108 8 8 +435 309 277 +292 498 496 +96 46 46 +137 13 13 +110 1 6 +73 43 43 +539 34 34 +57 6 6 +110 43 43 +50 187979 52647 +30 6393 6399 +90 113 113 +38 22083 22083 +47 0 1 +28 38193 38199 +29 45717 45753 +3941 0 1 +9600 1 0 +15033 4 0 +5544 0 1 +4655 4 1 +8476 0 1 +5231 1 0 +25935 4 0 +16316 0 5 +2608 12 0 +4498 0 2 +5593 1501 1501 +49 387814 347524 +40 385 706 +58 + +chain 2527822 1 249250621 + 13001392 13684890 chr1 248956422 - 235696198 236176247 240 +100 12718 12717 +5762 15 15 +678 1 1 +19 1 1 +1037 0 35 +30 1 1 +86 51 1 +678 1 0 +608 11 11 +209 1 0 +2634 12 12 +567 1 1 +45 1 0 +960 1 1 +44 15 24 +215 14 14 +86 33 43 +80 11 11 +71 19 19 +761 2 0 +61 29 26 +196 12 0 +373 12 12 +158 5 2 +245 7 7 +364 32 32 +171 337 337 +127 45 44 +96 63 64 +144 8 10 +88 192 192 +53 78 78 +93 196 195 +157 44 44 +313 8 8 +95 61 60 +338 74 72 +108 0 1 +359 10 8 +96 90 82 +305 17 17 +247 111 111 +153 1 1 +38 1 1 +96 4 0 +112 1 1 +52 1 1 +173 0 1 +74 1 1 +139 2 0 +6 1 1 +70 2 0 +110 4 4 +616 1 1 +82 1 1 +587 11 11 +161 3917 33700 +25 4451 4451 +77 877 877 +59 2261 2263 +46 1554 1559 +80 60584 4481 +73 1308 1309 +25 2485 2407 +168 22 22 +68 22 18 +208 65 67 +66 43 43 +63 186 191 +83 15 15 +114 31 31 +76 224 213 +196 41 41 +334 54 54 +49 222 222 +70 2621 2221 +64 230 231 +97 42 42 +72 68 60 +68 116 117 +145 105 101 +123 64 65 +73 135 139 +90 11 11 +106 24 24 +81 198777 122953 +79 6751 36588 +35 325 325 +50 52 52 +27 70 70 +27 251 242 +51 78 75 +172 91549 118606 +38 217960 51940 +206 16 18 +80 177 177 +106 75 75 +213 5 5 +183 17 19 +214 10 10 +84 291 293 +79 74 75 +95 276 276 +572 94 94 +91 276 276 +71 122 121 +196 95 103 +91 18 18 +116 49 49 +212 19 16 +73 359 366 +71 0 49 +55 119 120 +137 110 110 +72 84 84 +115 107 107 +105 323 88 +103 49 49 +88 18 18 +89 51 49 +93 14 14 +50 101 101 +110 38 38 +103 86 86 +347 13 13 +160 8 8 +136 128 123 +60 20 20 +149 75 75 +124 43 43 +188 204 204 +79 428 427 +164 189 188 +47 20 20 +91 61 59 +134 32 32 +100 99 99 +448 28 28 +65 68 68 +146 114 114 +280 55 55 +53 55 56 +59 102 109 +62 201 201 +130 10 10 +50 6 6 +93 11 11 +54 52 52 +153 8563 5869 +219 43 43 +132 57 57 +91 53 53 +360 15 15 +54 681 12021 +75 46 46 +85 158 158 +82 2 0 +158 306 293 +89 43 43 +116 231 231 +74 279 281 +431 105 117 +103 263 324 +78 80 80 +82 167 167 +61 229 223 +51 48 48 +72 1085 1072 +65 322 324 +83 16 16 +54 8757 8732 +56 27 27 +151 115 115 +542 324 177 +173 24 24 +70 128 128 +61 97 96 +142 83 83 +157 51 51 +177 108 108 +55 190 204 +88 47 47 +328 25 25 +284 90 91 +53 4 4 +118 40 40 +82 21 21 +301 46 46 +59 104 92 +86 10 5 +110 56 56 +171 49 49 +69 49 49 +65 60 55 +164 3792 3808 +53 1 0 +777 32 32 +94 39 39 +82 26 26 +68 32 32 +122 + +chain 2441185 1 249250621 + 147930886 148025253 chr1 248956422 - 128042135 128141922 599 +84 1071 1062 +66 552 551 +35 293 293 +25 103 103 +55 398 398 +41 149 149 +4034 0 2 +5629 0 2 +1397 0 1 +1470 0 5 +948 10 10 +212 0 4 +619 48 55 +2195 39 39 +406 13 13 +1120 1 0 +279 19 19 +2337 18 17 +825 46 46 +172 21 21 +61 38 76 +1390 16 14 +2112 0 18 +59 0 1 +349 36 36 +572 1 0 +115 19 20 +264 22 22 +1575 11 11 +3117 1 0 +1416 41 22 +390 34 34 +1263 0 1 +493 123 124 +167 21 21 +1886 433 433 +81 27 27 +2852 24 24 +247 28 25 +411 41 41 +2980 4 4 +51 36 36 +3869 11 10 +8253 0 1 +3588 1 1 +31 1 0 +3670 8 0 +2994 1 1 +28 1 1 +1223 1 0 +1736 891 891 +173 175 173 +29 647 647 +56 237 237 +573 11 13 +1013 60 60 +573 1 1 +24 1 1 +214 1540 0 +594 0 2022 +623 388 384 +1241 13 7 +1668 0 3358 +193 0 1540 +1202 0 2 +3249 1 0 +71 2 21 +3002 3 0 +2946 + +chain 2102392 1 249250621 + 223725664 223747846 chr9 138394717 + 136033381 136055496 2043 +2331 1 0 +1800 0 1 +390 0 2 +32 1 1 +368 1 1 +43 1 1 +2747 13 0 +1654 1 0 +23 0 2 +74 0 8 +828 1 1 +38 1 1 +1626 56 0 +6558 17 8 +3577 + +chain 1967132 1 249250621 + 120747156 120917612 chr1 248956422 - 127680242 127850752 350 +4002 1 0 +15046 17850 17861 +4 2 0 +39 13153 13160 +34 1973 1973 +28 935 935 +39 332 332 +82 10199 10198 +76 907 908 +2 2 0 +64 385 385 +40 636 636 +100 679 679 +34 7929 7930 +64 1866 1866 +98 85 85 +29 358 358 +48 2512 2512 +27 735 735 +37 16089 16089 +44 1788 1787 +76 423 420 +51 2591 2591 +61 307 307 +29 1068 1068 +73 7593 7599 +48 13880 13880 +31 215 215 +37 592 592 +45 506 506 +323 44068 44106 +76 1 1 +9 + +chain 1455478 1 249250621 + 13121929 13332327 chr1_KI270766v1_alt 256271 + 0 170233 339 +20632 623 623 +34 185193 145089 +76 102 102 +403 1 1 +18 2 2 +136 1 1 +35 4 4 +147 1 1 +53 1 1 +225 1 1 +32 1 1 +393 58 0 +184 11 11 +263 1 1 +66 1 1 +256 1 1 +103 1 1 +1 598 598 +110 73 71 +6 2 0 +139 75 76 +335 + +chain 1417974 1 249250621 + 143725585 143750135 chr1 248956422 + 120323082 120347619 281 +117 62 62 +97 22 19 +147 195 194 +571 26 26 +55 19 0 +768 31 29 +499 31 31 +623 35 35 +555 37 37 +81 19 16 +132 50 50 +626 0 4 +999 34 34 +496 47 47 +298 0 2 +174 76 75 +344 67 66 +536 18 17 +453 0 2 +706 25 25 +126 7 7 +227 22 22 +518 29 49 +255 37 66 +68 137 135 +149 36 36 +209 99 99 +51 63 63 +177 50 50 +454 14 11 +229 34 34 +50 36 36 +415 4 0 +304 33 34 +1173 1 0 +567 4 4 +94 43 43 +150 0 1 +923 51 51 +180 47 47 +889 17 17 +151 2 3 +509 0 1 +271 64 63 +127 38 38 +172 22 22 +50 44 44 +68 22 22 +293 86 68 +457 1 0 +159 33 33 +76 41 41 +899 65 65 +50 0 1 +215 29 32 +281 33 33 +389 0 3 +196 27 27 +121 30 30 +405 11 11 +128 71 71 +154 19 0 +89 7 7 +106 91 91 +259 19 19 +242 33 31 +458 25 26 +369 + +chain 1309572 1 249250621 + 144146952 144224426 chr1 248956422 - 103551256 103660336 980 +133 93 91 +40 317 319 +106 309 320 +52 125 125 +145 203 203 +49 266 266 +30 51 51 +74 698 698 +72 529 529 +3 5 0 +39 1 1 +47 799 799 +114 738 738 +69 1999 1999 +28 404 404 +36 309 309 +60 1544 1544 +39 945 945 +29 900 900 +31 275 271 +32 52 52 +49 473 473 +27 885 885 +73 111 4867 +151 1234 1234 +27 2913 2905 +73 144 144 +52 463 471 +436 202 202 +149 312 300 +49 2780 2807 +340 1 0 +410 697 697 +444 1413 2972 +227 0 4 +657 51 51 +138 261 261 +34 1837 1817 +15 198 1775 +128 979 10492 +34 431 5181 +39 99 99 +53 205 205 +40 1194 2773 +671 417 417 +34 2178 2174 +76 333 333 +641 381 381 +20 4 0 +24 3781 3775 +47 888 888 +44 371 371 +310 4021 4029 +46 1948 1942 +40 1839 1831 +56 271 5038 +32 2107 2107 +27 1343 2912 +278 4 0 +826 707 707 +25 835 833 +30 107 107 +37 1226 1226 +48 317 317 +32 538 538 +44 449 449 +65 253 5021 +785 2 0 +1351 500 500 +30 417 417 +883 2 0 +2301 4199 1002 +57 382 382 +71 167 167 +30 1301 1301 +25 1008 1008 +33 197 198 +54 1442 1436 +57 205 205 +40 375 375 +30 886 886 +555 + +chain 1138914 1 249250621 + 148758213 149707645 chr1 248956422 + 120842121 121044285 247 +42 475 471 +217 29 29 +143 5 5 +86 1 1 +198 1 1 +24 1 1 +82 1 1 +43 3 3 +63 14 16 +87 2 0 +39 1 1 +176 60 62 +59 172 172 +62 1 1 +113 73 77 +54 129 128 +30 379 379 +47 828 812 +107 270 271 +42 90 90 +59 251 259 +81 747768 593 +22 10 12 +93 545 545 +39 1 1 +34 254 254 +48 338 338 +30 338 338 +589 1 1 +21 1 1 +1347 7 6 +1183 0 17 +153 0 9 +30 0 1 +341 10 12 +194 1 1 +72 1 1 +1077 16 16 +396 0 1 +700 1 1 +28 1 1 +1181 3 2 +1653 1 1 +86 1 1 +365 1 1 +44 1 1 +593 1 1 +57 1 0 +805 1 1 +16 1 1 +206 4 0 +2522 1 0 +2698 1 1 +39 1 1 +3278 176 176 +98 87 87 +27 58 58 +56 873 873 +67 711 711 +25 106 106 +134 117 117 +27 411 411 +25 183 183 +77 143 143 +105 1388 1388 +70 1743 1743 +98 309 309 +148 176 176 +44 272 272 +37 1054 1054 +48 78 78 +82 340 340 +241 489 489 +75 385 385 +38 91 91 +48 244 244 +484 1030 1030 +33 720 720 +153 269 269 +27 82 82 +27 105 105 +75 246 246 +45 446 446 +118 50 50 +121 487 487 +35 231 231 +59 510 510 +32 197 197 +42 283 283 +115 30 1 +94 720 720 +91 105 105 +55 112 112 +27 921 921 +14 2 0 +58 801 801 +40 198 198 +38 334 357 +38 174 174 +194 245 245 +40 1289 1289 +172 737 737 +160 301 301 +52 333 333 +5 1 0 +46 227 227 +78 145 145 +35 73 73 +25 474 474 +102 792 792 +99 593 593 +126 218 218 +50 553 553 +149 56 56 +67 1022 1022 +55 205 205 +39 352 352 +50 1 6 +49 61 61 +4 3 0 +21 739 740 +42 83 83 +43 348 348 +46 299 300 +48 484 484 +84 50 50 +90 288 281 +33 61 63 +33 0 2 +39 58 58 +122 405 405 +142 177 177 +136 70 70 +48 188 188 +136 190 190 +62 87 87 +39 73 73 +29 82 82 +80 8 8 +12 117 117 +50 90 90 +25 180 180 +42 345 345 +2 0 2 +68 88 88 +65 1 1 +90 309 308 +74 182 182 +100 327 327 +43 52 52 +51 1 1 +46 186 186 +59 56 56 +16 1 1 +16 1 1 +179 1 1 +31 1 1 +15 42980 42915 +140 5 0 +95 8 8 +1379 1 1 +18 1 1 +1895 0 3 +4810 0 3 +369 20 0 +4728 56 56 +110 167 167 +229 143 143 +58 15689 15692 +47 2 3 +61 696 698 +55 394 394 +44 570 570 +51 1 1 +34 1 1 +32 152 152 +32 150 150 +45 75 75 +53 174 174 +95 1 1 +31 197 197 +125 989 966 +30 627 627 +71 248 248 +157 11 0 +179 12915 12917 +41 1468 1467 +15 1 1 +28 1 1 +2 4260 4261 +49 1626 1624 +51 119 119 +5 6 11 +59 299 301 +49 1095 1094 +101 606 607 +77 60 60 +31 1 1 +22 422 422 +67 664 664 +27 171 171 +48 794 794 +45 3105 3104 +31 298 298 +46 277 277 +46 232 232 +25 2308 2305 +41 92 92 +108 1512 1512 +39 1354 1352 +43 809 817 +52 1 0 +51 4269 4268 +70 1680 1680 +92 407 407 +54 1516 1522 +42 742 742 +31 1923 1923 +99 219 219 +27 387 387 +32 2130 2130 +56 248 248 +75 75 75 +91 3211 3212 +98 1039 1038 +87 290 290 +36 819 819 +56 74 74 +34 539 534 +26 196 196 +29 97 97 +57 1361 1361 +53 413 413 +26 508 508 +160 + +chain 1055259 1 249250621 + 13103076 13121929 chr1 248956422 - 235687550 235706403 1769 +5959 1034 1034 +31 332 332 +121 66 66 +103 180 180 +118 596 596 +34 99 99 +48 51 51 +127 52 52 +27 270 270 +77 240 240 +45 325 325 +101 108 108 +45 320 320 +156 208 208 +191 50 50 +27 117 117 +26 62 62 +184 89 89 +216 488 488 +65 66 66 +43 63 63 +186 212 212 +31 76 76 +224 196 196 +41 622 622 +37 273 273 +30 58 58 +2330 64 64 +230 97 97 +42 72 72 +68 68 68 +116 145 145 +105 123 123 +64 73 73 +135 364 364 +211 + +chain 698599 1 249250621 + 146424884 146434109 chr1 248956422 + 146984913 146994128 4530 +910 53 53 +155 43 43 +91 1 0 +122 84 84 +128 64 64 +117 79 79 +30 87 87 +62 66 66 +30 353 353 +346 2 0 +244 252 252 +1337 1 0 +1018 53 53 +155 60 60 +74 1 0 +1509 87 81 +95 0 1 +426 295 295 +466 246 246 +83 + +chain 687446 1 249250621 + 148765235 149283546 chr1 248956422 + 120849120 121005746 278 +64 168 166 +99 1 0 +419 126 126 +272 176 175 +149 30 30 +150 214 216 +74 21 10 +154 85 85 +66 5 5 +535 0 4 +277 751 98 +109 0 5 +328 270 272 +316 58 58 +721 100 100 +327 40 41 +164 36 36 +78 1 0 +91 9 9 +66 49 49 +142 179 179 +68 25 23 +386 27 27 +593 21 20 +144 10 10 +662 18 18 +90 3 0 +154 0 1 +55 19 19 +425 58 58 +217 6 6 +229 45 45 +372 12 12 +268 143 138 +183 82 82 +97 11 11 +518 1 0 +1524 25 25 +986 92 90 +742 8 8 +1178 9 2 +137 4 4 +96 53 53 +78 2 1 +774 20 21 +80 44 44 +60 30 30 +103 5 6 +126 36 36 +989 8 8 +74 2 1 +223 32 32 +95 58 58 +400 0 1 +194 31 31 +206 1185 1185 +26 356 353 +67 386 386 +29 24 24 +10 768 762 +155 399 399 +28 11286 11722 +27 1981 2054 +279 2105 2107 +32 6 6 +52 112 112 +49 681 681 +71 86 103 +11 1308 1309 +40 506 506 +76 33 172 +16 627 627 +58 265 264 +58 2032 2018 +39 507 506 +68 6646 6731 +93 849 849 +47 1445 1443 +43 2462 2457 +37 460414 98682 +45 + +chain 438813 1 249250621 + 13607926 13612545 chr1 248956422 + 13281530 13286149 94258 +4619 + +chain 411110 1 249250621 + 146432411 146439003 chr1 248956422 + 146987674 146994257 4978 +59 2 0 +26 1740 1740 +67 1 0 +1018 53 53 +155 60 60 +74 1 0 +107 45 45 +1357 87 81 +95 0 1 +745 52 52 +118 238 238 +492 + +chain 400720 1 249250621 + 145320313 148758730 chr1 248956422 - 100386075 102892146 182 +40 2320 2324 +667 5544 807 +136 41 41 +190 1913 1913 +34 613 615 +26 10905 6224 +243 4514 4502 +68 4890 4850 +103 5897 5879 +340 0 6 +65 7 7 +239 316 316 +103 12 12 +900 13 13 +111 4540 2994 +38 1318 1318 +3 1 1 +231 1 1 +21 656712 1514466 +58 35 35 +963 126 126 +206 65 62 +369 25 25 +992 4 4 +236 2 0 +785 46 46 +70 50 50 +680 7 9 +284 521 15729 +10 2752 2750 +62 120 120 +69 85 85 +93 495 481 +151 367 367 +36 1 1 +6 56 56 +43 181354 444 +105 152 152 +27 62 62 +142 1 1 +21 80 80 +69 64 64 +191 638 638 +128 95 95 +44 58 58 +67 116 116 +45 1009 1015 +240 71 71 +46 79 79 +142 562 562 +33 70 70 +49 1787 247 +109 131 131 +55 313 313 +137 67 66 +47 58 58 +97 6931 638 +160 63 63 +44 58 58 +67 536 536 +114 264 264 +31 316 316 +158 57 57 +60 79 79 +142 306 306 +65 1 0 +294 323 323 +82 159 159 +113 223 223 +31 9 0 +170 1 0 +16 1 1 +4 91 91 +36 0 14 +56 84 84 +80 73 73 +58 976 976 +99 595 595 +34 282 282 +56 394 394 +40 69 69 +41 375 375 +4 5 7 +50 100 100 +48 667 667 +58 192 192 +81 460 460 +27 963 963 +84 222 222 +53 15 0 +39 255 255 +183 88 88 +51 118 118 +32 135 135 +87 114 114 +50 51 51 +33 110 110 +85 142 142 +158 125 125 +44 82 82 +42 136 136 +27 368 368 +29 74 74 +73 72 72 +38 116 116 +76 235 235 +50 58 58 +35 50 50 +219 113 113 +65 127 127 +29 83 83 +128 108 108 +70 89 89 +43 51 51 +48 77 77 +9 1 1 +45 0 18 +131 162 164 +26 73 73 +210 185 185 +88 222 222 +240 72 72 +149 75 77 +46 1 1 +24 51 51 +113 1 1 +22 2 2 +37 441 441 +109 54 54 +371 604 604 +75 1 1 +18 1 1 +61 51 51 +72 233 233 +181 66 66 +27 174 174 +217 64 64 +179 69 69 +185 51 51 +366 24 27 +64 1 1 +34 1 1 +1947 1 0 +178 0 1 +176 4 0 +1253 1441106 452920 +41 946612 163451 +28 98098 202407 +204 159 160 +88 56 56 +62 0 6359 +167 76 76 +355 43 43 +388 4 4 +115 59 59 +755 39 39 +113 44 45 +72 18 14 +243 17 17 +838 20 20 +77 17 17 +354 84 84 +249 24 24 +205 50 50 +350 43 43 +123 49 49 +60 27 27 +89 77 77 +282 5 3 +1104 25 25 +190 61 61 +265 40 41 +61 0 3 +293 34 34 +238 102 102 +51 91 91 +438 12 4 +54 0 1 +428 13 13 +153 14 53 +207 1074 1074 +57 68 68 +204 32 32 +452 18 15 +251 67 67 +101 31 31 +59 29 29 +8 274 274 +31 169 169 +65 1165 1173 +61 3186 58293 +67 6 6 +101 51 51 +58 72 72 +1058 21 21 +176 3 0 +84 43 43 +169 12 10 +294 + +chain 278129 1 249250621 + 148216106 148855804 chr1 248956422 + 144387213 144643621 258 +36 588 589 +33 6276 6276 +55 208 208 +40 326 326 +46 463 463 +11 27 29 +52 3 4 +17 448 448 +25 68 68 +25 32 36 +25 127 127 +43 1443 1442 +25 600 603 +35 1 1 +14 6594 6605 +42 222 222 +63 96 96 +26 432 432 +42 91 91 +48 7599 7583 +40 1 1 +38 1 1 +83 5384 5424 +31 161 161 +24 230 230 +33 281 281 +57 176 176 +33 306 306 +87 14 3 +60 82 82 +71 473 473 +25 1567 1564 +40 69 69 +53 175 175 +11 1 1 +26 77 77 +90 0 2 +10 1 1 +51 27487 467 +163 6824 438 +57 19075 5 +32 1 1 +82 399 393 +24 414 414 +1121 16 0 +31 1 1 +52 4884 122 +73 5074 302 +226 8 8 +578 4773 25 +58 4836 52 +49 241 241 +26 558 558 +53 275 275 +29 354 354 +33 694 694 +30 955 954 +15 2 0 +10 435 440 +90 1 1 +32 196 196 +44 7 7 +92 1 1 +20 109 109 +63 581 581 +96 1191 1191 +34 226 224 +53 357 357 +30 288 288 +34 93 93 +100 381 381 +29 408 408 +72 55 56 +525 0 1 +41 1 1 +115 36 36 +131 34 34 +362 58 58 +17 13794 7272 +17 208 152 +8 404 400 +35 5643 7189 +276 1 0 +23 2 0 +61 9 9 +121 1 1 +87 0 1 +62 13 16 +1309 5 5 +108 91 111 +65 10 19 +73 494984 188233 +18 5 1 +5 + +chain 259047 1 249250621 + 148734147 148755222 chr1 248956422 - 100823992 100851278 955 +74 17 23 +75 15 23 +91 70 48 +61 26 26 +528 34 34 +96 44 44 +145 149 151 +109 0 1 +622 87 87 +48 1 0 +163 50 50 +169 32 32 +66 17 17 +69 35 35 +65 77 77 +79 364 220 +53 8 8 +297 0 1 +633 37 37 +124 15 15 +116 48 45 +116 271 269 +70 17 18 +63 128 121 +25 229 229 +54 391 6719 +29 3735 3727 +50 350 350 +43 232 232 +27 4327 4372 +158 72 72 +732 25 25 +87 57 57 +36 990 990 +59 198 208 +29 3642 3638 +24 + +chain 238727 1 249250621 + 147948091 148026038 chr1 248956422 + 145232038 145403493 900 +34 2195 5153 +31 16870 16250 +34 1756 1757 +27 11 11 +85 2074 2089 +432 82 82 +27 3123 3121 +28 33806 83684 +422 125 19160 +199 57 57 +63 186 3406 +233 45 45 +21 1233 5985 +194 13 13 +165 13591 27862 +36 47 47 +259 31 31 +81 36 36 +100 89 89 +106 + +chain 192123 1 249250621 + 144145783 144222787 chr1 248956422 - 99879534 100421976 869 +81 64 64 +60 256 257 +84 138 132 +235 18 18 +55 0 1 +145 166 170 +92 41 41 +317 107 107 +217 3 15 +88 52 52 +4 57 57 +64 145 145 +63 13 13 +19 207 207 +23 5 5 +45 298 298 +395 23 23 +10 121 121 +149 72 73 +72 204 204 +253 95 96 +140 54 54 +74 3239 3239 +40 259 262 +43 463 463 +35 543 543 +29 2015 2009 +99 768 769 +45 990 974 +89 27 27 +621 22 22 +242 335 3499 +163 18 18 +175 33 33 +270 5 5 +179 418 422 +42 1214 1214 +41 477 479003 +31 333 333 +231 16 16 +314 0 2 +214 73 73 +144 52 50 +463 4890 152 +55 3361 170 +261 473 467 +39 835 835 +439 12 12 +73 834 845 +69 7002 3787 +241 3767 3717 +62 688 690 +247 1383 1371 +42 3080 3091 +241 3748 3690 +1 24 4732 +100 3060 3034 +71 167 167 +30 450 450 +22 1144 2689 +707 25 1 +774 9 9 +52 30 30 +107 37 37 +297 842 820 +1 24 24 +62 688 688 +247 44 32 +449 65 65 +253 6993 625 +44 250 242 +57 382 382 +71 167 167 +30 23 23 +449 3986 789 +26 25 25 +104 3076 1474 +63 + +chain 191873 1 249250621 + 148786470 148855122 chr1_KI270765v1_alt 185285 + 84608 153772 730 +47 521 521 +51 2025 2018 +45 9763 9764 +27 216 216 +29 288 288 +45 448 448 +157 930 935 +48 15654 15667 +41 1010 1011 +36 24 122 +68 5144 5147 +705 18 18 +876 1069 1069 +38 8875 8877 +45 1 0 +59 11 11 +21 4746 4974 +30 372 372 +26 8 8 +9 4061 4022 +40 0 5 +2 10989 11191 +30 0 1 +4 + +chain 178082 1 249250621 + 146421578 146424884 chr1 248956422 + 146986371 146989674 4981 +1362 2 0 +26 536 536 +67 289 289 +36 524 524 +355 1 0 +108 + +chain 163581 1 249250621 + 147919970 148352385 chr1 248956422 + 145203908 145410907 316 +43 2121 2115 +35 253993 9718 +79 199 199 +53 1211 1211 +30 176 176 +122 553 553 +114 517 518 +62 304 304 +44 347 347 +58 281 281 +29 78 78 +40 3937 3937 +148 1210 1212 +70 307 307 +62 129 129 +36 1257 1255 +81 1042 1040 +78 2002 2009 +44 2298 2298 +2958 21107 21095 +51 6511 6511 +48 353 353 +27 638 639 +32 27430 27429 +1248 0 4758 +370 49 47 +877 13 13 +2124 400 6752 +75 378 5134 +52 133 133 +46 63 63 +554 23 29 +759 198 198 +219 269 269 +40 74 74 +44 89 89 +86 1324 1324 +21 0 2 +6 2364 2372 +59 253 253 +65 1268 1260 +160 1368 1370 +30 1569 1553 +59 1349 1341 +255 89 89 +53 564 564 +21 2 0 +6 1632 1630 +35 1830 6593 +233 1005 1005 +21 2 0 +6 1665 1651 +397 310 310 +59 288 288 +30 449 449 +20 198 1771 +239 163 163 +1025 1795 3360 +71 1305 1305 +26 1791 3370 +811 57 57 +518 439 431 +35 116 116 +53 91 91 +59 279 279 +39 449 449 +44 1164 1164 +28 52 52 +75 1412 1412 +37 837 815 +34 261 261 +59 767 766 +44 775 775 +51 56 56 +53 564 564 +27 1421 1421 +215 33 17 +2 408 408 +34 261 261 +59 260 260 +58 449 449 +44 775 775 +51 56 56 +53 62 62 +44 430 430 +55 1189 1189 +53 402 402 +459 261 261 +59 552 552 +1552 178 178 +55 179 179 +948 2173 2147 +3100 35 27 +444 261 261 +59 767 767 +20 13 9 +41 1475 1475 +15 0 2 +38 1637 1623 +1531 4 0 +591 812 812 +1803 3104 3106 +96 290 290 +84 169 169 +54 65 65 +46 836 828 +65 82 82 +58 383 383 +32 344 344 +72 50 50 +76 1322 1322 +30 89 89 +449 41 41 +27 1837 1837 +31 308 308 +39 4380 4380 +69 105 105 +31 2324 2319 +36 131 131 +34 362 362 +58 17 17 +798 6517 184 +34 3176 3176 +30 2608 2608 +36 230 230 +308 74 74 +7 0 2 +49 0 2 +63 0 2 +89 + +chain 146835 1 249250621 + 146461299 146464997 chr1 248956422 + 146984993 146988687 142481 +1193 432 432 +62 190 190 +68 66 66 +30 316 316 +37 99 99 +37 151 151 +60 4 0 +25 892 892 +36 + +chain 119346 1 249250621 + 146373849 146461024 chr1 248956422 - 100804316 100852417 853 +38 73471 43939 +131 1 1 +46 1 1 +671 9524 0 +722 10 10 +469 99 99 +56 132 132 +8 14 0 +15 1 1 +31 1596 1592 +139 + +chain 114897 1 249250621 + 146456351 146457596 chr1 248956422 + 146989566 146990811 1214913 +265 29 29 +951 + +chain 113740 1 249250621 + 148259609 148323820 chr1 248956422 + 145294486 145364918 1034 +14 13 13 +41 5362 5368 +44 4728 11066 +1 2 0 +41 5258 5264 +76 2590 2590 +33 4045 5602 +80 2556 4123 +34 83 83 +34 128 128 +762 36742 33491 +66 223 223 +85 1118 1118 +52 + +chain 92701 1 249250621 + 147931933 148344219 chr1 248956422 - 99349078 99477954 373 +71 103 103 +552 35 34 +293 25 25 +103 55 55 +398 41 41 +149 347233 76562 +166 42 42 +658 80 80 +597 4 0 +247 3158 1539 +35 37842 33022 +24 20350 14055 +25 + +chain 90706 1 249250621 + 148003839 148345376 chr1 248956422 + 146065609 146143386 335 +654 1 1 +38 5 5 +106 6 6 +81 173 174 +91 0 6 +84 29 29 +99 13 13 +155 6 6 +374 56 55 +67 12 12 +158 1597 24 +60 251808 4429 +97 24626 18087 +258 34 34 +83 34 34 +128 41874 33601 +36 309 309 +56 0 4 +39 12078 12048 +92 1 1 +24 1 1 +114 0 6 +25 1 1 +514 0 2 +44 1 1 +59 1 1 +39 1 1 +57 5 5 +44 0 4 +8 1 1 +54 1 1 +87 1 1 +145 4858 4870 +34 + +chain 87103 1 249250621 + 148754004 149510143 chr1 248956422 - 103662224 104539690 317 +32 999 991 +43 696 696 +32 4 7 +19 224 224 +62 76 76 +26 1 1 +12 72 72 +1 2 0 +89 1 1 +103 191 191 +50 60 60 +70 2078 2081 +29 6323 6315 +26 7 7 +64 59 57 +12 519 519 +46 1 1 +38 1 1 +40 273 273 +23 0 1 +6 1 0 +11 3 0 +131 149 151 +24 1 1 +5 151 151 +114 1 0 +56 0 1 +27 6 6 +9 249 257 +18 3 3 +44 1 1 +19 883 886 +576 1 1 +22 1 1 +151 437 438 +65 169 166 +36 316 316 +58 721 721 +100 327 327 +40 164 164 +35 259 257 +36 142 152 +29 13 13 +88 1 1 +42 1 1 +5 68 68 +25 386 386 +27 2194 2194 +7 1 1 +50 452 452 +45 665 661 +130 183 183 +82 2151 2146 +25 986 986 +92 2174 2171 +53 954 954 +44 60 60 +30 235 235 +15 1 1 +19 1296 1290 +32 95 95 +58 10434 10425 +84 7668 7690 +101 105 105 +41 1680 1679 +31 805 798 +82 173 173 +35 405 405 +80 1248 1248 +33 1875 1875 +29 82 82 +69 1500 1500 +47 6390 9362 +28 1034 1106 +60 93 93 +51 98 98 +37 159 159 +29 238 239 +63 265 260 +40 177 177 +32 82 82 +26 689811 808109 +33 + +chain 85530 1 249250621 + 146426259 146438511 chr1 248956422 - 232390553 232391674 3776 +84 1608 4 +83 9 9 +160 4816 51 +295 4789 24 +52 118 118 +119 11 14 +108 + +chain 78113 1 249250621 + 144168846 144224467 chr1 248956422 - 103568419 103644507 1192 +499 1892 1887 +30 4603 7729 +198 2985 4552 +65 6483 6465 +32 29874 39339 +40 500 2069 +30 1140 1140 +44 4715 9476 +44 97 97 +27 0 2 +20 2262 2262 +41 + +chain 76914 1 249250621 + 148176038 148323710 chr1 248956422 - 128043029 128132529 862 +124 109571 76301 +210 36399 11497 +223 85 85 +449 7 7 +106 23 23 +475 + +chain 71804 1 249250621 + 144171314 144172650 chr1 248956422 + 149490952 149492288 1492 +86 5 5 +366 11 11 +868 + +chain 71104 1 249250621 + 13607179 13607926 chr1 248956422 - 236035422 236036169 1579610 +747 + +chain 68160 1 249250621 + 148734419 148737500 chr1 248956422 - 104511150 104514203 275954 +70 61 61 +26 528 528 +34 96 96 +44 145 144 +81 799 799 +44 255 255 +50 169 169 +32 152 152 +35 65 65 +77 79 79 +124 27 0 +88 + +chain 67783 1 249250621 + 145319397 145328330 chr1 248956422 - 100389881 100403548 1739 +32 7610 12343 +69 286 287 +374 53 53 +378 13 13 +118 + +chain 65740 1 249250621 + 145328330 145361417 chr1 248956422 - 102851284 103630621 1669 +76 11 5 +66 18 18 +291 44 44 +48 136 136 +41 30083 749316 +97 116 19158 +66 1461 4677 +83 408 5175 +24 2 0 +16 + +chain 65256 1 249250621 + 13612717 13613403 chr1 248956422 - 236040983 236041669 2306473 +686 + +chain 62842 1 249250621 + 146448208 146449564 chr1 248956422 + 146990947 146992303 912724 +217 160 160 +115 162 162 +276 370 370 +56 + +chain 50767 1 249250621 + 1582861 1584456 chr1 248956422 + 1714655 1716246 1032141 +282 3 0 +130 1 0 +368 42 43 +381 65 65 +84 87 86 +152 + +chain 44980 1 249250621 + 148340484 148341590 chr1_KI270711v1_random 42210 + 23180 24293 2953 +192 75 75 +56 19 19 +55 32 32 +109 541 548 +27 + +chain 41081 1 249250621 + 146222232 146227895 chr1 248956422 - 101967470 101971590 124500 +59 206 206 +36 893 891 +86 736 736 +30 261 261 +29 481 480 +107 55 55 +43 383 383 +82 185 185 +87 1861 321 +43 + +chain 40770 1 249250621 + 146422968 146456645 chr1 248956422 - 102875451 102880669 650 +94 18 18 +359 5 5 +60 67 67 +197 21 21 +71 36 36 +345 12 12 +167 24966 2893 +122 7108 722 +29 + +chain 40238 1 249250621 + 146446934 146447358 chr1 248956422 + 146984913 146985337 1705896 +424 + +chain 37302 1 249250621 + 146455284 146461299 chr1 248956422 + 146988500 146989754 548095 +1066 4761 0 +188 + +chain 36084 1 249250621 + 145317457 145361500 chr1 248956422 + 149503229 149545981 187 +42 43201 41912 +184 94 94 +397 42 40 +83 + +chain 31938 1 249250621 + 146439098 146439782 chr1 248956422 + 146989593 146990277 1515091 +126 162 162 +163 185 185 +48 + +chain 23706 1 249250621 + 13030636 13330101 chr1_KI270766v1_alt 256271 - 81803 236181 392 +297 2887 2884 +74 585 577 +109 74447 48143 +42 220966 102194 +58 + +chain 22342 1 249250621 + 147955378 148009758 chr1 248956422 + 148483286 148563411 903 +45 19889 19464 +39 3037 3336 +7 1 0 +27 30129 52796 +57 519 520 +74 506 3710 +50 + +chain 21725 1 249250621 + 148741823 148744952 chr1 248956422 - 104518510 104521639 217256 +43 1680 1680 +60 1044 1044 +49 176 176 +77 + +chain 21422 1 249250621 + 249058230 249058895 chrX 156040895 + 122549322 122549987 2949698 +107 27 27 +70 38 38 +75 11 11 +124 39 39 +53 41 41 +80 + +chain 21083 1 249250621 + 144621799 144710692 chr1 248956422 + 120449545 120611794 1197 +566 53112 127198 +68 53 53 +132 1163 1163 +35 1547 1547 +60 32095 31365 +62 + +chain 20559 1 249250621 + 146220446 146226905 chr1 248956422 - 128119634 128129899 2984 +33 4677 8483 +55 43 43 +57 801 801 +105 151 151 +25 484 484 +28 + +chain 19783 1 249250621 + 148268252 148285733 chr1 248956422 + 145342784 145368140 1174 +28 17254 25129 +199 + +chain 19622 1 249250621 + 144675427 144710724 chr1 248956422 - 100022688 100057972 1318 +50 1226 1226 +48 108 108 +34 466 466 +98 1834 1830 +120 54 54 +185 16 16 +404 30622 30613 +32 + +chain 19335 1 249250621 + 148738908 148740915 chr1 248956422 - 104515591 104517601 137515 +48 116 116 +1 0 1 +66 451 452 +31 1235 1236 +59 + +chain 19040 1 249250621 + 148341168 148341563 chr1 248956422 + 148121430 148121823 579850 +52 175 173 +168 + +chain 17544 1 249250621 + 146445538 146446008 chr1 248956422 + 146992951 146993421 1729363 +37 284 284 +149 + +chain 15264 1 249250621 + 13027994 13037141 chr1_KI270766v1_alt 256271 + 10979 20119 1953 +33 1005 1005 +28 1373 1365 +31 469 469 +40 133 132 +39 96 96 +63 240 240 +192 53 53 +78 93 93 +196 157 157 +44 416 416 +61 338 338 +74 3843 3845 +52 + +chain 15161 1 249250621 + 148008650 148009693 chr1 248956422 - 128126685 128129546 87724 +48 504 2322 +51 199 199 +57 63 63 +121 + +chain 14622 1 249250621 + 13707676 13708084 chr1 248956422 + 13381217 13381625 2997720 +37 255 255 +116 + +chain 14296 1 249250621 + 13705701 13708522 chr1_KI270766v1_alt 256271 + 177693 181130 1282 +65 1780 2406 +130 37 37 +255 140 131 +197 15 14 +59 15 15 +64 26 26 +38 + +chain 13696 1 249250621 + 12822162 12822307 chr1 248956422 + 12762227 12762372 5498870 +145 + +chain 13584 1 249250621 + 148683946 148684147 chr1_KI270765v1_alt 185285 + 144103 144304 1014 +201 + +chain 12783 1 249250621 + 148361046 148361226 chr1 248956422 - 102011944 102012124 22610586 +70 35 35 +75 + +chain 12639 1 249250621 + 144146068 144168845 chr1 248956422 - 100366269 100406364 1871 +97 14084 26722 +111 8283 12963 +1 24 24 +100 15 15 +62 + +chain 12603 1 249250621 + 146445117 146445859 chr1 248956422 - 103380422 103381164 1369489 +132 16 16 +273 37 37 +284 + +chain 12209 1 249250621 + 144167939 144168117 chr1 248956422 - 102840608 102840786 2279 +178 + +chain 11233 1 249250621 + 148755490 148755611 chr1 248956422 - 104532216 104532337 920274 +121 + +chain 11103 1 249250621 + 144168194 144168379 chr1 248956422 + 149551161 149551346 12034082 +86 68 68 +31 + +chain 11047 1 249250621 + 146437176 146442254 chr1 248956422 + 146987674 146989674 5068 +59 2 0 +26 1740 1740 +41 3102 26 +108 + +chain 10050 1 249250621 + 249059083 249059544 chrX 156040895 - 44465434 44465895 2897300 +72 86 86 +67 7 7 +76 96 96 +57 + +chain 9935 1 249250621 + 148741670 148747635 chr1_KI270711v1_random 42210 - 21032 27015 3915 +38 1814 1811 +24 3338 3355 +40 626 630 +2 25 25 +58 + +chain 9901 1 249250621 + 144463448 144488642 chr1 248956422 - 99293918 99316696 1088 +60 2670 2673 +46 22386 19967 +32 + +chain 9882 1 249250621 + 146420403 146464885 chr1_KI270711v1_random 42210 - 31512 34843 3145 +80 6 6 +9 27927 1118 +160 115 115 +162 15978 1636 +45 + +chain 9260 1 249250621 + 146441958 146442056 chr1 248956422 - 232390422 232390520 31669406 +98 + +chain 9100 1 249250621 + 146425794 146426045 chr1 248956422 - 100848779 100849030 2372255 +53 155 155 +43 + +chain 8829 1 249250621 + 146226274 146226368 chr1 248956422 - 101966748 101966842 1529813 +94 + +chain 8660 1 249250621 + 146430559 146430810 chr1 248956422 - 100848779 100849030 165719 +53 155 155 +43 + +chain 8436 1 249250621 + 146435324 146435575 chr1 248956422 - 100848779 100849030 127511 +53 155 155 +43 + +chain 8031 1 249250621 + 146446769 146446853 chr1 248956422 - 232390553 232390637 34170155 +84 + +chain 7768 1 249250621 + 146441777 146441859 chr1 248956422 + 120828217 120828299 34711210 +82 + +chain 7341 1 249250621 + 146420674 146420756 chr1 248956422 + 146990229 146990311 117422 +82 + +chain 7217 1 249250621 + 13102998 13103076 chr1 248956422 + 12932838 12932916 883954 +78 + +chain 6814 1 249250621 + 13320232 13321094 chr1 248956422 + 13330652 13331514 28292 +42 777 777 +43 + +chain 6795 1 249250621 + 148735504 148738653 chr1 248956422 + 146956076 146959074 115907 +68 775 776 +43 2226 2074 +37 + +chain 5814 1 249250621 + 249059567 249059800 chr11 135086622 - 114394914 114395149 2656788 +68 160 162 +5 + +chain 5657 1 249250621 + 145356568 145359300 chr1 248956422 - 100403442 100406164 1770 +24 2516 2506 +36 97 97 +59 + +chain 5603 1 249250621 + 148360829 148360888 chr1 248956422 - 102011729 102011788 41188631 +59 + +chain 5593 1 249250621 + 146449696 146449755 chr1 248956422 + 146987674 146987733 922461 +59 + +chain 5475 1 249250621 + 13327859 13328589 chr1 248956422 + 13368100 13368823 237546 +25 603 596 +102 + +chain 5394 1 249250621 + 148765396 148765455 chr1 248956422 - 104542141 104542200 85650 +59 + +chain 5176 1 249250621 + 148025289 148025932 chr1 248956422 + 144437473 144438116 998 +27 567 567 +49 + +chain 5114 1 249250621 + 148259479 148281199 chr1 248956422 - 99428211 99460968 928 +33 19853 29328 +198 1594 3156 +42 + +chain 4886 1 249250621 + 144197440 144197496 chr1 248956422 - 103644507 103644563 115301 +56 + +chain 4886 1 249250621 + 13703552 13703604 chr1_KI270766v1_alt 256271 - 242464 242516 14906583 +52 + +chain 4819 1 249250621 + 13046124 13049666 chr1 248956422 - 235624908 235631099 3340 +43 1 1 +33 641 641 +50 52 52 +42 359 359 +44 1 1 +50 2166 4815 +60 + +chain 4726 1 249250621 + 249059206 249059975 chr1 248956422 - 193391815 193392585 3060521 +35 614 615 +120 + +chain 4617 1 249250621 + 144468907 144474666 chr1 248956422 - 100539887 100545643 3292 +23 0 1 +3 702 702 +34 4381 4377 +25 1 1 +45 511 511 +17 1 1 +16 + +chain 4411 1 249250621 + 145327768 145327821 chr1 248956422 - 102860162 102860215 1773 +53 + +chain 4245 1 249250621 + 249059644 249059689 chr2 242193529 + 167155411 167155456 33425797 +45 + +chain 4237 1 249250621 + 145360563 145360623 chr1 248956422 - 103601204 103601264 5826 +60 + +chain 4089 1 249250621 + 146455205 146461110 chr1 248956422 + 146988421 146989566 821982 +79 5740 980 +86 + +chain 3931 1 249250621 + 146224211 146227444 chr1 248956422 - 128493005 128494698 2095 +37 320 320 +80 235 235 +75 1794 254 +32 121 121 +150 344 344 +45 + +chain 3882 1 249250621 + 249059709 249060118 chr3 198295559 - 154353265 154353674 2718430 +66 11 13 +9 258 256 +65 + +chain 3710 1 249250621 + 146449564 146449696 chr1 248956422 + 149547780 149547912 228294 +132 + +chain 3568 1 249250621 + 148747704 148747744 chr1 248956422 - 103559115 103559155 751456 +40 + +chain 3481 1 249250621 + 147851597 147851633 chr1 248956422 + 145475938 145475974 40456863 +36 + +chain 3413 1 249250621 + 148340676 148340751 chr1 248956422 - 101990189 101990264 1883163 +37 11 11 +27 + +chain 3250 1 249250621 + 146439782 146440242 chr1 248956422 - 100848472 100848932 161152 +34 300 300 +30 53 53 +43 + +chain 3243 1 249250621 + 148284196 148284235 chr1 248956422 + 145338054 145338093 1038 +39 + +chain 3208 1 249250621 + 148747278 148747312 chr1 248956422 - 104523965 104523999 1138553 +34 + +chain 3156 1 249250621 + 146446457 146446718 chr1 248956422 - 102840644 102840905 4273383 +261 + +chain 3148 1 249250621 + 144168155 144168194 chr1 248956422 - 103651752 103651791 91574 +39 + +chain 3134 1 249250621 + 249060118 249060188 chr13 114364328 - 32803632 32803702 2378990 +70 + +chain 3091 1 249250621 + 13454498 13454812 chr1 248956422 + 13203236 13203548 1227 +51 108 108 +6 1 0 +47 1 0 +6 1 0 +6 0 4 +56 2 0 +12 1 0 +16 + +chain 3025 1 249250621 + 148747744 148747794 chr1 248956422 + 146980793 146980843 3394 +50 + +chain 3003 1 249250621 + 148817943 148817976 chr1 248956422 + 144604869 144604902 1466 +33 + +chain 2972 1 249250621 + 145359300 145359357 chr1 248956422 - 102886993 102887050 72316 +57 + +chain 2847 1 249250621 + 148785384 148785415 chr1 248956422 - 104562131 104562162 5298 +31 + +chain 2753 1 249250621 + 13500733 13500788 chr20 64444167 + 38461960 38462015 2693354 +55 + +chain 2680 1 249250621 + 149585032 149585062 chr1 248956422 + 149184586 149184616 2033 +30 + +chain 2658 1 249250621 + 146222822 146224427 chr1_KI270711v1_random 42210 + 7580 9129 3788 +67 1508 1452 +30 + +chain 2568 1 249250621 + 249058434 249058721 chr3 198295559 + 165961461 165961748 2959555 +38 210 210 +39 + +chain 2512 1 249250621 + 177376 177417 chr19 58617616 + 242823 242864 1031 +41 + +chain 2507 1 249250621 + 13634859 13634886 chr1 248956422 - 236063087 236063114 2293 +27 + +chain 2428 1 249250621 + 148751438 148751468 chr1 248956422 - 103562888 103562918 148345 +30 + +chain 2408 1 249250621 + 144678636 144679159 chr1 248956422 + 149199756 149200280 2213 +25 1 1 +59 1 1 +16 69 69 +2 0 1 +62 187 187 +54 11 11 +36 + +chain 2388 1 249250621 + 148253956 148253982 chr1 248956422 + 145328521 145328547 1905 +26 + +chain 2380 1 249250621 + 146226217 146226274 chr1 248956422 + 145316992 145317049 6251 +57 + +chain 2360 1 249250621 + 148746343 148746368 chr1 248956422 - 104523029 104523054 830973 +25 + +chain 2343 1 249250621 + 148750280 148750312 chr1 248956422 - 103376018 103376050 145487 +32 + +chain 2337 1 249250621 + 148752937 148752962 chr1 248956422 - 104529661 104529686 564643 +25 + +chain 2319 1 249250621 + 144201184 144201220 chr1 248956422 + 149516013 149516049 1652 +36 + +chain 2288 1 249250621 + 146219059 146220057 chr1 248956422 - 101970599 101971597 105601 +910 38 38 +50 + +chain 2247 1 249250621 + 120681253 120681278 chr1 248956422 + 148754254 148754279 2163699 +25 + +chain 2243 1 249250621 + 146449138 146449386 chr1 248956422 + 120463558 120463806 906468 +248 + +chain 2200 1 249250621 + 249059391 249059444 chrX 156040895 + 155571396 155571449 3079779 +53 + +chain 2185 1 249250621 + 146457637 146457732 chr1 248956422 + 146990852 146990947 910906 +95 + +chain 2149 1 249250621 + 249058895 249058951 chr12 133275309 - 75188 75244 4960107 +56 + +chain 2132 1 249250621 + 144168117 144168155 chr1 248956422 + 149522624 149522662 2544 +38 + +chain 2063 1 249250621 + 145328808 145328836 chr1 248956422 - 102832872 102832902 99143 +24 0 2 +4 + +chain 2018 1 249250621 + 144146377 144146466 chr1 248956422 + 146966028 146966117 1033 +55 29 29 +5 + +chain 2008 1 249250621 + 148009991 148010035 chr1 248956422 + 148568360 148568404 4652 +9 1 1 +34 + +chain 1988 1 249250621 + 144174430 144174457 chr1 248956422 - 103637385 103637412 4492 +27 + +chain 1885 1 249250621 + 148292134 148292159 chr1 248956422 + 145314240 145314265 1252 +25 + +chain 1842 1 249250621 + 144401696 144401744 chr1 248956422 - 128023462 128023510 32064444 +48 + +chain 1795 1 249250621 + 146226072 146226112 chr1 248956422 - 99458595 99458635 3237 +40 + +chain 1778 1 249250621 + 148746578 148746604 chr1 248956422 - 103557988 103558014 5780 +26 + +chain 1643 1 249250621 + 249059444 249059485 chr2 242193529 + 110298565 110298606 3254029 +41 + +chain 1594 1 249250621 + 144146038 144146952 chr1 248956422 + 120448418 120449333 2162 +30 851 852 +33 + +chain 1589 1 249250621 + 206276801 206276856 chr10 133797422 + 78468614 78468669 2949175 +42 9 9 +4 + +chain 1531 1 249250621 + 249059800 249059855 chr7 159345973 + 39274873 39274928 2575353 +55 + +chain 1316 1 249250621 + 148311195 148311229 chr1 248956422 + 145309467 145309501 1849 +34 + +chain 1289 1 249250621 + 146704995 146705025 chr15 101991189 - 62096845 62096875 2284016 +30 + +chain 1262 1 249250621 + 148769575 148769729 chr1 248956422 - 100436320 100436474 907 +154 + +chain 1214 1 249250621 + 146222720 146222763 chr1 248956422 + 148534344 148534387 43402 +43 + +chain 1167 1 249250621 + 148008609 148025883 chr1 248956422 + 146116035 146136475 1207 +41 48 50 +8 17001 20165 +36 101 101 +39 + +chain 1164 1 249250621 + 249060006 249060053 chr7 159345973 - 2434602 2434649 2810155 +47 + +chain 1127 1 249250621 + 148747552 148747577 chr1 248956422 - 232384873 232384898 4540 +25 + +chain 1108 1 249250621 + 146224958 146226072 chr1 248956422 - 99443190 99444312 2222 +47 307 315 +325 82 82 +185 87 87 +81 + +chain 1011 1 249250621 + 146421324 146421367 chr1 248956422 - 104529738 104529781 2003 +43 + +chain 865 1 249250621 + 146224278 146224310 chr1 248956422 + 145576836 145576868 4335 +32 + +chain 618 1 249250621 + 146442066 146442146 chr1 248956422 - 102829927 102830007 955643 +80 + +chain 286 1 249250621 + 147758493 147758522 chr8 145138636 + 38661815 38661844 32691763 +29 + +chain 169 1 249250621 + 147535841 147535872 chr1 248956422 + 145490427 145490458 807 +31 + +chain 12173607359 10 135534747 + 60000 135524747 chr10 133797422 + 14060 133787422 12 +1846 0 1 +1724 1 1 +25 1 1 +2404 2 0 +266 1 1 +29 21 0 +842 1 12 +63 1 1 +181 0 10 +646 1 1 +42 1 1 +141 1 1 +18 1 0 +231 1 1 +41 1 1 +231 0 6 +373 1 1 +44 1 1 +2539 1 1 +57 2 0 +15 1 1 +372 0 2 +594 1 1 +18 1 1 +760 1 0 +410 8 8 +588 1 1 +38 1 1 +1163 1 1 +34 1 1 +226 11 11 +200 16 15 +1341 1 1 +25 1 0 +4 1 1 +1144 1 0 +278 14 14 +112 1 1 +26 1 1 +2595 1 1 +33 1 1 +190 1 1 +22 1 1 +67 11 11 +300 10 10 +679 1 1 +66 1 1 +1959 1 1 +19 1 1 +107 1 1 +74 2 2 +74 1 1 +18 1 1 +523 14 14 +2830 1 1 +40 1 1 +1027 1 1 +39 1 1 +1187209 1 1 +31 1 1 +1302 2 0 +85 0 2 +142 2 0 +488 14 14 +734 0 2 +759 0 4 +755 1 1805 +16 0 216 +55 5 197 +20 0 120 +71 1 188 +74 0 117 +69 0 4 +6 0 267 +57 17 280 +82 0 102 +21 1 1 +50 25 1 +49 0 24 +48 0 144 +88 0 482 +53 25 0 +3 0 48 +67 24 0 +12 24 0 +2442 0 11 +9873 0 1 +9627 3 0 +272 6 0 +3157 136 0 +795 0 1 +388799 0 1 +806516 0 2 +2686436 0 1 +3290 4 0 +26 1 1 +4883 0 1 +59 12 0 +460 1 1 +21 1 1 +200 0 5 +21 1 1 +1301 0 3 +1239 1 1 +17 1 0 +62 1 1 +82 0 236 +78 1 1 +19 1 1 +1166479 4 4 +883 0 1 +1235471 1 0 +21 1 1 +3769483 36 0 +1499555 1 0 +1170599 0 1 +3836747 246930 0 +13659589 0 1 +7030794 50000 45797 +286100 3441764 3235767 +70 179 3859 +3830016 1102205 226417 +161234 1 1 +36 1 1 +8470 1 1 +15 1 1 +2839 13 13 +4352 1 0 +196 0 6 +866 0 2 +251 13 13 +1418 1 1 +35 1 1 +1026 1 1 +49 1 1 +162 16 16 +948 0 2 +1387 0 1 +3977 0 2 +840 1 0 +446 4 0 +1158 8 8 +2152 5 5 +74 0 1 +5965 0 2 +907 0 1 +225 0 6 +2680 0 2 +80 1 1 +1948 1 1 +154 1 1 +3568 0 3 +146 3 0 +4494 15 15 +850 40 0 +783 1 1 +20 1 1 +246 3 0 +955 0 1 +562 2 0 +1384 1 1 +29 1 1 +331 1 1 +32 0 1 +13 1 1 +2370 98 98 +285 94 94 +226 6 6 +825 8 8 +1080 6 6 +600 0 1 +724 36 36 +3524 9 9 +263 1 0 +2148 0 3 +1872 1 2 +172 83 83 +84 24 23 +936 1 1 +52 1 1 +2020 1 1 +42 1 1 +111 0 4 +180 2 2 +32 0 1 +109 1 1 +24 1 1 +620 4 4 +15 2 0 +258 0 1 +20 1 1 +54 16 16 +157 1 1 +36 1 1 +76 1 1 +26 2 0 +6 0 1 +13 0 8 +559 1 1 +35 1 1 +1020 1 1 +79 1 1 +203 18 18 +143 20 0 +304 1 1 +131 1 1 +1196 1 1 +49 3 4 +171 3 0 +14 467 0 +77 1 1 +175 3 0 +594 4 5 +66 3 4 +292 2 0 +308 33 33 +62 333690 306466 +1349 1 1 +34 1 1 +54 6 6 +508 1 1 +53 1 1 +2973 1 1 +17 1 1 +368 1 0 +1401 1 0 +194 1 1 +34 1 1 +319 4 4 +1276 1 0 +637 18 18 +156 0 9 +36 1 0 +141 1 1 +198 2 0 +42 1 1 +425 1 1 +43 1 1 +501 2 2 +16 1 1 +484 3 3 +63 1 1 +113 5 5 +78 9 11 +162 11 12 +957 1 1 +28 1 1 +712 1 1 +34 1 1 +600 1 1 +29 1 1 +181 1 1 +57 1 1 +448 1 1 +66 1 1 +282 1 1 +31 1 0 +81 1 0 +373 0 1 +83 19 19 +190 1 0 +662 16 16 +279 0 11 +39 1 2 +414 0 1 +56 1 0 +256 1 1 +44 4 4 +111 0 1 +711 0 1 +446 1 0 +478 1 1 +55 1 1 +93 2 2 +44 1 1 +220 1 1 +47 1 1 +1992 3 0 +10 1 1 +1000 0 16 +1441 1 0 +1222 1 1 +20 1 1 +581 1 0 +1364 50 0 +46 0 50 +51 3 1 +5640 1 1 +42 1 1 +333 1 1 +36 1 1 +406 1 1 +46 1 0 +329 0 2 +1438 1 0 +79 1 1 +245 1 1 +41 1 1 +139 0 1 +68 15 15 +1115 1 0 +27 1 1 +648 1 1 +94 1 1 +77 1 1 +32 1 1 +150 10 10 +729 1 1 +32 1 1 +570 26 20 +60 5 5 +89 10 10 +85 1 1 +27 1 0 +1650 1 1 +28 1 1 +859 1 1 +38 1 1 +333 1 1 +53 1 1 +65 9 9 +69 10 10 +90 1 1 +51 1 1 +113 0 1 +341 1 0 +42 1 1 +413 1 1 +43 1 1 +1148 14 14 +681 1 0 +1606 4 4 +315 11 0 +184 1 4 +120 15 15 +800 1 1 +45 1 1 +1512 19 19 +333 1 1 +83 2 2 +73 7 7 +437 1 1 +32 0 2 +10 1 1 +490 1 0 +478 13 13 +155 1 1 +15 1 1 +550 0 1 +741 0 1 +885 1 1 +19 1 1 +82 1 1 +78 1 1 +69 1 3 +374 1 1 +29 1 1 +390 0 4 +51 1 1 +1839 0 1 +88 0 4 +1060 1 1 +53 0 2 +224 1 1 +22 1 1 +1080 1 0 +1797 22 22 +1215 0 9 +809 2 0 +404 1 0 +29 1 1 +477 0 6 +904 1 1 +31 1 1 +677 1 1 +30 1 0 +77 15 15 +66 1 1 +46 1 1 +581 1 1 +19 1 1 +595 1 1 +42 1 1 +276 6 6 +792 0 1 +51 1 1 +86 1 1 +866 1 1 +42 1 1 +721 1 1 +35 4 4 +600 9 9 +639 9 7 +106 1 1 +81 1 1 +304 1 1 +25 1 1 +155 4 4 +58 1 1 +25 1 1 +193 3 0 +105 1 1 +41 0 2 +71 0 1 +8 0 1 +74 3 3 +107 1 1 +16 1 1 +153 1 1 +34 1 1 +59 15 6 +65 1 1 +329 1 1 +12 1 0 +41 1 1 +135 32 21 +67 1 1 +152 1 1 +150 1 1 +225 1 1 +19 1 1 +146 1 0 +62 1 1 +711 2 0 +6 5 0 +283 1 1 +50 1 1 +213 1 1 +32 1 1 +53 11 0 +246 15 14 +845 1 1 +22 1 1 +304 16 16 +691 9 0 +58 13 1 +22 1 1 +497 1 1 +43 1 1 +83 1 1 +22 28 0 +105 1 1 +318 2 0 +33 1 1 +50 1 1 +42 1 1 +65 1 1 +44 1 1 +151 1 1 +59 1 1 +359 4 4 +589 1 1 +48 1 1 +301 1 1 +42 1 1 +80 1 1 +15 1 1 +456 2 2 +19 1 1 +575 1 1 +41 0 2 +100 2 2 +889 6 6 +51 1 1 +44 11 0 +193 5 5 +27 0 10 +41 0 4 +117 1 1 +156 2 2 +58 1 0 +79 1 1 +176 1 1 +39 1 1 +54 1 1 +35 1 1 +573 27 26 +434 1 0 +75 1 1 +17 1 1 +209 1 0 +156 2 0 +189 2 6 +35 1 1 +784 1 1 +54 1 1 +133 17 17 +108 12 0 +44 1 1 +296 8 8 +344 1 1 +36 1 1 +189 1 1 +83 1 1 +125 1 1 +53 3 3 +284 1 1 +139 1 1 +256 1 1 +38 1 1 +1190 1 0 +316 1 1 +58 1 1 +53 1 1 +44 1 1 +151 6 0 +420 403 0 +84 0 1 +172 1 0 +242 2 0 +68 30 31 +61 3 3 +33 1 1 +384 1 1 +32 1 1 +715 1 1 +44 1 1 +113 1 1 +32 1 1 +134 4 1 +50 1 1 +41 1 1 +94 1 1 +41 1 1 +68 1 1 +19 1 1 +204 1 1 +70 1 1 +152 13 14 +789 14 18 +63 12 12 +99 4 4 +24 5 0 +10 0 2 +21 0 18 +395 7 7 +101 1 1 +109 1 1 +50 1 1 +52 1 1 +143 1 1 +58 1 1 +71 1 0 +129 1 1 +170 2 2 +129 1 1 +20 1 1 +104 1 1 +64 1 1 +133 1 1 +60 1 1 +102 0 1 +27 1 1 +66 4 0 +43 1 1 +222 1 1 +25 1 1 +606 7 7 +136 1 1 +38 1 1 +247 4 8 +53 1 1 +37 1 1 +302 1 1 +18 1 0 +23 1 1 +228 20 4 +51 0 1 +32 1 1 +136 0 1 +602 6 9 +96 1 1 +5 1 0 +38 1 1 +273 1 1 +55 1 1 +233 0 1 +137 1 1 +36 1 1 +93 29 29 +89 1 1 +83 0 2 +32 3 3 +174 23 23 +132 5 5 +78 1 1 +223 1 1 +24 1 1 +129 1 1 +40 1 1 +118 0 97 +60 1 1 +46 2 2 +258 1 1 +40 1 1 +63 1 1 +29 3 3 +656 2 1 +56 3 3 +55 1 1 +10 1 1 +175 5 8 +57 1 1 +350 1 1 +13 1 1 +184 1 1 +40 1 1 +970 0 4 +305 33 29 +69 196 196 +34 0 8 +162 0 9 +98 73 73 +76 141 136 +288 46 47 +159 23 22 +175 31 31 +80 4 4 +275 1 1 +26 1 1 +861 1 1 +76 1 1 +58 1 0 +179 23 23 +221 12 12 +248 1 1 +23 3 3 +274 25 26 +169 9 9 +79 180 183 +182 46 46 +124 86 86 +415 10 0 +217 86 86 +61 35 35 +84 52 52 +56 7 7 +296 65 66 +233 52 51 +143 47 46 +118 24 24 +104 106 105 +163 31 31 +85 58 59 +52 14 14 +85 214 217 +96 14 14 +264 45 43 +295 6 6 +54 71 71 +88 167 165 +50 63 63 +230 25 25 +85 16 15 +58 27 27 +98 48 48 +132 4 4 +72 31 31 +121 96 95 +102 1 0 +303 12 12 +142 80 84 +80 66 66 +60 13 13 +58 33 37 +109 51 51 +89 70 70 +435 14 14 +140 41 36 +98 41 41 +98 53 53 +217 39 39 +94 37 37 +124 253 253 +67 98 97 +81 29 29 +54 48 48 +239 16 16 +104 66 66 +64 0 3 +187 13 13 +687 49 49 +52 64 64 +258 261 251 +169 9 9 +227 80 80 +66 117 117 +82 28 28 +98 38 38 +75 14 14 +199 93 93 +70 13 13 +68 17 17 +66 60 60 +409 49 49 +53 37 35 +52 73 73 +121 9 9 +250 74 75 +141 23 23 +164 80 80 +434 130 130 +79 185 185 +123 1 0 +212 190 188 +204 80 80 +189 6 6 +58 58 58 +151 16 18 +61 17 17 +116 36 36 +151 7 7 +174 57 46 +144 111 111 +92 92 92 +54 57 57 +375 1 5 +162 1 0 +176 41 41 +428 182 182 +116 88 88 +279 28 28 +187 49 56 +419 12 11 +53 51 48 +212 106 103 +142 67 67 +77 43 51 +84 241 244 +82 0 1 +147 4 4 +94 68 68 +176 6 6 +106 659992 659992 +106 6 6 +198 46 46 +94 4 4 +136 1 0 +93 523 512 +142 103 106 +212 48 51 +53 11 12 +419 56 49 +187 28 28 +279 88 88 +116 182 182 +428 41 41 +163 0 1 +175 5 1 +375 57 57 +54 92 92 +92 111 111 +144 46 57 +174 7 7 +151 36 36 +116 17 17 +61 18 16 +151 58 58 +58 6 6 +189 80 80 +204 188 190 +206 0 1 +129 185 185 +79 130 130 +434 80 80 +164 23 23 +141 75 74 +78 57 57 +115 9 9 +121 73 73 +52 35 37 +53 49 49 +409 60 60 +66 17 17 +68 13 13 +70 93 93 +199 14 14 +75 38 38 +98 28 28 +82 117 117 +66 80 80 +227 9 9 +169 251 261 +258 64 64 +52 49 49 +687 13 13 +182 3 0 +69 66 66 +104 16 16 +239 48 48 +54 29 29 +81 97 98 +67 253 253 +124 37 37 +94 39 39 +217 53 53 +98 41 41 +98 36 41 +140 14 14 +435 70 70 +89 51 51 +109 37 33 +58 13 13 +60 66 66 +80 84 80 +142 12 12 +294 0 1 +111 95 96 +121 31 31 +72 4 4 +132 48 48 +98 27 27 +58 15 16 +85 25 25 +230 63 63 +50 1 3 +62 102 102 +88 71 71 +54 6 6 +295 43 45 +264 14 14 +96 217 214 +85 14 14 +52 59 58 +85 31 31 +163 105 106 +104 24 24 +118 46 47 +143 51 52 +233 66 65 +296 7 7 +56 52 52 +84 35 35 +61 86 86 +217 0 10 +422 79 79 +124 46 46 +182 183 180 +79 62 62 +116 26 25 +274 27 27 +248 12 12 +221 23 23 +179 0 1 +58 78 78 +861 28 28 +275 4 4 +80 31 31 +175 22 23 +159 47 46 +288 136 141 +76 73 73 +77 9 0 +164 8 0 +106 143 143 +69 29 33 +302 4 0 +973 42 42 +184 15 15 +350 66 63 +175 12 12 +55 60 61 +656 33 33 +63 42 42 +258 49 49 +57 97 0 +121 42 42 +129 26 26 +223 84 84 +132 23 23 +174 121 119 +89 29 29 +93 38 38 +131 1 0 +239 57 57 +273 45 46 +96 9 6 +601 1 0 +137 34 33 +51 4 20 +228 43 44 +302 39 39 +53 8 4 +247 40 40 +136 7 7 +606 27 27 +222 44 48 +66 29 28 +102 62 62 +133 66 66 +104 22 22 +129 173 173 +122 0 1 +78 60 60 +143 54 54 +50 111 111 +101 7 7 +395 79 64 +99 12 12 +63 18 14 +789 14 13 +152 72 72 +204 21 21 +68 43 43 +94 43 43 +50 1 4 +134 34 34 +113 46 46 +715 34 34 +384 37 37 +61 31 30 +67 0 2 +240 0 1 +165 1 0 +92 0 403 +399 0 6 +174 46 46 +53 60 60 +309 0 1 +1197 40 40 +256 141 141 +284 57 57 +125 85 85 +189 38 38 +344 8 8 +296 25 37 +128 17 17 +133 56 56 +784 42 38 +167 0 2 +171 0 1 +216 19 19 +74 0 1 +435 26 27 +573 37 37 +54 41 41 +176 80 81 +216 205 191 +193 45 56 +51 6 6 +889 51 51 +53 42 40 +575 22 22 +456 17 17 +80 44 44 +301 50 50 +589 4 4 +359 61 61 +151 46 46 +65 44 44 +50 34 36 +318 129 157 +83 45 45 +497 63 84 +710 16 16 +304 24 24 +845 14 15 +245 0 11 +54 34 34 +213 52 52 +286 3 10 +711 63 64 +146 21 21 +225 152 152 +152 89 100 +135 55 56 +329 72 81 +59 36 36 +153 18 18 +107 202 198 +105 0 3 +193 27 27 +58 4 4 +155 27 27 +304 83 83 +106 7 9 +639 9 9 +600 40 40 +721 44 44 +866 88 88 +44 1 0 +799 6 6 +276 44 44 +595 21 21 +581 48 48 +66 15 15 +77 31 32 +677 33 33 +879 6 0 +502 30 31 +388 0 2 +804 9 0 +1236 22 22 +1794 0 1 +1083 24 24 +224 56 54 +1049 4 0 +93 1 0 +1845 56 52 +390 31 31 +374 3 1 +69 80 80 +82 21 21 +877 1 0 +739 1 0 +560 17 17 +155 13 13 +468 0 1 +500 46 44 +437 7 7 +73 86 86 +333 19 19 +1512 47 47 +800 15 15 +120 4 1 +167 0 11 +332 4 4 +1593 0 1 +694 14 14 +1148 45 45 +413 43 44 +341 1 0 +113 53 53 +90 10 10 +69 9 9 +65 55 55 +333 40 40 +859 30 30 +1650 28 29 +85 10 10 +89 5 5 +60 20 26 +570 34 34 +729 10 10 +150 34 34 +77 96 96 +648 28 29 +1115 15 15 +60 1 0 +147 43 43 +245 80 81 +1431 2 0 +336 47 48 +406 38 38 +333 44 44 +5641 1 2 +47 50 0 +3 0 50 +1408 0 1 +584 22 22 +1219 0 1 +1420 16 0 +1035 1 4 +2260 1 1 +44 2 2 +93 1 1 +55 1 1 +469 0 1 +454 1 0 +712 1 0 +111 49 49 +256 54 54 +417 52 40 +279 16 16 +657 0 1 +195 19 19 +73 1 0 +383 0 1 +81 32 33 +282 68 68 +448 59 59 +812 36 36 +712 30 30 +957 12 11 +162 11 9 +78 5 5 +113 67 67 +484 19 19 +501 45 45 +443 25 27 +198 195 179 +805 0 1 +174 1 0 +1108 4 4 +319 36 36 +193 0 1 +1771 19 19 +2973 55 55 +508 6 6 +54 36 36 +1498 0 2 +2765 20 6 +830 28 28 +1622 1 0 +260 10 10 +1513 46 46 +3414 35 36 +649 1 0 +173 2 0 +188 17 17 +431 39 39 +239 23 23 +512 9 8 +643 0 4 +442 0 9 +121 2 1 +2085 36 36 +261 0 7 +583 1 0 +477 0 2 +68 22 22 +345 81 81 +747 18 18 +875 29 29 +606 20 20 +804 0 1 +601 39 39 +57 13 13 +126 91 91 +578 0 1 +1758 40 32 +188 4 0 +488 120 124 +679 0 4 +77 43 42 +603 0 1 +65 18 18 +107 51 50 +121 5 6 +61 119 119 +2410 31 32 +841 5 5 +332 0 3 +538 10 10 +48 1 0 +482 0 1 +441 246 1894 +1556 0 1 +485 19 19 +1025 121 121 +228 5 0 +449 0 1 +52 15 15 +436 11 0 +564 0 1 +682 33 32 +81 14 13 +550 3 0 +585 17 15 +640 1 0 +235 22 28 +66 35 35 +685 14 14 +392 0 2 +1737 1 0 +310 0 2 +935 1 0 +314 31 0 +52 17 17 +997 3 0 +687 1 0 +426 100 91 +150 32 32 +404 12 12 +85 36 34 +165 349 44 +454 39 40 +440 36 34 +88 123 123 +503 201 197 +128 33 33 +78 33 33 +442 38 38 +105 2 0 +202 43 44 +157 13 13 +182 24 24 +104 14 14 +143 5 0 +156 2 0 +247 102 102 +324 1 0 +67 11 18 +430 34 34 +795 56 56 +213 1 0 +1315 21 21 +104 2 0 +88 0 2 +209 1 0 +1450 2 0 +176 0 1 +132 25 25 +186 136 135 +56 17 17 +354 0 1 +378 388 61 +83 33 33 +58 100 103 +131 44 44 +518 25 25 +586 119 130 +413 0 1 +700 16 16 +429 100000 289968 +1598 1 1 +26 1 1 +84 1 1 +18 1 1 +459 1 1 +41 1 1 +107 1 1 +60 1 1 +3834 1 1 +47 1 1 +50 1 1 +26 1 1 +61 5 9 +282 1 0 +388 7 7 +306 0 1 +965 1 0 +113 0 1 +826 1 0 +6526 3 0 +395 0 3 +1654 0 10 +580 1 1 +31 2 2 +148 1 1 +39 1 1 +144 1 1 +48 1 1 +147 1 1 +21 1 1 +554 1 1 +72 1 1 +1955 1 0 +1369 9 9 +1326 1 0 +175 0 1 +895 0 1 +1778 19 27 +4187 0 1 +103 5 5 +6308 2 0 +3593 2 0 +921 0 1 +3853 0 3 +1775 1 1 +21 1 1 +666 13 13 +477 12 12 +1948 0 1 +716 1 1 +55 1 1 +1212 0 4 +678 11 1 +1459 2 0 +10420 4 0 +3224 0 1 +298 1 0 +329 21 3 +3840 0 4 +603 0 1 +790 17 16 +227 0 1 +486 5 4 +4145 0 3 +4686 1 1 +32 1 1 +1064 9 9 +1502 7 1 +445431 1 0 +3648 1 0 +848588 1 0 +557190 221576 0 +198 1 1 +257 2 2 +64 3 0 +262 1 1 +26 3 3 +1065 0 8 +125 1 1 +86 1 1 +66 16 16 +220 9 0 +14 1 1 +142 1 0 +238 4 4 +722 1 4 +329 6 6 +436 1 1 +175 1 1 +325 1 1 +124 1 1 +567 1 1 +50 5 0 +71 1 1 +157 1 1 +76 0 1 +76 1 1 +268 2 0 +39 1 1 +422 1 1 +21 1 1 +147 1 0 +330 1 1 +121 1 1 +156 1 1 +31 0 1 +9 1 1 +161 0 8 +81 1 0 +80 10 10 +78 1 1 +70 0 11 +7 1 1 +177 13 11 +147 1 1 +34 1 1 +66 1 1 +32 1 1 +140 0 255 +141 1 1 +40 1 1 +784 1 1 +59 1 1 +220 5 5 +329 9 9 +80 1 1 +27 1 1 +51 1 1 +44 1 1 +664 1 1 +30 1 1 +128 1 1 +48 2 2 +132 4017 4038 +52 1 1 +129 1 1 +185 0 1 +118 1 1 +81 1 1 +143 1 1 +35 1 1 +627 1 1 +20 1 1 +131 5 0 +446 1 1 +6 0 2 +41 1 1 +185 14 14 +118 1 1 +105 0 2 +96 1 1 +65 2 1 +57 1 1 +90 1 1 +34 1 1 +70 0 4 +174 1 0 +125 1 1 +45 1 1 +297 0 1 +39 1 1 +237 1 1 +70 1 1 +51 8 18 +284 10 5 +24 1 1 +768 1 1 +42 3 3 +137 0 15 +57 1 1 +143 1 1 +115 13 15 +818 1 1 +31 1 2 +33 1 1 +613 1 0 +93 1 1 +65 1 1 +104 0 1 +75 1 1 +5 0 1 +4 1 0 +23 1 0 +41 1 1 +486 1 1 +19 2 0 +57 1 1 +238 0 1 +21 1 1 +100 1 1 +17 1 1 +218 2 2 +18 1 1 +186 1 1 +57 1 1 +226 0 2 +26 1 1 +110 2 2 +44 1 1 +431 0 15 +327 16 21 +156 1 1 +58 5 0 +79 1 1 +177 1 1 +23 1 1 +336 1 1 +98 0 3 +88 1 1 +49 1 1 +113 5 5 +30 1 1 +127 26 48 +77 3 0 +303 1 0 +106 1 1 +26 1 1 +266 13 7 +105 1 1 +28 2 0 +10 0 2 +89 1 1 +204 1 1 +16 1 1 +96 1 1 +63 1 0 +49 1 1 +77 1 1 +74 1 1 +536 6 2 +125 1 0 +21 1 1 +128 9 9 +54 1 1 +19 1 1 +334 1 1 +75 5 5 +182 1 1 +90 2 2 +68 3 1 +59 1 1 +44 295 0 +35 330177 19 +296 21 21 +237 7 7 +346 18 18 +559 14 15 +148 1 1 +42 10 0 +49 1 1 +509 1 1 +39 2 0 +2 5 0 +45 1 1 +189 1 1 +48 1 1 +402 1 0 +6044233 1 0 +525897 0 1 +1562784 1 0 +165752 0 1 +1100946 0 2 +2473274 1 0 +775668 1 0 +1459224 1 0 +126978 0 1 +191931 0 1 +28603 0 1 +43810 0 1 +438996 1 0 +3003444 0 1 +933196 0 1 +1998276 1 0 +1026928 1 0 +6222522 0 1 +1257228 0 1 +6095417 1 0 +10722329 0 1 +90435 1 0 +7377058 1 0 +8824363 1 0 +2643161 0 2 +3091 2 0 +4587 1 0 +1876 1 0 +4243 1 0 +2909 1 0 +2606 1 1 +38 1 1 +57 1 0 +14055 0 2 +3357 1 0 +2919 1 1 +32 1 1 +797 1 0 +19 1 1 +7456 0 1 +571 1 0 +931 1 0 +1888 1 0 +1942 0 1 +8808 0 1 +498 0 3 +2433 0 1 +6 1 0 +24 0 1 +8 1 2 +1618 1 0 +5069 0 1 +1799 0 1 +2325 0 2 +2168 0 1 +334 0 1 +64 0 1 +30 0 1 +3943 1 0 +36 0 1 +9247 0 1 +1563 2 0 +14841 1 0 +168 0 2 +10294 6 0 +2562 10 10 +4111 0 1 +1229 0 1 +1933 4 0 +42 12 0 +1549 20 0 +1084 0 1 +4355 0 4 +6589 23 23 +3371 2 0 +4593 0 2 +1039 0 319 +2469 2 0 +6622 4 4 +4051 7 0 +2169 1 0 +2896 0 1 +4817 5 0 +482 22 0 +39 2 0 +756 4 0 +464068 1 0 +420012 1 0 +468706 0 1 +1553532 1 0 +2759013 1 0 +147030 1 0 +636174 1 0 +633355 1 0 +1756900 50000 120947 +2696597 150000 40305 +3859925 0 1 +755410 50000 15927 +245825 0 1 +298 50000 68831 +1750264 0 76179 +46956 + +chain 40781173 10 135534747 + 46476964 47923407 chr10 133797422 - 86722365 88092039 128 +1858 45 45 +2719 0 2 +5515 0 1 +4088 0 1 +6278 0 1 +953 30 30 +4368 1 0 +7663 0 1 +17033 10 10 +666 446 0 +248 0 1 +580 0 23 +5215 2 1 +909 11 11 +589 1 0 +647 8 0 +2261 0 2 +7368 75 79 +770 1 0 +1816 0 1 +4369 21 0 +103 1 0 +3165 10 10 +304 1 0 +1007 2 0 +108 0 4 +735 45 45 +906 1 0 +774 7 0 +1389 0 1 +807 0 1 +226 0 1 +6263 0 1 +3148 22 22 +3167 0 1 +2413 1 0 +3321 4 0 +69 9 2 +3502 22 22 +1432 78 76 +656 27 27 +1820 0 2 +1227 0 2 +3487 0 1 +4586 16 12 +694 0 38 +2336 16 16 +3132 6 6 +633 0 4 +2124 12 12 +3375 0 4 +3751 1 0 +5855 17 21 +6549 0 2 +756 7 6 +1468 32 32 +570 1 0 +2201 2 0 +1815 14 14 +2823 8 0 +4641 33 33 +6088 52 51 +247 1 0 +2831 0 1 +372 33 33 +1972 8 0 +539 43 43 +91 8 0 +631 1 0 +166 1 2 +215 3 0 +8937 1 0 +2244 17 17 +2592 1 0 +254 0 6 +41 6 0 +1071 18 18 +2447 24 24 +3112 0 1 +2370 0 1 +1939 49 49 +5857 6 18 +999 83 83 +4160 13 13 +615 358 0 +260 22 20 +5859 10 8 +541 41 41 +36 4 0 +1386 1 0 +697 2 0 +1177 0 4 +251 28 28 +181 54 54 +1906 128 128 +436 15 0 +866 0 2 +1828 22 22 +156 4 0 +83 0 1 +803 51 51 +773 1 0 +903 14 16 +2381 14 14 +410 43 43 +237 0 2 +485 119 120 +151 36 33 +59 7 3232 +195 20 21 +1368 32 32 +581 11 11 +508 38 38 +898 26 26 +365 6 6 +987 17 17 +1114 23 36 +2676 6 6 +350 45 45 +3301 0 4 +591 0 2 +1590 13 11 +898 6 6 +466 2 0 +1341 44 44 +935 1 0 +135 29 29 +2304 12 0 +499 21 21 +1287 19 19 +652 84 85 +3153 37 37 +328 1 0 +908 0 2 +285 1 0 +377 0 2 +377 42 42 +862 1 0 +184 2 0 +667 16 16 +1219 0 8 +181 12 12 +3186 1 0 +317 5 5 +5522 24 22 +187 1 0 +480 1 0 +1718 0 3 +1426 26 26 +2948 2 0 +424 28 0 +5637 4 0 +445 38 40 +8921 3 0 +388 1 0 +804 0 13 +1232 22 22 +1794 1 0 +1083 24 24 +221 54 59 +1033 15 18 +95 0 1 +1845 52 56 +390 31 31 +373 1 4 +58 91 91 +980 0 1 +1300 17 17 +155 13 13 +114 7 6 +270 13 13 +65 1 0 +500 44 46 +209 82 82 +227 36 36 +3398 4 4 +187 17 16 +1400 3 0 +684 14 14 +896 5 0 +236 61 61 +448 9 8 +331 4 0 +144 33 33 +64 36 36 +69 9 9 +65 55 55 +333 40 40 +694 0 6 +1370 8 8 +460 1 0 +114 10 10 +89 5 5 +60 26 20 +570 34 34 +729 10 10 +150 34 34 +125 48 48 +380 1 3 +293 1 0 +1115 15 15 +60 0 1 +147 43 43 +245 83 80 +1431 0 2 +294 46 45 +199001 1 1 +38 1 1 +15435 36476 36656 +2087 4 0 +851 11 0 +321 1 1 +23 1 1 +437 5 0 +268 10 0 +72 0 6 +649 1 1 +58 1 1 +939 8 8 +124 0 2 +204 2 3 +56 0 1 +5013 1 1 +21 1 1 +1159 1 1 +45 1 1 +1846 0 4 +2287 11 11 +1599 1 1 +39 1 1 +986 1 3 +1024 1 1 +21 1 1 +1658 1 1 +22 1 1 +438 0 1 +44 1 1 +70 1 1 +37 1 1 +1120 63 98 +1597 7 7 +198 4 0 +202 1 1 +93 1 1 +2140 1 1 +26 1 1 +877 328 0 +1807 1 1 +17 1 0 +622 3 0 +79 1 1 +41 1 1 +62 2 0 +30 1 1 +93 1 1 +44 1 1 +569 4 0 +69 1 1 +614 1 1 +35 1 1 +1075 6 3 +184 1 0 +52 14 15 +823 13 13 +110 1 1 +50 1 1 +2726 2 0 +4076 1 1 +72 1 1 +97 8 8 +2293 0 2 +798 1 1 +28 1 1 +882 1 1 +44 1 1 +2590 8 8 +696 0 1 +15 1 1 +468 1 1 +33 1 1 +209 1 1 +34 1 1 +3104 1 1 +30 1 1 +858 0 6 +152 1 1 +36 1 1 +2869 1 1 +142 1 1 +1109 11 11 +1827 2 0 +3647 1 1 +45 1 1 +1540 4 4 +5577 1 1 +17 1 1 +465 5 5 +416 10 10 +973 0 4 +37 1 1 +701 1 1 +16 1 1 +539 1 1 +63 1 1 +64 0 2 +378 2 2 +50 1 1 +111 0 1 +25 1 1 +76 2 2 +49 1 1 +177 15 15 +2874 3 0 +315 1 1 +21 1 1 +1390 1 1 +69 1 1 +109 1 1 +23 1 1 +1434 1 4 +177 9 9 +823 1 1 +28 1 1 +4554 0 1 +220 7 7 +455 16 0 +2934 22 26 +137 7 7 +92 3 0 +32 1 1 +516 15 15 +197 1 1 +29 1 1 +3124 27 24 +648 2 0 +15 4 4 +299 1 1 +33 1 1 +1616 1 1 +38 1 1 +1181 1 1 +30 1 1 +376 1 1 +28 1 1 +892 1 2 +4019 1 0 +2206 0 5 +4388 8 0 +2251 2 2 +77 1 1 +265 15 15 +403 77 77 +104 64 64 +232 118 117 +144 11 11 +95 1016 21 +90 100 100 +172 2 0 +273 40 40 +406 4 4 +291 7 7 +92 2 0 +549 0 3 +131 26 26 +594 1 1 +19 1 1 +167 8 0 +294 1 1 +34 1 1 +205 1 1 +55 1 1 +579 1 1 +43 1 1 +600 15 15 +954 1 1 +106 1 1 +634 1 1 +115 1 1 +517 1 1 +98 1 1 +495 13 12 +899 54 54 +589 33 35 +77 61 58 +51 4 7 +621 48 48 +1100 68 68 +230 2 0 +127 184 182 +52 15 15 +349 48 53 +81 13 13 +96 12 12 +620 7 7 +170 30 23 +994 118 118 +356 5 5 +380 243 248 +124 12 12 +73 21 21 +260 3 0 +53 12 11 +416 52 59 +94 17 17 +52 52 52 +140 14 14 +83 148 148 +101 42 42 +82 6 6 +167 48 48 +53 45 45 +78 127 127 +171 0 1 +169 1 0 +215 47 46 +56 4 4 +153 11 11 +265 29 29 +128 0 3 +72 5 5 +300 10 0 +264 0 1 +856 144 144 +642 24 24 +434 40 40 +200 38 38 +195 9 9 +1864 13 13 +88 10 10 +693 22 22 +153 13 9 +225 81 81 +115 37 37 +997 76 76 +322 12 13 +261 29 29 +81 26 26 +213 0 1 +124 21 21 +98 51 51 +368 41 41 +138 0 25 +141 14 14 +256 1 2 +214 18 18 +600 0 3 +512 25 24 +866 25 25 +230 20 20 +116 53 54 +82 5 5 +435 1 0 +604 27 27 +641 36 36 +310 28 37 +301 23 23 +69 94 95 +861 1 3 +425 115 115 +88 83 83 +145 108 110 +162 51 51 +142 48 49 +835 37 37 +1418 61 61 +175 20 23 +83 422 423 +280 106 134 +189 11 11 +99 54 54 +91 4 0 +344 59 63 +911 42 42 +184 15 15 +198 52 52 +88 108139 181066 +107 164 172 +70 129 151 +407 29 29 +338 76 72 +236 17 17 +75 305 314 +74 132 132 +76 32 35 +77 75 75 +65 107 107 +163 819 776 +52 163 162 +67 235 232 +58 47 47 +431 29 29 +56 66 65 +137 491 500 +60 23 23 +158 21 21 +55 96 97 +67 1200 867 +54 571891 421299 +151 290 281 +55 958 556 +63 72 72 +68 83 83 +103 210 206 +236 4 4 +61 45 45 +112 6 6 +106 225 216 +75 95 93 +104 284 287 +108 129 131 +63 9 9 +135 176 176 +76 111 111 +232 4001 4281 +50 122 122 +424 255 255 +52 207 217 +164 34 32 +68 462 467 +59 87 86 +126 557 542 +61 187 188 +95 10 10 +63 190 191 +115 87 92 +67 25 25 +56 53 53 +86 168 168 +57 76 76 +193 111 111 +80 262 264 +215 1083 1114 +98 72 69 +138 58 60 +275 134 139 +63 102 102 +53 49 49 +64 193 192 +400 33 33 +180 23 31 +339 119 119 +92 58 58 +117 39 39 +67 51 57 +217 0 1 +137 81 80 +50 51 51 +437 + +chain 22059922 10 135534747 + 47748983 51719659 chr10 133797422 - 85807594 87921256 101 +98 285 285 +87 20477 2905 +467 362872 379894 +50 12459 12459 +26 34983 34983 +32 5090 5090 +28 6082 6082 +27 6385 6385 +403 569 569 +30 9194 9194 +29 4552 4552 +33 69 69 +196 294 294 +73 76 76 +141 288 288 +46 357 357 +31 2369 2369 +25 257 257 +180 182 182 +46 124 124 +86 642 642 +86 61 61 +35 84 84 +52 359 359 +65 233 233 +52 143 143 +47 246 246 +106 163 163 +31 85 85 +58 151 151 +214 374 374 +45 355 355 +71 88 88 +167 50 50 +63 230 230 +25 159 159 +27 98 98 +48 208 208 +31 121 121 +96 560 560 +80 80 80 +66 131 131 +33 109 109 +51 89 89 +70 589 589 +41 98 98 +41 98 98 +53 217 217 +39 94 94 +37 124 124 +253 67 67 +98 81 81 +29 54 54 +48 359 359 +66 951 951 +49 52 52 +64 258 258 +261 405 405 +80 66 66 +117 82 82 +28 98 98 +38 288 288 +93 234 234 +60 409 409 +49 53 53 +37 52 52 +73 380 380 +74 328 328 +80 434 434 +130 79 79 +185 336 336 +190 204 204 +80 253 253 +58 361 361 +36 332 332 +57 144 144 +111 92 92 +92 54 54 +57 715 715 +41 428 428 +182 116 116 +88 279 279 +28 187 187 +49 484 484 +51 212 212 +106 142 142 +67 77 77 +43 84 84 +241 327 327 +68 288 288 +659992 310 310 +46 328 328 +523 142 142 +103 212 212 +48 483 483 +56 187 187 +28 279 279 +88 116 116 +182 428 428 +41 718 718 +57 54 54 +92 92 92 +111 144 144 +46 332 332 +36 363 363 +58 253 253 +80 204 204 +188 335 335 +185 79 79 +130 434 434 +80 328 328 +75 78 78 +57 245 245 +73 52 52 +35 53 53 +49 409 409 +60 234 234 +93 288 288 +38 98 98 +28 82 82 +117 66 66 +80 405 405 +251 258 258 +64 52 52 +49 954 954 +66 359 359 +48 54 54 +29 81 81 +97 67 67 +253 124 124 +37 94 94 +39 217 217 +53 98 98 +41 98 98 +36 589 589 +70 89 89 +51 109 109 +37 131 131 +66 80 80 +84 559 559 +95 121 121 +31 208 208 +48 98 98 +27 158 158 +25 230 230 +63 113 113 +102 88 88 +71 355 355 +43 374 374 +217 151 151 +59 85 85 +31 163 163 +105 246 246 +46 143 143 +51 233 233 +66 359 359 +52 84 84 +35 61 61 +86 639 639 +79 124 124 +46 182 182 +183 79 79 +62 116 116 +26 274 274 +27 741 741 +78 861 861 +28 359 359 +31 356 356 +47 288 288 +136 76 76 +73 364 364 +143 69 69 +29 1279 1279 +42 549 549 +66 242 242 +60 656 656 +33 63 63 +42 258 258 +49 57 57 +97 121 121 +42 129 129 +26 223 223 +84 329 329 +121 89 89 +29 93 93 +38 371 371 +57 273 273 +45 844 844 +34 283 283 +43 302 302 +39 308 308 +40 749 749 +27 222 222 +44 66 66 +29 102 102 +62 133 133 +66 255 255 +173 200 200 +60 143 143 +54 50 50 +111 503 503 +79 1147 1147 +72 293 293 +43 94 94 +43 185 185 +34 113 113 +46 715 715 +34 384 384 +37 61 61 +31 1138 1138 +46 53 53 +60 1506 1506 +40 256 256 +141 284 284 +57 125 125 +85 189 189 +38 648 648 +25 278 278 +56 784 784 +42 1082 1082 +26 573 573 +37 54 54 +41 176 176 +80 216 216 +205 193 193 +45 946 946 +51 53 53 +42 1150 1150 +44 301 301 +50 952 952 +61 151 151 +46 65 65 +44 50 50 +34 318 318 +129 83 83 +45 497 497 +63 2212 2212 +34 213 213 +52 1000 1000 +63 392 392 +152 152 152 +89 135 135 +55 329 329 +72 59 59 +36 278 278 +202 298 298 +27 217 217 +27 304 304 +83 1361 1361 +40 721 721 +44 866 866 +88 1126 1126 +44 1197 1197 +48 158 158 +31 677 677 +33 1387 1387 +30 5584 5584 +56 2992 2992 +56 390 390 +31 446 446 +80 3434 3434 +46 517 517 +86 1864 1864 +47 4891 4891 +45 413 413 +43 455 455 +53 243 243 +55 333 333 +40 859 859 +30 1650 1650 +28 839 839 +34 889 889 +34 77 77 +96 648 648 +28 1338 1338 +43 245 245 +80 1769 1769 +47 406 406 +38 333 333 +44 5689 5688 +50 9913 9913 +49 256 256 +54 417 417 +52 1704 1704 +32 282 282 +68 448 448 +59 812 812 +36 712 712 +30 1338 1338 +67 1004 1004 +45 443 443 +25 198 198 +29 157 149 +9 2411 2410 +36 4956 4955 +55 568 568 +36 5113 5113 +28 3406 3404 +46 3414 3414 +35 1461 1461 +39 4076 4076 +36 1757 1757 +81 1640 1640 +29 2031 2032 +39 196 196 +91 2336 2336 +40 685 689 +115 756 756 +43 793 793 +51 217 218 +89 2410 2410 +31 2698 2698 +246 3085 3086 +121 2442 2447 +33 2214 2214 +35 4389 4391 +31 2183 2172 +100 150 150 +32 501 503 +36 165 165 +349 454 454 +39 440 440 +2 12 14 +22 88 88 +123 503 503 +201 128 128 +33 78 78 +33 442 442 +38 309 310 +43 1047 1047 +102 833 833 +34 795 795 +56 3714 3714 +25 186 186 +136 805 806 +46 326 0 +16 83 83 +33 58 59 +100 131 131 +44 518 518 +25 586 586 +119 2354867 498736 +148126 0 1 +1507 0 1 +373 3 1 +783 1 1 +45 1 1 +2876 13 0 +5621 0 3 +813 2 0 +7191 1 0 +156 1 0 +5314 2 1 +976 2 0 +4132 1 0 +2196 1 0 +3606 0 1 +667 0 1 +174 0 1 +1855 0 2 +926 7 0 +7066 1 21 +40 1 1 +1047 1 1 +26 1 3 +39 9 4 +2946 1 0 +2325 1 0 +31 1 1 +3865 1 0 +10431 0 2 +9226 1 0 +35 0 2 +46347 + +chain 18097009 10 135534747 + 42354935 42546687 chr10 133797422 - 91912149 92103901 340 +191752 + +chain 15664020 10 135534747 + 47023104 47429169 chr10 133797422 + 46489964 47739149 219 +36476 114322 957477 +45 118 118 +50 264 264 +52 511 511 +84 157 157 +29 321 321 +57 2300 2300 +26 9096 9090 +68 359 359 +25 594 594 +29 2977 2978 +123 1752 1752 +42 3400 3400 +42 1164 1164 +40 3542 3542 +62 10938 10940 +48 3736 3736 +54 2024 2024 +40 5104 5103 +39 1915 1915 +46 1405 1405 +35 9604 9604 +53 123 124 +58 82 82 +50 718 718 +27 2564 2564 +51 53 53 +40 1053 1053 +98 732 732 +2179 16 0 +63 0 9 +4345 0 4 +4999 1 1 +20 1 1 +1116 6 6 +3169 1 1 +34 1 1 +641 1 1 +28 0 1 +389 0 1 +425 6 6 +220 47 48 +122 22 0 +576 0 4 +3406 1 0 +382 56 54 +627 77 77 +326 1 0 +112 1 0 +1128 1 0 +739 30 32 +942 30 30 +53 21 21 +228 754 754 +1503 1 0 +1020 1 0 +2090 52 52 +1344 0 2 +518 1 0 +1420 1 0 +1608 2 0 +1092 0 4 +7758 2 0 +1247 0 9 +7024 1 0 +5790 0 3 +1992 49 49 +220 47 47 +93 1 1 +55 1 1 +469 0 1 +454 1 0 +712 1 0 +111 4 4 +44 1 1 +243 0 1 +66 1 0 +417 2 1 +42 11 0 +276 16 16 +945 1 0 +383 0 1 +81 0 1 +31 1 1 +282 1 1 +66 1 1 +448 1 1 +57 1 1 +812 1 1 +34 1 1 +712 1 1 +28 1 1 +136 1 0 +821 12 11 +162 12 9 +78 5 5 +113 1 1 +63 3 3 +484 19 19 +501 1 1 +43 1 1 +443 1 1 +35 1 3 +186 1 1 +28 1 0 +114 0 1 +35 6 0 +805 0 1 +174 0 1 +6821 1 1 +37 1 1 +4031 107 107 +164 70 70 +129 407 407 +29 338 338 +76 328 328 +305 74 74 +132 76 76 +32 77 77 +75 65 65 +107 163 163 +819 52 52 +163 67 67 +235 58 58 +47 431 431 +29 56 56 +66 137 137 +491 317 317 +96 67 67 +1200 54 54 +95896 + +chain 8629503 10 135534747 + 17882065 17974675 chr10 133797422 + 17840065 17932651 802 +230 0 1 +2929 9 8 +3109 0 1 +365 9 9 +446 0 1 +433 9 9 +183 34 32 +105 2 0 +1377 1 0 +254 3 2 +141 36 36 +520 5 0 +943 47 47 +125 9 9 +4191 1 0 +9256 0 1 +1509 25 25 +1002 3 0 +6845 44 44 +7417 3 0 +164 0 4 +1601 0 1 +149 47 47 +9374 1 0 +1384 1 0 +4252 7 7 +455 1 0 +989 1 0 +2341 1 0 +1521 2 1 +4582 24 24 +7549 3 0 +261 0 6 +791 5 5 +590 2 0 +291 30 30 +2140 7 7 +58 5 0 +98 0 1 +61 57 57 +414 34 32 +777 1 0 +2861 21 21 +370 21 21 +1701 0 1 +59 30 30 +655 32 30 +529 2 0 +818 0 1 +91 21 21 +219 0 1 +742 1 2 +667 27 28 +712 49 49 +790 13 10 +488 + +chain 7172068 10 135534747 + 46702064 48055707 chr10 133797422 + 46205272 50241236 149 +28 181 181 +54 1906 1905 +128 4213 4209 +51 4496 1288491 +42 2678 5900 +32 7606 7629 +36 9332 9342 +29 8031 7906 +36 18332 18753 +26 3374 3374 +28 20618 20679 +54 2988 2987 +52 390 390 +31 432 433 +91 3435 3433 +44 518 518 +36 6844 6844 +61 936 931 +33 64 64 +36 143 143 +55 333 333 +40 2811 2817 +26 570 570 +34 889 889 +34 125 125 +48 2012 2014 +43 245 245 +80 2 0 +1 276310 320710 +6 5 1 +52 90640 73217 +32 445 445 +32 52 51 +34 250 250 +227 84 84 +157 29 29 +321 57 56 +71 0 1 +58 102 441 +77 8476 8459 +54 589 589 +33 77 77 +61 676 661 +48 1552 1575 +159 2487 2486 +118 741 739 +95 123 122 +25 974 972 +2 0 7 +50 163 163 +52 237 237 +148 398 398 +48 53 53 +44 79 79 +127 556 541 +47 489 489 +29 1635 1650 +38 42 42 +64 1340 1337 +38 3482 3475 +36 997 997 +76 595 596 +29 81 81 +26 456 457 +51 368 368 +41 1894 1876 +25 866 866 +25 366 365 +53 1127 1128 +27 641 641 +36 310 309 +28 393 393 +94 1292 1290 +110 88 88 +83 145 145 +68 0 1 +40 162 162 +19 1 0 +31 1025 1026 +37 1418 1419 +61 278 278 +422 280 280 +78 0 12 +28 792 790 +59 911 911 +42 397 397 +52 88 88 +36 40 62 +300 2 0 +681 8 8 +1451 0 1 +181 6 11 +2475 39 33 +1427 0 6 +488 46 46 +387 1 0 +1017 35 35 +166 0 4 +3641 0 2 +3250 13 13 +2534 53 56 +123 58 52 +82 50 49 +718 27 26 +83 12 0 +866 0 2 +304 9 9 +313 21 3 +956 51 51 +53 40 42 +1053 98 98 +413 21 21 +298 650555 2016562 +538 0 1 +2862 1 0 +1468 45 45 +77 0 22 +563 56 57 +803 11 7 +1710 4 0 +543 1 0 +3684 1 0 +321 151 151 +290 55 55 +738 19 2 +201 63 63 +72 68 68 +83 103 103 +210 301 301 +45 224 224 +225 75 75 +95 104 104 +284 108 108 +129 207 207 +176 76 76 +111 232 232 +463 2 3 +658 53 53 +2579 33 33 +213 50 50 +122 424 424 +119 34 34 +102 52 52 +207 165 165 +33 68 68 +199 1 2 +262 59 59 +87 126 126 +256 37 37 +264 61 61 +187 168 168 +190 115 115 +87 67 67 +25 56 56 +53 86 86 +168 57 57 +76 193 193 +111 80 80 +262 215 215 +626 14 14 +320 5 5 +118 98 98 +72 138 138 +57 276 276 +8 1 0 +125 63 63 +102 53 53 +49 64 64 +193 400 400 +33 542 542 +119 92 92 +58 117 117 +39 67 68 +51 354 354 +33 1 0 +47 50 50 +51 437 437 +1406 26 25 +1955 1 0 +1664 2 5 +1600 22 22 +347 1 0 +1500 86 85 +196 6 7 +632 23 23 +402 64 64 +6829 23 23 +186 39 39 +353 4 0 +1297 23 23 +1653 28 28 +757 41 41 +219 41 41 +1262 48 48 +81 29 26 +441 31 31 +3072 0 1 +715 17 17 +486 6 0 +2077 8 0 +6641 88 88 +1811 15 17 +1474 0 3 +681 0 2 +334 47 47 +73 47 47 +128 29 29 +63 206 223 +64 73 73 +112 11 11 +170 1 0 +84 53 53 +87 13 13 +71 82 82 +117 16 16 +52 38 1487 +143 80 80 +375 106 94 +50 30 30 +60 68 68 +195 67 66 +50 61 62 +244 8 8 +540 19 19 +193 0 1 +509 17 17 +5248 3 0 +4840 33 33 +622 16 16 +1614 1 0 +65 1 0 +4870 0 1 +1791 3 0 +695 16 16 +276 13 14 +99 26 26 +124 20 20 +1865 33 33 +115 0 4 +65 35 35 +2209 97 97 +380 8 8 +222 25 25 +251 72 72 +99 4 4 +314 32 32 +59 120 119 +61 246 241 +71 65 65 +208 12 12 +111 90 90 +69 93 95 +2584 0 3 +520 4 4 +990 6 6 +804 50 50 +570 64 58 +754 16 16 +1031 43 43 +1779 52 52 +322 6 6 +1000 20 16 +107 40 40 +54 4 4 +90 8 10 +281 14 15 +2005 43 43 +3264 0 2 +8471 8 0 +1096 0 1 +956 2 0 +851 4 4 +1062 18 18 +796 50 50 +2796 7 7 +2134 0 2 +363 0 2 +554 1 0 +302 12 12 +545 43 42 +513 27 27 +875 8 8 +945 2 8 +330 0 4 +790 3 1 +1392 42 42 +4274 13 11 +1413 34 34 +10701 25 25 +305 2 0 +146 5 5 +1257 + +chain 1251385 10 135534747 + 51221227 51275077 chr10 133797422 - 83783477 83837505 555 +156 61 61 +390 7 7 +260 21 21 +1030 101 101 +167 31 31 +69 10 12 +111 32 27 +230 172 172 +518 14 14 +908 24 24 +1338 10 8 +382 12 12 +478 0 2 +245 15 15 +287 8 8 +87 2 0 +529 1 1 +26 1 1 +290 1 0 +19 1 1 +127 1 1 +31 1 1 +87 13 13 +172 4 4 +152 1 1 +128 16 16 +68 29 29 +97 22 22 +291 20 21 +220 23 23 +178 204 205 +80 12 12 +179 42 42 +57 55 55 +51 6 6 +1536 24 24 +537 45 43 +54 61 61 +91 56 56 +1206 54 54 +370 57 57 +210 45 44 +184 55 81 +238 20 20 +196 81 81 +330 11 11 +55 8 16 +254 43 43 +59 0 1 +280 68 68 +437 85 87 +363 1 0 +164 11 10 +78 31 31 +64 2 0 +151 76 76 +61 32 32 +72 41 41 +66 34 34 +58 15 16 +367 307 314 +76 22 22 +272 1 0 +78 46 46 +55 72 72 +96 48 48 +103 59 63 +60 76 76 +107 67 68 +54 2 4 +54 54 54 +171 18 18 +377 110 105 +72 49 49 +149 165 165 +82 106 112 +200 8 8 +406 109 115 +192 36 36 +311 116 116 +111 103 102 +137 1 1 +36 0 1 +72 1 1 +106 11 11 +200 23 24 +75 1 1 +47 1 1 +88 1 1 +59 1 1 +128 1 1 +120 1 1 +60 1 1 +30 1 1 +138 1 1 +49 1 1 +61 11 11 +162 1 1 +16 1 1 +226 27 15 +115 1 1 +51 1 1 +289 15 15 +437 1 1 +47 1 1 +96 1 1 +28 1 1 +122 2 0 +11 1 1 +193 1 1 +37 1 1 +517 16 13 +149 0 2 +58 1 1 +30 1 1 +197 0 1 +189 16 16 +866 118 117 +332 28 28 +673 97 98 +705 50 50 +611 20 20 +77 56 56 +685 90 91 +73 97 78 +69 18 18 +223 69 69 +128 0 3 +205 50 50 +244 41 41 +64 40 34 +75 23 23 +225 7 7 +277 6 0 +367 47 47 +284 5 9 +208 13 15 +177 35 37 +749 43 43 +66 5 0 +91 3 0 +294 84 84 +517 30 33 +74 18 18 +177 17 17 +219 29 29 +187 10 10 +259 56 31 +310 7 7 +189 12 11 +670 55 55 +529 7 5 +244 25 25 +407 94 96 +844 1 1 +47 1 1 +794 6 0 +48 1 1 +169 1 1 +39 0 1 +273 1 1 +120 1 1 +100 40 0 +28 1 1 +52 1 1 +24 1 0 +4 1 1 +104 1 1 +67 1 1 +317 1 1 +27 0 1 +50 1 1 +178 9 9 +289 0 11 +342 1 0 +91 1 1 +49 0 3 +322 1 1 +46 1 1 +60 1 1 +67 1 1 +175 1 1 +42 1 1 +529 5 0 +309 46 46 +228 74 74 +201 6 0 +111 56 56 +400 20 20 +564 0 142 +454 19 19 +130 9 9 +268 5 10 +357 0 124 +186 10 0 +309 5 0 +52 20 20 +62 5 0 +96 1 1 +36 1 1 +501 1 0 +416 1 1 +48 1 1 +189 1 1 +30 5 0 +25 2 0 +31 1 1 +509 1 1 +38 8 0 +53 1 1 +148 12 15 +923 7 7 +237 22 21 +295 + +chain 1160726 10 135534747 + 51187410 51207160 chr10 133797422 + 50128891 50155812 3361 +166 121 121 +220 14 14 +323 28 28 +427 128 125 +388 26 26 +63 81 81 +250 19 19 +224 11 11 +325 120 120 +87 40 40 +86 130 130 +75 95 94 +85 18 18 +100 21 21 +223 39 39 +181 13 13 +50 18 18 +247 25 25 +278 0 2 +141 27 27 +74 18 19 +445 43 43 +74 27 27 +106 32 32 +59 15 15 +288 34 34 +90 1 0 +331 58 77 +70 27 27 +161 5 5 +160 106 106 +68 49 49 +109 13 13 +81 17 17 +170 26 25 +149 48 47 +136 63 63 +69 13 13 +135 23 16 +56 0 1 +195 50 50 +103 131 133 +82 56 56 +193 45 45 +71 184 184 +116 317 315 +199 22 22 +139 155 155 +57 24 24 +303 177 185 +72 193 194 +194 6 6 +69 50 50 +223 73 72 +161 107 107 +125 0 3 +145 63 59 +259 105 105 +299 181 179 +132 36 36 +453 102 102 +52 40 40 +234 184 183 +212 34 34 +200 17 17 +55 68 68 +449 38 38 +88 20 20 +53 34 34 +53 201 200 +74 59 59 +267 81 72 +61 76 76 +180 47 48 +54 7 7 +97 235 235 +109 10 11 +107 41 41 +331 5 5 +131 32 32 +128 485 7652 +58 97 97 +54 254 255 +83 455 453 +71 + +chain 735515 10 135534747 + 51329916 51398845 chr10 133797422 + 45931000 45999929 868 +29010 11395 11395 +4017 11402 11402 +26 3386 3386 +295 35 35 +9363 + +chain 474996 10 135534747 + 51208579 51213579 chr10 133797422 + 45809500 45814500 55899 +5000 + +chain 473612 10 135534747 + 18028964 18033964 chr10 133797422 + 17740000 17745000 57488 +5000 + +chain 473093 10 135534747 + 18064989 18069989 chr10 133797422 + 17776000 17781000 58061 +5000 + +chain 472998 10 135534747 + 18042466 18047482 chr10 133797422 + 17753500 17758500 58162 +1425 16 0 +3575 + +chain 472203 10 135534747 + 51302901 51307901 chr10 133797422 + 45904000 45909000 59068 +5000 + +chain 471732 10 135534747 + 51311901 51316901 chr10 133797422 + 45913000 45918000 59596 +5000 + +chain 471632 10 135534747 + 51280413 51285416 chr10 133797422 + 45881500 45886500 59712 +1927 3 0 +3073 + +chain 470923 10 135534747 + 18082989 18087985 chr10 133797422 + 17794000 17799000 60570 +514 0 3 +2777 0 1 +1705 + +chain 470274 10 135534747 + 51289426 51294426 chr10 133797422 + 45890500 45895500 61277 +5000 + +chain 470197 10 135534747 + 18096489 18101489 chr10 133797422 + 17807500 17812500 61364 +4252 31 31 +717 + +chain 466261 10 135534747 + 18118953 18123953 chr10 133797422 + 17830000 17835000 65781 +884 0 2 +169 1 0 +2465 1 0 +296 42 42 +1142 + +chain 465003 10 135534747 + 18110034 18114970 chr10 133797422 + 17821063 17826000 67245 +455 0 1 +4481 + +chain 426197 10 135534747 + 18033964 18038466 chr10 133797422 + 17745000 17749500 57585 +825 0 1 +840 2 0 +790 1 0 +2044 + +chain 425376 10 135534747 + 18069989 18074487 chr10 133797422 + 17781000 17785500 58520 +745 0 2 +3753 + +chain 423934 10 135534747 + 51325411 51329916 chr10 133797422 + 45926500 45931000 60505 +3555 5 0 +945 + +chain 423924 10 135534747 + 18055977 18060517 chr10 133797422 + 17767000 17771534 66311 +913 1 0 +170 6 3 +640 3 1 +2807 + +chain 423861 10 135534747 + 51298402 51302901 chr10 133797422 + 45899500 45904000 60524 +645 0 1 +3854 + +chain 422269 10 135534747 + 51316901 51321401 chr10 133797422 + 45918000 45922500 62510 +4500 + +chain 419403 10 135534747 + 18060517 18064989 chr10 133797422 + 17771534 17776000 65745 +2492 7 3 +769 2 0 +1202 + +chain 419218 10 135534747 + 18092032 18096489 chr10 133797422 + 17803045 17807500 65805 +1873 1 0 +463 2 0 +697 0 1 +1421 + +chain 418085 10 135534747 + 51213579 51218054 chr10 133797422 + 45814500 45818972 55956 +1486 3 0 +2596 71 71 +319 + +chain 417582 10 135534747 + 18123953 18128444 chr10 133797422 + 17835000 17839492 68313 +1268 23 23 +291 4 4 +514 7 7 +1449 0 1 +935 + +chain 414014 10 135534747 + 18101489 18105984 chr10 133797422 + 17812500 17817000 72654 +67 0 3 +1130 0 2 +714 51 51 +210 1 0 +874 14 14 +268 0 1 +163 28 28 +975 + +chain 412451 10 135534747 + 18074487 18078852 chr10 133797422 + 17785500 17789865 73056 +4365 + +chain 404181 10 135534747 + 18051608 18055977 chr10 133797422 + 17762630 17767000 82823 +2418 53 53 +1751 28 29 +119 + +chain 390467 10 135534747 + 18078853 18082989 chr10 133797422 + 17789865 17794000 95311 +1426 1 0 +2709 + +chain 388615 10 135534747 + 18047482 18051601 chr10 133797422 + 17758500 17762617 97008 +3193 2 0 +924 + +chain 387479 10 135534747 + 18024843 18028964 chr10 133797422 + 17735879 17740000 98201 +2640 12 14 +136 2 0 +1331 + +chain 378456 10 135534747 + 18105984 18110008 chr10 133797422 + 17817000 17821037 105995 +247 0 1 +2205 0 12 +1572 + +chain 376863 10 135534747 + 18038466 18042466 chr10 133797422 + 17749500 17753500 60397 +1393 1 0 +175 0 1 +687 18 18 +1726 + +chain 376428 10 135534747 + 51307901 51311901 chr10 133797422 + 45909000 45913000 60967 +491 0 1 +3201 1 0 +307 + +chain 376294 10 135534747 + 51285416 51289426 chr10 133797422 + 45886500 45890500 61445 +2689 10 0 +1311 + +chain 376131 10 135534747 + 51276411 51280413 chr10 133797422 + 45877500 45881500 61466 +129 2 0 +3871 + +chain 374118 10 135534747 + 51321401 51325411 chr10 133797422 + 45922500 45926500 64467 +15 45 35 +3950 + +chain 370851 10 135534747 + 18087985 18091996 chr10 133797422 + 17799000 17803009 112739 +846 2 0 +2294 56 56 +813 + +chain 370684 10 135534747 + 18114970 18118953 chr10 133797422 + 17826000 17830000 68681 +197 0 1 +290 46 43 +838 3 22 +2609 + +chain 369581 10 135534747 + 51294426 51298402 chr10 133797422 + 45895500 45899500 72334 +771 42 66 +3163 + +chain 275345 10 135534747 + 51204576 51208579 chr10 133797422 + 45805500 45809500 58831 +133 226 226 +41 467 467 +32 128 128 +308 4 0 +173 58 58 +97 54 54 +254 83 83 +455 71 71 +608 0 1 +811 + +chain 241551 10 135534747 + 47760961 47792476 chr10 133797422 - 86327350 86358865 764 +83 10878 10878 +33 62 62 +20459 + +chain 224131 10 135534747 + 51217664 51259603 chr10 133797422 + 73666838 73710759 1732 +71 319 312 +70 756 766 +54 75 77 +69 24 24 +92 98 98 +54 101 147 +72 13 13 +350 152 151 +80 154 127 +238 59 63 +130 54 54 +141 130 135 +85 278 278 +61 1977 2364 +30 190 188 +32 20070 21828 +41 6279 6228 +57 1896 1729 +50 2019 1999 +69 333 342 +50 1369 1367 +47 1471 1512 +35 2091 2098 +30 10 0 +13 + +chain 154394 10 135534747 + 51195229 51199539 chr10 133797422 + 45796159 45800462 62941 +48 136 136 +63 491 484 +50 103 103 +131 82 82 +56 193 193 +45 71 71 +184 116 116 +317 360 360 +155 384 384 +177 72 72 +2 0 1 +191 269 268 +50 223 223 +73 161 161 +107 + +chain 137144 10 135534747 + 51199809 51204576 chr10 133797422 + 45800732 45805500 58709 +63 259 259 +105 299 299 +181 132 132 +36 453 453 +69 0 1 +33 52 52 +40 234 234 +184 212 212 +34 272 272 +68 449 449 +38 161 161 +34 53 53 +201 74 74 +59 267 267 +81 61 61 +76 180 180 +47 158 158 +102 + +chain 125728 10 135534747 + 51275077 51276411 chr10 133797422 + 45876165 45877500 60636 +141 0 1 +1193 + +chain 111753 10 135534747 + 51218124 51221202 chr10 133797422 + 45819042 45822126 71416 +756 54 54 +75 185 185 +98 54 54 +101 493 493 +66 194 194 +27 279 285 +42 609 609 +45 + +chain 70246 10 135534747 + 47268178 47269264 chr10 133797422 - 87035178 87036265 5049 +30 302 302 +649 0 1 +105 + +chain 63474 10 135534747 + 51190568 51195080 chr10 133797422 + 45791500 45796010 65039 +119 75 75 +95 447 447 +39 509 509 +25 419 419 +27 537 537 +43 207 206 +32 362 362 +34 422 422 +8 13 12 +37 70 70 +27 326 326 +106 68 68 +49 390 390 +26 + +chain 51467 10 135534747 + 51187576 51190471 chr10 133797422 + 45788507 45791403 181131 +42 0 2 +79 557 557 +28 427 427 +128 388 388 +26 63 63 +81 829 828 +120 87 87 +40 + +chain 50253 10 135534747 + 51220006 51244461 chr10 133797422 - 88092215 88116656 1971 +28 91 91 +61 49 22 +33 431 443 +50 154 158 +77 0 5 +40 85 85 +52 10285 10265 +27 2270 2282 +40 207 206 +20 1 1 +35 9664 9665 +37 625 625 +93 + +chain 39651 10 135534747 + 46686548 46691777 chr10 133797422 - 87637611 87642844 3268 +83 4788 4792 +358 + +chain 37330 10 135534747 + 51223153 51268550 chr10 133797422 - 87664227 87803227 1297 +72 6847 6838 +29 851 852 +20 17 23 +167 370 370 +42 2266 2257 +28 15 15 +18 1353 1353 +27 12 12 +15 370 370 +57 210 209 +45 184 184 +55 454 454 +81 659 657 +42 844 1169 +85 617 618 +31 217 215 +76 61 61 +32 72 72 +41 66 66 +34 440 440 +258 498 498 +34 0 1 +12 55 55 +72 96 96 +48 103 103 +59 60 60 +30 22 22 +24 107 107 +67 110 112 +54 566 565 +3 3 0 +104 72 72 +49 149 148 +165 121 127 +54 627 626 +9 78 83 +22 192 192 +36 538 538 +96 2 0 +5 23439 116726 +74 318 318 +44 + +chain 33727 10 135534747 + 51250120 51253705 chr10 133797422 + 45851058 45854633 96652 +61 332 332 +28 673 673 +77 13 3 +7 1463 1463 +56 685 685 +90 73 73 +27 + +chain 30849 10 135534747 + 49091943 49092264 chr10 133797422 + 92823457 92823778 5707627 +321 + +chain 30746 10 135534747 + 47088384 47088706 chr5 181538259 + 94773924 94774246 5733635 +322 + +chain 22723 10 135534747 + 51253706 51258010 chr10 133797422 + 45854633 45858941 72294 +52 1023 1023 +41 76 76 +28 1714 1718 +35 1251 1251 +84 + +chain 19037 10 135534747 + 51259062 51262152 chr10 133797422 + 45859993 45863089 63514 +29 1700 1706 +55 780 780 +25 407 407 +94 + +chain 17723 10 135534747 + 46629121 46653447 chr10 133797422 + 48128544 48152858 659 +32 12075 12055 +33 6088 6088 +52 3451 3452 +33 2519 2526 +43 + +chain 15840 10 135534747 + 18024675 18024842 chr10 133797422 + 17735712 17735879 17853380 +167 + +chain 11823 10 135534747 + 1307776 1307912 chr10 133797422 + 1265784 1265920 4246388 +42 4 4 +90 + +chain 8636 10 135534747 + 47264138 47264898 chr10 133797422 - 87031128 87031888 1241132 +56 662 662 +42 + +chain 8125 10 135534747 + 51240333 51243016 chr10 133797422 + 45841276 45843954 115505 +49 2595 2590 +39 + +chain 7911 10 135534747 + 47944792 47946253 chr10 133797422 + 45788337 45789800 225743 +41 1262 1264 +44 85 85 +29 + +chain 7630 10 135534747 + 47897345 47898086 chr10 133797422 + 45740762 45741526 141359 +45 653 676 +43 + +chain 5776 10 135534747 + 47995044 47995286 chr8 145138636 - 25883301 25883543 3260746 +29 128 128 +85 + +chain 5768 10 135534747 + 47913364 47914359 chr10 133797422 + 45756800 45757795 106591 +33 928 928 +34 + +chain 5720 10 135534747 + 46716973 46717935 chr10 133797422 + 45831240 45832200 190210 +38 898 896 +26 + +chain 5307 10 135534747 + 46713903 46714005 chr10 133797422 + 73673619 73673721 2507 +102 + +chain 4316 10 135534747 + 51267840 51267886 chr10 133797422 + 45868778 45868824 77582 +46 + +chain 4285 10 135534747 + 51137350 51137410 chr10 133797422 + 45960010 45960070 2088 +60 + +chain 4131 10 135534747 + 47964150 47966699 chr10 133797422 - 83766228 83771702 4931 +46 1062 1055 +53 171 171 +82 821 3760 +30 126 114 +30 60 60 +35 17 22 +16 + +chain 3991 10 135534747 + 47273879 47273931 chr10 133797422 + 50710452 50710504 284775 +52 + +chain 3727 10 135534747 + 51264598 51264638 chr10 133797422 + 45865537 45865577 66334 +40 + +chain 3597 10 135534747 + 46546476 46546551 chr18 80373285 - 18323738 18323813 1918511 +18 11 11 +46 + +chain 3395 10 135534747 + 47303744 47303780 chr10 133797422 - 87070749 87070785 59773 +36 + +chain 3365 10 135534747 + 47994911 47995426 chr5 181538259 - 157351305 157351819 4067807 +29 442 441 +44 + +chain 3298 10 135534747 + 51237798 51237833 chr10 133797422 + 45838740 45838775 97589 +35 + +chain 3162 10 135534747 + 47995073 47995138 chr14 107043718 + 19504999 19505064 5206969 +65 + +chain 3110 10 135534747 + 47993300 47993348 chr3 198295559 - 66594589 66594637 28448969 +48 + +chain 3061 10 135534747 + 46731733 46731776 chr10 133797422 + 48030258 48030301 1457 +43 + +chain 3011 10 135534747 + 47940378 47940416 chr10 133797422 + 45783834 45783872 187134 +38 + +chain 2985 10 135534747 + 47304000 47304047 chr10 133797422 + 87421587 87421634 1757 +47 + +chain 2969 10 135534747 + 46714156 46714192 chr10 133797422 - 87665341 87665377 968579 +36 + +chain 2869 10 135534747 + 46791047 46791092 chr10 133797422 + 87389737 87389782 1678 +45 + +chain 2584 10 135534747 + 47910732 47910764 chr10 133797422 + 45754169 45754201 146512 +32 + +chain 2496 10 135534747 + 47995140 47995201 chr4 190214555 + 189797956 189798017 4541583 +61 + +chain 2442 10 135534747 + 51223225 51223253 chr10 133797422 + 45824149 45824177 112914 +28 + +chain 2305 10 135534747 + 47959747 47959785 chr10 133797422 + 45803256 45803294 298635 +38 + +chain 2197 10 135534747 + 51219882 51219940 chr10 133797422 - 46782427 46782485 7686 +58 + +chain 2128 10 135534747 + 51221202 51221226 chr10 133797422 + 47498286 47498310 6728152 +24 + +chain 2107 10 135534747 + 47978693 48003445 chr10 133797422 - 83021370 83044344 1287 +33 12117 10397 +33 180 184 +34 3219 3202 +46 508 504 +48 849 843 +51 1 1 +35 69 69 +61 1 1 +31 4908 4885 +50 570 570 +33 1832 1820 +43 + +chain 738 10 135534747 + 47993362 47993397 chr3 198295559 + 176448487 176448522 27081767 +35 + +chain 563 10 135534747 + 47994283 47994309 chr22 50818468 - 40231450 40231476 3806660 +26 + +chain 502 10 135534747 + 42596869 42596948 chr1 248956422 - 123786400 123786479 24170172 +79 + +chain 12365864768 11 135006516 + 60000 134946516 chr11 135086622 + 60000 135076622 10 +1016475 144 0 +825 1 1 +47 1 1 +1397 1 66 +28 3 6 +63 1 4 +62 2 2 +21 1 1 +55 2 1060 +85 0 601 +127 1 4 +61 0 257 +76 1 1 +54 0 158 +2985 14 14 +285 1 1 +37 1 1 +1706 1 1 +20 1 1 +519 6 44 +16 9 0 +37 1 27 +21 0 8 +106 68 0 +50 0 12 +1159 0 61 +27 1 1 +51 58 0 +41 2 4 +75 0 48 +15 1 1 +2376 4 0 +53 1 1 +39 0 2 +3474 0 2364 +224 1 1667 +67 1 1 +185 5 5 +51265 50 47 +307 9 9 +3551 0 300 +1010 16 0 +2730 9 9 +425 1 1 +25 1 1 +497 21 41 +266 10 0 +602 0 1 +934 1 0 +3349 30 30 +195 33 0 +479 0 1 +55 1 1 +1338 0 314 +1224 16 16 +1031 50025 22135 +1751 1 0 +1781 0 1 +20 1 0 +2274 1 1 +17 1 1 +2128 1 1 +35 1 1 +200 1 1 +40 1 1 +1286 7 7 +600 4 0 +506 1 1 +45 1 1 +1743 1 1 +38 1 1 +729 12 12 +4968441 1 1 +31 1 1 +435542 1 0 +1086876 316 0 +6384272 0 1 +2340561 1 0 +3173982 0 1 +6088639 1 0 +5956766 1 0 +179228 0 1 +22967 0 1 +2044791 1 0 +1545365 1 0 +330512 1 0 +28130 1 0 +1156052 0 1 +7269 1 0 +7861785 1 0 +578262 0 1 +330246 1 0 +596201 0 1 +495374 1 0 +625203 1 0 +2517611 0 1 +55 0 1 +1125 1 1 +38 1 1 +10461 1 1 +25 1 0 +55 0 1 +451 0 4 +5253 0 5 +382 0 5 +8109 1 0 +4499 1 1 +31 1 1 +2022 1 0 +2833 1 0 +3693 0 1 +3332 2 1 +2702 0 18 +1954 1 0 +3573 0 1 +2303 0 1 +520 1 1 +17 1 1 +433 11 11 +2011 1 0 +644 0 2 +1697 1 0 +665 0 62366 +792 7 3 +1352 1 0 +3742 12 12 +1573 1 1 +41 1 1 +139 1 0 +2965 0 1 +696 11 0 +422 1 0 +294 4 4 +1931 0 2 +631 1 0 +344 4 3 +1439 4 3 +1009 1 1 +24 0 1 +723717 3913686 4105383 +1244 1 0 +3765 15 15 +172 1 1 +27 1 1 +230 1 1 +42 1 1 +1219 1 0 +2120 1 1 +39 1 1 +2065 1 1 +95 1 1 +3049 15 15 +1821 1 1 +17 1 1 +1044 10 10 +1979143 0 1 +176676 0 1 +268638 0 1 +285478 0 1 +683354 1 0 +614529 1 1 +23 1 1 +1938275 0 1 +4241032 0 1 +2866806 0 1 +20901 0 1 +3229 0 1 +6085 0 1 +213963 1 0 +702669 1 0 +39198 0 1 +210449 0 1 +127253 1 0 +888 50000 2700 +571000 0 1 +2576 0 15 +1097 0 1 +210 0 4 +66 16 0 +51 5 9 +1385 1 0 +191 0 20 +40 0 1 +74 1 0 +2165 0 3 +3649 0 1 +2367 50000 18634 +7356 4 0 +513640 0 1 +501187 2 0 +696 1 1 +42 1 1 +61 37 0 +468 7 7 +728 7 0 +2654 0 135105 +1048570 0 2 +539103 1 0 +2572163 0 1 +174898 1 0 +447094 0 1 +1168126 1 0 +41 1 0 +18 1 0 +27197 0 1 +114479 0 1 +590570 1 0 +796318 0 1 +793601 0 1 +497533 0 1 +210510 1 0 +644518 0 1 +680048 0 1 +1877826 1 0 +1571167 1 0 +838325 0 1 +341616 0 1 +1507488 0 150 +443620 8 8 +980 7 9 +88 1 28 +34 23 2 +117 4 3 +42 1 1 +63 13 144 +23 124 0 +61 3 24 +49 1 32 +128 0 30 +55 0 34 +112 50017 27611 +3305293 0 1 +62988 0 1 +3468084 0 1 +1081 10 10 +56963 1 1 +18 1 1 +66690 0 1 +101395 0 1 +3589 1 0 +663807 1 1 +16 1 1 +274921 0 1 +8522 1 0 +523969 1 0 +11797 6 5 +50 150000 12157 +75 1 0 +109 1 1 +3420 0 14 +23 1 0 +1010 1 1 +34 1 1 +221 0 1 +498 1 1 +32 1 1 +182 4 0 +314 0 1 +328 10 10 +1743 1 0 +1024 0 2 +5866 1 0 +2598 1 0 +314 1 1 +39 1 1 +2524 14 14 +1365619 1 273 +438972 1 0 +112327 1 0 +644264 1 0 +691759 1 0 +49195 1 1 +59 1 1 +460159 0 1 +1593816 1 1 +29 1 1 +231154 1 1 +25 1 1 +693427 1 2 +55366 0 1 +398374 0 1 +1421392 0 1 +942533 0 1 +255683 1 0 +681981 0 1 +1415317 1 0 +576113 12 12 +750659 0 1 +676647 0 1 +10687 1 0 +47270 0 1 +270382 0 1 +256452 0 1 +232842 1 0 +358835 1 0 +370306 0 1 +240604 0 1 +41890 1 0 +106215 1 0 +4744 0 1 +131504 0 1 +847355 0 1 +343 0 1 +32 1 0 +16 1 1 +1915191 0 1 +2799 0 1 +438080 0 1 +48352 0 1 +54579 1 0 +68565 0 1 +594195 0 1 +599157 0 1 +788966 0 1 +1152389 2 0 +582 0 1 +86 5 5 +5437 1 0 +4931 1 0 +11300 0 2 +1987 1 0 +21 0 12 +6432 5 0 +3593 1 1 +27 0 1 +33 1 1 +16694 1 0 +2849 0 1 +72094 1 0 +1172 0 1 +13077 0 1 +44 1 1 +4179 1 0 +178071 1 0 +96437 1 0 +2056 1 0 +11255 0 1 +12926 0 1 +91902 0 1 +30783 1 0 +267611 1 0 +23532 1 0 +9778 0 1 +22509 0 1 +31610 1 0 +38731 1 0 +41172 0 1 +7580 0 1 +120083 0 1 +335968 0 1 +127855 1 0 +1451677 0 1 +2195190 0 1 +351962 1 1 +35 1 1 +3192 1 0 +2612 0 4 +1052 1 1 +33 1 1 +502 1 0 +926 1 1 +27 3 3 +2539 5 5 +20 0 1 +197 0 8 +1011 1 1 +28 1 1 +121 1 1 +44 1 1 +186 2 0 +1859 1 1 +39 1 1 +87 4 0 +441 1 1 +28 0 3 +175 5 0 +260 18 18 +1043 1 1 +45 1 1 +1093 0 3 +93 1 1 +24 1 1 +742 1 1 +139 1 1 +377 1 1 +24 1 1 +215 1 1 +170 1 1 +675 1 1 +153 1 1 +161 1 1 +20 1 1 +985 40 0 +37 1 1 +85 1 1 +62 1 0 +78 1 1 +98 1 1 +556 16 16 +434 0 2 +1498 1 1 +113 1 1 +377 1 1 +67 1 0 +27 5 1 +260 1 1 +32 2 2 +194 3 0 +241 1 1 +27 1 1 +652 1 1 +42 1 1 +527 2 0 +518 1 2 +35 1 1 +179 11 11 +164 1 1 +31 1 0 +155 1 1 +349 1 0 +268 5 5 +120 1 1 +49 1 1 +86 11 11 +711 6 6 +71 1 1 +35 0 4 +45 1 1 +591 4 4 +179 4 0 +1128 0 1 +477 1 1 +17 3 3 +95 0 3 +128 1 1 +35 1 1 +947 0 851 +733 4 4 +80 5 5 +177 1 1 +45 1 1 +683 1 1 +46 1 1 +1329238 0 1 +1285733 1 0 +133220 0 1 +4409242 0 1 +1129982 1 0 +1666311 0 1 +869726 + +chain 47239925 11 135006516 + 51090853 51594205 chr11 135086622 - 80059914 80561548 157 +1351 16 17 +866 0 3 +2890 16 16 +143 1 0 +103 1 1 +41 1 1 +343 1 1 +43 1 1 +753 13 13 +1491 1 1 +46 1 1 +3186 16 16 +4820 1 2 +3455 1 1 +20 1 1 +7178 6 6 +3766 0 1 +4919 15 15 +598 4 4 +27 1 1 +99 7 7 +2007 9 9 +5065 1 1 +31 1 1 +1665 1 0 +76 0 1 +36 1 0 +273 1 1 +65 1 1 +840 12 12 +1724 10 10 +6589 8 8 +204 1 1 +38 1 1 +5560 1 0 +2381 171 0 +388 1 0 +1664 1 1 +50 1 1 +6542 1 1 +49 1 1 +1825 15 15 +59 1 1 +63 1 1 +227 8 8 +426 1 1 +24 1 1 +386 1 1 +41 1 1 +3738 1 1 +47 1 1 +979 14 14 +1875 8 8 +6277 11 11 +5679 1 0 +2522 0 1 +4748 1549 0 +401109 + +chain 29308 11 135006516 + 7716915 7717221 chr3 198295559 - 94466174 94466480 6294238 +306 + +chain 25833 11 135006516 + 1076475 1086714 chr11_KI270927v1_alt 218612 + 150868 161107 307 +144 8681 8681 +68 1288 1288 +58 + +chain 6968 11 135006516 + 51192703 51192777 chr11 135086622 + 55104000 55104074 36680512 +74 + +chain 5458 11 135006516 + 51191977 51192035 chr12 133275309 - 98770335 98770393 41793443 +58 + +chain 5185 11 135006516 + 50781945 50782000 chr11 135086622 + 50809938 50809993 42860989 +55 + +chain 4976 11 135006516 + 50782069 50782122 chr2 242193529 - 147662467 147662520 43756387 +53 + +chain 2749 11 135006516 + 87687828 87687858 chr11 135086622 + 87977105 87977135 43031687 +30 + +chain 2334 11 135006516 + 1158582 1158615 chr11 135086622 + 1164803 1164836 28591267 +33 + +chain 857 11 135006516 + 50780863 50780919 chr20 64444167 + 28534739 28534795 32567254 +56 + +chain 3789843 GL000202.1 40103 + 0 40103 chr11 135086622 + 69902743 69942662 1364 +1196 0 3 +3649 0 1 +4710 1 1 +28 13 0 +274 1 1 +34 1 1 +473 4 0 +597 49 0 +1255 0 1 +2206 1 1 +24 1 1 +212 13 13 +172 131 0 +89 3 0 +81 1 1 +37 0 21 +1692 1 1 +10 1 1 +1208 6 0 +3077 1 1 +24 1 1 +1368 51 51 +1506 1 1 +34 1 1 +454 1 1 +87 1 1 +158 0 1 +6822 1 0 +1624 4 0 +6713 + +chain 10695 GL000202.1 40103 + 14926 15037 chr11 135086622 + 69917490 69917601 27339516 +111 + +chain 12341034620 12 133851895 + 154166 133841895 chr12 133275309 + 45000 133265309 11 +111 1 1 +47 1 1 +127 27 27 +6780036 0 1 +3507 0 1 +91152 0 1 +51036 1 2 +10447 0 1 +3713 0 1 +395 1 1 +22 0 1068 +8766 7 7 +4552 0 787 +10510 0 1 +71251 50000 4708 +2754569 3 0 +1337334 0 1 +950 1 0 +507 0 1 +372 1 0 +19 1 1 +1803 3 0 +743 0 1 +1954 4 0 +390 1 0 +81 2 2 +135 1 1 +30 1 1 +772 0 1 +1686 0 4 +638 1 1 +23 314 0 +185 15 15 +2933 0 3 +858 0 1 +302 1 0 +709 5 5 +492 1 1 +81 1 1 +1063 1 1 +23 1 1 +718 1 1 +65 1 1 +1279 13 13 +4258 0 4 +4078 1 3 +2081 1 0 +482 0 1 +1244 1 0 +110 1 1 +22 1 1 +2252 8 14 +4478 1 1 +40 0 1 +5054 1 0 +1178 2 0 +775 0 9 +37 0 1 +6285 5 0 +638 1 0 +1000 5 0 +3434 0 1 +24 1 1 +1649 0 1 +273 5 6 +2748 1 1 +37 1 1 +445 16 16 +1490 12 12 +1413 5 0 +2978 1 1 +36 1 1 +496 1 0 +38 1 1 +1358 4 0 +712 1 1 +17 1 1 +923 2 0 +417 1 0 +3260 2 0 +3059 15 0 +2890 1 0 +2437 1 0 +24 1 1 +5098 1 0 +10643402 13 13 +3936607 0 1 +4728591 1 0 +382152 1 0 +50128 0 1 +2182100 1 0 +1513364 3000000 2759133 +5350249 1 0 +1390910 0 20 +7001396 2 1 +5847122 0 1 +1524876 0 1 +315466 0 1 +3493161 0 1 +18068348 7505 7506 +4559545 0 1 +3504 1 1 +46 1 1 +901844 1 0 +51968 0 1 +445447 0 1 +5377351 0 1 +3907109 2 0 +11558853 0 1 +1263898 0 1 +448170 50000 5971 +1805457 0 1 +1856904 1 0 +7105305 0 1 +421139 0 1 +1352461 499 398 +28 1 0 +99513 1 0 +465844 50000 3359 +1992293 7 8 +2880067 0 1 +5254002 100000 13698 +3054 2 0 +126 2 0 +1978 225 0 +85 360 0 +50 714 0 +128 53 8 +99 270 0 +45 45 0 +58 766 1 +52 54 9 +36 361 1 +62 895 0 +36 1350 0 +133 2 2 +26 1 1 +739 1 1 +41 143 8 +1568 493 0 +9793 14 14 +1513 1 1 +46 1 1 +1108 1 1 +35 1 1 +439 35 8 +54 0 41 +896 13 13 +1414 1 1 +105 1 1 +61 47 0 +254 11 11 +1005006 + +chain 3423816 12 133851895 + 60000 95739 chr12 133275309 - 133229570 133265309 1464 +35739 + +chain 441605 12 133851895 + 80848225 80855675 chr12 133275309 - 52813358 52820809 4620 +6343 0 1 +1107 + +chain 175749 12 133851895 + 150801 152812 chr15 101991189 - 37693 39711 300659 +93 1 1 +18 1 1 +254 1 1 +43 1 7 +58 1 1 +148 1 1 +47 1 1 +66 12 12 +176 6 6 +202 1 1 +48 1 1 +86 1 1 +43 1 1 +228 10 11 +462 + +chain 127260 12 133851895 + 152812 154166 chr12_GL877875v1_alt 167313 + 31540 32877 596 +187 1 1 +58 1 1 +139 1 1 +36 4 0 +46 1 1 +148 2 2 +31 1 1 +53 1 1 +26 1 1 +120 1 1 +41 1 1 +156 1 1 +28 1 1 +55 24 14 +68 1 1 +41 1 1 +54 3 0 +8 1 1 +12 + +chain 62953 12 133851895 + 132812965 132817877 chr12 133275309 + 132241396 132243077 1052515 +80 194 16 +82 223 0 +44 128 38 +53 99 99 +21 46 46 +51 459 54 +83 135 0 +58 262 82 +19 45 0 +5 345 75 +51 226 1 +43 985 0 +33 90 0 +58 91 1 +72 181 1 +222 200 20 +70 5 50 +153 + +chain 28307 12 133851895 + 121964737 121965036 chr12 133275309 + 121527556 121527855 5829580 +299 + +chain 20529 12 133851895 + 146191 146868 chr10 133797422 + 61713737 61714414 12530907 +92 218 218 +52 175 175 +71 20 20 +49 + +chain 14329 12 133851895 + 132812154 132812824 chr12 133275309 + 132241393 132241838 2959799 +93 217 82 +5 284 194 +71 + +chain 14115 12 133851895 + 148296 148443 chr20 64444167 + 60000 60147 20313926 +147 + +chain 12646 12 133851895 + 132813045 132814218 chr12 133275309 + 132241566 132242473 2631703 +46 142 9 +6 263 40 +42 639 729 +35 + +chain 6639 12 133851895 + 132812663 132812732 chr12 133275309 + 132241047 132241116 37619613 +69 + +chain 6338 12 133851895 + 132818841 132818976 chr12 133275309 + 132243141 132243276 1440919 +135 + +chain 6288 12 133851895 + 145859 145972 chr12 133275309 - 31035793 31035906 14703306 +113 + +chain 5669 12 133851895 + 132820552 132820666 chr12 133275309 + 132244615 132244730 19256382 +86 26 27 +2 + +chain 5025 12 133851895 + 132812271 132812379 chr12 133275309 + 132241105 132241213 5957101 +108 + +chain 4820 12 133851895 + 132814579 132816778 chr12 133275309 + 132241889 132242203 1551876 +84 90 45 +50 199 19 +34 1699 39 +43 + +chain 4690 12 133851895 + 132820874 132821045 chr12 133275309 + 132244444 132244615 4931436 +171 + +chain 4267 12 133851895 + 146324 146398 chrX 156040895 - 32474684 32474758 17232863 +74 + +chain 3920 12 133851895 + 146599 146658 chr4 190214555 + 45107749 45107808 28080447 +59 + +chain 3869 12 133851895 + 132814007 132815397 chr12 133275309 + 132241992 132242437 2493661 +87 192 102 +33 574 124 +45 405 0 +54 + +chain 3784 12 133851895 + 132820699 132820847 chr12 133275309 + 132244370 132244492 3112120 +63 26 0 +59 + +chain 3723 12 133851895 + 146086 146178 chr4 190214555 + 127460243 127460335 13859530 +92 + +chain 3710 12 133851895 + 132813092 132813367 chr12 133275309 + 132241793 132241935 12175812 +58 171 38 +46 + +chain 3038 12 133851895 + 132817501 132817551 chr12 133275309 + 132241441 132241491 17196779 +50 + +chain 2885 12 133851895 + 132817146 132817176 chr12 133275309 + 132241086 132241116 37927175 +30 + +chain 2738 12 133851895 + 132820666 132820874 chr12 133275309 + 132244483 132244615 8989492 +33 148 72 +27 + +chain 2223 12 133851895 + 132815307 132815330 chr12 133275309 + 132241717 132241740 40818692 +23 + +chain 2073 12 133851895 + 145976 146034 chr1 248956422 - 202223754 202223812 28690110 +58 + +chain 1735 12 133851895 + 132814414 132816221 chr12 133275309 + 132240869 132241144 11181577 +31 1665 133 +54 7 7 +50 + +chain 1665 12 133851895 + 132815448 132815518 chr12 133275309 + 132241903 132241973 1818365 +70 + +chain 1584 12 133851895 + 132814363 132814753 chr12 133275309 + 132241673 132241748 32595035 +45 315 0 +30 + +chain 1259 12 133851895 + 132812469 132812518 chr12 133275309 + 132241033 132241082 25481048 +49 + +chain 1060 12 133851895 + 145758 145823 chr12 133275309 + 20060596 20060661 16514127 +65 + +chain 632 12 133851895 + 132815518 132815547 chr12 133275309 + 132241748 132241777 8723310 +29 + +chain 542 12 133851895 + 145825 145859 chrX 156040895 - 101896430 101896464 16588560 +34 + +chain 537 12 133851895 + 132814528 132815667 chr12 133275309 + 132241073 132241222 8481130 +51 1044 54 +44 + +chain 449 12 133851895 + 132815991 132816043 chr12 133275309 + 132240869 132240921 23064739 +52 + +chain 399 12 133851895 + 132815717 132815763 chr12 133275309 + 132241452 132241498 7096549 +46 + +chain 375 12 133851895 + 132815793 132815841 chr12 133275309 + 132241977 132242025 33183221 +48 + +chain 358 12 133851895 + 132817096 132817146 chr12 133275309 + 132241441 132241491 18734287 +50 + +chain 263 12 133851895 + 132816778 132816816 chr12 133275309 + 132241078 132241116 28726256 +38 + +chain 9027875864 13 115169878 + 19020000 115109878 chr13 114364328 + 18445860 114344403 14 +762 1 0 +12 1 1 +598 0 1 +14 1 1 +891133 17 17 +751503 0 1 +4102281 0 1 +1969622 0 1 +6575286 1 0 +293676 0 1 +7658506 0 1 +4183602 0 1 +3128191 1 0 +4142842 0 1 +3532491 0 1 +5548224 0 1 +2930715 0 1 +7711180 6 0 +1236998 0 1 +2067316 0 1 +1348737 0 1 +376529 0 1 +42631 1 1 +22 1 0 +9247423 161499 83358 +445 0 4 +28 1 1 +450 1 1 +46 1 1 +247 1 4 +101 1 1 +42 1 1 +70 1 1 +66 0 1 +1677 8 8 +101 4 4 +407 3 0 +979 1 1 +37 1 1 +207 1 1 +68 1 1 +124 1 1 +43 1 1 +176 1 1 +39 1 1 +117 5 14 +1432 1 0 +720 1 1 +26 0 1 +1041 1 0 +296 0 4 +1325 0 4 +2333636 0 1 +3365889 0 1 +2006630 1 0 +6987449 98 0 +100817 0 1 +506350 0 1 +2922286 1 0 +847912 0 1 +54296 0 1 +907200 0 1 +3020830 0 1 +2368428 150000 148033 +1422224 1 0 +399774 100000 51342 +213955 100001 33563 +14163 0 3935 +62515 0 1 +293251 + +chain 8343022327 14 107349540 + 19000000 107289540 chr14 107043718 + 18223523 106881350 15 +489013 0 190726 +747 1 1 +27 1 1 +2229 2 0 +6436 1 1 +22 1 1 +300 1 0 +128 1 1 +29 0 1 +52 11 11 +487 1 1 +16 1 1 +56 1 1 +66 1 0 +606 1 1 +36 0 1 +1008 1 1 +46 4 5 +841 1 1 +35 1 1 +819 1 0 +320 20 11 +1002 1 1 +29 1 1 +1010 1 1 +68 1 1 +819 0 3 +1301 1 0 +1036 4 5 +49 1 1 +2227 4 0 +2993 0 2 +468 0 1 +1720 0 1 +484 1 1 +36 1 1 +273 15 15 +3440 1 1 +38 0 1 +1185 1 0 +2530 0 1 +4765 1 0 +974 1 1 +18 1 1 +3125 1 1 +85 1 1 +352 1 1 +68 1 1 +922 1 1 +20 1 1 +514 1 1 +48 1 1 +324 1 1 +80 1 1 +653 0 2 +61 0 4 +113 0 1 +63 1 1 +235 1 1 +35 1 1 +479 1 1 +26 1 1 +363 18 18 +113 1 1 +9 1 0 +72 1 1 +202 2 3 +1470 11 12 +562 8 7 +1095 1 0 +893 1 1 +56 1 1 +856 0 1 +1543 155 0 +299 1 1 +37 1 1 +163 1 1 +40 1 1 +1125 0 1 +2423 2 0 +336 1 1 +19 1 1 +272 15 15 +66 12 0 +276 1 0 +1862 0 1 +568 2 0 +617 12 0 +138 14 14 +123 1 1 +57 20 21 +16 11 13 +47 2 2 +1292 12 2 +324 1 1 +28 0 1 +482 4 2 +10 0 2 +35 4 0 +25 15 1 +1133 0 1 +320 1 1 +28 1 1 +1822 1 1 +10 1 1 +2397 0 12 +332 9 9 +737 1 1 +34 0 4 +566 4 4 +45 1 1 +82 14 13 +139 10 10 +193 0 4 +35 1 1 +4478 1 1 +36 1 1 +918 0 1 +2773 2 0 +343 1 1 +60 7 1 +56 11 8 +339 0 18 +370 1 1 +22 1 1 +273 1 0 +406 11 11 +3716 0 1 +3969 1 1 +36 1 1 +1035 9 9 +3260 1 1 +19 1 1 +2206 1 1 +45 1 1 +364 26 26 +2004 0 1 +71 0 1 +51 20 15 +3952 1 1 +68 1 1 +211 6 6 +817 1 1 +45 1 1 +134 1 22 +57 1 1 +29 1 1 +56 4 4 +18 1 1 +356 1 0 +29 1 1 +666 1 1 +31 1 1 +209 16 16 +96 1165 0 +594 1 1 +40 4 4 +162 13 13 +658 1 1 +36 629 1 +58 1 1 +74 1 1 +107 1 1 +20 1 1 +606 1 1 +42 1 1 +371 1 1 +47 0 4 +227 2 0 +296 6 5 +469 1 1 +40 1 1 +564 1 1 +19 1 1 +793 1 1 +41 1 1 +202 1 1 +28 1 1 +141 1 1 +10 0 7 +52 1 1 +245 17 17 +506 0 2 +99 7 7 +544 3 0 +25 1 0 +95 1 1 +466 11 11 +736 1 1 +42 12 0 +56 1 1 +66 8 0 +55 1 1 +48 1 1 +483 1 1 +19 1 1 +570 1 1 +32 1 1 +335 18 0 +599 9 8 +388 2 1 +197 0 1 +81 1 1 +32 1 2 +49 1 1 +180 1 0 +37 1 1 +183 12 12 +123 0 4 +9 0 4 +48 2 0 +8 1 5 +22 13 0 +17 0 65 +29 1 1 +126 1 0 +1712 1 1 +25 1 0 +26 2 2 +90 3 0 +60 1 1 +43 5 5 +163 14 14 +109 1 0 +124 1 1 +48 1 1 +59 1 1 +22 1 1 +131 13 13 +419 1 1 +58 8 4 +85 1 1 +331 1 1 +142 1 1 +13 1 4 +59 0 1 +143 8 0 +30 1 1 +1856 1 1 +30 1 1 +1390 0 4 +1083 1 1 +72 1 1 +381 1 1 +47 1 1 +5274 2 0 +108 1 1 +19 1 1 +924 0 1 +3348 1 1 +45 1 1 +382 1 1 +40 1 1 +3941 0 1 +172 0 1 +610 1 1 +42 1 1 +995 0 1 +258 0 1 +633 0 1 +1109 0 1 +5266 19 18 +177 7 7 +311 7 7 +1214 1 0 +1385 1 1 +59 1 1 +157 1 1 +48 1 1 +334 0 25 +1407 1 0 +241 1 1 +45 1 1 +1058 16 16 +2191 1 1 +18 1 0 +775 21 25 +3338 0 1 +866 1 1 +31 1 1 +367 5 5 +1995 1 0 +117 9 9 +2529 1 1 +30 1 1 +1012 0 1 +396 0 1 +998 1 1 +27 3 0 +1635 16 16 +1515 1 1 +44 1 1 +80 1 1 +64 1 1 +526 13 13 +140 15 17 +151 1 1 +32 1 1 +1007 7 0 +616 9 9 +48 1 0 +314 13 19 +1545 1 0 +18 1 1 +606 1 1 +49 1 1 +1027 11 0 +331 1 1 +43 1 1 +471 1 1 +33 1 1 +928 1 1 +42 1 1 +268 5 5 +327 1 1 +51 1 1 +815 16 7 +4425 2 0 +831 13 12 +68 14 14 +993 0 1 +653 4 0 +18 0 4 +130 1 1 +49 1 1 +150 1 1 +23 1 1 +425 1 1 +90 1 1 +82 1 1 +30 1 1 +162 1 0 +102 1 1 +46 1 1 +772 6 6 +179 1 1 +49 1 1 +116 1 1 +21 1 1 +217 16 16 +212 12 12 +977 4 1 +1026 0 7 +78 1 0 +47 1 1 +719 1 1 +30 1 1 +260 0 1 +2533 1 0 +311 4 4 +23 1 1 +946 10 10 +152 1 1 +29 1 1 +50 1 1 +20 1 1 +511 4 0 +482 12 12 +203 4 0 +429 23 0 +40 1 1 +367 1 1 +32 0 1 +337 1 1 +22 1 1 +291 11 2 +87 5 5 +25 1 1 +1004 10 10 +565 2 2 +42 1 1 +115 0 2 +323 5 5 +996 1 1 +15 1 1 +1792 10 10 +277 4 0 +207 4 4 +561 4 0 +107 0 4 +56 1 1 +3256 1 1 +90 1 1 +322 1 1 +90 1 1 +117 1 1 +82 1 1 +513 30 39 +1354 9 8 +501 0 1 +1420 2 2 +24 0 1 +4 1 0 +407 1 1 +30 1 1 +302 1 1 +84 1 1 +109 0 1 +23 0 1 +689 16 16 +1183 3 0 +431 1 1 +26 1 1 +405 1 1 +41 1 1 +394 1 1 +25 1 1 +106 1 1 +46 1 1 +343 1 1 +42 1 1 +753 0 2 +491 0 14 +87 0 5 +465 0 1 +774 10 10 +465 12 1 +43 1 1 +145 1 1 +36 1 1 +591 13 13 +1679 0 2 +910 10 10 +62 1 1 +28 1 1 +338 1 1 +42 1 1 +2043 1 1 +31 1 1 +746 1 1 +23 0 1 +126 1 0 +990 13 13 +346 1 1 +28 1 1 +83 12 0 +575 1 1 +64 1 1 +351 1 0 +23 1 1 +114 0 1 +122 1 0 +1646 1 5 +957 1 0 +36 1 1 +13338 21 24 +232 24 22 +184 0 1 +230 1 6 +618 0 1 +432 3 0 +190 1 1 +24 1 1 +211 1 0 +66 1 1 +41 1 1 +86 12 1 +99 1 0 +52 396 1 +106 1 1 +52 3 3 +428 3 3 +27 1 1 +1146 1 0 +68 1 1 +131 1 1 +92 1 1 +105 1 1 +671 3 0 +209 1 1 +8 1 2 +73 1 1 +500 1 1 +30 1 1 +210 1 1 +40 1 1 +517 1 1 +28 1 1 +200 1 0 +40 1 1 +428 16 16 +2129 4 0 +268 72 72 +287 4 4 +220 58 58 +109 49 49 +74 46 46 +59 105 104 +75 49 49 +147 112 112 +82 9 9 +348 7 7 +52 503 523 +86 72 72 +62 59603 61241 +79 123 123 +79 56 57 +91 4277 2623 +985 16 16 +428 1 1 +40 0 1 +200 1 1 +28 1 1 +517 1 1 +40 1 1 +210 1 1 +30 1 1 +500 1 1 +73 2 1 +8 1 1 +205 0 3 +675 1 1 +105 1 1 +92 1 1 +131 1 1 +68 0 1 +1146 1 1 +27 3 3 +428 3 3 +52 1 1 +106 1 396 +52 0 1 +99 1 12 +86 1 1 +41 1 1 +54 0 1 +223 1 1 +24 1 1 +174 0 3 +440 1 0 +626 6 1 +219 1 0 +195 22 24 +232 3 0 +20 1 1 +13338 1 1 +36 0 1 +957 5 1 +1636 0 1 +131 1 0 +115 1 1 +23 0 1 +351 1 1 +64 1 1 +563 0 12 +95 1 1 +28 1 1 +346 13 13 +986 0 1 +130 1 0 +23 1 1 +746 1 1 +31 1 1 +2043 1 1 +42 1 1 +338 1 1 +28 1 1 +62 10 10 +895 2 0 +1694 13 13 +591 1 1 +36 1 1 +145 1 1 +43 1 12 +465 10 10 +772 1 0 +465 5 0 +73 14 0 +497 2 0 +763 1 1 +42 1 1 +343 1 1 +46 1 1 +106 1 1 +25 1 1 +394 1 1 +41 1 1 +405 1 1 +26 1 1 +417 0 3 +1197 16 16 +689 1 0 +23 1 0 +109 1 1 +84 1 1 +302 1 1 +30 1 1 +407 0 1 +4 1 0 +24 2 2 +1419 1 0 +502 8 9 +1354 39 30 +513 1 1 +82 1 1 +117 1 1 +90 1 1 +322 1 1 +90 1 1 +3256 1 1 +56 4 0 +85 0 1 +4 1 0 +17 0 4 +561 4 4 +195 0 4 +289 10 10 +1792 1 1 +15 1 1 +996 5 5 +309 2 0 +129 1 1 +42 2 2 +565 10 10 +1004 1 1 +25 5 5 +87 2 11 +291 1 1 +22 1 1 +337 1 0 +32 1 1 +367 1 1 +40 0 23 +412 0 4 +220 12 12 +481 0 4 +512 1 1 +20 1 1 +50 1 1 +29 1 1 +152 10 10 +946 1 1 +23 4 4 +305 0 1 +2529 1 0 +270 1 1 +30 1 1 +719 1 1 +47 0 1 +55 7 0 +1049 1 4 +977 12 12 +212 16 16 +217 1 1 +21 1 1 +116 1 1 +49 1 1 +179 6 6 +772 1 1 +46 1 1 +99 0 1 +165 1 1 +30 1 1 +82 1 1 +90 1 1 +425 1 1 +23 1 1 +150 1 1 +49 1 1 +129 4 0 +16 0 4 +651 1 0 +998 14 14 +68 12 13 +830 0 2 +4426 7 16 +815 1 1 +51 1 1 +327 5 5 +268 1 1 +42 1 1 +928 1 1 +33 1 1 +471 1 1 +43 1 1 +315 0 11 +1043 1 1 +49 1 1 +606 19 20 +1545 19 13 +314 0 1 +48 9 9 +616 0 7 +1007 1 1 +32 1 1 +151 17 15 +140 13 13 +474 1 1 +51 1 1 +145 1 1 +44 1 1 +1515 16 16 +1635 0 3 +27 1 1 +985 1 0 +400 1 0 +1021 1 1 +30 1 1 +2529 9 9 +116 0 1 +1996 5 5 +367 1 1 +31 1 1 +856 1 0 +3348 25 21 +775 0 1 +18 1 1 +2191 16 16 +1058 1 1 +45 1 1 +241 0 1 +1402 25 0 +339 1 1 +48 1 1 +157 1 1 +59 1 1 +1375 0 1 +1224 7 7 +311 7 7 +177 18 19 +5265 1 0 +1100 1 0 +633 1 0 +259 1 0 +1004 1 1 +42 1 1 +609 1 0 +165 1 0 +3949 1 1 +40 1 1 +382 1 1 +45 1 1 +3346 1 0 +926 1 1 +19 1 1 +108 0 2 +5274 1 1 +47 1 1 +381 1 1 +72 1 1 +1070 4 0 +1403 1 1 +30 1 1 +1856 18 26 +156 1 0 +46 6 0 +15 0 3 +9 1 1 +142 1 1 +331 1 1 +85 4 8 +58 1 1 +419 13 13 +131 1 1 +22 1 1 +59 1 1 +48 1 1 +114 0 1 +119 14 14 +163 5 5 +43 1 1 +57 0 3 +93 2 2 +27 0 1 +24 1 1 +1696 0 1 +142 1 1 +29 42 0 +8 7 0 +4 0 1 +10 2 0 +7 2 0 +15 0 1 +4 0 1 +6 2 0 +6 2 0 +48 4 0 +11 4 0 +121 12 12 +183 1 1 +37 0 1 +180 1 1 +49 2 1 +32 1 1 +70 1 0 +208 1 2 +388 8 9 +597 0 18 +337 1 1 +32 1 1 +570 1 1 +19 1 1 +483 1 1 +48 1 1 +60 0 8 +61 1 1 +58 0 12 +40 1 1 +736 11 11 +466 1 1 +95 0 1 +25 0 3 +544 7 7 +74 2 0 +531 1 1 +15 1 1 +245 1 1 +52 7 0 +10 1 1 +141 1 1 +28 1 1 +202 1 1 +41 1 1 +793 1 1 +19 1 1 +564 1 1 +40 1 1 +469 5 6 +296 0 2 +225 4 0 +49 1 1 +371 1 1 +42 1 1 +606 1 1 +20 1 1 +107 1 1 +74 1 1 +7 0 628 +51 38 38 +658 13 13 +162 45 45 +516 0 1165 +174 16 16 +209 33 33 +666 30 31 +356 23 23 +56 31 31 +57 22 1 +134 47 47 +817 6 6 +211 1 1 +68 1 1 +3952 15 20 +47 1 0 +75 1 0 +2004 26 26 +364 1 1 +45 1 1 +2206 1 1 +19 1 1 +3260 9 9 +1035 1 1 +36 1 1 +3967 1 0 +3718 11 11 +400 0 1 +279 1 1 +22 1 1 +370 18 0 +339 8 11 +56 1 7 +60 1 1 +342 0 2 +2760 1 0 +932 1 1 +36 1 1 +4478 1 1 +35 4 0 +193 10 10 +139 0 1 +12 1 1 +82 1 1 +45 4 4 +564 4 0 +36 1 1 +737 9 9 +326 12 0 +2403 12 12 +1822 1 1 +28 1 1 +320 1 0 +1133 1 15 +26 0 4 +20 2 0 +24 2 4 +482 1 0 +28 1 1 +324 2 12 +1292 2 2 +47 13 11 +30 7 6 +57 1 1 +123 14 14 +138 0 12 +609 0 2 +563 1 0 +1868 0 1 +281 0 12 +68 15 15 +272 1 1 +19 1 1 +333 0 2 +2423 1 0 +1128 1 1 +40 1 1 +163 1 1 +37 1 1 +299 0 155 +1542 1 0 +857 1 1 +56 1 1 +884 0 1 +1104 7 8 +562 12 11 +1470 3 2 +202 1 1 +72 0 1 +9 1 1 +113 18 18 +363 1 1 +26 1 1 +479 1 1 +35 1 1 +235 1 1 +63 1 0 +109 4 0 +52 2 0 +666 1 1 +80 1 1 +324 1 1 +48 1 1 +514 1 1 +20 1 1 +922 1 1 +68 1 1 +352 1 1 +85 1 1 +3125 1 1 +18 1 1 +973 0 1 +4751 1 0 +2529 0 1 +1201 1 0 +38 1 1 +3440 15 15 +273 1 1 +36 1 1 +473 1 0 +1720 1 0 +463 2 0 +3008 0 4 +2228 1 1 +49 5 4 +1036 0 1 +1294 3 0 +826 1 1 +68 1 1 +1010 1 1 +29 1 1 +1002 11 20 +304 0 1 +835 1 1 +35 1 1 +841 5 4 +46 1 1 +1008 1 0 +36 1 1 +606 0 1 +66 1 1 +56 1 1 +16 1 1 +487 11 11 +52 1 0 +29 1 1 +125 0 1 +303 1 1 +22 1 1 +6404 0 2 +2261 1 1 +27 1 1 +1876 287 0 +1297 10 10 +994 1 1 +35 1 1 +258 1 1 +17 1 1 +426 7 7 +2281 1 1 +39 1 1 +120 1 1 +37 1 1 +1143 2 0 +74 1 1 +615 10 10 +227 1 0 +291 5 5 +380 1 1 +104 1 1 +781 4 4 +16 1 1 +587 1 1 +24 1 1 +288 1 1 +24 0 2 +128 1 0 +18 1 1 +253 6 6 +388 6 6 +62 0 1 +202 1 1 +34 1 1 +277 0 117763 +560 1 1 +20 1 1 +1327 13 6 +1050 1 1 +44 1 1 +202 4 0 +43 1 1 +352 10 10 +261 1 1 +39 1 1 +939 0 12 +1678 0 36 +159 1 1 +32 1 8 +818 6 0 +580 0 1 +931 0 1 +276 0 2 +3513 0 14 +45 1 1 +882 0 2 +94 1 1 +49 1 1 +864 0 4 +40 1 1 +807 15 16 +416 3 0 +3345 15 15 +92 29 30 +80 1 1 +48 1 1 +2459 1 0 +646 1 1 +31 1 1 +392 1 1 +29 0 54 +1875 0 3 +1841710 0 1 +1480 6 20 +2828 0 2 +1649 0 1 +224 1 1 +30 1 1 +726 2 0 +2129 0 1 +6926 8 0 +1015 1 0 +254 0 1 +763 2 0 +274 3 0 +1190 0 2 +979 0 2 +4790 0 15 +234 0 2 +18621 6 0 +393 1 1 +46 0 1 +339 7 4 +601 4 0 +2984 1 0 +4697 21 20 +2807 0 1 +640 0 16 +18939 1 0 +603 9 0 +323 0 3 +1691 0 3 +3551 3 3 +60 1 1 +1316 0 1 +1995 1 1 +30 1 0 +539 0 1 +797 0 1 +1823 0 3 +523 0 6 +736 1 1 +45 1 1 +2253 0 5 +3546 1 0 +2538 1 1 +22 1 0 +265 11 11 +354 5 1 +1451 1 1 +33 1 1 +1076 1 1 +37 1 1 +1441 1 0 +448 14 0 +758 10 0 +96 0 1 +1363 1 0 +1002 1 0 +301 1 1 +45 1 1 +3003 4 0 +259 1 0 +174 0 2 +402 0 3 +1157 19 19 +149 1 1 +40 1 1 +148 1 1 +91 1 1 +214 1 1 +24 1 1 +50 1 1 +34 1 1 +55 1 1 +31 1 1 +342 1 0 +69 1 1 +212 0 5 +53 1 1 +66 1 1 +198 1 1 +43 1 1 +72 16 16 +205 10 0 +294 21 21 +1032 0 2 +30 1 1 +424 1 1 +26 0 1 +51 1 1 +160 13 13 +182 1 1 +29 1 1 +798 20 20 +50 19 19 +2781 1 0 +903 0 1 +1454 9 9 +2986 0 1 +6047 1 1 +135 1 1 +3511 13 13 +63 4 4 +291 1 1 +49 1 1 +654 4 0 +40 1 1 +361 2 0 +166 0 3 +1558 1 1 +80 1 1 +217 1 1 +19 1 1 +1841 4 0 +564 0 1 +379 72 0 +326 0 1 +859 0 3 +2629 2 0 +191 0 2 +458 1 0 +529 1 5 +82 0 4 +3006 0 8 +607 1 0 +847 0 1 +857 5 1 +34 1 1 +4529 1 1 +46 1 1 +3836 0 1 +68 1 0 +1329 0 4 +10 0 4 +57 5 0 +3053 0 1 +1510 1 0 +1345 2 1 +4996 0 1 +1855 10 8 +2259 1 0 +992 0 1 +2229 2 0 +845 2 0 +621 0 2 +1481 4 4 +3214 1 1 +49 1 1 +412 2 0 +1408 1 1 +45 1 1 +72 0 2 +4176 12 12 +1700 1 1 +45 1 1 +3113 0 2 +324 1 1 +30 8 0 +379 0 1 +2180 1 1 +78 4 2 +24 1 1 +202 14 14 +2304 0 2 +3647 2 0 +22 0 1 +73 0 1 +36 1 0 +8506 18 18 +4495 1 0 +1061 0 1 +1180 1 1 +28 1 1 +57 0 1 +1093 0 1 +54 0 1 +420 24 0 +567 0 3 +1168 1 1 +46 1 1 +108 6 0 +3483 27 0 +622 1 0 +2134 0 1 +3762 7 0 +30 0 2 +1335 0 1 +282 1 1 +45 1 1 +57 4 0 +642 0 1 +46 1 1 +1247 1 0 +157 1 1 +38 1 1 +4609 1 1 +64 1 1 +1455 1 1 +41 1 1 +470 1 1 +42 1 1 +1207 12 12 +284 12 11 +1054 1 1 +48 1 1 +2084 1 0 +5960 0 1 +2371 1 0 +32 1 1 +1107 3 0 +116 1 1 +133 1 1 +1423 5 5 +447 1 1 +117 12 12 +66 0 1 +35 4 4 +74 7 7 +364 1 1 +214 0 1 +32 1 1 +56 4 4 +864 0 1 +539 1 1 +40 9 9 +223 1 1 +76 1 1 +1130 2 0 +314 1 1 +42 1 1 +879 1 1 +20 1 1 +680 1 1 +52 2 2 +907 0 48 +467 1 1 +46 1 1 +76 1 1 +49 1 1 +233 1 1 +45 1 1 +553 11 10 +448 1 0 +842 1 1 +44 1 1 +95 17 17 +166 5 5 +151 5 5 +2700 2 39 +4812 1 0 +1772 14 1 +368 2 0 +2333 0 2 +2469 1 1 +30 1 1 +2852 1 0 +208 0 2 +1387 39 60 +1422 7 7 +909 4 4 +64 1 1 +1383 1 1 +43 0 24 +844 2 2 +17 1 1 +689 1 1 +55 1 1 +2654 1 0 +20652 0 1 +586 0 1 +401 0 1 +97 1 1 +43 1 1 +357 12 12 +420 1 1 +42 1 1 +311 0 3 +1773 0 2 +380 1 0 +3538 1 1 +26 1 1 +1399 1 1 +44 0 1 +1097 0 12 +158 1 1 +113 1 1 +1214 1 0 +2173 1 0 +397 2 0 +337 1 1 +38 1 1 +2347 2 1 +3632 1 1 +48 1 1 +708 1 1 +33 1 1 +995 3 0 +613 1 0 +709 0 1 +970 31 9 +109 1 1 +32 1 1 +6778 1 1 +25 1 1 +604 1 0 +331 0 9 +168 1 2 +1609 4 0 +11258 0 2 +3928 6 0 +4005 1 0 +2976 1 1 +22 1 1 +1366 1 1 +25 1 1 +687 1 1 +15 1 1 +4607 8 8 +8173 0 2 +20355 1 0 +2664 1 8 +176 1 1 +20 1 0 +278 0 1 +4122 1 0 +6451 1 0 +809 1 1 +49 1 1 +132 10 10 +1241 1 1 +53 1 1 +819 1 1 +23 1 1 +50 1 1 +66 1 1 +172 1 1 +101 1 1 +160 1 1 +86 1 1 +222 1 1 +98 1 1 +350 1 1 +76 1 1 +1009 9 9 +57 0 1 +130 1 1 +43 1 1 +1796 2 3 +254 19 19 +1062 1 1 +44 1 1 +8010 11 0 +2543 7 1 +31 1 1 +1929 5 0 +797 0 1 +673 2 0 +118 7 7 +359 1 0 +1919 9 0 +3009 16 0 +2026 1 1 +26 1 1 +3067 1 0 +124 11 11 +1573 1 1 +64 1 1 +375 4 0 +2235 10 10 +1022 1 1 +25 1 1 +4314 1 0 +8841 0 1 +1195 1 0 +76 0 1 +157 1 1 +81 13 1 +158 10 10 +3415 4 4 +1068 1 0 +1650 1 1 +34 1 1 +685 1 1 +48 1 1 +2238 1 1 +56 1 1 +877 1 1 +29 1 1 +1645 1 1 +58 0 1 +34 1 1 +2299 0 1 +2811 1 0 +2503 0 1 +4156 1 1 +42 1 1 +3195 0 1 +220 1 0 +12389 1 0 +13479 0 1 +4211 1 0 +1749 25 27 +1537 4 0 +1754 1 1 +29 1 1 +1030 1 1 +90 1 1 +436 1 1 +25 1 1 +362 4 0 +3973 1 0 +394 0 1 +828 1 0 +10 1 0 +465 9 9 +805 16 16 +396 0 1 +632 1 1 +64 1 1 +1627 1 1 +44 1 1 +3240 9 0 +22 3 0 +2390 1 0 +860 11 10 +2331 1 0 +2457 1 0 +3016 1 0 +6498 0 1 +950 9 9 +1336 1 1 +22 1 0 +58 3 1 +67 1 1 +160 1 0 +271 1 1 +42 1 1 +772 0 1 +866 0 1 +961 4 0 +77 0 8 +4445 1 0 +2889 15 0 +377 1 1 +75 0 1 +2131 1 0 +2974 0 1 +1763 1 0 +1179 1 1 +42 1 1 +19123 11 332 +306 0 2 +444 0 1 +2826 1 1 +28 1 1 +4778 8 8 +458 1 1 +36 1 1 +211 4 0 +64 1 1 +1782 1 0 +3685 1 1 +43 1 1 +1315 1 0 +821 1 1 +33 0 2 +30 1 1 +1444 5 0 +509 0 1 +49 1 1 +104 3 0 +879 0 1 +50 1 1 +33 0 1 +61 1 1 +271 1 1 +192 3 3 +61 1 1 +1834 1 1 +42 1 1 +64 1 0 +157 7 5 +315 15 15 +1007 1 1 +47 1 1 +400 0 7 +1181 1 1 +12 1 0 +19 1 1 +677 1 1 +26 1 1 +1898 1 0 +309 1 1 +51 1 1 +311 3 0 +317 1 1 +64 5 5 +122 1 1 +45 1 1 +1088 1 1 +50 1 1 +707 1 1 +22 1 1 +297 0 1 +135 0 1 +1060 1 1 +45 1 1 +89 1 1 +36 1 1 +406 0 7 +57 1 1 +5379 0 1 +254 8 8 +711 1 0 +905 1 0 +551 1 0 +2170 0 23 +3321 1 1 +23 1 1 +2139 1 0 +92 1 1 +38 1 1 +693 4 0 +856 0 4 +162 0 1 +72 0 2 +64 0 35 +4430 1 1 +31 1 1 +458 1 1 +34 1 1 +2618 1 0 +1322 1 1 +48 1 1 +271 1 1 +19 1 1 +1018 1 1 +43 1 1 +12234 0 1 +3995 0 1 +50 1 1 +22 1 1 +633 0 1 +16201 2 0 +7359 8 0 +171 2 0 +2153 0 1 +653 1 0 +70 1 0 +265 1 0 +92 0 1 +3608 0 8 +2176 0 3 +450 1 1 +17 1 1 +386 1 0 +1498 1 1 +20 1 1 +371 1 1 +31 1 1 +847 8 10 +3927 0 1 +767 0 7 +91 0 4 +4101 0 1 +1585 0 1 +4233 2 0 +4403 1 1 +25 1 0 +1223 1 1 +87 1 1 +113 1 1 +111 1 1 +17160 0 1 +6334 1 1 +56 1 1 +108 6 6 +335 1 1 +53 1 1 +19590 1 0 +2769 1 0 +3562 8 0 +41 1 1 +3699 0 2 +2145 3 4 +1326 1 1 +46 1 1 +462 0 5 +833 1 1 +37 1 1 +457 1 0 +1742 533 0 +4476 10 10 +1881 14 0 +277 0 1 +10473 1 1 +41 1 1 +845 1 1 +78 1 1 +314 0 2 +2026 11 11 +7546 1 1 +20 1 1 +799 0 1 +848 1 0 +622 0 4 +2140 0 1 +2153 0 1 +5277 0 1 +5147 13 13 +3394 26 26 +391 2 0 +82 5 5 +3131 1 1 +44 1 0 +1054 1 0 +5320 0 1 +1475 32 0 +215 2 4 +760 0 51 +7257 1 1 +32 1 1 +1144 0 1 +36 0 1 +79 0 1 +27 1 0 +13150 1 0 +2290 0 1 +3928 1 1 +44 1 1 +1527 1 1 +27 1 1 +2717 2 4 +3588 23 12 +467 0 1 +2288 0 1 +2024 1 1 +21 1 1 +778 1 1 +40 1 1 +223 0 8 +3616 424 0 +6 169 0 +31 1 1 +298 6 6 +1939 0 1 +120 13 1 +131 1 1 +33 0 16 +4146 1 0 +7232 1 0 +1216 1 0 +2723 0 1 +40006 0 2 +6250 0 1 +7797 0 1 +6463 0 1 +1454 0 1 +1510 0 1 +1011 0 1 +197 0 1 +279 1 0 +24 1 0 +2178 14 15 +171 8 9 +2621 1 0 +1567 0 1 +187 1 0 +304 1 0 +543 1 1 +42 1 0 +58 1 1 +1306 1 0 +711 0 1 +181 1 0 +53 0 1 +247 0 1 +1861 17 17 +650 0 1 +61 1 0 +121 0 1 +396 0 1 +986 1 0 +409 0 1 +361 0 1 +1861 0 1 +670 1 0 +19 1 1 +1671 0 1 +67 2 5 +962 1 1 +24 0 1 +338 1 0 +3826 0 1 +1278 0 1 +940 1 1 +32 0 2 +395 0 1 +821 0 1 +159 0 1 +504 0 1 +1028 0 1 +698 0 1 +690 1 1 +71 4 2 +415 1 0 +53 1 1 +25 0 4 +43 0 1 +41 3 4 +64 1 3 +131 0 3 +601 14 16 +211 1 1 +47 0 7 +16 1 0 +240 0 1 +409 1 0 +26 1 0 +561 0 1 +21 0 1 +595 3 3 +23 0 1 +1941 1 0 +24 0 1 +10 0 1 +8 0 1 +115 0 1 +345 5 4 +1246 5 5 +1225 1 0 +23 0 1 +269 0 1 +1074 0 2 +549 10 11 +394 0 1 +5805 1 0 +2519 0 1 +43 0 1 +424 14 14 +328 0 1 +1327 1 1 +58 4 0 +88 5 4 +79 1 1 +500 0 1 +26 0 1 +44 1 0 +65 0 1 +406 15 15 +341 1 1 +44 1 1 +868 1 0 +610 0 1 +133 4 5 +93 3 3 +48 1 1 +881 4 4 +360 0 4 +958 10 0 +11 84 0 +69 0 131 +10 0 1 +18 0 1 +8 0 1 +379 0 1 +86 10 11 +163 7 9 +45 0 1 +2139 1 2 +156 0 1 +415 10 0 +1904 11 12 +258 10 11 +301 1 1 +62 1 1 +2782 1 1 +43 1 1 +3069 1 0 +2357 0 1 +574 0 2 +160 0 1 +503 14 14 +1058 1 0 +305 1 0 +312 1 0 +8232 2 0 +21 1 1 +1712 1 0 +152 1 0 +1262 1 0 +3180 15 14 +3992 2 0 +481 0 1 +3417 18 18 +598 7 7 +1392 1 0 +18 1 1 +622 1 0 +4044 1 1 +38 0 4 +3731 1 0 +9964 0 2 +230 0 1 +12614 2 0 +8891 3 175 +1097 34 0 +13 498 0 +316 4 1 +45 1 0 +757 4 5 +1269 1 1 +47 0 1 +215 4 0 +90 0 10 +890 0 45 +9 3 0 +28 4 0 +41 4 2 +73 6 0 +26 7 3 +35 0 20 +50 4 0 +37 4 0 +33 0 2 +710 0 20 +1431 9 1 +1533433 0 3 +6429463 5 5 +5756124 0 1 +1922959 0 1 +2235437 1 0 +614958 0 2 +166860 1 1 +18 1 1 +7716163 1 0 +1371 154 2640 +363 1 1 +15 1 1 +14287063 0 4 +42 1 1 +53 1 1 +42 1 1 +2341 0 1 +1293 1 0 +479 1 0 +509 1 1 +33 1 1 +2243 0 1 +1949 19 19 +1040 1 0 +60 1 0 +12 2 0 +27 1 1 +1365 1 0 +3205 0 2 +499 8 8 +2924 1 0 +1583 15 15 +3556595 0 1 +5265247 0 2 +4460 0 4 +10341 0 1 +2288 0 2 +3436 9 9 +17556 1 1 +30 1 1 +1223170 14 14 +12 9 9 +32897 0 1 +11550 0 1 +9215 0 1 +24030 0 1 +142543 0 1 +1853839 2 362 +5020535 1 0 +6890505 1 1 +18 1 1 +5141287 1 0 +667517 1 0 +907898 0 9 +11670719 1 0 +429 1 0 +4819 10 0 +3256 0 2 +1268 8 11 +1677 22 22 +1619 11 14 +2254 1 0 +2178 1 17 +8943 2 0 +567 4 0 +422 1 0 +2845 5 5 +884 13 13 +523 11 11 +1662 1 1 +19 1 1 +150 1 1 +41 1 1 +1487 4 4 +1695 1 1 +38 1 1 +1849 7 7 +199 1 1 +49 1 1 +1612 1 1 +30 1 1 +2268 1 0 +7277 5 5 +194 11 11 +1324 7 5 +4501 0 3 +8847 0 1 +528 11 11 +1426 0 227 +3582 64 0 +2336 51 0 +554 0 10 +3653 10 10 +51 1 1 +18 1 1 +122 1 1 +49 1 1 +2266 1 1 +31 0 1 +849 0 100 +21 0 250 +545 3 0 +3696 1 0 +2904 0 4 +4064 0 1 +3379 1 1 +40 1 1 +5418 1 1 +34 1 1 +5868 1 1 +46 1 1 +2018 4 4 +13752 1 1 +16 1 1 +128 1 1 +19 1 0 +4660 1 1 +29 1 1 +10410 25 24 +10697 2 2 +14 1 0 +123 0 1 +10 0 1 +30 0 1 +27 0 1 +7 0 1 +30 0 1 +7943 3 0 +1339 0 2 +2463 1 1 +35 1 1 +1011 1 1 +56 1 1 +243 12 0 +483 90 0 +80 0 2 +18 1 1 +1037 1 0 +85 1 0 +98 3 0 +1791 104 0 +506 1 1 +84 1 1 +259 1 1 +38 1 1 +142 2 2 +47 1 1 +1137 1 1 +22 1 1 +3594 1 0 +2487 1 1 +42 1 1 +6208 21 0 +2765 2 0 +5345 0 1 +1383 1 0 +11 2 2 +1324 1 1 +19 1 1 +246 2 2 +33 0 3 +357 1 0 +6372 1 1 +22 1 1 +1643 1 1 +44 1 1 +1294 1 1 +48 1 1 +1174 1 1 +94 2 2 +55 1 1 +48 3 0 +3109 15 0 +1655 0 8 +1257 7 7 +1084 1 1 +42 0 1 +93 15 15 +356 1 1 +42 1 1 +305 0 3 +2280 141 0 +178 13 33 +12 1 60 +82 1 1 +29 1 1 +286 5 83 +59 1 1 +118 8 27 +55 39 0 +7 0 158 +85 136 0 +58 39 0 +13 1 1 +52 1 1 +80 0 61 +63 39 0 +92 136 0 +40 4 7 +8 1 1 +79 0 82 +937 1 1 +22 1 1 +442 1 1 +59 4 0 +170 1 0 +149 0 1 +40 1 1 +875 1 1 +73 1 1 +78 21 19 +218 1 1 +42 1 1 +552 6 6 +79 1 1 +34 1 1 +139 1 1 +66 1 1 +896 17 19 +71 6 6 +120 5 5 +15 1 1 +84 16 0 +2270 1 1 +39 1 1 +619 1 1 +56 1 1 +50 1 1 +41 1 1 +104 20 20 +342 1 1 +12 1 1 +128 1 1 +39 1 1 +159 23 0 +621 1 1 +87 4 4 +121 1 1 +23 1 1 +128 20 20 +234 1 1 +43 3 3 +117 258 261 +62 1 1 +98 1 1 +539 10 10 +89 8 8 +727 28 29 +94 1 1 +83 1 1 +299 1 1 +15 5 4 +106 1 1 +110 1 1 +39 2 2 +54 1 1 +30 1 1 +42 0 311 +155 1 1 +148 1 1 +166 3 3 +106 1 1 +631 1 1 +49 1 1 +142 1 1 +40 0 1 +155 0 3 +417 3365 13000 +603 0 2 +771 18 18 +61 15 15 +183 1 1 +99 1 1 +3856 1 0 +65 14 14 +4496 0 1 +171 1 1 +58 1 1 +5993 0 1 +792 1 1 +36 1 1 +1286 1 1 +38 1 1 +435 0 1 +1025 1 0 +90 0 1 +460 1 1 +21 1 1 +499 1 1 +42 1 1 +1381 1 1 +49 1 1 +234 3 0 +412 1 0 +2951 1 1 +61 1 1 +358 11 11 +577 2 0 +9 8 0 +119 1 1 +80 1 1 +30 1 1 +1173 6 5 +81 1 0 +8 1 0 +446 0 1 +167 1 1 +21 1 0 +76 1 2 +130 1 1 +34 1 0 +32 1 0 +224 3 3 +23 1 1 +689 1 0 +4 1 0 +5673 0 4 +25 1 1 +395 5 5 +177 1 0 +94 1 0 +67 0 1 +270 1 1 +15 1 1 +99 1 1 +29 1 1 +388 20 22 +596 12 11 +540 1 1 +49 1 1 +230 1 1 +99 4 0 +175 31 32 +1098 1 1 +35 1 1 +315 42674 42330 +133 1 1 +125 1 1 +52 1 1 +71 0 3 +81 1 1 +14 6 0 +31 1 1 +114 1 1 +49 1 0 +76 2 0 +6 1 1 +309 1 1 +39 1 1 +234 15 15 +1602 1 1 +60 15 17 +28 10 11 +62 21 21 +55 1 1 +28 3 2 +75 1 1 +59 1 1 +40 13 13 +1614 1 0 +151 1 1 +90 1 1 +1545 0 1 +683 1 1 +40 4 4 +429 1 1 +37 0 1 +40 0 1 +2335 1 0 +3634 5 5 +5191 0 4 +3715 1 0 +21 4 2 +8 1 1 +53 1 0 +9 1 0 +876 20 19 +713 1 0 +560 1 0 +616 1 0 +13 1 0 +338 0 2 +903 1 1 +35 1 1 +491 1 1 +25 1 1 +131 1 1 +41 1 1 +118 1 1 +17 1 1 +58 0 1 +34 1 1 +492 57 0 +31 4 1 +75 1 1 +83 5 0 +40 46 1 +444 1 1 +115 1 1 +166 1 0 +2083 0 20 +810 1 1 +29 1 1 +10597 1 0 +1835 15 15 +1187 0 1 +502 0 3 +1466 1 1 +50 2 2 +76 2 1 +624 1 1 +56 1 1 +84 1 1 +74 1 1 +317 8 8 +1865 1 0 +104 1 0 +1086 0 1 +147 0 1 +799 1 1 +38 1 1 +185 1 1 +29 1 1 +170 1 0 +558 1 1 +46 1 1 +1628 13 13 +485 2 0 +1164 0 1 +1093 1 1 +36 1 1 +2904 1 1 +40 1 1 +966 0 1 +2357 4 12 +620 0 3 +558 1 1 +42 0 1 +24 0 1 +16 0 1 +6 0 1 +5 0 2 +10 0 1 +12 0 1 +37 0 1 +19 0 1 +34 0 1 +175 0 1 +47 0 1 +15 0 1 +7 0 1 +5 0 1 +5 0 1 +13 0 1 +12 0 1 +54 4 5 +1669 0 1 +213 1 0 +32 1 0 +29 1 0 +411 1 0 +26 1 1 +2076 3 1 +2819 0 1 +2559 8 0 +926 2 0 +2568 1 1 +15 1 1 +54 1 1 +73 0 1 +54 2 1 +5661 14 15 +2723 0 1 +804 1 1 +125 1 1 +825 1 27 +1054 8 8 +6314 0 1 +195 1 1 +32 0 1 +27 3 4 +369 15 15 +225 5 5 +14 6 6 +839 1 1 +32 1 0 +192 7 6 +20 1 1 +1191 1 0 +2913 1 0 +693 5 5 +1258 1 1 +40 2 2 +195 1 1 +92 1 1 +123 1 1 +39 1 1 +113 1 1 +13 1 0 +27 1 0 +367 4 4 +171 13 13 +2128 0 1 +1710 1 3 +3283 0 1 +2948 2 0 +549 0 36 +375 1 1 +30 1 1 +101 2 0 +1228 1 2 +1201 1 0 +112 1 0 +686 1 1 +87 0 1 +15 0 1 +956 1 0 +427 1 0 +49 1 0 +305 1 0 +396 1 0 +485 9 9 +65 1 1 +149 2 2 +143 6 6 +329 0 1 +54 1 0 +51 1 0 +5 1 0 +996 1 27 +719 0 1 +82 1 1 +40 1 0 +11 1 0 +2588 4 0 +1789 1 1 +65 0 1 +91 1 1 +26 1 1 +3158 14 15 +576 9 11 +473 2 2 +30 1 1 +650 1 1 +61 1 1 +159 1 1 +43 1 1 +218 1 0 +237 1 1 +48 1 1 +311 1 1 +46 1 1 +427 2 0 +1274 1 1 +22 4 4 +924 2 1 +1697 1 1 +25 1 1 +1027 1 1 +88 5 5 +103 3 2 +67 14 14 +68 4 4 +113 1 1 +22 0 3 +257 1 0 +149 1 0 +411 4 2 +50 1 0 +15 1 1 +1399 0 1 +2747 0 1 +1313 0 3 +1376 0 1 +16 1 0 +109 1 1 +42 1 1 +577 1 1 +39 1 1 +4504 4 0 +1232 0 1 +1658 9 10 +894 4 4 +485 12 12 +57 1 1 +109 1 1 +326 1 1 +16 1 1 +1600 1 0 +2264 0 1 +1197 0 1 +983 6 8 +357 5 5 +573 1 1 +18 1 1 +230 1 1 +35 1 1 +1058 18 18 +3043 1 1 +11 1 0 +29 2 0 +2126 1 1 +25 0 1 +1930 1 1 +49 1 1 +82 0 1 +1595 0 1 +38 1 1 +50 19 19 +150 1 1 +117 1 1 +73 1 1 +43 3 2 +184 1 0 +1254 1 0 +1811 1 1 +33 1 1 +684 1 1 +50 1 1 +87 23 23 +177 0 1 +398 1 1 +24 1 1 +841 7 7 +21 1 1 +67 0 1 +17 0 1 +2254 0 338 +1730 7 7 +676 0 1 +343 1 1 +23 1 1 +2550 81 75 +59 12 12 +1433 1 0 +48 5 6 +14 9 7 +24 0 1 +481 1 1 +33 1 0 +24 1 1 +1763 1 1 +22 1 1 +804 5 5 +294 1 0 +227 8 10 +573 1 1 +26 1 0 +1327 9 9 +668 1 0 +110 1 1 +479 1 0 +1382 0 2 +746 1 0 +343 1 0 +2344 0 6 +85 2 2 +2657 5 5 +78 2 2 +597 1 1 +46 1 1 +1698 1 1 +15 1 1 +799 1 1 +40 3 3 +1110 1 1 +123 1 1 +2203 0 1 +255 5 5 +85 1 1 +46 1 1 +63 0 2 +315 1 1 +42 0 1 +16 0 1 +293 11 11 +2565 1 1 +22 8 7 +18 0 331 +614 1 0 +42 1 1 +2441 4 4 +51 1 1 +51 2 2 +154 1 1 +32 1 1 +2753 0 1 +730 1 0 +1357 1 0 +261 1 1 +45 1 1 +666 2 4 +1205 1 0 +1005 1 0 +4939 1 1 +337 1 1 +144 1 1 +83 3 3 +143 4113 4112 +53 12 12 +149 41 41 +95 1 1 +17 1 1 +55 1 1 +54 1 1 +50 6 6 +82 2 2 +67 0 1 +20 1 0 +83 1 1 +758 1 0 +1395 1 0 +89 1 0 +49 1 0 +10152 1 0 +690 1 0 +7429 11 11 +3347 2 0 +5461 0 1 +2999 0 1 +1784 1 1 +65 4 4 +72 1 1 +64 1 1 +1220 0 21 +903 1 0 +4091 1 0 +1818 8 8 +1054 1 1 +43 1 1 +146 1 1 +44 1 1 +114 27 27 +842 1 1 +42 0 1 +280 12 12 +1402 3 3 +71 1 1 +234 1 1 +59 4 4 +5231 6 6 +395 1 0 +378 8 8 +162 1 1 +55 1 1 +70 1 1 +42 1 1 +1392 1 0 +1894 3 3 +121 2 0 +23 1 1 +342 0 1 +3038 1 0 +667 1 1 +72 1 0 +90 1 1 +915 1 1 +19 1 1 +239 1 0 +422 1 1 +39 1 1 +1811 7 9 +641 1 1 +23 0 1 +18 1 1 +126 1 1 +44 1 1 +128 1 1 +47 1 1 +1317 3 9 +835 0 1 +421 1 1 +75 1 1 +973 0 1 +1312 0 1 +705 1 0 +798 16 15 +197 1 1 +20 1 1 +2005 1 1 +25 1 1 +585 1 1 +51 1 1 +817 0 1 +83 1 1 +32 1 0 +109 1 1 +19 1 1 +410 1 0 +35 1 1 +47 0 1 +607 1 1 +32 0 1 +891 1 1 +47 1 1 +94 1 1 +165 0 1 +39 1 1 +291 13 13 +92 13 13 +264 1 1 +49 1 1 +163 1 1 +19 1 1 +53 1 1 +53 6 3 +598 1 0 +71 1 0 +178 1 1 +45 1 1 +158 1 1 +65 0 1 +47 5 5 +695 1 1 +61 1 0 +47 1 1 +71 14 14 +178 10 10 +169 1 1 +66 1 1 +83 1 1 +39 1 1 +416 1 1 +31 1 1 +558 1 1 +21 1 1 +2283 1 0 +40 1 1 +599 1 1 +20 1 1 +446 1 1 +48 1 1 +2104 0 1 +233 1 1 +29 2 2 +231 1 1 +18 1 1 +56 1 1 +98 1 1 +221 1 1 +54 1 1 +639 1 1 +22 1 1 +380 1 1 +29 1 1 +54 1 1 +29 1 1 +585 1 0 +16 1 1 +81 1 1 +26 1 1 +194 0 5 +136 2 2 +42 1 1 +75 1 1 +31 5 5 +86 1 1 +106 3 3 +568 5 5 +71 1 1 +35 1 1 +2566 9 9 +1519 0 1 +613 0 4 +2601 2 0 +2581 27 7 +172 1 1 +71 1 1 +2049 26 24 +153 4 4 +717 1 1 +40 1 1 +5568 1 1 +23 1 1 +784 0 2 +1149 1 0 +654 1 1 +118 1 1 +372 0 1 +696 1 1 +27 1 1 +71 1 0 +2928 0 1 +509 78 0 +336 1 1 +39 1 1 +181 1 1 +20 1 0 +168 5 5 +476 1 0 +20 1 0 +325 0 1 +40 1 1 +91 1 0 +10 1 1 +726 1 0 +2313 1 0 +1139 1 0 +307 1 1 +21 1 1 +827 1 1 +44 1 1 +51 8 8 +860 0 1 +441 1 0 +91 1 1 +33 0 1 +448 4 3 +47 1 1 +6583 11 11 +1123 1 0 +15 2 1 +14 1 0 +11 1 0 +877 1 1 +113 1 1 +585 18 18 +1862 3 0 +4498 1 1 +49 0 3 +14 0 50 +371 3 2 +39 0 10 +9 0 8 +59 1 1 +42 1 1 +387 16 16 +1575 0 8 +1742 6 7 +731 15 15 +636 1 1 +64 1 1 +146 1 1 +42 1 1 +193 1 1 +39 0 1 +307 14 14 +61 1 1 +60 1 1 +458 0 1 +1406 1 1 +29 1 1 +1326 1 1 +20 1 1 +285 0 1 +127 13 13 +655 1 0 +773 0 1 +2736 6 5 +557 0 3 +1888 4 0 +1167 2 0 +59 1 1 +33 1 1 +122 7 11 +628 1 1 +29 1 1 +1036 0 5 +32 1 1 +372 1 1 +78 1 1 +83 4 4 +1371 1 1 +33 1 1 +144 1 1 +40 1 1 +450 1 1 +60 1 1 +1280 8 8 +240 8 8 +100 1 1 +56 14 0 +139 0 1 +278 1 1 +44 1 0 +11 0 1 +24 1 1 +768 5 2 +1322 0 1 +39 1 1 +907 0 1 +2045 1 0 +47 1 1 +781 1 1 +16 1 1 +1050 1 1 +41 1 1 +695 60 0 +4804 0 1 +917 1 1 +49 1 1 +847 2 0 +91 1 1 +117 3 4 +128 1 1 +122 7 7 +47 1 1 +605 5 5 +385 1 1 +35 1 0 +355 1 1 +61 1 1 +199 1 1 +31 0 7 +201 0 1 +240 1 1 +104 1 1 +283 1 1 +33 1 1 +40 3 0 +317 1 1 +42 1 1 +129 1 1 +41 0 1 +26 0 1 +14 0 1 +4 0 1 +134 22 22 +294 15 15 +168 1 0 +161 9 9 +81 1 1 +25 1 1 +934 0 2 +146 5 5 +500 4 6 +173 0 1 +2042 11 11 +278 1 1 +96 7 3 +50 1 1 +344 1 1 +27 1 1 +2060 15 15 +859 1 1 +95 1 1 +56 14 14 +1050 1 1 +44 1 1 +423 1 1 +34 1 1 +2701 7 7 +365 16 14 +1727 11 7 +1865 1 0 +231 6 8 +1069 15 15 +253 1 1 +37 1 1 +111 1 1 +84 1 1 +68 6 6 +66 1 1 +261 0 4 +149 2 2 +195 1 1 +6 0 4 +78 1 1 +154 1 1 +26 1 1 +65 10 11 +62 1 1 +36 1 1 +56 1 1 +131 1 0 +152 1 1 +84 1 1 +350 5 6 +75 1 1 +76 1 0 +121 6 6 +53 16 16 +155 1 1 +68 0 1 +89 1 1 +236 14 14 +634 1 2 +525 1 1 +47 1 2 +1473 1 1 +25 1 1 +1939 9 10 +1829 0 4 +4647 1 0 +2388 4 4 +1457 1 0 +1656 1 0 +3558 1 0 +1046 1 1 +48 1 1 +235 0 4 +25 3 1 +204 1 1 +49 0 1 +3802 1 1 +44 5 0 +771 2 0 +157 1 1 +73 1 1 +1575 1 1 +31 1 1 +1131 1 1 +40 1 0 +78 1 1 +57 1 1 +218 2 0 +39 3 3 +392 1 1 +30 1 1 +790 0 1 +66 1 0 +459 1 0 +176 1 1 +47 1 1 +765 1 1 +44 4 0 +12 2 0 +98 1 1 +19 1 1 +55 1 1 +57 1 1 +98 6 6 +108 4 4 +449 1 1 +50 10 0 +340 1 1 +37 1 1 +302 1 1 +62 1 1 +1313 16 16 +175 1 0 +23 1 1 +186 1 1 +17 1 1 +1118 4 4 +66 1 1 +88 14 14 +158 0 1 +16 1 1 +320 1 0 +674 24 24 +100 14 14 +115 0 8 +62 0 1 +1728 0 1 +154 0 1 +57 1 1 +353 17 16 +141 1 1 +43 0 1 +276 1 0 +14 1 0 +293 1 0 +19 1 0 +12 1 0 +734 1 0 +38 1 0 +98 2 0 +1632 0 1 +445 1 0 +3353 1 0 +12 1 0 +30 1 0 +193 0 2 +119 1 1 +106 1 1 +1892 18 18 +1082 11 11 +242 2 0 +2799 1 1 +27 1 1 +807 1 1 +77 1 1 +1534 1 0 +6829 24 33 +1912 1 1 +26 1 1 +598 1 1 +27 1 1 +553 1 1 +42 5 5 +64 6 6 +141 1 1 +44 1 1 +278 1 1 +46 1 1 +401 1 1 +36 1 1 +128 16 16 +27 1 1 +1057 5 5 +5055 1 1 +261 1 1 +2079 1 1 +38 1 1 +453 1 1 +18 1 1 +194 1 0 +203 1 0 +516 1 1 +24 2 2 +1281 1 1 +179 1 1 +58 1 1 +129 1 1 +57 0 3 +136 1 1 +55 1 1 +19 0 1 +53 16 16 +27 1 1 +1843 1 1 +23 1 1 +4328 1 1 +27 1 1 +80 8 8 +140 1 1 +118 1 1 +516 1 1 +74 1 1 +55 1 1 +27 9 9 +57 1 0 +23 1 1 +125 3 3 +52 1 1 +63 4 4 +52 14 14 +62 1 1 +51 1 1 +224 10 0 +146 3 3 +61 1 1 +286 1 0 +1527 1 0 +10 1 1 +614 1 1 +46 2 2 +859 1 1 +25 1 1 +1923 1 1 +37 1 1 +81 3 3 +106 1 1 +2233 12 12 +242 1 1 +16 1 1 +17702 1 0 +27642 0 1 +956 0 765 +4123 0 4 +8764 0 1 +303 0 47003 +1360 0 1 +2365 3 3 +49 1 0 +64 6 7 +56 1 1 +2157 0 1 +312 1 3 +397 0 1 +268 1 0 +6857 0 1 +105 0 1 +4064 1 0 +9668 0 1 +802 1 1 +32 1 0 +1881 14 14 +8749 0 2 +4343 9 11 +3323 0 1 +2641 1 1 +37 1 1 +2572 0 1 +758 0 1 +1915 0 1 +6085 0 2 +1643 0 1 +4100 0 1 +2097 3 13 +4555 6 6 +3715 0 1 +19025 1 0 +1004 0 1 +24 1 0 +402 1 1 +52 1 1 +65 12 13 +2271 0 1 +4 0 1 +70 1 1 +1229 0 1 +3139 0 1 +1896 0 1 +71 0 1 +35 0 1 +228 1 0 +1669 11 11 +225 0 1 +100 4 4 +3942 0 1 +54 1 1 +21 1 1 +1361 6 23 +665 + +chain 6014759 14 107349540 + 19544369 20116915 chr14 107043718 - 87600382 88172928 122 +155 43507 43507 +26 8958 8958 +1165 1509 1509 +629 107616 107616 +30 39208 39208 +396 7553 7553 +72 511 511 +58 109 109 +49 74 74 +46 59 59 +105 75 75 +49 147 147 +112 498 498 +503 86 86 +72 62 62 +59603 79 79 +123 79 79 +56 91 91 +4277 45336 45336 +39 55139 55139 +25 5749 5749 +25 35878 35878 +42 10744 10744 +38 833 833 +45 915 915 +33 666 666 +30 435 435 +31 213 213 +47 7199 7199 +26 99968 99968 +287 31027 31027 +29 + +chain 992144 14 107349540 + 106478143 106809888 chr14_KI270846v1_alt 1351393 + 479726 821728 103 +39 1 1 +108 20 23 +89 5186 15058 +85 2 1 +67 1 1 +119 1 1 +20 1 1 +151 1 1 +28 0 1 +85 1 1 +240 5 88 +236 1 1 +41 1 1 +134 1 1 +24 1 1 +94 13 13 +188 1 1 +25 1 1 +230 1 1 +25 0 1 +197 0 4 +491 10 0 +125 41015 41000 +192 1 1 +97 1 1 +557 12 17 +108 4 4 +272 15 15 +325 1 1 +74 1 1 +66 2347 3910 +54 25 25 +58 274466 273222 +109 1 1 +17 1 0 +87 1 1 +50 36 27 +69 2 2 +28 1 1 +87 1 1 +23 1 1 +267 1 1 +29 5 6 +71 4 0 +62 0 1 +61 0 4 +47 1 1 +308 1 1 +40 1 1 +185 235 236 +112 34 34 +215 429 427 +109 35 35 +66 93 93 +101 63 63 +58 47 47 +186 55 55 +67 31 35 +111 91 91 +74 4 4 +55 22 22 +74 + +chain 50077 14 107349540 + 106533039 106534023 chr14_KI270846v1_alt 1351393 - 925446 926433 3102289 +85 51 51 +68 138 142 +53 56 56 +301 149 148 +83 + +chain 45866 14 107349540 + 23106271 23106816 chr4 190214555 + 76917177 76917763 429604 +2 0 16 +32 13 13 +49 1 1 +46 49 0 +59 46 122 +50 1 0 +4 1 0 +192 + +chain 39974 14 107349540 + 106807521 106809118 chr14_KI270846v1_alt 1351393 + 794323 795920 1106919 +131 494 497 +147 91 88 +162 109 109 +35 66 66 +76 118 118 +35 86 86 +47 + +chain 29741 14 107349540 + 106537142 106542174 chr14_KI270846v1_alt 1351393 + 1204414 1209667 6068123 +56 151 152 +55 1673 1684 +67 1846 2050 +74 772 777 +142 84 84 +112 + +chain 21382 14 107349540 + 106562695 106562923 chr12 133275309 - 54222484 54222712 11756632 +228 + +chain 20601 14 107349540 + 106550616 106550887 chr14_KI270726v1_random 43739 - 15538 15809 12460197 +129 42 42 +100 + +chain 16712 14 107349540 + 106531793 106532327 chrX 156040895 + 83431988 83432509 16720856 +62 98 98 +70 228 215 +76 + +chain 16256 14 107349540 + 106563265 106563621 chr2_GL383522v1_alt 123821 + 35295 35653 17316327 +68 168 170 +120 + +chain 15173 14 107349540 + 106563823 106564001 chr5 181538259 + 42030208 42030386 18763358 +97 7 7 +74 + +chain 14082 14 107349540 + 106539290 106539527 chr15 101991189 + 21718021 21718257 20361227 +103 77 76 +57 + +chain 13157 14 107349540 + 106467308 106467444 chr14 107043718 + 106000300 106000436 16570984 +136 + +chain 13020 14 107349540 + 106568782 106569543 chr3 198295559 - 173661329 173662085 22156839 +89 598 593 +74 + +chain 12305 14 107349540 + 106555377 106557526 chr14_KI270846v1_alt 1351393 + 686596 689061 23574868 +62 1939 2255 +148 + +chain 11435 14 107349540 + 106536095 106536217 chr16 90338345 - 57449034 57449156 25483711 +122 + +chain 9451 14 107349540 + 106562301 106562401 chr6 170805979 - 103254737 103254837 31138913 +100 + +chain 9390 14 107349540 + 106562948 106563186 chr20 64444167 - 11046976 11047214 13709533 +53 135 135 +50 + +chain 9165 14 107349540 + 106532761 106533027 chr9 138394717 + 122763656 122763921 5029970 +64 200 199 +2 + +chain 9092 14 107349540 + 106531855 106531953 chr16 90338345 + 31516796 31516894 18829625 +98 + +chain 8441 14 107349540 + 106564965 106565054 chr13 114364328 - 37758067 37758156 33329465 +89 + +chain 8323 14 107349540 + 106555007 106555095 chr15 101991189 + 21693023 21693111 33562825 +88 + +chain 8125 14 107349540 + 106563415 106563501 chr13 114364328 + 50545915 50546001 17808497 +86 + +chain 7933 14 107349540 + 106568871 106569024 chr17 83257441 + 14603055 14603209 24252735 +6 89 90 +58 + +chain 7795 14 107349540 + 106564836 106564918 chr7 159345973 - 140294651 140294733 34657885 +82 + +chain 7706 14 107349540 + 106568539 106568782 chr5 181538259 - 73081910 73082153 29896580 +50 189 189 +4 + +chain 7434 14 107349540 + 106534152 106534391 chr7 159345973 + 148534180 148534419 3781746 +65 99 99 +75 + +chain 7201 14 107349540 + 106533145 106534977 chr16 90338345 - 14601555 14603392 3648522 +30 144 148 +62 1367 1368 +102 92 92 +35 + +chain 6986 14 107349540 + 106545923 106545997 chr14 107043718 + 106463704 106463778 36635827 +74 + +chain 6913 14 107349540 + 106562208 106562281 chr8 145138636 + 82611403 82611476 36812107 +73 + +chain 6835 14 107349540 + 106562568 106562658 chr9 138394717 + 25172994 25173084 14105434 +90 + +chain 6393 14 107349540 + 106465648 106465714 chr14_KI270846v1_alt 1351393 + 467244 467310 38424640 +66 + +chain 6340 14 107349540 + 106563624 106563691 chr11 135086622 - 90075710 90075777 38578878 +67 + +chain 6149 14 107349540 + 106564620 106564685 chr10 133797422 + 115647149 115647214 39235040 +65 + +chain 6120 14 107349540 + 106554909 106554972 chr14_KI270846v1_alt 1351393 + 1258223 1258286 39349266 +63 + +chain 6004 14 107349540 + 106564718 106564782 chr5 181538259 + 148918591 148918655 39735598 +64 + +chain 5738 14 107349540 + 106568877 106568947 chr5 181538259 + 16359289 16359368 29370956 +14 5 14 +51 + +chain 5233 14 107349540 + 106563691 106563747 chr15 101991189 - 15023320 15023376 41530606 +56 + +chain 5057 14 107349540 + 106548770 106548823 chr14_KI270846v1_alt 1351393 + 958347 958400 43380635 +53 + +chain 4835 14 107349540 + 106564785 106564836 chr13 114364328 + 66281153 66281204 43925660 +51 + +chain 3873 14 107349540 + 106465714 106465754 chr14 107043718 + 105999501 105999541 42650717 +40 + +chain 3689 14 107349540 + 106466734 106466870 chr14_KI270846v1_alt 1351393 + 468069 468205 5808799 +136 + +chain 3552 14 107349540 + 106466930 106466967 chr14_KI270846v1_alt 1351393 + 468048 468085 15546260 +37 + +chain 3548 14 107349540 + 23106522 23106568 chr3 198295559 - 47474747 47474795 536928 +10 0 2 +36 + +chain 3189 14 107349540 + 106563186 106563220 chr7 159345973 - 54469865 54469899 34465137 +34 + +chain 3143 14 107349540 + 106563790 106563823 chr2 242193529 - 163699677 163699710 34422880 +33 + +chain 3079 14 107349540 + 106534048 106534099 chr7 159345973 + 79380110 79380161 15805235 +51 + +chain 3018 14 107349540 + 106552773 106554418 chr14 107043718 + 106211435 106215552 32804873 +65 1499 3971 +81 + +chain 2917 14 107349540 + 106534908 106534942 chr6 170805979 + 48944916 48944950 13152299 +34 + +chain 2849 14 107349540 + 106569543 106569573 chr12 133275309 + 81504951 81504981 29749440 +30 + +chain 2752 14 107349540 + 106535041 106535070 chr6 170805979 + 62347862 62347891 25601372 +29 + +chain 2745 14 107349540 + 106565054 106565083 chr4 190214555 - 114895023 114895052 36065297 +29 + +chain 2719 14 107349540 + 106563055 106563119 chr13 114364328 - 43865748 43865812 16420102 +64 + +chain 2650 14 107349540 + 106534705 106534733 chr14 107043718 + 106338049 106338077 19066860 +28 + +chain 2647 14 107349540 + 106564937 106564965 chr6_KI270801v1_alt 870480 + 13292 13320 37975109 +28 + +chain 2544 14 107349540 + 106532917 106532978 chr2 242193529 - 126861924 126861985 12039115 +61 + +chain 2531 14 107349540 + 106483477 106483586 chr15 101991189 + 21737640 21737749 12356818 +109 + +chain 2408 14 107349540 + 106534538 106534635 chr14 107043718 - 43904147 43904244 10127232 +97 + +chain 2392 14 107349540 + 106929417 106929444 chr14_KI270726v1_random 43739 - 20442 20469 2614 +27 + +chain 2391 14 107349540 + 22835311 22835337 chr11 135086622 - 27626111 27626137 36620594 +26 + +chain 2326 14 107349540 + 106532068 106532123 chr3 198295559 - 59738200 59738255 26659738 +55 + +chain 2282 14 107349540 + 106569236 106569305 chrX 156040895 - 68032634 68032703 27915992 +69 + +chain 2084 14 107349540 + 106568390 106568412 chr9 138394717 + 24791583 24791605 38252767 +22 + +chain 2070 14 107349540 + 106535006 106535041 chrX 156040895 - 85330015 85330050 18403021 +35 + +chain 1743 14 107349540 + 23106423 23106449 chr17 83257441 + 2447796 2447822 686431 +26 + +chain 1728 14 107349540 + 106534407 106534483 chr4 190214555 - 100865354 100865430 15259575 +76 + +chain 1679 14 107349540 + 106568412 106568481 chr7 159345973 - 10827262 10827331 27117726 +69 + +chain 1630 14 107349540 + 106533796 106533864 chr4 190214555 + 52974881 52974949 6448304 +68 + +chain 1607 14 107349540 + 106563001 106563035 chr9 138394717 - 46781110 46781144 17561914 +34 + +chain 1463 14 107349540 + 106532593 106532689 chr3 198295559 - 37102743 37102839 15137450 +96 + +chain 1326 14 107349540 + 106533434 106533485 chr6 170805979 + 19131198 19131249 4681651 +51 + +chain 1264 14 107349540 + 106809569 106809635 chr14 107043718 + 106080391 106080457 5444748 +66 + +chain 940 14 107349540 + 106535211 106535555 chr14 107043718 + 106757605 106758560 14069973 +61 223 834 +60 + +chain 920 14 107349540 + 106534023 106534047 chr14 107043718 - 55829035 55829059 6652374 +24 + +chain 855 14 107349540 + 106534977 106535006 chr7 159345973 - 113280875 113280904 5460956 +29 + +chain 843 14 107349540 + 106534850 106534884 chr4 190214555 - 68049235 68049269 6198678 +34 + +chain 755 14 107349540 + 106532524 106532574 chrX 156040895 - 19061200 19061250 14411090 +50 + +chain 543 14 107349540 + 106534648 106534689 chr10 133797422 + 111229778 111229819 18686059 +41 + +chain 322 14 107349540 + 106562450 106565185 chr1 248956422 + 66020763 66021233 36775718 +63 2608 343 +64 + +chain 7634481634 15 102531392 + 20000000 102521392 chr15 101991189 + 19794747 101981189 16 +716101 0 3 +199 0 7 +2001 0 2 +869 19 21 +1803 1 0 +1699 7 7 +251 1 1 +49 1 1 +274 1 0 +325 1 0 +131 1 0 +22 1 1 +2467 0 3 +1064 0 1 +622 22 22 +867 8 8 +4785 0 1 +163 1 1 +47 1 1 +6487 4 4 +278 42 0 +1113 1 1 +33 1 1 +509 12 12 +48 0 2 +4559 36 0 +982 3 1 +2207 0 4 +395 0 5 +5789 7 0 +420 1 0 +298 0 1 +432 1 0 +2997 2 9 +2077 9 0 +1198 0 1 +678 1 0 +2339 8 0 +1286 0 2 +4137 13 13 +1580 9 9 +11025 1 0 +3404 0 1 +30 1 1 +2650 14 14 +86 1 1 +36 1 1 +1021 2 0 +989 0 1 +428 1 2 +184 2 0 +682 0 1 +2785 35 35 +5650 0 1 +716 38 38 +715 6 24 +1405 47 47 +1742 41 41 +1099 1 0 +1541 33 33 +771 152 151 +882 10 10 +321 0 2 +2386 34 33 +109 5 5 +464 51 51 +1232 0 1 +2212 0 3 +10302 9 8 +7186 1 0 +673 21 21 +2816 18 18 +6438 0 3 +1344 1 0 +2157 17 17 +120 1 1 +39 1 1 +592 5 5 +604 1 1 +45 1 1 +139 1 1 +24 1 1 +390 1 1 +40 1 1 +725 5 0 +1749 21 0 +678 10 10 +565 1 1 +24 0 3 +681 1 1 +34 1 0 +142 12 13 +2343 1 0 +1990 1 0 +1244 42 39 +188 1 1 +23 0 1 +20 1 1 +170 13 13 +32121 40442 40442 +463744 486181 48600 +155004 2 0 +4540 1 1 +30 1 1 +2265 10 11 +297 0 1 +665 49 70 +240 39 39 +1731 41 41 +519 33 33 +339 22 22 +2037 4 0 +749 1 49 +910 38 38 +1831 3 9 +333 0 1 +470 1 1 +43 1 1 +1518 1 1 +51 1 1 +1122 1 0 +2351 19 6 +376 2 0 +1022 2 0 +1907 1 1 +19 1 1 +318 0 1 +3104 8 8 +179 1 1 +29 1 1 +3162 2 0 +2854 28 28 +482 1 0 +512 28 28 +571 27 16 +323 37 36 +5342 0 111 +542 40 39 +1141 64 35 +275 13 13 +503 26 26 +130 44 44 +581 4 0 +1128 4 4 +749 0 1 +1439 0 1 +474 0 16 +1270 27 27 +54 11 0 +623 39 39 +381 20 0 +56 0 1 +2591 1 1 +55 1 1 +160 4 4 +75 14 14 +1217 0 15 +742 59 53 +955 3 0 +1737 60 60 +391 43 43 +2071 24 20 +218 2 0 +18 1 1 +684 4 4 +1195 4 4 +2001 1 1 +31 1 1 +58 18 18 +499 6 6 +431 1 1 +35 1 1 +431 1 1 +45 1 1 +3158 17 0 +983 0 1 +773 16 16 +1457 4 1 +767 57 57 +338 10 10 +650 0 2 +126 0 1 +261 50 50 +53 7 7 +776 48 48 +663 2 0 +377 13 13 +4081 0 1 +159 5 0 +41 1 0 +164 1 1 +61 4 4 +925 0 3 +934 18 18 +1971 0 5 +3592 1 1 +76 1 1 +200 0 6 +682 1 0 +632 2 0 +2338 1 0 +110 1 1 +231 10 0 +1682 42 54 +616 1 2 +171 2 1 +543 1 1 +45 0 12 +2837 1 0 +1596 1 1 +44 1 1 +3758 6 0 +455 1 1 +35 1 1 +330 1 1 +20 1 1 +727 1 1 +28 1 1 +4306 0 10 +540 1 1 +52 3 0 +1747 4 0 +822 28 29 +3670 3 0 +313 1 0 +670 1 0 +2891 0 4 +4584 1 1 +54 1 1 +986 0 2 +1276 1 0 +2858 1 1 +42 1 1 +278 5 5 +687 1 0 +10 1 1 +318 13 8 +133 1 1 +31 1 1 +414 1 1 +49 1 0 +97 1 1 +87 1 0 +53 1 1 +49 1 1 +748 0 3 +60 1 1 +217 1 0 +12 0 1 +237 1 0 +51 4 0 +86 1 1 +441 5 5 +42 0 2 +268 1 1 +46 1 1 +364 1 0 +182 2 0 +274 1 1 +234 1 1 +103 5 8 +112 20 20 +328 0 2 +115 3 1 +60 1 1 +6 2 0 +32 1 1 +250 1 1 +45 0 3 +85 1 1 +43 1 1 +52 1 1 +65 1 1 +86 13 13 +144 1 1 +36 0 3 +35 1 1 +608 7 7 +1122 5 4 +372 0 4 +120 43 43 +162 7 3 +592 23 21 +163 43 43 +207 54 54 +405 22 23 +634 161 161 +334 26 28 +803 46 46 +2036 14 14 +141 90 90 +336 13 13 +1377 56 56 +723 22 22 +832 28 28 +669 25 25 +313 22 22 +351 6 0 +161 55 55 +216 1 0 +48 0 3 +70 0 4 +392 0 1 +106 32 32 +1036 12 12 +1594 1 1 +45 3 0 +486 4 0 +72 16 16 +518 1 1 +21 1 1 +1405 1 1 +34 1 1 +1060 1 1 +28 1 1 +302 9 9 +805 11 11 +2396 15 15 +1674 1 1 +21 1 1 +880 1 0 +79 0 1 +2878 15 15 +392 4 0 +687 39 2013 +521 1 0 +948 50000 402897 +334079 102383 112655 +589 1 1 +40 1 1 +335 2 0 +633 1 1 +23 1 1 +1863 1 1 +26 1 1 +917 1 0 +2979 1 1 +29 1 1 +490 21 21 +654 1 1 +129 1 1 +1702 69 69 +142 174 154 +100 162 163 +115 51 51 +52 1 0 +1307 13 13 +466 25 25 +92 36 36 +882 1 1 +64 1 1 +1175 1 1 +16 1 1 +153 1 1 +52 1 1 +774 1 1 +27 1 1 +1314 2 0 +1730 4 0 +950 1 2 +168 0 14 +769 0 4 +922 0 6 +1038 1 1 +29 1 1 +840 1 1 +20 1 1 +139 0 18 +302 15 0 +320 1 1 +57 0 329 +1054 2 0 +440 0 3 +547 1 0 +278 4 0 +410 1 1 +26 3 0 +101 1 1 +24 1 1 +149 0 9 +179 1 1 +29 1 1 +208 11 0 +39 1 1 +473 6 0 +717 2 0 +1044 1 1 +23 1 1 +625 1 1 +41 1 0 +359 32 32 +254 27 27 +179 66 66 +1405 36 38 +464 0 3 +403 43 54 +55 167 167 +1966 13 23 +845 18 0 +981 1 1 +44 1 1 +1797 7 7 +101 49 49 +685 32 32 +525 22 22 +387 6 0 +983 4 0 +103 81 79 +493 42 0 +352 0 3 +92 8 311 +17 0 21 +207 0 315 +2404 0 1 +480 17 17 +644 26 3 +512 18 18 +227 18 18 +1217 49 49 +343 651184 651156 +343 49 49 +1217 18 18 +227 18 18 +512 3 26 +644 17 17 +479 1 0 +2346 315 0 +228 21 0 +42 105 0 +21 198 0 +87 3 0 +328 0 42 +522 79 81 +69 0 4 +1006 0 6 +398 1 1 +20 1 1 +93 464 464 +685 49 49 +101 7 7 +1797 46 46 +877 0 18 +949 23 13 +1966 167 167 +55 54 43 +398 3 0 +469 38 36 +1405 66 66 +179 27 27 +254 32 32 +359 42 43 +625 25 25 +1032 0 2 +712 0 6 +490 40 51 +208 31 31 +157 9 0 +171 26 26 +101 27 30 +410 0 4 +270 0 1 +543 3 0 +450 0 2 +1056 387 58 +310 0 15 +282 18 0 +169 22 22 +840 31 31 +1033 6 0 +914 4 0 +782 14 0 +168 2 1 +927 0 4 +1753 0 2 +1314 1 1 +27 1 1 +774 1 1 +52 1 1 +153 18 18 +1175 66 66 +882 36 36 +92 25 25 +466 13 13 +1300 0 1 +59 51 51 +66 212 211 +100 154 174 +142 69 69 +1702 131 131 +654 21 21 +490 31 31 +2978 0 1 +918 1 1 +26 1 1 +1863 1 1 +23 1 1 +620 0 2 +348 42 42 +589 112655 145221 +7422 129 147 +77 8 29 +62 41 38 +351 42 0 +337 2 0 +185 0 1 +1161 0 1 +358 1 1 +79 1 1 +4014426 0 1 +1569908 50000 2943 +267907 1 0 +562306 0 1 +2356416 0 2 +1523 1 1 +28 1 1 +8302380 0 2 +171359 0 1 +6565359 0 1 +7083220 1 0 +3855145 1 0 +5250698 7 7 +1596662 0 1 +2691 1 0 +851 1 0 +864 0 1 +558 0 1 +2383 9 9 +1326 0 1 +1199 1 0 +464 0 1 +2063 0 1 +957 1 1 +34 1 0 +1942 22 0 +28 1 0 +2412 1 0 +1550 1 1 +34 1 1 +1107 1 7 +554 24 0 +32 2 0 +5 0 4 +10 1 0 +51 0 1 +4 0 2 +25 0 1 +6 1 0 +4 9 3 +24 2 0 +17 3 0 +54 3 0 +18 22 3 +4 0 1 +49 0 5 +58 63 38 +126 15 18 +182 1 1 +20 0 3 +9 3 0 +4 0 1 +30 0 2 +5 0 3 +222 3 0 +38 0 3 +30 5 6 +96 10 0 +68 9 12 +49 20 0 +116 20 26 +72 6 0 +98 5 0 +11 7 0 +5 0 2 +23 3 0 +49 2 0 +105 0 4 +11 0 3 +36 0 3 +168 0 3 +56 3 0 +35 4 13 +58 20 0 +70 32 0 +14 9 0 +26 0 3 +6 18 0 +60 4 13 +47 5 0 +56 3 14 +21 4 1 +34 0 3 +21 4 0 +31 0 1 +13 4 0 +44 4 0 +38 0 3 +13 0 3 +92 0 43 +96 9 0 +17 0 7 +46 3 0 +8 3 0 +46 1 1 +104 0 3 +90 3 0 +96 3 0 +17 4 0 +109 25 22 +53 3 0 +118 3 0 +1191 0 4 +262 1 1 +47 0 4 +905 3 0 +4196 0 1 +5241 0 6 +564 1 0 +870 1 0 +1347 1 0 +3416246 1 0 +636591 1 0 +95520 0 1 +2689597 1 0 +5946 1 0 +2573146 0 1 +8991 1 0 +2647036 1 0 +3388789 0 1 +1857889 1 1 +33 1 1 +678 1 0 +1705 0 4 +7403 2 1 +3448 0 1 +7994 9 8 +606 0 4 +513 1 0 +10836 20 20 +614 20 0 +3900 13 13 +726 1 1 +46 1 1 +150 5 5 +2294 3 5 +524 9 9 +2699 1 1 +65 1 1 +92 9 9 +78 7 7 +3591 1 1 +45 1 1 +1155 11 11 +4302 1 0 +1614 18 0 +284 42 0 +33 297179 0 +139 126 0 +352 2 0 +1457 0 1 +876 1 0 +1754 1 0 +1403 1 3 +71 44 44 +210 29 30 +461 9 9 +94 1 1 +80 1 1 +384 8 8 +381 31 31 +184 8 7 +322 0 1 +185 5 15 +31 1 1 +80 1 1 +20 1 1 +202 0 1 +43 1 1 +171 0 4 +34 1 1 +1120 16 16 +787 4 1 +70 1 0 +1201 1 1 +33 1 1 +1834 1 1 +84 1 1 +525 1 0 +637 79013 0 +72 7 5 +1477 3 0 +5268 16 0 +54 0 3 +64 5 0 +57 3 0 +2543 0 2 +1082 8 9 +1180 0 1 +5134 7 7 +575 1 1 +18 1 1 +4573 0 4 +1395 14 0 +1810 0 1 +2489 0 7 +1426 0 1 +8998 1 7 +503 0 4 +89 45 45 +3444 0 5 +646 19 19 +55 44 44 +3126 17 18 +15160 1 0 +7002 0 1 +1935 35 35 +514 43 43 +335 17 21 +203 49 49 +1242 4 4 +323 1 1 +22 1 1 +442 0 1 +5571 16 16 +461 34 31 +195 25 25 +104 15 15 +101 18 19 +91 29 29 +259 84 84 +93 207 210 +166 195 187 +196 38 38 +820 74 74 +58 235 237 +118 48 48 +222 26 26 +74 46 46 +292 23 23 +96 15 15 +149 8 9 +56 84 85 +299 51 59 +353 2 0 +38 0 45 +145 21 21 +2484 22 18 +286 27 27 +595 12 12 +704 2 0 +165 1 0 +1119 36 34 +59 39 39 +686 0 1 +594 18 18 +328 6 5 +118 1 1 +18 0 1 +90 4 4 +36 1 1 +271 11 0 +128 1 1 +35 1 1 +70 1 1 +22 1 1 +1098 1 1 +25 1 1 +106 2 0 +185 1 1 +27 1 1 +1080 5 1 +699 3 1 +915 24 0 +3412 2 1 +5274 1 0 +500 0 8 +6003 16 13 +3044 6 6 +701 89 89 +2345 4 0 +590 16 17 +1541 0 5 +967 23 28 +509 4 0 +1121 1 0 +157 0 4 +1346 0 2 +57 0 1 +96 0 1 +647 1 1 +52 0 1 +1392 1 1 +51 1 1 +136 0 7 +152 1 1 +22 1 3 +122 1 1 +42 1 1 +664 16 1 +3168 1 0 +6091 2 0 +171 1 0 +384 1 0 +661 0 4 +2468 0 5 +74 2 0 +119 0 3 +28 268 1 +569 3 0 +889 1 1 +20 1 1 +6083 1 0 +1289 1 0 +1262 0 3 +1144 77 83 +756 47 47 +457 22 22 +424 14 14 +203 17 17 +191 45 44 +203 148 139 +77 45 46 +385 7 8 +184 31 31 +381 8 8 +384 82 82 +94 9 9 +72 18 18 +347 54 53 +77 8 8 +240 55 53 +103 5 5 +1826 0 1 +3493 3 0 +393 0 105 +129 0 78 +251 14 33 +1617 0 1 +367 20 57 +3423 11 11 +10573 0 1 +39330 0 1 +4984 1 0 +1340 1 0 +3966 0 1 +10687 0 1 +5919 1 0 +4141 1 0 +45034 1 0 +1612954 0 114054 +29957 1 0 +1528 0 1 +10578 1 0 +4710 50078 61546 +5321355 1 0 +832728 0 1 +99354 0 1 +2312060 0 1 +3341237 1 0 +1626258 0 1 +1054313 0 1 +6214 1 0 +2069 0 3027 +274 0 1 +1429 1 1 +34 1 1 +3618 2 0 +2366 1 1 +48 1 1 +1031 1 1 +20 1 1 +5383 10 10 +396 27 24 +1321 0 1 +2383578 0 2 +491707 + +chain 12993285 15 102531392 + 82879645 83187110 chr15_KI270850v1_alt 430880 + 0 307465 175 +54923 139 139 +126 5918 5918 +44 210 210 +29 1419 1419 +31 7607 7607 +79013 38873 38873 +45 4164 4164 +44 27241 27241 +35 514 514 +43 555 555 +49 8083 8083 +34 195 195 +25 329 329 +29 259 259 +84 93 93 +207 166 166 +195 196 196 +38 820 820 +74 58 58 +235 118 118 +48 222 222 +26 74 74 +46 639 639 +84 299 299 +51 3351 3351 +27 2598 2598 +36 59 59 +39 25573 25573 +89 25251 25251 +268 11263 11263 +77 756 756 +47 1328 1328 +45 203 203 +148 77 77 +45 576 576 +31 773 773 +82 540 540 +54 325 325 +55 + +chain 9657974 15 102531392 + 82637389 82829645 chr15 101991189 + 82345058 82545237 221 +29 17 122 +256 5 0 +1457 0 1 +876 1 0 +1754 1 0 +1403 1 3 +325 29 30 +204 15 15 +242 9 9 +94 82 82 +384 8 8 +395 53 53 +148 8 7 +508 38 47 +80 22 22 +201 46 46 +164 43 46 +1120 16 16 +787 76 78 +1328 41 41 +913 50 50 +469 24 22 +240 87 86 +525 0 1 +187 29 29 +60 45 32 +62 69 72 +266 6 5 +925 1 2 +550 3 0 +54 5 5 +952 5 5 +333 125 125 +1812 47 47 +1911 0 33 +112 5 0 +57 3 0 +740 10 10 +2876 8 10 +145 1 3 +1032 2 0 +938 35 36 +4743 42 42 +2176 22 22 +2353 4 0 +1399 16 0 +157 0 1 +1642 10 11 +935 0 1 +1553 0 7 +283 26 26 +205 0 1 +911 0 1 +7491 1 0 +1503 0 1 +4095 0 5 +646 19 19 +3225 17 18 +15160 1 0 +7002 0 1 +1749 221 221 +514 43 43 +335 17 21 +203 26 26 +1265 4 4 +323 24 24 +442 0 1 +5571 16 16 +461 34 31 +195 25 25 +104 15 15 +101 18 19 +91 29 29 +259 84 84 +93 207 210 +166 195 187 +196 38 38 +809 85 85 +58 235 237 +118 48 48 +222 26 26 +74 46 46 +292 23 23 +96 15 15 +149 8 9 +56 84 85 +299 51 59 +387 0 49 +145 21 21 +89 48 48 +2347 22 18 +286 1 1 +25 1 1 +595 12 12 +704 2 0 +165 1 0 +1119 1 1 +33 2 0 +59 1 1 +37 1 1 +686 0 1 +594 18 18 +328 6 5 +118 1 1 +18 0 1 +90 4 4 +36 1 1 +271 11 0 +128 37 37 +70 24 24 +1098 27 27 +106 2 0 +185 29 29 +1080 8 4 +696 2 1 +906 0 30 +3391 2 1 +5274 1 0 +500 0 8 +6003 5 0 +3057 6 6 +701 89 89 +2345 4 0 +590 16 17 +292 25 29 +1220 0 5 +971 23 24 +509 4 0 +1121 2 0 +157 0 12 +1005 51 51 +148 24 24 +110 0 4 +55 0 1 +96 0 1 +647 53 54 +1392 53 53 +136 0 6 +153 24 26 +122 44 44 +438 8 8 +218 11 1 +3168 1 0 +1760 9 7956 +63 0 5 +74 2 0 +119 236 32 +60 27 0 +509 3 0 +889 22 22 +6083 1 0 +1289 1 0 +1262 0 3 +1144 76 83 +756 47 47 +457 22 22 +424 14 14 +203 32 31 +177 45 44 +203 22 22 +80 46 37 +508 7 8 +184 31 31 +381 8 8 +384 82 82 +94 9 9 +72 18 18 +347 54 53 +77 8 8 +240 55 53 +103 5 5 +1891 7 8 +3421 3 0 +423 21 0 +34 105 0 +151 0 78 +285 0 18 +696 1 0 +921 0 1 +365 22 59 +3423 11 11 +15223 + +chain 8842970 15 102531392 + 22646193 23514853 chr15 101991189 - 78764315 79632947 107 +52383 10443 10443 +69 142 142 +174 100 100 +162 115 115 +51 1839 1839 +25 92 92 +36 18581 18581 +32 254 254 +27 179 179 +66 1405 1405 +36 867 867 +43 55 55 +167 5774 5774 +49 685 685 +32 2030 2030 +81 493 493 +42 4221 4221 +26 1992 1992 +49 343 343 +353000 168 0 +594 1 1 +55 1 1 +177 21 0 +183 0 21 +21 0 21 +72 21 0 +89 1 1 +13 0 42 +540 0 21 +18 0 84 +341 21 0 +5567 1 0 +5325 1 0 +1691 0 1 +1236 0 1 +4209 25 25 +2242 0 4 +295 1 1 +4375 1 1 +33 2 1 +1743 5 5 +70 1 1 +17 1 1 +50 0 1 +125 1 0 +37 1 1 +795 1 1 +39 0 4 +4500 0 4 +3567 0 1 +728 1 0 +1789 8 6 +3444 2 0 +1475 3 1 +560 1 0 +3582 0 10 +248297 343 343 +49 5482 5482 +315 291 291 +105 21 21 +198 940 940 +79 1588 1588 +464 685 685 +49 1905 1905 +46 3815 3815 +167 55 55 +54 870 870 +38 1405 1405 +66 179 179 +27 254 254 +32 359 359 +42 625 625 +25 2234 2234 +40 208 208 +31 337 337 +26 101 101 +27 2732 2732 +387 1641 1641 +31 9120 9120 +66 882 882 +36 92 92 +25 1838 1838 +51 66 66 +212 100 100 +154 142 142 +69 1702 1702 +131 1165 1165 +31 6780 6780 +42 589 589 +62655 + +chain 189606 15 102531392 + 82643514 82802534 chr15_KI270850v1_alt 430880 + 140361 307465 263 +29 564 564 +82 787 787 +53 664 663 +5 1 0 +32 2479 2476 +51 2307 2313 +50 1532 1534 +29 60 60 +45 62 62 +69 17702 17749 +42 52787 52770 +35 514 514 +43 8916 8916 +25 617 617 +84 93 93 +71 73 73 +42 1425 1425 +85 58 58 +171 452 452 +26 74 74 +46 639 639 +84 299 299 +51 8414 8420 +37 1192 1192 +27 293 293 +29 24968 25025 +25 13991 21947 +236 60 60 +11 0 33 +16 11203 11204 +76 1923 1923 +31 178 177 +45 305 305 +46 1503 1502 +82 540 540 +54 325 325 +55 + +chain 98444 15 102531392 + 22047817 22194093 chr15_KI270852v1_alt 478999 + 162877 309122 168 +47 2010 2008 +41 519 519 +33 4062 4108 +38 20734 20733 +28 995 996 +28 922 903 +24 1 0 +11 5884 5981 +39 1997 1967 +26 130 130 +44 5649 5647 +27 688 677 +39 5317 5279 +59 2695 2697 +60 391 394 +43 36315 36295 +24 45496 45461 +43 947 924 +42 208 208 +54 1061 1062 +17 0 4 +78 1 1 +65 334 334 +26 803 804 +46 2191 2191 +90 1726 1726 +56 1577 1574 +28 669 667 +25 853 848 +40 848 854 +32 + +chain 28049 15 102531392 + 22048104 22210644 chr15 101991189 + 21842580 22005120 407 +39 36232 36232 +64 30916 30916 +57 1385 1385 +50 836 836 +48 92874 92874 +39 + +chain 23966 15 102531392 + 20740573 20814763 chr15_KI270851v1_alt 263054 - 153479 227640 301 +42 69560 69531 +33 771 771 +152 3599 3599 +11 1 1 +21 + +chain 9764 15 102531392 + 82646035 82808470 chr15 101991189 - 16755152 17557722 253 +45 3534 3535 +41 1696 1695 +13 1 0 +73 71322 714326 +186 9279 9882 +34 549 550 +29 507 519 +73 42 45 +21 166 166 +195 1357 1363 +56 126 126 +48 2083 2133 +48 30934 31016 +89 8284 8222 +51 1080 1096 +53 1392 1392 +53 435 435 +44 18229 14792 +47 10192 10050 +28 + +chain 5702 15 102531392 + 23102354 23102521 chr15 101991189 - 79220455 79220622 2736371 +167 + +chain 5654 15 102531392 + 23572296 23572357 chr15 101991189 - 79524585 79524646 105056 +61 + +chain 4391 15 102531392 + 23572357 23572404 chr15 101991189 + 20534540 20534587 182307 +47 + +chain 3715 15 102531392 + 23572943 23572985 chr15_KI270851v1_alt 263054 - 153513 153555 1556 +42 + +chain 2881 15 102531392 + 85034473 85034518 chr15_KI270850v1_alt 430880 + 113179 113224 313168 +45 + +chain 2459 15 102531392 + 82680709 82680735 chr15 101991189 + 84373701 84373727 8607266 +26 + +chain 949 15 102531392 + 20805704 20815393 chr15 101991189 - 79591185 79600870 290 +47 9591 9587 +51 + +chain 571 15 102531392 + 82646246 82646287 chr15_KI270850v1_alt 430880 + 64088 64129 1198 +41 + +chain 513 15 102531392 + 85034518 85034551 chr15 101991189 - 17734984 17735017 2690 +33 + +chain 251 15 102531392 + 82657452 82657499 chr15_KI270850v1_alt 430880 - 137733 137780 380 +47 + +chain 7470613414 16 90354753 + 60000 90294753 chr16 90338345 + 10000 90228345 17 +47969 0 1 +827 0 1 +15584 1 0 +14391 0 1 +23024 1 0 +161379 1 0 +956060 1 0 +1951792 0 1 +371197 1 0 +3902514 1 0 +1132178 50000 6151 +1170 6 0 +2805249 0 1 +409995 1 0 +6626704 0 82535 +2523832 0 1 +12111958 0 110080 +127497 0 98774 +729817 150002 718075 +689 0 23 +1111960 11100000 10329252 +401 28793 0 +591165 0 1 +4934125 1 0 +5907348 1 9 +28 1 1 +6537506 0 1 +7596244 0 4 +2326601 0 1 +2003587 0 1 +4702525 0 292 +3180603 1 0 +4194652 50000 17198 +1855370 + +chain 540815 16 90354753 + 46388410 46412458 chr16 90338345 - 43936686 43954114 5692 +119 1 1 +53 0 26 +14 1 47 +90 14 14 +199 2 2 +15 1 1 +61 1 1 +53 1 1 +61 5 5 +92 1 1 +61 0 23 +373 396 566 +127 36 36 +405 17 17 +64 21 21 +124 23 23 +237 47 47 +178 26 26 +254 6 767 +104 159 2237 +173 11 11 +198 4 4 +145 35 35 +90 5 104 +128 5388 285 +61 374 2511 +343 6007 59 +55 153 153 +142 26 26 +122 47 44 +343 38 38 +314 185 188 +84 68 68 +144 95 95 +77 22 22 +154 100 100 +238 32 32 +63 102 102 +275 22 22 +396 9 32 +256 30 30 +196 69 69 +66 50 50 +100 53 59 +86 0 5 +54 29 29 +170 1451 1497 +173 10 0 +73 45 45 +212 1134 155 +81 + +chain 141608 16 90354753 + 46386202 46391329 chr16 90338345 - 43946345 43951930 151110 +52 1 1 +64 1 1 +37 1 24 +299 1 1 +62 1 1 +295 0 158 +473 219 216 +268 1652 1747 +356 13 183 +27 1279 1294 +26 + +chain 92765 16 90354753 + 46412841 46414263 chr16 90338345 - 43947813 43949225 1580339 +802 5 5 +55 129 129 +54 129 142 +50 116 93 +82 + +chain 74059 16 90354753 + 46392656 46410410 chr16 90338345 - 55750086 55765138 451054 +54 29 29 +147 798 20 +58 89 89 +74 86 86 +63 5000 621 +50 254 253 +245 42 42 +24 0 2514 +98 58 58 +148 175 181 +83 66 66 +17 0 23 +148 14 14 +103 122 122 +70 294 294 +167 57 57 +62 73 57 +107 208 198 +99 45 43 +290 47 47 +103 93 93 +142 5818 4254 +30 196 196 +69 822 2452 +3 862 737 +52 + +chain 66650 16 90354753 + 46392898 46394219 chr16 90338345 - 43947225 43948701 1405873 +127 46 204 +155 45 45 +121 47 44 +159 30 30 +56 221 221 +58 91 91 +165 + +chain 59287 16 90354753 + 46398979 46403470 chr16 90338345 - 43947650 43952152 487080 +74 51 51 +47 41 41 +60 3 0 +103 409 409 +37 18 18 +3 148 148 +37 67 75 +50 490 491 +79 175 175 +126 31 31 +37 286 286 +6 49 49 +18 216 216 +99 99 99 +45 290 290 +47 349 349 +55 784 789 +62 + +chain 39462 16 90354753 + 46395559 46414995 chr16 90338345 - 43937999 43941537 350527 +366 1 1 +104 4 4 +161 873 0 +257 1 1 +26 1 1 +81 10 10 +167 3 26 +21 10 0 +78 4958 0 +224 6426 343 +162 4875 878 +173 72 82 +299 34 24 +49 + +chain 38844 16 90354753 + 46403508 46404421 chr16 90338345 - 43940891 43943881 2882239 +59 244 2321 +25 19 19 +65 57 57 +444 + +chain 38129 16 90354753 + 46410987 46412377 chr16 90338345 + 46381108 46382498 252005 +44 270 270 +53 27 27 +71 60 60 +53 10 10 +77 12 12 +86 109 109 +108 60 60 +63 20 20 +129 28 28 +110 + +chain 33953 16 90354753 + 46396365 46397015 chr16 90338345 - 43938805 43939445 4422029 +91 59 59 +165 114 104 +56 102 102 +63 + +chain 26827 16 90354753 + 46387506 46403219 chr16 90338345 - 55751431 55765922 551130 +116 360 360 +34 0 2514 +97 59 59 +123 26 26 +55 5982 143 +51 80 80 +17 0 23 +304 44 44 +145 183 183 +60 15 15 +167 771 743 +170 6540 8648 +79 170 170 +65 + +chain 9988 16 90354753 + 46412650 46412756 chr16 90338345 - 43947622 43947728 29406559 +106 + +chain 8197 16 90354753 + 46398127 46404580 chr16 90338345 + 34593196 34593648 2392636 +113 23 23 +59 5413 22 +76 610 0 +159 + +chain 7673 16 90354753 + 46409599 46410325 chr16 90338345 + 34589549 34590321 2678240 +56 197 197 +76 42 42 +147 0 46 +72 75 75 +61 + +chain 6893 16 90354753 + 46395097 46395182 chr16 90338345 - 43937537 43937622 7893545 +85 + +chain 6703 16 90354753 + 46406323 46406983 chr16 90338345 - 43936843 43937503 2469993 +68 538 538 +54 + +chain 6538 16 90354753 + 46414263 46414333 chr16 90338345 - 55755363 55755433 20189369 +70 + +chain 6488 16 90354753 + 46398368 46398437 chr16 90338345 + 34593542 34593611 25403165 +69 + +chain 6325 16 90354753 + 46404869 46404937 chr16 90338345 - 43947276 43947344 25475520 +68 + +chain 5606 16 90354753 + 46401531 46401602 chr16 90338345 - 43938163 43938234 8299123 +71 + +chain 5085 16 90354753 + 46391769 46391823 chr22 50818468 + 16266733 16266787 43275256 +54 + +chain 4713 16 90354753 + 46412458 46412591 chr16 90338345 - 55749683 55749816 3899904 +66 14 14 +53 + +chain 4489 16 90354753 + 46394457 46394854 chr16 90338345 - 43936897 43937294 4895960 +32 338 338 +27 + +chain 2962 16 90354753 + 46408887 46408919 chr16 90338345 - 43939420 43939452 23750529 +32 + +chain 2900 16 90354753 + 46400231 46400279 chr16 90338345 - 43936863 43936911 5152503 +48 + +chain 2624 16 90354753 + 46393392 46393439 chr16 90338345 - 55751478 55751525 5582545 +47 + +chain 1529 16 90354753 + 46404764 46404813 chr16 90338345 - 55750274 55750323 5999035 +49 + +chain 1438 16 90354753 + 46398327 46404764 chr16 90338345 - 43943992 43947171 3711145 +41 6212 2954 +184 + +chain 957 16 90354753 + 46392383 46398127 chr16 90338345 + 34593266 34594012 1114970 +34 5673 675 +37 + +chain 7373267797 17 81195210 + 0 81195210 chr17 83257441 + 150207 83247441 18 +5522 0 2 +291104 100000 46551 +623698 58 0 +119 88 2 +29 0 30 +54 148 4 +54 27 0 +17 170 0 +99 4 295 +53 16 17 +44 31 2 +63 87 0 +59 1 88 +21 1 1 +56 0 1 +28 0 58 +66 7 6 +57 0 28 +60 58 0 +57 0 87 +19 0 1 +8 2 30 +70 1 0 +31 0 56 +59 1 1 +93 1 1 +75 59 0 +12 87 0 +47 0 174 +940 0 1 +1287 132 0 +912 1 1 +703 1 1 +39 0 1 +5524 0 72 +940 1 1 +45 1 1 +1442 0 44 +207 1 1 +45 0 2 +6 1 0 +138 1 0 +24 1 1 +148 0 1 +534 0 3 +2298 1 1 +23 1 1 +269 1 1 +48 1 1 +945 0 1 +35 1 1 +1008 29 32 +398 0 2 +26 1 1 +1636 0 2 +2655 1 0 +1391 0 18 +25 2 2 +99 1 55 +28 18 0 +142 0 18 +1058 1 1 +27 1 1 +1631 10 0 +359 0 16 +239 1 1 +17 0 9 +2063 1 1 +80 17 17 +1606 5 5 +919 10 10 +479 1 1 +16 1 1 +148 1 1 +34 0 3 +1155 5 5 +195 88 0 +107 87 0 +2207 1 0 +3015201 1 0 +1212413 25 0 +1268658 0 1 +861539 8 10 +53192 1 0 +1254928 0 1 +6618310 0 3 +3154535 0 1 +2658471 0 1 +228081 0 1 +2759 16 0 +15366 0 1 +5101 5 5 +519 1 1 +29 0 3 +7881 0 62 +27 1 1 +501 0 1 +4877 1 0 +18261 2 0 +23287 1 0 +16659 2 0 +29891 1 0 +20298 0 9 +13 1 1 +52 8 8 +216 1 1 +96 1 1 +238 0 2 +148 5 5 +277 1 1 +75 1 1 +88 1 0 +16 3 0 +63 1 0 +238 11 0 +14 7 0 +241 24 24 +54 20 20 +64 12 12 +116 1 0 +17 5 5 +120 9 9 +402 8752 8778 +66 1 1 +27 1 1 +105 0 14 +151 8 8 +294 5 5 +25 1 1 +99 1 1 +29 3 3 +648 1 1 +98 1 1 +56 1 1 +115 1 1 +155 13 13 +187 22 22 +326 1 1 +68 1 1 +122 16 16 +304 9 9 +175 1 1 +27 1 1 +130 4 0 +20 1 0 +21 1 1 +679 1 1 +67 1 1 +108 1 1 +54 1 1 +105 8 9 +29 1 1 +287 8679 8571 +104 1 1 +39 1 1 +147 20 16 +138 20 20 +213 8 8 +289 2 2 +45 1 1 +121 1 1 +36 1 1 +117 5 5 +107 0 1 +89 1 1 +57 1 1 +117 3 3 +143 1369 18 +154 1 1 +34 1 1 +592 1 1 +32 1 1 +90 14 14 +756 1 1 +32 1 1 +61 4 4 +40 1 1 +225 4 4 +27 1 1 +192 5 6 +354 15 15 +208 2 2 +44 1 9 +128 6 6 +97 4103 4108 +236 13 14 +120 1 0 +102 1 1 +28 1 1 +227 13 13 +570 100000 478086 +235326 11 11 +1150 1 1 +38 1 1 +413 38 21839 +435 3 3 +15 1 1 +286 1 1 +21 5 2295 +50 0 1 +41 0 26 +1464 3 1466 +890 0 1696 +36221 3 2 +31839 1 0 +1400 0 1 +885 0 1 +34102 0 3 +29703 1 0 +222050 3000000 4172301 +1421385 3 4 +135 0 2 +3369 0 1 +4326 0 1 +6971 11 12 +161 0 1 +8932 5 5 +16570 0 3 +2847 1 0 +331 1 0 +3135603 1 0 +898746 0 1 +1070610 1 0 +2265700 0 14 +1635 0 1 +167465 1 1 +76 1 1 +19741 9 9 +58 2 2 +47 1 1 +534 13 0 +475 3 0 +154 0 2 +2953 1 0 +170 0 11 +1256 1 1 +26 1 1 +452 1 1 +74 1 1 +971 1 0 +285 4 0 +92 1 1 +19 1 1 +75 1 1 +22 1 0 +215 1 2 +456 1 1 +92 1 0 +68 1 1 +278 13 25 +728 2 0 +281 3 0 +70 1 0 +1356 22 0 +937 9 9 +1613 8 0 +176 3 0 +184 2 9 +142 1 0 +172 1 1 +34 1 1 +624 1 0 +5902 1 0 +311 1 1 +24 0 1 +18111 3 0 +1459 7 0 +879 1 1 +21 1 1 +721 0 1 +276 0 2 +3602 0 2 +1188 0 1 +1491 1 1 +39 1 1 +595 19 19 +472 1 1 +33 1 1 +837 1 1 +47 1 1 +2770 0 1 +342 0 2 +16601 0 1 +242 1 1 +46 1 1 +3395 0 6 +2740 9 0 +3595 1 1 +95 1 1 +495 0 1 +1801 0 1 +2042 0 4 +3221 331 0 +269 0 1 +1326 1 0 +22 1 1 +8477 1 1 +31 0 5 +134 1 1 +39 1 1 +1945 1 0 +41 1 1 +16566 1 3 +3617 1 1 +18 0 1 +9 1 1 +1607 11 11 +2292 0 8 +592 0 2 +334 0 1 +4431 2 0 +3179 0 10 +1283 4 0 +116 69 17 +5410 0 1 +13566 1 1 +45 1 1 +1740 12 12 +612 1 1 +18 1 1 +593 0 2 +546 1 1 +37 0 1 +25 1 1 +3257 1 1 +35 0 5 +88 2 1 +375 16 16 +60 1 1 +46 1 1 +2547 1 0 +4966 1 1 +25 1 1 +666 2 0 +280 0 3 +667 5 9 +3497 0 2 +4892 7 2 +7118 0 4 +1871 1 0 +1769 0 2 +42 1 1 +576 11 11 +369 1 1 +21 1 1 +649 8 8 +2512 0 7 +7190 1 1 +36 1 1 +256 1 1 +18 1 1 +65 7 0 +51 4 4 +2996 1 1 +23 1 1 +557 1 1 +30 1 1 +755 442 460 +736 45 49 +2954 1 0 +30 1 1 +3979 1 0 +3704 11 11 +703 6 0 +1133 2 4 +90 9 1 +37 4 0 +1796 4 0 +1750 36 37 +321 0 4 +407 1 0 +3718 93 93 +100 11 11 +62 56 43 +98 33 33 +126 27 27 +482 29 29 +376 34 34 +1535 0 2 +1314 12 0 +4408 1 0 +10858 2 0 +4948 0 1 +209 59 6 +696 5 5 +22 1 1 +1794 12 12 +1645 4 0 +78 0 14 +4844 8 8 +3699 0 1 +620 1 0 +3781 0 1 +3147 1 0 +5004 2 0 +394 710 710 +1829 7 7 +3000 46 46 +7841 21 21 +2008 6 5 +401 18 0 +690 29 29 +64 122 126 +490 69 69 +745 2 0 +213 1 0 +1353 65 60 +606 0 1 +328 63 63 +409 15 15 +88 195 195 +172 1 0 +2240 36 36 +1535 27 27 +110 61 61 +245 244 244 +160 58661 80987 +87 56 56 +68 5 5 +348 150 149 +73 23 23 +322 46 46 +81 20 20 +183 28 34 +84 0 2 +406 148 148 +667 16 16 +515 89 89 +62 9 9 +203 0 3 +65 9 10 +188 32 33 +260 88 89 +92 1 0 +67 52 48 +69 0 1 +2330 42 39 +332 24 26 +767 9 5 +69 0 4 +373 30 29 +138 0 1 +381 46 46 +144 1 0 +273 13 13 +140 24 25 +457 39 39 +204 19 19 +137 49 49 +178 63508 51 +354 1 0 +315 1 0 +3383 0 2 +448 0 1 +892 2 0 +31 1 1 +249 0 2 +1953 0 2 +1493 1 1 +18 1 1 +51 0 2 +23 1 1 +4785 1 0 +733 3 3 +428 6 6 +6468 75 93 +3199 58 58 +9139 6 6 +845 1 3 +1599 0 1 +3304 0 1 +4607 0 1 +1736 6 0 +969 3 0 +1107 1 0 +1122 0 3 +1612 0 1 +2029 1 0 +329 0 3 +649 1 1 +40 1 1 +4519 1 0 +148 40 30 +717 3 0 +225 13 13 +1048 0 24 +1300 0 2 +613 0 1 +501 22 22 +634 11 10 +1175 2 0 +2041 1 1 +80 1 1 +2321 37 37 +261 45 45 +86 17 17 +312 20 20 +185 55 55 +126 7 7 +238 38 38 +357 101 101 +125 64 64 +232 0 1 +86 71 71 +323 21 22 +385 0 18 +491 10 10 +189 37 37 +617 21 21 +2404 0 3 +547 26 26 +432 63 63 +509 21 21 +2211 32 32 +158 23 22 +608 24 24 +1190 47 47 +719 5 5 +1526 29 29 +283 3 5 +476 0 4 +569 1 1 +18 1 1 +48 0 4 +198 1 1 +30 1 1 +2263 36 37 +208 1 0 +358 20 20 +80 1 12714 +3687 0 4 +16 2 0 +23 33 3 +2948 4 0 +793 6 0 +2881 17 17 +4663 1 0 +8156 0 8 +1360 0 1 +4275 0 1 +1531 1 0 +10035 0 4 +5248 0 1 +7283 4 0 +1110 6 6 +5177 61 67 +227 0 4 +1220 0 1 +2019 17 17 +1138 0 1 +8211 0 1 +1635 0 3 +2198 22 1 +1292 1 0 +12007 1 1 +83 0 8 +8128 0 1 +6201 0 1 +12695 6 0 +546 1 1 +92 632 51 +244 16 12 +18815 0 1 +11003 1 0 +193 1 0 +294 18 14 +539 1 0 +2783 3 0 +100 20 20 +50 1 1 +118 1 1 +411 1 1 +35 1 1 +874 1 1 +38 1 1 +62 9 10 +106 13 13 +1157 15 15 +12101 18 0 +109 1 0 +523 0 1 +1691 2 0 +2504 1 1 +49 1 1 +8744 0 1 +38 1 1 +1702 0 1 +25 1 1 +3353 18 18 +5960 0 6 +143 0 1 +1671 2 0 +287 0 1 +328 5 0 +1620 2 0 +1970 0 14 +643 0 1 +609 6 0 +72 12 30 +306 1 0 +167 9 9 +3896 1 1 +20 1 1 +1347 1 9 +66 12 0 +1084 7 7 +754 1 0 +2309 1 1 +59 1 1 +1083 1 1 +22 1 1 +909 1 0 +305 0 1 +856 0 1 +4007 7 3 +470 0 4 +1274 0 3 +3122 15 0 +3160 2 0 +697 0 1 +1039 1 0 +2672 2 0 +1236 1 0 +5560 0 1 +1954 0 8 +2972 4 4 +454 1 1 +19 1 1 +589 23 23 +2243 29 27 +778 1 1 +26 1 1 +234 1 1 +38 1 1 +623 1 1 +24 1 1 +382 1 1 +30 0 2 +141 1 1 +106 1 1 +492 0 2 +442 1 1 +20 1 1 +682 7 7 +765 5 0 +6539 0 1 +528 0 1 +158 2 0 +1279 1 131 +1117 0 5 +4293 1 1 +48 1 1 +4424 1 1 +43 1 1 +1567 0 3 +5353 1 1 +89 1 1 +5270 0 1 +671 24 0 +71 0 16 +535 1 4 +2093 0 4 +31 4 0 +156 0 2 +178 2 0 +11 0 2 +51 2 0 +57 1 0 +20 1 1 +89 1 1 +74 1 0 +20 0 26 +15 1 0 +10 7 6 +250 1 3 +808 1 0 +1110 2 0 +988 0 1 +2470 3 1 +563 1 1 +32 1 1 +209 1 1 +42 1 1 +945 2 0 +4623 3 2 +2494 0 1 +1626 1 0 +254 2 2 +30 1 1 +2719 1 1 +38 109 0 +7 2 4 +15 781 0 +93 10 12 +2758 3 0 +6039 1 1 +32 1 1 +1921 15 15 +1492 1 0 +2229 1 1 +26 1 1 +3443 1 1 +47 1 1 +583 2 9 +99 1 1 +17 1 1 +458 1 1 +111 1 1 +5202 16 18 +505 16 16 +154 0 4 +17 1 1 +355 36 0 +2121 66 0 +2826 1 0 +643 2 0 +5889 1 0 +1598 9 0 +772 8 8 +137 1 5 +209 1 1 +1471 0 27 +168 1 1 +43 1 1 +179 1 1 +41 1 1 +495 0 1 +176 20 20 +790 1 1 +47 1 1 +236 0 4 +390 0 1 +5120 15 0 +18902 0 1 +4711 2 0 +2659 1 1 +47 1 1 +1911 0 1 +292 4 0 +1661 0 3 +1259 0 1 +1441 1 1 +25 1 1 +5510 0 1 +313 1 0 +373 0 1 +3527 0 4 +1271 0 1 +6512 2 0 +31 1 1 +1199 10 10 +2657 0 30 +803 1 0 +161 0 4 +576 1 0 +5458 3 0 +477 1 1 +40 1 1 +408 1 1 +38 1 1 +2449 8 0 +340 3 0 +745 1 0 +13 1 1 +256 1 0 +8 3 0 +63 1 1 +434 5 0 +3071 4 0 +6832 4 0 +6885 0 1 +3859 13 10 +1547 16 31 +390 38 0 +311 6 6 +2447 1 1 +44 1 1 +1096 5 0 +887 0 6 +1101 12 12 +486 1 1 +34 1 1 +5379 0 4 +59 12 14 +30 0 2 +947 6 0 +4782 0 2 +4296 3 0 +2993 1 0 +148 1 0 +1948 8 0 +1253 7 1 +8003 0 1 +964 16 17 +131 0 1 +6154 2 0 +735 1 0 +24338 0 1 +33147 0 1 +1484 1 0 +6484 22 22 +12704 0 2 +18356 1 0 +11226 2 0 +5706 0 1 +893 1 0 +11762 0 8 +603 6 349 +2379 2 0 +723 1 0 +951 1 0 +27 0 4 +867 15 15 +1562 0 18 +156 2 0 +1557 1 0 +796 1 0 +35115 0 1 +4399 0 12 +5620 0 1 +2801 6 1 +2566 0 1 +11411 0 1 +8538 1 0 +4375 0 3 +1134 0 7 +357 0 2 +1112 1 0 +5665 12 0 +2479 1 0 +1444 1 0 +151 0 1 +4413 2 0 +2337 16 0 +24 1 1 +756 11 11 +2456 0 4 +4605 1 1 +21 1 0 +2948 0 1 +553 1 0 +771 0 2 +3854 1 0 +3187 1 1 +20 1 1 +6587 2 0 +2863 0 30 +244 1 0 +7789 0 1 +3062 1 0 +2341 2 4 +7 0 2 +21 6 0 +1071 0 1 +245 4 4 +242 14 13 +383 1 0 +3315 4 0 +6396 1 0 +347 0 2 +935 0 1 +1268 1 5 +7917 1 0 +9040 8 0 +4483 2 0 +2271 0 4 +6152 0 19 +6118 0 1 +1342 1 0 +961 0 18 +303 1 0 +717 5 0 +675 1 1 +31 1 1 +4511 1 0 +513 1 0 +4149 1 0 +1086 6 0 +328 1 0 +6532 1 0 +3166 0 3 +321 1 0 +63 16 0 +38 6 0 +2358 1 0 +2762 0 1 +1144 1 0 +100 2 0 +7243 1 0 +1123 1 2 +2033 0 1 +3465 2 0 +2691 2 0 +870 0 1 +51 1 1 +1275 10 0 +8486 1 1 +41 1 1 +773 2 0 +16 1 1 +4019 1 0 +3270 1 0 +4505 1 0 +141 0 1 +1418 19 0 +868 21 17 +1829 0 1 +745 33 39 +3842 1 0 +73 0 3 +34 1 1 +273 0 10 +2851 1 0 +2366 0 1 +1709 0 2 +9540 0 1 +1410 1 0 +46 0 2 +1833 1 0 +236 1 0 +3303 0 1 +972 1 0 +2273 0 1 +4402 0 4 +8927 0 3 +3582 10 0 +78 0 7 +69 17 1 +2814 1 0 +675 0 1 +432 1 1 +17 2 2 +1157 0 1 +909 1 0 +1942 1 0 +361 3153 18 +67 4 4 +2830 0 1 +1806 0 1 +1201 2 0 +1903 1 0 +496 0 4 +2794 1 0 +573 0 1 +1877 0 1 +564 0 1 +2112 0 1 +977 1 0 +2507 11 11 +284 1 1 +33 0 1 +1067 0 1 +2052 23 0 +650 0 6 +1265 0 1 +9172 1 0 +1898 1 0 +9436 1 0 +14378 2 0 +14490 1 0 +11890 1 0 +24226 0 4 +5220 1 0 +15071 0 1 +34743 1 0 +980 0 1 +4880 0 2 +225 0 1 +5086 0 1 +2237 0 1 +169 0 1 +2430 0 1 +214 11 1 +762 3 0 +6984 0 1 +5614 5 6 +275 0 60 +248 1 0 +9778 0 1 +3731 1 0 +5 1 0 +2150 1 0 +163 0 4 +11872 1 0 +5543 0 2 +1517 0 14 +9528 0 1 +1916 0 1 +484 1 0 +9278 0 1 +2905 1 0 +4939 2 0 +6389 0 1 +2887 1 0 +1720 0 30 +698 10 10 +3395 1 0 +2367 2 0 +5135 0 1 +1959 1 1 +43 1 1 +5448 2 0 +3671 1 1 +18 1 1 +108 1 0 +430 8 4 +576 0 1 +1231 1 1 +23 1 4 +2100 1 1 +19 1 1 +3639 8 9 +3195 2 0 +3263 1 0 +10166 0 10 +2261 0 3 +5787 0 4 +7773 1 0 +169 1 0 +1021 0 4 +915 1 0 +1698 1 1 +36 1 1 +1146 1 0 +3923 1 1 +46 1 1 +7454 0 1 +7714 0 1 +798 1 1 +37 1 1 +2945 0 1 +534 0 1 +550 14 14 +356 0 3 +2162 0 1 +737 4 0 +176 0 1 +1771 14 28 +4742 0 1 +3494 0 1 +3773 1 0 +475 1 1 +35 1 1 +1401 19 20 +1321 1 0 +5747 1 0 +8887 8 5 +3594 0 2 +628 2 4 +2997 2 4 +276 1 1 +91 1 1 +610 9 10 +1006 2 0 +250 1 1 +83 0 1 +1046 1 1 +21 5 5 +209 7 7 +347 9 8 +74 0 2 +457 1 1 +28 1 1 +91 5 5 +318 14 14 +348 0 306 +17 1 1 +472 0 6 +1775 0 8 +76 1 1 +27 1 1 +441 16 30 +1230 1 1 +15 1 1 +606 2 12 +113 1 1 +36 1 1 +69 1 1 +25 1 0 +14 1 1 +477 1 1 +29 1 1 +1698 0 1 +3742 0 2 +456 1 1 +24 1 1 +1301 7 7 +1040 0 2 +9509 0 3 +3359 16 16 +1960 0 1 +3067 8 0 +40 1 1 +7659 0 10 +67 26 16 +1741 0 8 +789 1 1 +72 2 0 +257 1 1 +18 1 1 +617 1 0 +3080 1 1 +46 1 0 +120 0 1 +1723 1 1 +17 1 0 +1047 0 2 +1999 0 1 +335 14 15 +3068 0 2 +4619 1 1 +26 1 1 +58 4 2 +1234 2 0 +5017 1 0 +614 1 0 +675 0 1 +1869 0 3 +1769 0 1 +3175 5 0 +336 1 1 +40 1 1 +450 1 1 +37 1 1 +1161 0 2 +216 2 0 +55 2 0 +589 1 0 +559 0 1 +165 1 1 +108 1 1 +2490 12 12 +770 0 1 +786 5 6 +718 0 2 +85 1 1 +19 1 1 +449 1 1 +49 1 1 +566 0 5 +607 0 4 +3337 3 71 +34 2 0 +84 3 0 +3518 8 0 +463 0 1 +294 13 10 +520 6 6 +403 5 4 +329 0 1 +228 0 7 +258 1 0 +1823 0 1 +1299 0 1 +1045 0 4 +3387 0 1 +2043 0 2 +1705 6 1 +3557 0 1 +750 2 0 +1951 0 2 +1135 3 5 +677 1 1 +102 1 1 +56 1 1 +25 1 1 +281 1 1 +45 6 0 +428 5 5 +61 0 4 +108 1 1 +46 1 1 +160 1 1 +92 1 1 +164 1 1 +106 1 1 +123 1 1 +59 1 1 +2323 1 1 +67 1 1 +3493 0 1 +3021 3 3 +39 1 1 +3473 1 1 +114 1 1 +207 1 1 +47 1 1 +343 4 4 +2089 1 0 +15534 2 0 +321 1 0 +28 1 0 +35 1 0 +1499 0 1 +6598 1 0 +1960 7 0 +3677 1 1 +44 1 1 +2501 0 1 +11562 5 0 +6295 0 1 +1210 0 203494 +135 7 7 +49 0 10 +773 11 11 +1058 0 1 +128 1 1 +34 1 1 +955 1 1 +31 1 1 +446 0 1 +1929 14 15 +2240 8 0 +3316 9 8 +733 8 8 +2339 0 2 +1748 0 5 +2973 0 1 +711 6 0 +2049 1 0 +751 1 0 +1915 0 9 +206 1 0 +956 1 0 +490 0 1 +2014 0 1 +331 0 1 +456 0 20 +2341 0 2 +406 2 0 +5537 1 0 +709 1 1 +47 1 1 +282 1 0 +1308 1 0 +2058 0 1 +1646 1 0 +11 1 1 +371 2 0 +71 17 39 +75 2 0 +4947 3 1 +1605 0 16 +259 2 0 +76 1 0 +872 1 0 +3136 1 0 +539 1 1 +20 2 0 +825 1 0 +541 0 1 +755 0 1 +836 0 4 +1509 1 0 +1732 1 0 +2313 1 0 +636 0 6 +1085 1 0 +4667 1 0 +322 0 28 +5828 0 7 +6145 10 0 +861 0 1 +1937 0 3 +605 0 1 +918 1 0 +471 0 1 +804 7 7 +360 0 1 +73 1 1 +48 1 1 +4920 0 1 +713 1 1 +21 0 3 +6 0 3 +6 0 1 +4823 22 23 +1532 1 0 +1572 1 0 +5598 1 0 +388 5 6 +2340 0 1 +797 1 0 +762 1 0 +1443 0 1 +31 1 1 +544 0 1 +1104 8 9 +78 0 1 +507 1 0 +1554 0 1 +1158 1 0 +141 2 0 +328 8 73 +3352 0 1 +1468 0 1 +615 0 11 +164 0 4 +1987 0 1 +23 1 1 +14468 12 12 +9432 0 1 +2318 1 0 +19901 1 1 +53 1 1 +1306 1 0 +1168 1 0 +1603 1 0 +212 0 60 +205 0 1 +2325 1 0 +6149 1 1 +20 1 1 +1722 0 2 +462 1 0 +2454 0 1 +543 7 10 +878 7 0 +780 167 32 +518 205 0 +119 0 1 +2091 32 0 +34 62 4 +738 0 4 +15563 1 0 +502 0 1 +1062 0 5 +584 0 5 +262 1 1 +46 1 1 +10905 4 0 +8800 0 3 +605 0 1 +9331 2 0 +7699 0 1 +354 5 5 +15330 0 1 +536 0 2 +3065 1 1 +47 1 1 +5531 1 1 +32 1 1 +22234 1 0 +11816 4 0 +4043 0 10 +17980 0 1 +19903 1 0 +19954 12 0 +3750 0 1 +7832 13 7 +1599647 0 1 +1684134 1 0 +17464 31 31 +61774 1 0 +5532 0 4235 +1263 0 1 +871752 0 1 +377885 1 0 +344 0 1 +2289 2 0 +14919 1 0 +3511 4 3 +213 2 0 +2219 27 2 +55 0 1 +2233 8 74710 +131 4 0 +612 6 6 +1952 13 0 +2382 0 10 +2281 3 0 +2370 6 7 +2826 2 0 +43 1 1 +1173 5 0 +706 6 0 +1879 0 2 +1069 1 1 +20 0 1 +368 0 1 +616 2 1 +668 0 1 +670 1 0 +321 4 0 +296 1 1 +48 1 1 +1792038 0 1 +171744 0 1 +2750781 0 1 +10 0 2 +38 0 1 +1812412 1 0 +44949 1 0 +240162 1 0 +14736 19 23 +1510401 0 1 +1383745 1 0 +10539339 1 0 +11109 0 1 +911 0 2 +6539 1 0 +731310 50000 131243 +3065 0 1 +226 1 0 +1058 1 1 +19 1 1 +26163 1 0 +2385256 0 1 +64268 0 1 +1127344 1 0 +17 1 0 +8 1 0 +8 0 13 +25 21 3 +27 0 29 +22 0 20 +5 1 0 +17 2 0 +6 1 0 +8 4 0 +27 150 0 +31 0 3 +5 1 0 +11 0 3 +15 1 3 +11 0 4 +16 0 1 +4 3 0 +6 0 4 +16 6 0 +7 1 5 +16 0 1 +4 0 6 +99 10 1 +32 3 0 +63 8 122 +6403 0 8 +741 9 0 +2318 10 0 +29 1 1 +470 2 0 +1257 1 0 +692 11 3 +28 6 0 +2930 0 1 +24 1 1 +1264 1 0 +4344139 0 1 +122588 0 1 +2299575 1 1 +42 1 1 +1192 3 0 +1862 1 1 +57 0 19 +3950 0 1 +3480 1 1 +16 1 1 +1464 1 0 +20 1 1 +3184 2 0 +53 0 1 +43 1 1 +161 1 0 +2911 4 0 +5330 1 0 +5677 4 0 +597 0 3 +1057 1 0 +84 2 3 +600 0 2 +1094 10 16 +1425 1 0 +274 1 0 +1242 1 0 +1106 1 1 +15 1 1 +180 1 0 +696 24 0 +12 1 0 +401 0 54 +780 1 1 +16 1 1 +1122 0 2 +172 0 1 +32 1 1 +1637 3 0 +223 9 9 +516 1 1 +43 1 1 +1007 3 4 +234 0 1 +45 1 1 +3789 0 2 +2563 0 1 +8818 0 1 +2377 1 1 +16 2 0 +706 1 0 +320213 0 14 +378632 0 1 +110811 1 0 +677951 1 0 +1568189 0 1 +461886 1 0 +1109575 2 0 +3663 1 1 +27 1 1 +1710 84286 106518 +850 5 6 +2845 1 1 +24 1 1 +1462 0 1 +47 12 0 +2047 0 1 +2061 1 1 +33 1 1 +606 1 0 +11983 1 1 +45 2 2 +179 1 1 +32 1 1 +295 1 1 +44 1 0 +237 4 4 +3401 1 1 +23 1 1 +180 1 3 +1722 10 16 +2997 9 0 +3 4 0 +717 0 1 +669 0 1 +35 1 1 +104 58 0 +1100 1 1 +30 1 1 +454 4 0 +63 16 0 +44 2 16 +1808 9 9 +182 1 1 +27 1 1 +254 0 6 +618 1 1 +33 1 1 +136 1 1 +62 1 1 +2043 1 11 +2857 0 84 +800 1 1 +43 1 1 +1024 57 21 +178 0 60 +44 1 1 +461 23 23 +895 1 1 +17 3 0 +5980 0 1 +604 1 1 +37 1 1 +545 0 44 +2445 0 2 +2330 0 1 +201 6 0 +4277 1 0 +557 1 1 +106 1 1 +314 1 1 +40 1 1 +241 1 0 +1999 1 0 +3410 0 4 +1212 0 4 +445 1 1 +35 1 1 +2577 1 1 +71 1 1 +1642 62 26 +2308 15 14 +560977 1 0 +1130615 0 6774 +215064 4 0 +94110 50000 59154 +1289125 53 0 +82 0 126 +1416 16 16 +610 0 57 +482 0 1 +148 1 1 +24 1 1 +2322 1 1 +23 0 1 +719 16 0 +20 0 16 +105 9 9 +1277 1 0 +2498 1 0 +352 0 49 +50 50 0 +21 49 0 +28 49 0 +60 47 0 +17 97 0 +901 47 0 +272 14 1104 +279 1 0 +37 12 11 +68 1 1 +13 1 0 +57 1 0 +15219 0 9180 +4403 0 1 +1748 1 1 +54 1 1 +113261 + +chain 5812699 17 81195210 + 34511469 34747565 chr17_KI270909v1_alt 325800 + 138204 310827 209 +36 4447 4447 +93 173 173 +56 98 98 +33 126 126 +27 482 482 +29 376 376 +34 23287 23287 +59 25758 25758 +710 4836 4836 +46 10985 10985 +29 64 64 +122 490 490 +69 2314 2314 +65 934 934 +63 670 670 +37 2413 2413 +36 1535 1535 +27 110 110 +61 245 245 +244 160 160 +58661 87 87 +56 421 421 +150 418 418 +46 284 284 +28 490 490 +148 1198 1198 +89 536 536 +32 260 260 +88 160 160 +52 2399 2399 +42 1574 1574 +30 519 519 +46 1052 1052 +39 360 360 +49 178 178 +12682 72468 8995 +75 + +chain 2078860 17 81195210 + 21532757 21564472 chr17 83257441 - 61183645 61215380 1437 +498 4 6 +7893 1 1 +38 2 1 +94 1 1 +221 4684 4673 +665 1 0 +3 1 0 +8009 1827 1825 +413 1 0 +955 3125 3126 +1158 1 1 +42 0 34 +2078 + +chain 1335341 17 81195210 + 77614970 77628903 chr17 83257441 + 79517567 79531500 2966 +13933 + +chain 585722 17 81195210 + 34376281 36546159 chr17_KI270857v1_alt 2877074 + 283809 2425225 78 +331 46355 46355 +69 70995 70995 +442 736 736 +45 92568 92476 +158 207366 166275 +35 136752 149472 +632 125883 125883 +29 58872 58872 +109 24 24 +781 25655 25655 +36 2121 2121 +66 110541 110541 +38 442478 442478 +33 56166 56166 +3153 450001 450001 +26 334154 334155 +167 518 518 +205 2210 2210 +32 34 34 +62 + +chain 479136 17 81195210 + 77601352 77606352 chr17 83257441 + 79504000 79509000 51486 +5000 + +chain 429458 17 81195210 + 77596852 77601352 chr17 83257441 + 79499500 79504000 53526 +4500 + +chain 422990 17 81195210 + 77606352 77610902 chr17 83257441 + 79509000 79513500 63462 +3467 0 50 +178 64 14 +19 50 0 +203 9 9 +560 + +chain 390235 17 81195210 + 77610902 77614969 chr17 83257441 + 79513500 79517567 94814 +4067 + +chain 154348 17 81195210 + 77628903 77630507 chr17 83257441 + 79531500 79533104 589049 +1604 + +chain 58462 17 81195210 + 1020324 1057040 chr17_KI270862v1_alt 391357 + 160633 197561 186 +30 0 145 +14 2 1 +12 178 237 +29 83 141 +2 2 2 +27 115 0 +2 98 71 +12 0 1 +34 0 1 +51 2 90 +35 0 461 +36 216 480 +31 63 63 +1 1 1 +24 1 0 +22 15 45 +23 356 327 +14 0 1 +44 551 144 +24 2274 2246 +73 31937 31736 +50 174 87 +58 + +chain 34692 17 81195210 + 77596487 77596852 chr17 83257441 + 79499135 79499500 1798535 +365 + +chain 19822 17 81195210 + 34796308 34797394 chr17 83257441 + 36164817 36165903 2731 +37 389 389 +38 357 357 +101 125 125 +39 + +chain 19410 17 81195210 + 34675022 34675848 chr17 83257441 + 37970530 37971356 1295 +826 + +chain 5679 17 81195210 + 1024821 1024880 chr17_KI270862v1_alt 391357 + 165696 165755 9871921 +59 + +chain 5628 17 81195210 + 1020501 1020739 chr17_KI270862v1_alt 391357 + 161389 162205 4334829 +4 32 638 +23 143 115 +36 + +chain 5534 17 81195210 + 1056808 1056982 chr17 83257441 + 1153544 1153660 4507314 +38 107 49 +29 + +chain 4913 17 81195210 + 81048174 81048227 chr17_KI270860v1_alt 178921 - 165413 165450 388 +7 26 10 +20 + +chain 4218 17 81195210 + 81058474 81058598 chr17 83257441 + 83100775 83100850 35360840 +47 49 0 +28 + +chain 3350 17 81195210 + 77675126 77675171 chr17 83257441 + 79701206 79701251 24078543 +45 + +chain 3199 17 81195210 + 34814368 34814404 chr17_KI270857v1_alt 2877074 - 720500 720536 2341 +36 + +chain 2507 17 81195210 + 77610080 77610118 chr17 83257441 + 79513028 79513066 23510665 +38 + +chain 1425 17 81195210 + 77610031 77610061 chr17 83257441 + 79512629 79512659 24069512 +30 + +chain 1401 17 81195210 + 1022421 1022450 chr17_KI270862v1_alt 391357 + 163026 163055 1974124 +29 + +chain 1153 17 81195210 + 34795643 34810476 chr17 83257441 - 45320543 45335398 1396 +45 14759 14781 +29 + +chain 1008 17 81195210 + 34797737 34808196 chr17_KI270857v1_alt 2877074 + 489109 499567 908 +71 1419 1419 +37 4048 4048 +61 2742 2742 +32 2003 2002 +46 + +chain 922 17 81195210 + 81058722 81058751 chr17 83257441 + 83100684 83100713 29503291 +29 + +chain 722 17 81195210 + 34750764 34784637 chr17 83257441 - 45326734 45360613 521 +58 33775 33781 +40 + +chain 3499015 GL000203.1 37498 + 8 37490 chr17 83257441 - 61083795 61125679 1443 +515 0 2 +2223 4 0 +6841 5 0 +1999 6 0 +830 2 0 +2018 1 1 +11 1 1 +5668 0 2 +2037 2 0 +1487 0 1 +6335 0 4419 +2601 1 0 +363 3 0 +2845 1 1 +91 1 1 +308 0 1 +1283 + +chain 7571279 GL000204.1 81310 + 0 81310 chr17 83257441 + 79466298 79635384 865 +2639 0 8 +198 1 0 +1111 0 2 +3864 1 0 +3137 0 1 +6185 212 0 +1047 15 0 +3103 1 1 +48 1 1 +270 1 0 +451 0 1 +845 1 1 +29 0 3 +109 1 1 +42 1 1 +902 1 1 +18 1 1 +769 0 10 +50 5 0 +81 1 1 +49 1 1 +3881 1 1 +15 1 1 +84 38 38 +250 0 1 +10 0 1 +38 1 1 +2884 8 87992 +2828 0 1 +2967 0 1 +5779 0 3 +20 1 1 +314 0 2 +4575 1 1 +20 0 1 +8141 80 55 +3293 1 0 +2104 6 0 +3583 2 0 +423 0 10 +38 10 0 +14 0 14 +335 0 3 +3817 20 20 +1065 17 17 +1892 2 0 +1007 14 14 +119 7 7 +1203 2 2 +16 1 1 +4877 0 11 +314 + +chain 15614048 GL000205.1 174588 + 0 174588 chr17_GL000205v2_random 185591 - 10808 185591 438 +64 10 10 +122 1 1 +82 1 1 +108 1 1 +78 5 5 +82 7 7 +153 1 1 +44 1 1 +607 1 1 +48 1 2 +48 1 1 +733 1 1 +56 1 1 +67 1 1 +129 1 1 +157 4 4 +58 1 1 +273 14 14 +379 1 1 +37 1 1 +838 1 1 +127 1 1 +299 16 16 +1183 13 14 +596 1 1 +77 1 1 +70 1 1 +35 1 1 +80 13 13 +135 1 1 +83 1 1 +233 1 1 +24 3 141 +270 1 1 +75 1 1 +220 1 1 +152 1 1 +101 20 22 +61 8540 8595 +137 1 1 +7 1 0 +21 1 1 +82 5 5 +30 1 1 +66 1 1 +170 1 1 +150 1 1 +25 0 1 +52 1 1 +869 4 0 +388 15 15 +1634 1 1 +26 1 1 +306 1 1 +35 1 0 +30 1 1 +2541 1 1 +111 1 1 +231 24 24 +452 1 0 +18 1 1 +187 7 7 +69 1 1 +47 0 4 +384 1 1 +48 1 1 +149740 + +chain 550304 GL000205.1 174588 + 8117 15953 chr21 46709983 + 6292665 6300498 948 +269 1 1 +70 1 1 +279 1 1 +37 0 1 +322 1 1 +22 3 3 +1915 2 0 +131 2 2 +14 1 1 +1138 5 5 +88 1 1 +231 1 1 +29 1 1 +862 4 4 +883 1 0 +1094 1 1 +29 1 0 +147 1 1 +87 1 1 +160 + +chain 49989 GL000205.1 174588 + 15953 16657 chrUn_GL000195v1 182896 + 120016 120712 1053 +228 1 1 +21 8 0 +168 1 1 +46 1 1 +230 + +chain 3855332 GL000206.1 41001 + 8 40993 chr17 83257441 + 83162353 83202887 1346 +4948 0 1 +1806 0 4 +93 11 14 +3859 0 1 +456 4 5 +1605 21 21 +1281 7 13 +5085 456 0 +1548 1 1 +37 1 1 +2825 1 1 +64 1 1 +1075 0 1 +721 0 1 +5566 22 5 +1136 1 0 +2390 0 3 +1347 0 2 +4617 + +chain 35556 GL000206.1 41001 + 19273 19640 chr17 83257441 + 83181482 83181849 3375601 +367 + +chain 8661 GL000206.1 41001 + 19184 19273 chr17 83257441 + 83181583 83181672 3994518 +89 + +chain 7051817355 18 78077248 + 10000 78017154 chr18 80373285 + 10000 80259271 19 +754213 1 0 +1391832 0 1 +115074 0 1 +406906 0 1 +933359 1 0 +32907 1 0 +997769 1 0 +25475 0 1 +70818 0 1 +2431308 0 1 +2498195 0 1 +1016972 1 0 +354441 1 0 +4371623 3100000 5520038 +1263396 1 0 +12 1 1 +6219 1 0 +858940 1 0 +5768736 1 0 +151590 0 1 +154615 1 0 +1155929 1 0 +796184 0 3 +1792023 1 0 +2976283 0 1 +1888515 1 0 +4028848 1 0 +193386 0 1 +23223 5 5 +195479 1 0 +3733706 1 0 +335702 0 3 +715696 0 53592 +1849530 0 1 +5660209 150000 9138 +238 1 1 +35 1 1 +663 0 1 +2838081 1 0 +2771324 1 0 +3433027 1 0 +582458 1 0 +569211 1 0 +1433504 1 0 +3073596 0 1 +2747326 0 1 +2587840 1 0 +36781 1 0 +25 5 3 +93 50000 5277 +1098 1 0 +243 0 4 +95 0 4 +63 4 0 +31 1 1 +81 1 1 +23 2 0 +13 0 2 +12 1 1 +94 0 2 +178 0 1 +505242 0 1 +1250421 1 0 +117527 1 0 +39096 1 1 +25 1 1 +155769 0 1 +1318442 50007 1959 +15674 1 5 +2043637 1 1 +28 1 1 +73 1 1 +37 36 0 +65 6 79 +89 110 768 +62 0 893 +71 1 0 +36 1 1 +103 1 111 +1265 1 1 +31 1 1 +268 0 75 +87 0 30 +34 0 225 +90 0 75 +1422 2 0 +154 2 0 +3984 5 0 +1894 0 1 +293 2 0 +468 1 1 +42 1 1 +3973 1 1 +66 1 1 +840 2 0 +279 1 7 +1132 6 6 +732 1 1 +25 1 1 +426 0 2 +856 0 20 +1748 0 2 +4502 1 0 +4598 1 1 +27 1 1 +3289 3 0 +2606 8 8 +2416 0 1 +513 13 13 +147178 + +chain 6172 18 78077248 + 77831280 77831549 chr18 80373285 + 80072925 80073499 8342549 +14 1 1 +21 182 487 +51 + +chain 590 18 78077248 + 78017179 78017245 chr18 80373285 + 80258580 80258646 32218888 +66 + +chain 404026 GL000207.1 4262 + 0 4255 chr18 80373285 - 25830970 25835225 122440 +4255 + +chain 5304388456 19 59128983 + 60000 59118983 chr19 58617616 + 60000 58607616 21 +933374 0 1 +1346780 0 1 +1782529 0 1 +376951 15 0 +455030 0 1 +2349410 92015 27241 +79 137 0 +368 1 2 +3226 1 17 +987 0 1 +2543 0 2 +1361 0 2 +2762 4 0 +4726 1 0 +3371 0 8 +51 1 1 +875 0 3 +847 2 0 +32 1 1 +248 5 0 +30 1 1 +156 1 1 +42 5 5 +890 1 0 +1111 0 16 +518336 0 1 +85082 0 1 +645497 1 0 +2775 1 1 +44 1 1 +1086 0 4 +213 1 0 +247 0 3 +2047 6 0 +3262 1 0 +2975 0 4 +1999 1 0 +303 1 0 +2753 50596 6030 +7117 4 0 +4734 1 0 +717 5 0 +1170 1 1 +22 1 1 +319 0 1 +1123 3 0 +1806 14 13 +528 1 0 +2287 2 0 +191 2 0 +393 2 0 +681 1 0 +422 1 0 +1379 0 1 +2324 56 88 +1252 1 0 +1594 0 1 +391 1 1 +24 180 0 +57 5 75 +16 6 22 +2165 0 8 +1455 8 8 +449 1 5 +51 0 1 +469 7 0 +1086 1 1 +46 1 1 +1179 290 0 +313 36 18 +2291 0 1 +4946 1 0 +7100 422 0 +60 4 0 +1117 3 0 +926 0 1 +4874 1 0 +10 0 13 +36 1 0 +314 0 2 +683 1 1 +41 1 1 +255 2 1 +731 1 1 +43 1 1 +124 1 0 +32 1 0 +1041 0 4 +2824 50 0 +121 14 16 +167 22 0 +44 32 0 +100 1 1 +1339 1 0 +142 0 4 +1691 2 0 +3696 1 1 +41 1 1 +3504 2 0 +1885 0 4 +558 12 11 +719 6 6 +1288 19 0 +258 2 0 +5 64 0 +207 30 10 +70 1 119 +202 2 0 +2092 16 0 +936 0 1 +33 1 1 +173 10 10 +436 0 6 +567 8 8 +1468 0 2 +5471 0 1 +1523 4 0 +88 0 8 +90 28 0 +85 0 4 +6 1 1 +3520 0 4 +261 1 0 +1732 1 0 +6366 0 1 +869 0 2 +1240 1 0 +4114 0 8 +865 1 1 +35 1 1 +184 293 0 +5606 1 1 +30 1 1 +137 42 42 +236 6 0 +195 35 34 +53 23 23 +272 32 32 +143 38 51 +936 178 177 +629 11 11 +422 1 4 +251 17 17 +735 36 36 +1519 4 0 +1481 32 32 +137 24 24 +220 121 101 +113 98 99 +1534 48 48 +670 11 11 +422 93 94 +749 32 32 +134 36 36 +359 41 41 +1119 4 0 +1481 32 32 +137 1 1 +22 1 1 +254 16 0 +191 1 1 +8 0 1 +23 1 1 +1507 0 1 +80 1 1 +46 1 1 +261 420 420 +422 24 25 +818 32 32 +134 36 36 +359 138 138 +2651082 0 2 +1252 2 0 +772 10 10 +1883 0 8 +3692 1 0 +760 4 2 +303 126 0 +24 102 0 +44 0 2 +103 2 0 +27 0 2 +36 2 0 +14 9 97 +53 0 8 +20 20 0 +22 10 2 +36 0 2 +12 0 6 +44 0 2 +117 4 0 +28 0 2 +63 3 6 +24 1 1 +122 10 10 +5035 1 1 +26 1 1 +886 1 0 +164 1 0 +2276 20 20 +296 0 1 +2497 5 5 +2568 0 7 +713 1 0 +47 1 1 +869097 0 1 +1571292 0 1 +61586 0 1 +1085269 0 1 +592066 0 1 +537709 1 0 +743742 0 1 +271433 0 1 +858628 1 0 +755514 0 1 +1625802 71997 0 +704449 0 3 +85283 0 1 +2573180 1 1 +16 1 1 +6810 13 13 +7040 9 9 +2201 1 1 +23 1 1 +24919 1 1 +39 1 1 +6913 1 1 +46 1 1 +342 1 1 +47 1 1 +625117 3100000 2791894 +746614 0 1 +2923123 1 0 +18608 0 1 +1226 0 1 +2761173 0 1 +1086836 0 1 +368860 0 1 +206456 0 1 +369953 0 1 +44305 1 0 +1811090 0 1 +167943 2 264 +188 1 0 +2150407 63 63 +319 58 602 +155 77 77 +303 37 37 +341 14 14 +144 7 7 +115 0 22 +339 13 13 +584 108 108 +174 50 51 +876 139 139 +2480 0 1 +444 1 0 +908 15834 0 +628658 0 1 +82283 0 1 +840068 1 0 +7473 0 1 +3806 3 3 +22 1 1 +5980 2 0 +725 1 0 +19 1 1 +4391 1 1 +36 1 1 +16684 2 0 +4344 4 4 +589 6 0 +8691 7 5 +55 455 0 +4547 0 1 +1226 1 1 +53 1 1 +3064 0 11 +1094 0 1 +1052 15 15 +12011 2 0 +7458 1 1 +19 1 1 +6116 4 0 +207 2 0 +4193 2 0 +13171 0 16 +1216 4 0 +2332 0 1 +3346 0 5 +7056 1 0 +11441 1 1 +22 2 0 +18029 4 0 +1768 17 16 +185 1 1 +48 1 1 +2089 0 4 +211 2 0 +1377 0 2 +2989 0 12 +673 1 1 +43 1 1 +785 29 0 +4851 4 0 +566 0 3 +2641 0 6 +4900 0 1 +921 0 1 +469 2 0 +126 1 1 +30 1 1 +3942 1 1 +46 1 1 +7348 0 2447 +514 1 1 +47 1 1 +2342 4 0 +4339 2 0 +992 1 0 +25089 4 0 +172 3 0 +167 0 4 +4129 1 0 +997 1 1 +30 5 5 +234 0 1 +66 1 1 +16 1 1 +568 8 8 +35 1 1 +1285 0 2 +15 1 1 +1834 0 8 +4449 0 3 +5077 0 5 +1305 6 0 +20451 1 0 +27490 5 1 +93 0 16 +13857 1 1 +22 1 1 +1742 1 1 +37 1 1 +3243 1 0 +1671 1 1 +24 1 1 +1029 0 4 +5196 1 0 +963 1 0 +494 1 0 +35 1 1 +2915 0 1 +6710 3 2 +3832 24 0 +12124 1 1 +43 2 2 +449 1 1 +40 1 1 +506 17 18 +315 1 1 +40 0 8 +51 13 6 +210 175 62 +225 4 4 +45 1 1 +64 1 1 +37 1 1 +103 1 1 +36 2 0 +174 1 1 +51 1 1 +780 1 2 +711 2 5 +1014 0 3 +4220 1 1 +18 1 1 +2257 0 5 +913 1 0 +14 1 1 +1354 1 0 +552 20 19 +1236 17 11 +331 1 2 +548 1 1 +29 1 1 +1058 1 1 +44 1 1 +208 2 0 +606 4 5 +1541 0 1 +878 1 1 +42 1 1 +95 1 0 +2868 11 0 +307 0 1 +434 4 0 +1126 0 2 +181 1 1 +41 1 1 +4489 2 0 +234 0 2 +1403 1 0 +1983 4 0 +196 15 0 +407 1 1 +35 1 1 +2949 21 0 +1985 0 1 +1098 0 10 +288 0 17 +827 0 4 +2080 1 1 +21 1 0 +546 3 0 +322 1 0 +8559 3 0 +4003 0 1 +1483 8 9 +939 1 1 +19 1 1 +141 4 0 +122 16 16 +461 0 1 +1197 9 11 +1478 1 1 +40 0 1 +585 1 0 +4899 0 2 +3544 1 1 +77 1 1 +975 2 0 +3210 17 17 +1781 0 3 +1150 1 0 +43 1 0 +289 0 2 +3238 1 1 +30 1 1 +242 4 0 +8680 2 0 +2668 76 0 +3983 1 0 +2741 2 0 +1457636 9 9 +8 1 1 +667228 1 0 +309567 0 1 +22123 3 0 +157 2 0 +128 1 0 +2756 9 9 +1867 4 4 +314 1 1 +35 2 2 +107 2 0 +1646 7 7 +443 18 18 +3762 0 1 +1575 0 1 +1369 7 6 +4705 1 0 +1410 1 0 +1869 1 0 +6232 14 14 +177 2 0 +134 0 1 +60 9 9 +161 1 1 +81 1 1 +196 1 1 +63 1 1 +171 1 1 +107 1 1 +496 1 0 +782 1 1 +44 1 1 +3383 0 1 +535 1 1 +30 1 1 +775 1 1 +115 1 1 +58 1 1 +20 1 1 +873 1 1 +68 2 0 +467 1 1 +30 1 1 +179 14 14 +193 1 1 +119 1 0 +7 1 1 +919 1 1 +22 1 1 +472 1 1 +25 1 1 +381 1 1 +19 1 1 +2193 1 1 +29 0 1 +1334 0 4 +1029 0 1 +59 1 1 +405 1 0 +916 10 10 +180 2 0 +1822 3 0 +654 1 1 +34 1 1 +1014 1 1 +48 1 1 +3726 7 0 +50 0 4 +2535 0 2 +473 1 1 +25 1 1 +1168 0 1 +2434 1 0 +3166 1 0 +39 4 0 +470 1 1 +20 2 2 +1822 1 1 +30 1 1 +1677 1 1 +66 2 2 +291 3 0 +3811 1 1 +25 1 1 +2203 1 1 +27 1 1 +2026 8 0 +6531 1 0 +1265 1 1 +34 1 1 +3309 14 14 +119 6 5 +406 3 0 +4054 0 2 +3441 1 1 +29 1 1 +559 28 0 +54 0 1 +554 1 1 +39 1 1 +156 1 1 +25 1 1 +290 14 14 +2386 6 0 +1625 3 0 +5430 6 6 +762 1 1 +46 0 5 +4018 1 1 +84 2 2 +2153 1 1 +21 1 1 +119 1 1 +34 1 1 +6311 1 0 +1445 1 1 +17 1 1 +303 15 15 +2390 0 1 +322 0 6 +45 1 1 +2148 0 1 +1873 0 48 +63 0 31 +310 1 1 +42 1 1 +103 1 1 +39 1 1 +419 1 1 +41 0 40 +279 1 1 +95 10 10 +234 6 11 +61 0 4 +88 5 0 +24 0 40 +107 5 1 +3566 10 0 +1998 1 1 +24 1 1 +491 1 1 +66 1 1 +325 1 1 +21 0 9 +13869 67 61 +2321 1 0 +487 1 0 +24 1 0 +3973 1 0 +615 1 1 +106 1 29 +2673 5 9 +255 0 1 +2307 4 0 +3864 0 3 +882 0 9 +786 4 0 +398 0 2 +925 0 1 +1076 3 0 +977 0 1 +198 56 93 +2037 1 0 +1908 0 2 +470 1 0 +7154 8 0 +435 1 1 +28 1 1 +120 1 1 +26 1 1 +625 12 15 +590 5 0 +186 0 663 +769 0 16 +581 1 0 +1060 10 0 +1652 12 0 +112 15 13 +89 12 54 +100 0 14 +42 0 38 +45 0 12 +39 0 8 +3921 1 1 +48 3 0 +160 1 0 +4750 0 1 +155 1 1 +81 1 1 +3414 14 0 +8895 2 0 +5330 10 0 +1415 1 0 +7770 4 0 +96 34 1 +37 22 0 +8 6 0 +44 1 3 +14 1 1 +9641 0 2 +43 0 4 +393 0 1 +5136 3 0 +1039 12 13 +2992 1 0 +3351 0 8 +6041 11 11 +339 1 0 +2286 0 1 +1359 0 12 +929 0 1 +6664 1 0 +1685 2 0 +1460 1 0 +1749 0 1 +11376 0 1 +58 1 0 +458 1 0 +17 1 0 +307 7 0 +69 0 40 +239 10 8 +1199 1 0 +205 9 9 +17 1 0 +20 2 2 +77 1 0 +189 4 6 +4748 0 2 +1954 0 1 +282 0 2 +1735 1 0 +4309 0 1 +5462 1 0 +1006 1 0 +662 0 1 +699 13 9 +23771 0 2 +12976 0 1 +530 1 0 +970 9 7 +4748 0 1 +1360 0 2 +377 0 1 +1340 1 0 +416 6 6 +476 1 1 +25 1 1 +632 1 1 +85 5 5 +446 1 1 +23 1 1 +122 0 2 +25 1 1 +123 8 0 +137 10 11 +667 2 0 +247 0 1 +319 26 29 +2037 10 0 +49 2 0 +38 0 21 +1355 1 0 +5 1 0 +27 0 1 +4673 0 1 +644 0 1 +1060 4 0 +2192 1 0 +359 1 0 +317 3 21 +299 20 0 +729 0 10 +1642 0 4 +3427 1 0 +247834 1 0 +1134248 0 1 +909307 1 0 +30355 0 1 +3753668 0 1 +223864 1 0 +137335 0 1 +56974 0 1 +20334 0 1 +287475 0 1 +1911418 1 0 +621953 4 4 +25 1 1 +1792 0 2 +2928 16 0 +1841 0 3 +911 0 1 +172 1 0 +767 8 0 +63 81 77 +296 4 0 +28 0 12 +419 1 1 +36 1 1 +1014 2 0 +842 2 0 +3956 4 0 +117 0 7 +838 3 0 +474 1 0 +162 0 5 +47 1 1 +84 5 5 +78 1 1 +517 1 1 +73 1 1 +181 11 22 +85 2 0 +18 1 1 +450 21 11 +261 3 0 +67 1 1 +20 1 1 +101 1 1 +43 1 1 +175 1 1 +41 1 1 +119 1 1 +39 1 1 +961 1 1 +67 1 1 +80 0 2 +123 1 1 +27 0 6 +1314 1 0 +162 1 1 +39 1 1 +463 0 1 +2257 0 16 +234 25 9 +106 22 0 +907 0 3 +16 1 1 +131 0 1 +1298 5 0 +170 3 0 +1876 0 4 +219 0 4 +209 24 0 +458 1 0 +3265 0 1 +4537 76 0 +1882 0 1 +568 0 1 +839 0 1 +8209 0 1 +4206 0 4 +2990 1 1 +55 1 1 +1518 56 0 +2755 0 4 +991 446 0 +87 0 155 +1593 2 3 +753 0 1 +6012 20 0 +4590 0 1 +573 13 13 +2226 1 1 +25 2 0 +4988 1 0 +5308 0 1 +1157 0 1 +1024 1 1 +44 1 4 +918 0 1 +683 2 0 +21 1 1 +2309 0 7 +581 1 1 +40 0 1 +1836 39 0 +8 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +4 0 1 +9 0 1 +4 0 1 +4 0 1 +4 0 1 +8 0 1 +13 0 2 +60 0 2 +42 2 0 +9 2 0 +10 0 9 +1572 0 5 +500 36 0 +1052 0 111 +147 38 1 +692 0 1 +2664 1 1 +31 1 1 +1338 18 0 +745 5 0 +3937 84 0 +39 77 1 +37 8 0 +75 0 4 +511 10 9 +488 1 0 +1150 0 4 +48 1 0 +701 4 0 +1079 0 1 +951 0 1 +908 1 1 +49 1 1 +121 25 53 +973 0 3 +630 1 1 +26 1 1 +2738 0 1 +563 5 0 +1335 3 0 +1054 5 0 +572 10 9 +1738 1 0 +770 2 0 +1962 1 0 +406 1 1 +47 1 1 +9871 1 0 +9252 6 5 +129 431 431 +147 30 30 +177 9 7 +136 2 2 +80 8 8 +945 8 8 +298 1 1 +47 1 1 +912 12 12 +1055 18 18 +146 13 13 +119 1 1 +39 1 1 +386 1 1 +28 1 1 +398 4 4 +86 0 1 +373 2 0 +515 1 1 +54 1 1 +849 1 0 +119 1 1 +24 1 1 +1236 1 0 +292 1 1 +17 1 1 +1823 1 0 +9477 9 9 +898 19 19 +223 2 2 +41 1 1 +194 8 8 +22 1 1 +202 16 16 +57 1 1 +29 1 1 +178 1 1 +28 0 24 +33 18 18 +117 0 3 +6 1 1 +72 1 1 +87 1 1 +264 5 5 +129 1 1 +162 0 3 +42 1 1 +159 5 5 +111 0 8 +95 1 1 +37 1 1 +128 128 125 +951 11 0 +578 4 3 +36 1 1 +194 0 1 +589 11 4 +2596 0 1 +1003 1 0 +24 5 0 +922 19 20 +107 1 1 +42 2 2 +252 1 1 +29 1 1 +361 2 2 +37 1 1 +319 1 1 +29 1 1 +93 1 1 +23 1 1 +2959 9 9 +3018 0 14 +944 8 8 +76 0 1 +3202 2 0 +62 30 16 +272 0 2 +95 0 14 +277 2 0 +116 0 2 +149 4 0 +253 2 0 +13918 17 17 +1008 1 0 +2353 1 1 +15 1 1 +1988 1 2 +5835 9 9 +268 11 11 +190 1 1 +40 1 1 +76 6 5 +52 1 1 +925 0 2 +5352 0 1 +529 4 4 +453 1 1 +140 0 1 +37 158 0 +6 6601 0 +623 0 1 +1091 8 8 +1252 5 48 +9 5 0 +18 0 1 +40 0 2 +104 721 0 +1928 0 13 +303 0 1 +33 1 1 +591 1 1 +73 2 2 +936 1 1 +20 1 1 +629 12 0 +115 0 4 +2382 2 0 +1094 9 27 +1166 4 0 +1429 0 1 +2298 0 3 +256 4 0 +2613 1 1 +78 1 1 +1177 14 14 +30 1 1 +1240 1 0 +13450 9 9 +166 0 1 +20 1 1 +4917 6 6 +2408 0 1 +1119 1 0 +236 1 0 +226 11 12 +2413 3 0 +88 1 1 +26 1 1 +126 0 4 +1049 567 0 +1743 6 6 +1400 0 1 +147 10 10 +181 0 1 +26 0 2 +638 1 31 +20 4 38 +32 0 274 +178 4 4 +58 4 0 +61 95 1 +7 0 4 +18 30 0 +7 4 0 +76 19 19 +793 0 16 +621 1 1 +44 1 1 +375 2 0 +85 1 0 +934 12 12 +142 10 10 +148 1 1 +47 1 2 +647 1 1 +62 18 18 +125 5 5 +411 7 7 +3955 0 2 +1915 3 3 +23 11 11 +367 1 1 +21 8 9 +23 9 4 +11 6 10 +189 1 1 +16 1 1 +461 1 1 +24 1 1 +15884 0 3 +17658 1 0 +6182 0 1 +3759 1 0 +767 4 0 +282 4 0 +2618 63 0 +2852 0 16 +2083 0 486 +8846 3 0 +232 1 0 +2552 0 1 +1537 0 2 +70 0 1 +216 1 1 +80 4 1 +458 1 0 +592 14 14 +4874 1 0 +152 1 0 +3313 2 0 +5523 10 10 +1304 3 0 +638 0 4 +168 0 3 +2900 4 4 +21 1 1 +2395 1 1 +48 1 1 +568 5 6 +2017 2 0 +2044 1 1 +46 1 1 +5857 1 0 +2223 3 0 +1213 1 0 +2664 1 0 +248 3 0 +353 2 0 +282 1 0 +778 0 2 +369 0 1 +205 32 0 +455 1 0 +2541 0 74 +70 1 1 +29 0 1 +72 9 10 +689 13 11 +1195 1 0 +25 1 1 +291 9 3 +1030 3 0 +263 1 1 +26 1 1 +1497 0 1 +1475 2 0 +629 0 4 +1735 9 8 +857 1 0 +296 10 10 +623 20 0 +412 0 2 +2985 1 1 +48 1 1 +1334 0 2 +475 0 14 +2480 1 1 +67 0 1 +51 68 0 +326 0 16 +37 11 1 +859 2 0 +689 12 12 +6204 18 19 +2322 0 4 +854 1 1 +36 1 1 +440 13 13 +4720 0 1 +910 1 1 +64 1 1 +59 0 5 +3782 0 2 +142 1 1 +1430 0 4 +878 0 20 +2173 0 2 +603 1 0 +3756 1 1 +47 1 1 +822 1 1 +69 1 1 +1812 0 2 +2440 16 16 +139 12 13 +105 1 1 +24 1 1 +482 37 0 +64 15 15 +2463 1 1 +30 1 1 +3351 2 0 +2133 17 17 +2665 4 6 +39 0 8 +509 0 1 +896 1 0 +295 0 1 +3188 1 0 +45 1 1 +2481 3 0 +68 79 8 +367 0 1 +152 1 1 +48 1 1 +85 1 1 +32 1 1 +1156 0 1 +1365 5 0 +2136 5 8 +1932 0 2 +33 180 0 +96 2 0 +43 0 2 +168 1 1 +49 1 1 +362 0 3 +7162 0 11 +7141 20 0 +21483 0 2 +17837 8 8 +540 2 0 +1944 5 5 +31 1 1 +754 1 2 +32 1 1 +1603 1 1 +20 1 1 +1550 0 12 +3994 6 0 +555 0 7 +53 0 1 +28 1 1 +1755 1 0 +1307 4 0 +274 0 2 +3478 0 3 +138 1 1 +28 1 1 +1425 0 1 +5388 1 1 +38 1 1 +13798 0 2 +4777 1 0 +6382 1 0 +5317 1 1 +37 1 1 +302 1 0 +786 6 0 +695 0 7 +3323 1 1 +47 1 1 +5645 0 2 +1996 21 0 +273 17 0 +334 0 1 +751 1 0 +2163 4 0 +1591 0 235 +1637 1 0 +11 1 1 +407 15 15 +398 33 0 +166 3 0 +727 1 1 +22 1 1 +220 1 0 +1663 1 0 +530 1 0 +1753 14 0 +2967 0 3 +143 5 5 +592 1 1 +55 1 1 +571 0 1 +113 1 1 +18 1 1 +142 150 0 +75 75 0 +62 12 12 +140 234 0 +1926 0 1 +769 20 5 +394 11 11 +500 5 5 +1305 5 5 +93 7 7 +63 1 1 +27 1 0 +1651 1 1 +39 1 1 +692 0 2 +1672 0 1 +574 2 1 +1941 0 1 +495 1 1 +25 1 1 +1652 6 0 +379 1 0 +2680 1 1 +137 0 2 +12 1 1 +1698 0 280 +1437 13 13 +1126 1 1 +51 1 0 +974 1 4 +147 0 1 +7242 11 11 +153 4 4 +300 1 1 +67 1 1 +116 6 0 +41 1 1 +857 1 1 +31 1 1 +527 0 39 +1387 1 1 +46 1 1 +1720 1 1 +132 1 1 +1001 1 1 +31 1 1 +128 1 1 +26 1 1 +1389 1 1 +35 1 1 +1191 1 0 +172 0 1 +1731 1 0 +2442 1 1 +34 1 1 +86 1 1 +26 1 1 +454 0 2 +1652 0 19 +3828 2 0 +2246 5 1 +50613 1 0 +2817 2 0 +54013 1 1 +22 1 1 +8451 4 4 +8178 1 0 +12845 0 32 +487 0 13 +2372 1 0 +1457 1 0 +60 0 2 +129 1 1 +576 4 48 +101 1 1 +16 1 1 +371 1 1 +73 1 1 +1728 0 1 +4709 0 2 +937 1 1 +34 1 1 +229 1 1 +90 3 3 +103 15 15 +391 13 13 +900 1 1 +46 1 1 +141 1 1 +83 1 1 +59 30 30 +98 1 1 +16 1 1 +81 15 15 +233 10 10 +67 1 1 +55 1 1 +72 1 1 +279 0 4 +18 1 1 +3005 7 0 +180 1 1 +56 0 7 +2054 38 0 +14 0 38 +652 0 2 +2245 1 1 +37 1 1 +1069 7 6 +1167 1 0 +347 0 1 +933 1 0 +1189 1 1 +115 1 1 +84 1 1 +32 1 1 +51 8 0 +504790 0 1 +124770 0 1 +547100 3 0 +487863 0 1 +1500985 0 1 +130072 0 1 +156089 1 0 +244533 + +chain 3949379 19 59128983 + 7304089 7346004 chr7 159345973 - 57658679 57700592 1324 +491 1 6 +410 15 15 +225 0 1 +437 1 1 +47 1 1 +1294 30 26 +592 0 2 +180 0 1 +23 1 1 +241 1 1 +32 1 1 +365 10 10 +650 0 1 +510 2 2 +38 1 1 +669 1 1 +19 10 0 +52 2 0 +294 1 1 +23 1 1 +4723 1 1 +60 1 1 +1035 1 0 +103 2 0 +5287 1 1 +33 1 1 +335 0 4 +3427 0 14 +1102 1 1 +49 1 1 +1159 1 1 +31 1 1 +498 0 29 +4355 8 0 +694 0 3 +145 1 0 +1967 1 0 +672 1 1 +49 1 1 +3106 1 1 +46 1 1 +225 3 0 +1807 0 1 +889 53 22 +3366 + +chain 1029737 19 59128983 + 54583368 55414819 chr19_KI270938v1_alt 1066800 + 54481 885933 105 +81 16387 16387 +25 13248 13248 +76 20269 20269 +56 3746 3746 +446 34813 34814 +39 2295 2295 +36 1199 1199 +38 9432 9432 +84 39 39 +77 6144 6144 +25 32104 32104 +431 147 147 +30 23130 23130 +128 18529 18529 +30 34404 34404 +158 6 6 +6601 3155 3155 +721 44724 44724 +567 4513 4513 +95 25 25 +30 58807 58807 +63 59790 59790 +32 21735 21735 +68 36320 36320 +37 18273 18273 +79 7320 7320 +180 130079 130079 +33 9713 9713 +150 75 75 +75 214 214 +234 203770 203770 +30 6253 6253 +38 + +chain 468493 19 59128983 + 20575968 20580949 chr19 58617616 + 20396000 20400981 63288 +553 4 4 +4424 + +chain 425242 19 59128983 + 40397824 40402328 chr19 58617616 + 39891500 39896000 58762 +37 16 16 +56 4 4 +978 4 0 +2740 12 12 +657 + +chain 425019 19 59128983 + 20588007 20592789 chr19 58617616 + 20405184 20409988 106375 +904 83 79 +370 1 6 +1668 26 27 +347 0 21 +191 6 6 +369 2 0 +393 67 68 +355 + +chain 386725 19 59128983 + 20581012 20585150 chr19 58617616 + 20401044 20405179 136152 +1117 2 0 +363 1 0 +2655 + +chain 253563 19 59128983 + 20585170 20587961 chr3 198295559 + 48210572 48213481 367690 +112 40 0 +741 1 1 +10 0 2 +13 1 0 +37 2 0 +66 6 6 +163 1 0 +408 3 117 +117 1 1 +39 2 50 +79 1 1 +30 1 1 +237 0 2 +304 3 0 +296 1 0 +76 + +chain 238600 19 59128983 + 20573415 20575968 chr19 58617616 + 20393446 20396000 282789 +1065 0 1 +1488 + +chain 234245 19 59128983 + 20592789 20595281 chr19 58617616 + 20409982 20412475 430317 +2028 0 1 +464 + +chain 143092 19 59128983 + 40396318 40397824 chr19 58617616 + 39889993 39891500 55927 +302 0 1 +1204 + +chain 78095 19 59128983 + 40408298 40409893 chr19 58617616 + 39902287 39903876 1900380 +204 200 200 +154 216 213 +65 109 109 +247 37 37 +55 102 100 +79 26 25 +101 + +chain 72203 19 59128983 + 40404756 40406189 chr19 58617616 + 39898385 39899826 2067055 +130 126 130 +237 101 101 +60 55 55 +119 328 332 +277 + +chain 68918 19 59128983 + 8860327 8875810 chr19 58617616 + 8757146 8784196 2444 +34 3006 3002 +30 3423 3405 +69 3955 3955 +32 2551 8830 +420 1264 6574 +32 134 134 +36 373 373 +124 + +chain 67839 19 59128983 + 40402328 40403596 chr19 58617616 + 39879749 39880989 784109 +192 24 23 +73 175 170 +65 438 416 +301 + +chain 37617 19 59128983 + 8857108 8868240 chr19 58617616 + 8753920 8784099 3086 +38 946 948 +79 48 7504 +41 5519 17132 +26 257 237 +49 1534 1532 +48 1945 1943 +32 134 134 +36 373 373 +27 + +chain 25982 19 59128983 + 40406896 40407208 chr19 58617616 + 39884634 39884946 8202809 +220 28 28 +64 + +chain 25116 19 59128983 + 40411425 40411830 chr19 58617616 + 39889267 39889671 8751873 +65 130 129 +210 + +chain 24299 19 59128983 + 40388973 40392485 chr19 58617616 + 39882626 39886160 141687 +36 155 155 +77 1966 1988 +39 1113 1113 +126 + +chain 23133 19 59128983 + 40408128 40408684 chr19 58617616 + 39885865 39886421 2266282 +170 204 204 +3 41 41 +138 + +chain 20411 19 59128983 + 40404271 40404576 chr19 58617616 + 39881647 39881952 9660019 +26 95 95 +184 + +chain 16298 19 59128983 + 42307631 42307801 chr19 58617616 + 41807213 41807383 17262395 +170 + +chain 13452 19 59128983 + 40410789 40410930 chr19 58617616 + 39888945 39889086 21399695 +141 + +chain 12700 19 59128983 + 40406645 40406781 chr19 58617616 + 39884382 39884518 22789725 +136 + +chain 11896 19 59128983 + 8773116 8773240 chr19 58617616 + 8663415 8663539 22471178 +124 + +chain 11411 19 59128983 + 8856071 8858219 chr19 58617616 + 8767810 8776242 4593 +42 437 435 +7 8 6 +20 1586 7874 +48 + +chain 7467 19 59128983 + 40406298 40406376 chr19 58617616 + 39883676 39883754 35409306 +78 + +chain 5552 19 59128983 + 8773019 8773077 chr19 58617616 + 8663434 8663492 26525190 +58 + +chain 5448 19 59128983 + 40410565 40410622 chr19 58617616 + 39888721 39888778 41821265 +57 + +chain 3673 19 59128983 + 8773077 8773116 chr19 58617616 + 8663434 8663473 24499581 +39 + +chain 3337 19 59128983 + 20585282 20585322 chr19 58617616 - 28715674 28715714 444159 +40 + +chain 2176 19 59128983 + 40404218 40404271 chr19 58617616 + 39897845 39897898 1451550 +53 + +chain 2050 19 59128983 + 40407901 40407965 chr19 58617616 + 39885638 39885702 29393313 +64 + +chain 1567 19 59128983 + 40407653 40407710 chr19 58617616 + 39901639 39901696 16509591 +57 + +chain 1418 19 59128983 + 8850196 8850254 chr19 58617616 + 8739601 8739659 281801 +58 + +chain 784 19 59128983 + 8850150 8850182 chr2 242193529 - 85741764 85741796 4008251 +32 + +chain 8748871 GL000208.1 92689 + 0 92689 chr5_GL000208v1_random 92689 + 0 92689 790 +92689 + +chain 13548911 GL000209.1 159169 + 0 159169 chr19_GL000209v2_alt 177381 - 18212 177381 537 +20761 0 16180 +108228 16180 0 +14000 + +chain 228868 GL000209.1 159169 + 140619 144643 chr19_KI270932v1_alt 215732 - 189764 193789 762 +68 183 182 +320 67 67 +58 143 145 +66 169 171 +145 43 43 +73 21 21 +94 165 169 +147 65 65 +191 49 43 +104 226 227 +53 287 288 +77 56 56 +223 77 75 +121 79 79 +539 5 5 +110 + +chain 215065 GL000209.1 159169 + 131275 140490 chr19_KI270914v1_alt 205194 - 178797 189536 784 +182 1091 2579 +172 62 63 +66 597 597 +51 4306 4340 +148 43 43 +144 26 26 +71 207 208 +112 262 262 +58 64 64 +54 19 19 +141 112 112 +59 36 36 +62 86 86 +72 212 212 +109 76 76 +131 26 26 +64 57 57 +122 55 55 +60 + +chain 189841 GL000209.1 159169 + 134381 143789 chr19_GL000209v2_alt 177381 - 43065 52473 2552 +42 338 338 +44 78 78 +58 732 732 +253 1179 1179 +25 234 234 +62 138 138 +42 710 710 +125 112 112 +35 85 85 +116 116 116 +32 214 214 +63 206 206 +86 72 72 +212 406 406 +57 237 237 +62 256 256 +62 445 445 +143 66 66 +169 145 145 +43 188 188 +165 878 878 +215 385 385 +77 + +chain 130369 GL000209.1 159169 + 130140 141257 chr19_GL949753v2_alt 796479 + 479441 490771 2075 +1135 182 182 +307 1 1 +40 1 79 +205 1 1 +36 0 38 +50 11 11 +136 2 2 +21 1 1 +1 54 54 +82 1 1 +61 1 1 +79 172 172 +62 66 66 +597 51 51 +296 5 5 +113 55 55 +416 42 42 +338 44 44 +78 58 58 +732 253 253 +131 4 0 +294 12 12 +463 4 4 +271 25 25 +234 62 62 +138 42 42 +57 63 164 +76 148 148 +43 144 144 +26 71 71 +82 272 272 +85 116 116 +26 58 58 +32 309 309 +49 59 59 +36 542 543 +73 133 133 +26 243 243 +55 122 122 +66 69 69 +34 13 13 +74 382 381 +28 5 5 +34 + +chain 113047 GL000209.1 159169 + 132270 144826 chr19_KI270884v1_alt 157053 - 122908 135498 763 +54 1586 1611 +55 9468 9479 +56 421 419 +79 676 676 +161 + +chain 63192 GL000209.1 159169 + 129026 130140 chr19_KI270923v1_alt 189352 + 125395 126509 765 +1114 + +chain 29072 GL000209.1 159169 + 144826 145169 chr19_KI270890v1_alt 184499 - 163085 163428 540 +343 + +chain 8849 GL000209.1 159169 + 142381 142840 chr19_KI270932v1_alt 215732 - 127236 127695 1354 +65 191 191 +15 10 10 +24 104 104 +50 + +chain 8269 GL000209.1 159169 + 142840 143016 chr19_KI270886v1_alt 204239 - 127438 127615 1722 +24 1 2 +151 + +chain 7785 GL000209.1 159169 + 143069 143356 chr19_GL949746v1_alt 987716 + 687294 687581 1329 +43 215 215 +29 + +chain 2906 GL000209.1 159169 + 128989 129026 chr19_KI270882v1_alt 248807 - 221270 221307 573 +37 + +chain 907 GL000209.1 159169 + 137671 137726 chr19_KI270921v1_alt 282224 + 59688 59743 2086 +55 + +chain 9974409 GL000191.1 106433 + 0 106433 chr1 248956422 + 23930147 24036733 706 +232 14 7 +1711 2 0 +186 4 0 +1396 1 1 +45 2 2 +2058 0 49 +668 0 1 +1321 0 2 +17 4 4 +966 0 3 +2621 0 2 +1244 5 2 +856 0 1 +4261 9 0 +855 0 1 +1953 0 4 +966 1 1 +21 1 1 +72 4 0 +1333 0 4 +1163 16 0 +180 0 1 +1162 0 2 +625 1 1 +23 1 1 +51 7 6 +339 0 1 +918 8 0 +194 0 1 +3608 0 3 +620 1 1 +27 1 1 +1459 0 6 +2932 1 1 +23 1 1 +1596 0 1 +567 4 0 +1835 4 0 +2064 5 4 +327 1 0 +70 1 1 +2365 1 1 +35 1 1 +980 0 2 +1658 1 0 +1186 1 0 +207 14 30 +511 0 1 +1684 0 1 +1491 0 1 +832 11 11 +108 0 3 +6299 12 0 +527 0 1 +633 0 1 +713 1 0 +595 0 1 +764 1 1 +82 1 1 +81 1 1 +23 1 0 +1 0 147 +598 0 1 +317 1 1 +19 1 1 +1769 5 0 +663 0 1 +1198 12 12 +152 1 0 +71 7 0 +26 1 1 +6245 6 6 +1589 1 1 +55 1 1 +1039 4 5 +415 0 1 +52 1 1 +860 11 11 +100 5 8 +449 1 1 +19 1 1 +53 1 1 +47 1 1 +347 1 1 +32 1 1 +137 3 0 +868 139 27 +51 0 10 +232 0 1 +1034 1 0 +3115 1 0 +205 14 103 +712 0 1 +20 1 1 +1916 1 1 +39 1 1 +1666 0 1 +455 1 1 +35 1 1 +453 1 1 +21 1 1 +3798 0 1 +272 1 1 +96 1 1 +42 0 1 +667 0 3 +1410 0 1 +2052 3 0 +1099 1 1 +39 1 1 +683 0 2 +483 9 9 +308 1 0 +1436 10 0 +356 1 1 +22 1 1 +585 0 1 +936 0 1 +830 0 2 +503 + +chain 51627479 GL000192.1 547496 + 0 547496 chr1 248956422 - 102001710 102548909 150 +299 4 0 +1270 0 3 +5387 1 1 +38 1 1 +1175 0 3 +1513 1 41 +3105 1 0 +98 2 0 +1207 0 1 +573 0 1 +2345 13 4 +979 1 0 +655 0 10 +424 2 1 +479 1 1 +20 1 1 +140 0 2 +468 2 0 +1239 1 1 +56 1 1 +609 0 1 +10999 0 19 +1799 0 3 +2570 1 0 +3520 1 1 +33 1 1 +227 26 26 +2171 13 8 +3388 13 14 +1399 0 1 +6995 0 1 +977 1 1 +10 0 8 +48 1 0 +4 0 1 +2 11 0 +59 2 0 +16 0 2 +26 0 1 +20 1 1 +1025 0 3 +205 8 10 +1001 1 1 +37 1 1 +5319 4 6 +1653 0 1 +204 0 2 +3027 1 1 +46 1 1 +1307 0 1 +411 20 19 +17798 0 1 +1791 0 2 +903 0 1 +4689 0 1 +2154 0 1 +4920 5 0 +457 0 15 +8329 0 8 +7523 1 0 +985 17 19 +196 1 1 +182 0 3 +2198 1 1 +47 1 1 +830 0 10 +156 20 20 +8633 0 4 +3123 1 1 +19 5 4 +2083 0 2 +1740 0 1 +429 0 16 +662 0 1 +149 1 1 +69 1 1 +178 8 0 +764 0 1 +348 0 4 +2796 0 4 +4050 1 0 +6989 1 1 +23 1 1 +6063 1 0 +212 1 1 +16 1 1 +627 7 6 +158 0 1 +1500 0 1 +24 2 2 +490 1 1 +64 1 1 +1735 13 13 +756 26 0 +1371 1 1 +33 1 1 +1301 1 1 +47 0 9 +650 1 0 +158 0 1 +587 12 11 +1252 1 0 +469 0 1 +3335 0 3 +556 12 12 +3780 0 1 +4989 418 0 +6746 0 1 +4867 1 1 +22 1 1 +1506 0 3 +902 1 1 +24 1 1 +4328 0 1 +1622 5 5 +11476 18 0 +4410 0 2 +5469 1 1 +34 0 14 +4668 1 1 +19 1 1 +4180 4 0 +850 1 0 +4 2 0 +34 0 5 +1178 0 1 +938 1 1 +59 1 1 +6389 0 1 +773 1 0 +345 1 0 +4456 0 5 +4573 1 0 +4345 1 0 +1573 16 16 +658 2 0 +66 1 1 +113 1 0 +812 0 6 +364 1 1 +15 1 1 +412 1 0 +10311 1 0 +72724 0 2 +33711 0 10 +1211 0 1 +21795 1 0 +3081 0 2 +2829 0 2 +9716 15 14 +35 1 0 +1053 1 0 +1543 1 0 +11403 1 0 +13868 4 0 +1144 2 0 +3396 1 0 +10849 10 2 +6053 3 2 +270 0 5 +1105 2 0 +2400 27 29 +9556 3 0 +1777 0 1 +5471 1 0 +14185 0 1 +21912 0 1 +16631 0 2 +4430 + +chain 18946 GL000192.1 547496 + 186298 186626 chr3 198295559 + 41779669 41779997 1157719 +124 44 44 +160 + +chain 6673 GL000192.1 547496 + 167666 186298 chr16 90338345 + 70928427 70949142 201 +26 18557 20640 +49 + +chain 3086 GL000192.1 547496 + 186422 186466 chr20 64444167 - 51642947 51642991 1177773 +44 + +chain 22495713365 2 243199373 + 10000 243102476 chr2 242193529 + 10000 242160331 1 +765832 7 7 +275 5 8 +307 1 1 +97 1 1 +4948 7 0 +4750 6 0 +5951 1 1 +24 1 1 +953 4 0 +2498 0 2 +965 0 1 +571 1 3 +1152 9 9 +1430 11 12 +601 5 5 +2617 1 1 +28 1 1 +4515 1 1 +48 1 1 +229 3 0 +1477 11 4154 +628 6 1 +3590 8 8 +975 5 5 +44 1 1 +198 0 1 +1358 66 0 +353 50 17 +728 1 1 +24 1 1 +871 1 1 +44 1 1 +43 0 4 +1963 11 10 +549 1 0 +2251 2 0 +128 1 1 +32 1 1 +4840 0 2 +2615 1 1 +28 1 1 +293 1 1 +25 1 1 +541 0 21 +39 5 5 +223 1 1 +30 1 1 +219 14 14 +1407 12 20 +180 0 1 +627 13 13 +257 1 1 +17 1 1 +764 1 1 +48 1 1 +723 0 2 +367 1 1 +34 0 1 +60 5 0 +422 1 1 +19 1 1 +1150 1 1 +51 1 0 +2719 1 1 +34 1 1 +1395 1 1 +21 61 1 +427 1 91 +114 90 0 +30 30 0 +34 1 1 +203 3 3 +41 1 1 +428 1 1 +47 1 1 +1235 1 1 +44 1 49 +72 2 238 +144 10 9 +33 26 27 +21 15 14 +167 2 49 +21 0 47 +134 48 0 +728 0 2 +110 1 1 +24 0 22 +308 1 1 +54 1 1 +993 12 12 +1651 2 0 +43 2 0 +640 9 9 +328 14 14 +127 11 9 +161 1 1 +42 1 1 +231 20 20 +88 16 16 +284 1 1 +44 1 1 +455 1 1 +38 1 1 +216 1 1 +32 1 1 +89 1 1 +42 1 1 +340 1 1 +34 1 1 +2781 1 0 +361160 468 284 +25 15 1 +24 0 16 +19 1 13 +26 0 2 +18 44 0 +19 59 7 +42 1 51 +62 230 0 +16 2 0 +6 162 0 +44 66 0 +339 2026 0 +173 630 0 +254 2590 0 +280 2164 0 +6151 2 0 +1910465 0 1 +385760 50000 6181 +509236 1 0 +90398 0 1 +839841 100000 7457 +465493 0 1 +1288118 0 1 +1270620 0 1 +923995 0 1 +1045150 0 1 +38050 0 1 +150339 0 1 +2824924 0 1 +1208402 0 1 +1696128 0 1 +30164 0 1 +219553 50000 8854 +537675 2 3 +1268144 0 1 +978458 18 18 +2035 3 0 +2198 0 12 +2314 4 0 +2822 1 0 +3408 16 0 +75 1 1 +1369 0 6 +929 1 0 +27 1 1 +1378 1 0 +2530 3 0 +670 1 0 +18053 0 2 +3870 1 1 +31 1 1 +480 1 0 +4540 1 0 +8639 1 0 +1873 0 4 +2266 0 1 +3081 0 1 +17273 42 42 +1308 0 18 +186 28 25 +4988 1 1 +38 1 1 +2679 1 1 +93 1 1 +957 18508 6 +388 1 1 +26 1 1 +1209 0 4 +135 0 1 +352 5 5 +4356 0 1 +5354 1 1 +28 1 1 +5812 1 0 +3623 1 0 +9278 2 0 +554 3 0 +1434884 0 1 +464348 25000 1888 +2086951 0 1 +414096 0 1 +708018 0 1 +2055725 0 1 +1092408 0 1 +1320607 0 1 +2869244 2259 55 +253 9 9 +78197 0 1 +2939 1 1 +41 1 1 +759275 0 1 +140897 0 1 +2562353 0 1 +885780 1 1 +38 1 1 +3126 1 1 +81 0 4 +1908 2 0 +36 1 1 +93 3 0 +18 1 1 +848 1 1 +22 1 1 +1303 17 19 +408 1 1 +46 1 1 +651 1 1 +45 1 1 +1790 1 0 +636 0 1 +3208 15 16 +2797 8 8 +3541 1 0 +80 13 13 +942 1 1 +37 1 1 +2069 0 1 +72 7 0 +13 6 0 +30 6 0 +17 0 18 +189 59 0 +24 1 30 +57 1 3 +86 0 1 +46 39 0 +582 0 34 +338 3 0 +350 3 0 +882 2 0 +1253 1 0 +968 0 1 +2712 0 3 +265 0 1 +1096 0 2 +50 1 1 +28 1 1 +2941 0 1 +2570 0 1 +4105 16 0 +748 0 14 +4296 0 1 +2388 1 1 +44 1 1 +1215 1 1 +45 1 1 +1696 0 1 +883 0 3 +2861 0 10 +1628 0 1 +399 1 1 +35 1 1 +916 2067 0 +7056 0 10 +1567 1 0 +5748 2 0 +8 1 1 +949 13 13 +2068662 0 1 +800015 0 1 +692600 0 1 +3443031 0 1 +38804 0 1 +54517 1 0 +6288581 0 1 +4160517 0 1 +1406214 0 1 +657319 0 1 +7807266 0 1 +2686507 0 1 +26849 0 1 +4683480 0 1 +14115 0 1 +1278764 0 1 +957766 0 1 +375537 1 0 +118 1 0 +207 0 3 +1657852 0 1 +5080164 0 1 +734796 0 1 +4023764 0 1 +2485033 72396 0 +1022519 0 1 +280495 0 1 +70812 0 3 +21017 0 1 +30681 1 1 +41 1 1 +4133 0 1 +2136 4 4 +8754 4 0 +57330 2 0 +25199 1 0 +40114 0 21 +4668 0 1 +51457 0 1 +17283 10 10 +26094 0 2 +2327 0 1 +5543 0 2 +20183 0 7 +3985 0 1 +25440 1 0 +40931 4 0 +14294 0 3 +9161 0 4 +24036 2 0 +12652 1 0 +833 2 0 +12524 1 0 +13 31 0 +20 107 9 +615 0 2 +162 82 0 +70 61 0 +7793 1 1 +17 5 5 +539 1 0 +5479 0 1 +37247 1 0 +9573 1 1 +47 1 1 +610 0 1 +4052 200000 456954 +897 0 1 +646 1347 0 +1535 0 4805 +1897 0 537 +1350 3 0 +209528 1 1 +21 1 1 +23068 1 0 +1862 13 1 +73 9 0 +13572 13 0 +4177 1 0 +9849 0 4 +44289 11 0 +2323 6 0 +2469 1 1 +22 1 1 +1422 0 2 +809 1 0 +7890 1 1 +39 0 6 +5408 1 1 +17 0 1 +6292 0 1 +3639 1 0 +6616 3 0 +6035 0 3 +3067 1 1 +62 1 1 +150 12 12 +89 4 4 +227 1 1 +42 1 1 +445 4 4 +590 7 7 +372 13 13 +145 9 10 +578 1 1 +11 1 1 +309 1 1 +31 1 1 +789 1 1 +61 1 1 +296 12 12 +186 1 1 +46 1 1 +268 1 1 +79 1 1 +521 15 15 +212 1 1 +24 6 0 +502 1 1 +48 1 1 +425 1 1 +70 1 1 +476 14 14 +240 12 12 +139 0 1 +63 1 1 +267 1 1 +95 1 0 +74 1 1 +66 11 12 +929 1 1 +48 1 1 +213 10 10 +258 0 13 +387 1 1 +52 1 1 +415 0 1 +70 1 1 +248 2 0 +798 0 1 +1147 1 1 +37 1 1 +654 1 1 +65 1 1 +272 1 1 +144 1 1 +55 8 0 +76 1 1 +43 1 1 +580 8 8 +115 1 1 +57 1 1 +78 1 1 +23 1 1 +188 1 1 +49 1 1 +88 1 1 +16 1 0 +29 1 1 +76 1 1 +61 1 1 +244 1 1 +96 1 1 +66 5 0 +124 1 0 +2763 0 16 +17998 21 9 +156 0 1 +3340 1 0 +1853 16 16 +190 12 0 +7556 1 0 +2198 1 0 +18 1 1 +3148 0 1 +6802 1 1 +49 1 1 +20434 1 0 +11533 0 1 +4129 0 5 +17686 0 1 +9008 0 1 +5944 71050 1138878 +61 12 12 +124 53 53 +58 34 34 +194 84 84 +61 90 90 +105 244 267 +81 88 88 +58 157 131 +68 21 21 +110 43 43 +115 148 113 +82 126 127 +77 79 79 +130 71 71 +261 17 17 +323 44 44 +55 38 39 +297 49 48 +1158 49 49 +1307 10 10 +395 1 1 +94 1 1 +1089 3 1 +59 1 1 +56 8 8 +2907 1221498 10 +249 1 1 +26 1 1 +2572 12 12 +338 1 1 +28 1 1 +574 39 39 +992 0 1 +84 34 34 +84 24 25 +210 28 28 +981 1 11 +225 38 38 +1320 1 1 +24 1 1 +76 1 1 +32 1 1 +408 0 2 +1385 1 1 +57 1 1 +89 0 1 +98 1 1 +44 1 1 +213 18 18 +134 1 1 +47 1 0 +54 1 1 +66 4 5 +655 0 1 +234 1 1 +48 1 1 +646 0 2 +390 1 0 +1352 6 6 +82 49 55 +59 0 5 +196 0 148 +5437 1 1 +54 1 1 +1081 0 2 +221 1 1 +21 1 1 +203 0 3 +24 1 1 +1058 0 1 +1453 0 2 +922 31 31 +2642 2 0 +3222 1 1 +21 1 1 +471 1 1 +29 1 1 +984 1 1 +31 0 1 +851 1 1 +37 1 1 +1818 0 1 +32 1 1 +333 1 1 +64 1 1 +941 1 1 +83 1 2 +63 1 1 +51 1 1 +1496 2 0 +363 3 0 +3554 1 1 +36 0 3 +248 0 1 +1562 1 1 +32 1 1 +471 4 0 +238 1 1 +46 1 1 +197 87 138 +87 0 1 +79 13 5 +22 17 0 +53 1 1 +36 0 1 +387 0 3 +303 41 0 +68 16 0 +4 7 0 +158 16 0 +36 0 186 +21 0 21 +18 20 25 +25 5 73 +148 0 63 +27 1 1 +173 26 4 +86 1 1 +136 1 0 +181 0 1 +1450 1 1 +48 1 1 +647 8 0 +1008 1 1 +33 1 1 +2603 1 1 +27 1 1 +2099 5591 15 +217 1 1 +54 1 1 +119 1 1 +62 1 1 +1463 1 1 +29 1 1 +354 4 0 +1150 2 0 +87 117 117 +101 1 0 +379 37 37 +339 43 43 +172 23 23 +461 25 25 +893 44 46 +1611 1 0 +524 54 54 +87 7 0 +322 1 0 +177 39 39 +113 0 6 +699 2 3 +216 46 46 +61 0 2 +175 436 513 +50 196 88 +71 49 50 +62 55 104 +76 702 117 +64 1131 1821 +57 17 17 +92 29 31 +167 25 26 +79 53 53 +102 437 130 +126 0 1 +200 4945 406 +113 30 31 +141 76 76 +194 186 186 +83 33 33 +88 30 36 +130 79 78 +139 336 217 +85 74 22631 +90 230 1278 +83 333 330 +15 0 52 +289 63 66 +221 6 6 +124 93 93 +1260 0 2 +236 18 16 +57 0 5 +165 42 43 +152 26 28 +257 15 21 +298 8 8 +153 47 47 +135 14 14 +215 68 68 +323 50 50 +766 21 21 +971 1 1 +24 1 1 +727 0 1 +74 7 7 +128 4 0 +454 5 10 +542 1 1 +45 5 5 +184 1 1 +33 1 1 +1477 158 0 +1437 1 22 +1529 46 48 +991 4 0 +270 0 10 +183 28 31 +80 12 12 +800 46 46 +762 19 19 +263 36 36 +905 0 76 +210 35 1 +836 48 48 +1102 2 0 +647 1 6 +54 1 2 +72 1 1 +66 1 1 +354 10 10 +59 1 1 +73 1 4 +32 1 1 +373 9 9 +184 4 0 +42 1 1 +1347 1 1 +55 1 1 +57 1 1 +75 1 1 +1814 26 26 +317 7 6 +610 26 22 +755 58 57 +897 19 19 +636 349 27 +827 1 1 +47 1 1 +936 1 1 +21 5 0 +113 3 0 +30 5 0 +361 3 0 +181 5 0 +414 0 5 +187 3 0 +373 5 0 +412 5 0 +83 5 0 +8 0 2 +46 2 0 +320 1 1 +95 1 1 +52 8 0 +285 1 1 +195 1 1 +480 0 1 +300 45 0 +65 0 1 +539 12 12 +202 1 1 +40 1 1 +521 11 11 +261 1 1 +20 1 1 +793 1 1 +33 1 1 +389 15 15 +695 1 1 +49 1 1 +86 1 1 +40 1 1 +133 0 1 +90 1 1 +1333 1 1 +56 5 5 +718 1 1 +29 1 1 +312 3 3 +16 1 1 +789 0 1 +818 9 11 +485 1 45 +31 8 0 +33 0 8 +54 19 1 +88 37 0 +83 8720 14 +25 1 1 +276 0 1 +431 1 1 +36 1 1 +822 10 10 +144 1 1 +35 5 5 +513 1 1 +31 4 4 +458 0 1 +41 1 1 +1289 1 0 +154 1 1 +34 1 1 +837 13 1 +167 10 10 +76 0 1 +31 1 1 +219 8 19 +1285 0 2 +48 1 1 +2045 18 18 +700 1 1 +28 1 1 +1060 2 0 +1385 3 2 +1024 12 26 +855 22 14 +834 1 1 +57 7 7 +84 0 8 +77 0 4 +349 1 1 +87 1 1 +312 1 1 +34 1 1 +233 17 17 +1010 35 35 +70 1 1 +33 1 1 +83 1 1 +51 1 1 +304 1 1 +38 1 0 +183 9 0 +255 0 2 +331 0 1 +243 1 1 +90 0 11 +46 0 10 +2274 0 4 +1946 1 1 +62 1 1 +1004 2 0 +123 0 4 +43 1 1 +470 1 1 +63 1 1 +422 1 1 +32 1 1 +288 5 0 +41 1 1 +2198 1 1 +16 1 0 +412 0 2 +507 12 12 +537422 3000000 2522301 +26497 1 0 +8577 1 0 +2614 0 2 +796 0 4 +3071 0 1 +4988 2 1 +11629 49 17 +4423 0 8 +458221 3 0 +933943 0 9 +43002 0 1 +251795 0 1 +875908 4 4 +61 1 1 +869 13 0 +2827 4 0 +2818 0 2 +156 88 1 +100 0 634 +4753 0 8 +4903 6 6 +3847 0 2 +2815 1 0 +735 0 1 +127 0 1 +85 1 1 +3571 1 1 +16 1 1 +12456 0 1 +20816 0 1 +445 12468 12468 +435 1 0 +20817 1 0 +12465 18 18 +3571 1 1 +85 1 0 +114 1 0 +746 0 1 +2786 2 0 +3878 6 6 +4875 8 0 +4780 25 0 +101 465 88 +155 2 0 +2791 0 3 +2845 0 13 +880 1 1 +61 4 4 +1597 1 1 +45 1 1 +1711 37 51 +3094 0 1 +402 1 1 +47 1 1 +63 2 0 +583 1 1 +34 1 1 +5676 1 1 +33 1 1 +3263 0 46 +379 1 1 +70 1 1 +339 1 0 +167 1032 50000 +935 0 102 +1756 0 1 +8426 0 1 +1904375 0 1 +2640706 0 1 +17448 0 1 +409457 0 1 +422865 0 1 +2256788 0 1 +667584 0 1 +3672812 142000 879 +5669090 0 1 +5644302 0 1 +74714 1 0 +2884980 1 0 +2874120 0 1 +901005 0 1 +108571 0 1 +1359139 0 1 +4118289 0 1 +273252 0 1 +1169562 0 1 +4946277 0 1 +4350517 0 1 +47616 0 1 +1282874 1 0 +2492066 1 0 +1242867 100000 1055 +4545151 0 1 +830682 0 1 +4818329 0 1 +2380494 0 1 +10426787 2 0 +2510 8 0 +1014 5 5 +3210 5 5 +24 1 1 +788 1 2 +336 2 0 +316 0 2 +1770 1 0 +4175 0 1 +1998 0 1 +1953 3 0 +880 1 1 +134 1 1 +1536 1 0 +356 9 5 +175 5 5 +4857 0 4 +3256 0 1 +5659 0 12 +2892 2 0 +792 18 18 +892 1 0 +966 8427 0 +1471 0 30 +1010 4 0 +2294 2 1 +6701 1 0 +161 0 1 +2534 0 4 +1846 1 0 +4120 16 20 +5785 1 0 +4140 0 2 +925 0 1 +1597 1 0 +1735 1 0 +3377 0 2 +2476 7 3 +964 1 5 +831 1 1 +21 0 1 +5730 1 0 +892 4 0 +3793 0 6 +7640 1 1 +32 1 1 +69 1 1 +27 1 0 +946 1 0 +29 2 0 +130 1 1 +40 3 0 +2210 0 1 +1088 2 0 +13 1 1 +628 1 0 +52 0 1 +268 8 0 +392 1 1 +37 6 234 +58 76 10 +15 4 0 +4 4 0 +26 0 8 +11 9 1 +18 0 6 +11 13 5 +13 0 6 +12 13 5 +14 0 6 +12 46 0 +46 3 37 +24 1 3 +27 0 2 +15 1 3 +44 0 28 +23 1 1 +81 3 3 +42 1 1 +83 20 29 +1280 0 4 +5756075 0 1 +5034835 1 0 +891922 0 1 +5073327 0 1 +4444510 0 1 +339564 0 1 +5411926 0 1 +6091920 1 0 +3271657 1 0 +260111 0 1 +2528180 1 0 +1175837 0 1 +2734328 0 1 +616312 1 1 +46 1 1 +4454 1 1 +40 1 1 +3185801 0 1 +934203 0 1 +835513 0 1 +1281355 0 1 +904639 0 1 +792700 0 1 +1711816 0 1 +4879521 0 1 +848760 0 1 +147361 0 1 +118168 0 1 +41510 0 1 +314354 0 1 +1463852 50000 6064 +753345 0 1 +37252 0 1 +2229260 0 1 +1707535 0 1 +150029 0 1 +870816 30000 16945 +373703 0 1 +113655 0 1 +464796 25000 7277 +1195087 0 1 +2423 0 1 +737883 142 0 +109 82 0 +70 38 0 +57 468 1 +49 39 0 +49 39 0 +35 116 0 +83 3 0 +13 116 1 +38 79 1 +54 42 0 +19 39 1 +49 154 0 +46 0 294 +77 43 0 +35 8 0 +38 3 0 +15 23 24 +16 0 40 +129 116 1 +30 1 1 +50 0 35 +82 3 0 +24 197 0 +56 11 47 +59 278 0 +60 38 0 +36 1 1 +60 0 70 +35 0 39 +53 1 1 +34 0 1 +101 0 78 +106 155 0 +42 1 1 +47 0 4 +53 47 8 +99 0 121 +49 39 0 +21 38 0 +39 39 0 +42 40 1 +45 12 0 +2510 9 9 +380 15 15 +1491 43 0 +1335 59 0 +1599 129 0 +2034 1 1 +41 1 1 +66 1 1 +47 1 1 +337 1 1 +19 1 1 +166 2 0 +308 1 1 +26 1 1 +779 0 57 +155 1 1 +32 58 1 +55 3 3 +19 116 0 +223 58 1 +23 171 0 +240 513 0 +1644 17 17 +1579 0 62 +34 1 9 +52 3 0 +51 40 0 +43 0 2 +52 3 0 +146 20 0 +1104 7 8 +3169 0 1 +6437 1 1 +35 1 1 +710 0 25 +38909 0 1 +283597 1 1 +94 6 11 +50 1 1 +155 1 1 +62 8 9 +202 7 7 +355 1 1 +69 1 1 +137 16 15 +677 1 1 +36 1 1 +59 1 1 +84 1 1 +161 1 0 +67 1 1 +22 1 0 +8 0 3 +118 1 1 +66 1 1 +17 1 1 +80 + +chain 7395201 2 243199373 + 90371525 90545103 chr2 242193529 - 151791018 151965425 327 +21050 197 197 +53 58 58 +34 194 194 +84 61 61 +90 105 105 +244 81 81 +88 58 58 +157 199 199 +43 115 115 +148 82 82 +126 77 77 +79 130 130 +71 601 601 +44 55 55 +38 297 297 +49 1158 1158 +49 5931 5931 +72048 54 54 +205 64 64 +147 119 119 +57 71 71 +27 100 100 +1265 496 496 +31 238 238 +61 162 162 +77 255 255 +261 95 95 +264 204 204 +53 136 136 +81 173 173 +62 130 130 +77 241 241 +35 424 424 +45 625 625 +31 564 564 +146 49 49 +956 32 32 +163 37 37 +619 151 151 +973 346 346 +26 124 124 +56 14 14 +65 2295 2295 +40 1593 1593 +26 235 235 +54 1069 1069 +91 295 295 +35 1051 1051 +112 56 56 +26 2212 2212 +181 494 494 +42 9486 9486 +25 5540 5541 +31 2095 2095 +36 543 543 +39 82 82 +43 235 235 +38 1618 1618 +36 256 256 +31 146 146 +38 92 92 +82 304 1131 +34 189 189 +50 234 234 +100 384 384 +74 62 62 +37 258 258 +30 114 114 +47 494 494 +96 323 323 +42 268 268 +250 1332 1332 +237 255 255 +48 379 379 +29 173 173 +50 227 227 +147 1455 1455 +41 313 313 +77 219 219 +52 479 479 +28 99 99 +43 229 229 +27 156 156 +107 1709 1709 +173 54 54 +70 58 58 +86 285 285 +48 838 838 +75 214 214 +42 1810 1810 +36 423 423 +35 9943 9944 +49 839 839 +49 275 275 +120 108 108 +75 50 50 +1542 + +chain 3266737 2 243199373 + 91595103 91753108 chr2_KI270894v1_alt 214158 - 2090 164867 517 +29766 3803 3803 +39 1076 1077 +34 318 318 +28 1207 1207 +38 18279 17997 +31 21815 21664 +26 18446 18428 +43 656 656 +25 893 894 +44 2784 2783 +39 1859 4069 +106 217 2948 +49 76 76 +66 448 0 +51 1498 1840 +29 167 167 +25 79 79 +31 2 2 +20 102 102 +21 1 0 +274 1 0 +140 326 325 +48 1 1 +29 8 0 +499 0 1 +758 9 0 +445 1 0 +217 0 3 +50 1 1 +61 1 1 +647 1 1 +24 1 1 +194 0 1 +450 2 0 +1158 8 0 +332 114 113 +29 141 141 +76 194 196 +186 83 83 +33 88 88 +30 130 130 +75 0 1 +4 139 139 +54 23 24 +138 0 1 +36 2 2 +83 85 85 +19 1 220 +14 0 34 +39 91 100 +9 26 363 +84 8 0 +10 9 0 +14 154 399 +25 258 212 +49 305 305 +27 0 3 +34 352 352 +34 13689 13692 +28 1982 1982 +36 27223 26847 +69 54 54 +48 286 286 +32 243 243 +43 10 10 +55 319 317 +26 601 601 +33 + +chain 3060275 2 243199373 + 243152476 243189373 chr2 242193529 - 10000 46781 1579 +26765 3 16 +156 23 20 +65 82 0 +4 26 0 +129 1 0 +373 1 1 +18 1 1 +194 1 1 +10 1 1 +98 1 1 +59 1 1 +116 4016 4000 +51 14 14 +225 1 0 +134 1 1 +160 1 1 +46 1 1 +396 25 25 +136 1 1 +44 2 0 +93 4 4 +81 2 0 +162 0 5 +61 1 0 +60 1 1 +31 4 4 +140 17 17 +2858 + +chain 1222507 2 243199373 + 91679897 91777075 chr1 248956422 - 104082337 104169381 306 +8 1 1 +81 1 1 +29 1 1 +556 1 1 +44 14 0 +148 1 1 +36 1 1 +78 1 1 +31 1 1 +155 4 1 +1081 4 4 +366 0 1 +598 1 1 +42 1 1 +178 1 1 +83 7 0 +486 14 14 +442 1 1 +124 1 0 +20 1 1 +128 1 0 +46 1 0 +205 17 17 +189 4 4 +214 1 1 +142 3547 3526 +24 9 0 +28 0 2 +55 482 479 +37 4136 4136 +53 16464 4180 +23 731 731 +47 364 349 +18 1 1 +49 336 280 +37 5472 5811 +59 1 1 +54 1 1 +43 2967 3312 +46 11972 11931 +25 1715 1709 +58 7723 8612 +45 8821 9530 +32 83 83 +243 171 172 +286 32 32 +243 121 123 +306 26 26 +94 13 13 +100 10 10 +384 33 33 +120 1 1 +27 1 1 +678 1 1 +29 4 3 +43 1 1 +560 1 1 +16 1 1 +211 0 2 +917 1 1 +29 1 1 +417 1 1 +109 3 3 +330 1 1 +39 1 1 +154 1 1 +34 1 1 +142 1 1 +51 1 1 +69 1 1 +29 1 1 +124 4 4 +99 1 1 +117 1 1 +44 5 5 +160 4 4 +42 1 1 +95 1 1 +139 7 0 +85 1 1 +23 1 0 +31 4 4 +448 10 10 +69 1 1 +32 1 1 +61 1 1 +39 1 1 +339 1 1 +19 1 1 +336 1 1 +22 3 3 +199 1 1 +51 1 1 +4 17275 17322 +34 + +chain 1031184 2 243199373 + 89564856 90543561 chr2 242193529 - 152276108 154860150 183 +15 1 1 +27 27 1 +12 70 70 +61 910350 2510741 +54 205 14 +64 147 86 +119 57 8 +71 27 96 +100 1265 73 +307 7 9 +182 31 30 +128 15 15 +95 61 59 +92 20 296 +50 77 75 +255 261 3338 +95 264 262 +204 53 55 +136 81 81 +173 62 57 +130 77 76 +241 35 35 +424 45 199 +109 0 434 +68 0 59 +215 1 1 +47 1 1 +109 0 180 +10 4 0 +21 7 104 +33 31 37 +62 17 17 +114 1 1 +50 0 9 +117 9 0 +63 1 1 +92 1 1 +37 146 0 +49 956 0 +32 163 4 +37 619 0 +42 1 1 +108 973 20 +91 1 18 +215 19 19 +20 26 0 +124 56 0 +14 65 0 +65 1 1 +465 1 1 +45 1 0 +126 1 1 +46 1 1 +1501 1 1 +41 40 0 +58 2 5 +574 8 0 +830 0 5 +121 26 31 +52 0 2 +183 54 0 +1069 91 87 +62 0 3 +233 35 34 +1051 112 112 +56 26 26 +59 7 7 +588 17 18 +401 18 18 +472 1 0 +398 2 3 +249 181 22 +397 0 158 +97 42 42 +1302 24 2 +162 9 9 +740 2 2 +37 1 1 +554 0 1 +1332 4 0 +48 1 1 +249 12 12 +372 1 1 +34 1 1 +987 1 0 +221 10 8 +394 9 9 +169 1 1 +33 0 2 +170 1 1 +27 1 1 +61 1 0 +396 0 120 +152 1 13 +60 0 5 +12 1 1 +145 1 1 +51 1 1 +847 6 6 +420 1 1 +46 1 0 +43 1 1 +145 1 1 +41 1 1 +142 25 24 +332 14 14 +310 1 1 +91 1 1 +605 1 1 +47 1 1 +361 10 10 +183 0 5 +672 8 8 +76 17 20 +227 1 1 +86 1 1 +60 1 0 +30 5 5 +2399 31 31 +547 10 17 +195 3 0 +609 3 0 +511 8 8 +209 36 37 +543 39 39 +82 43 43 +235 38 38 +760 20 20 +502 8 0 +108 7 18 +66 2 0 +57 0 3 +88 36 36 +77 0 15 +94 24 24 +61 31 1532 +146 38 41 +92 82 77 +151 0 2606 +94 93 1000 +189 50 50 +234 100 94 +146 14 14 +224 74 74 +62 37 17 +258 30 30 +114 47 47 +494 96 98 +323 42 43 +106 20 20 +142 250 250 +161 7 7 +651 21 21 +492 237 249 +144 23 23 +88 48 48 +52 15 15 +201 6 0 +105 29 29 +68 18 18 +87 50 50 +227 147 147 +176 17 17 +404 9 9 +457 0 23 +392 41 41 +196 18 18 +99 77 80 +219 52 53 +156 0 7 +323 28 28 +99 43 42 +229 27 27 +156 107 103 +95 1 0 +1118 0 1 +314 9 9 +172 173 199 +54 70 140 +58 86 86 +285 48 48 +320 15 15 +326 7 7 +170 75 75 +214 42 42 +613 1 0 +772 0 2 +424 36 36 +423 35 35 +1157 1 1 +43 2 2 +82 1 1 +21 1 1 +65 1 1 +62 1 1 +250 1 1 +79 1 1 +88 2 2 +79 1 1 +68 11 11 +115 1 1 +38 1 1 +63 9 0 +39 1 1 +73 1 1 +77 3 3 +55 1 1 +46 1 1 +157 1 1 +58 0 2 +92 1 1 +67 1 1 +48 1 1 +289 1 1 +40 1 0 +398 1 1 +31 1 1 +729 1 1 +72 1 1 +575 1 1 +86 1 1 +495 3 0 +472 1 1 +34 1 1 +87 1 0 +28 1 1 +441 20 0 +31 1 1 +61 1 1 +152 5 5 +774 0 1 +114 2 0 +355 0 3 +415 5 0 +76 1 1 +18 1 1 +308 1 1 +18 1 1 +226 4 4 +490 0 3 +104 49 49 +542 6 6 +131 8 0 +152 49 1 +68 9 9 +198 120 130 +108 75 75 +50 + +chain 864961 2 243199373 + 19212422 19221692 chr2 242193529 + 19012647 19021932 4447 +40 1 1 +1308 0 18 +186 28 25 +4988 40 40 +2679 + +chain 380362 2 243199373 + 1217129 1226934 chr2_KI270773v1_alt 70887 + 16508 20325 931 +120 2 0 +332 153 119 +33 19 13 +55 1 1 +3 263 89 +17 0 426 +55 32 18 +7 0 2 +34 0 4 +11 101 1 +1 44 44 +12 5 31 +6 4 0 +33 5 49 +1 3422 626 +164 494 4 +112 70 0 +560 1470 210 +70 700 0 +115 70 0 +25 140 0 +163 368 18 +69 70 0 +9 210 0 +155 + +chain 344252 2 243199373 + 19208775 19212421 chr2 242193529 + 19009000 19012646 183606 +3646 + +chain 225974 2 243199373 + 19204248 19206707 chr2 242193529 + 19022990 19025454 467577 +388 28 28 +1209 0 4 +135 0 1 +352 5 5 +342 + +chain 201441 2 243199373 + 97958444 98106185 chr2 242193529 - 144778275 144926174 238 +88 54679 54679 +12468 54591 54736 +25 101 101 +465 24292 24305 +1032 + +chain 195287 2 243199373 + 19206707 19208775 chr2 242193529 + 19006932 19009000 405952 +2068 + +chain 192625 2 243199373 + 87656920 87668206 chr2 242193529 + 87429797 87441083 3499 +83 71 71 +191 132 132 +84 86 86 +83 115 115 +72 52 52 +50 119 119 +62 140 140 +302 8551 8551 +1093 + +chain 156534 2 243199373 + 243181845 243184594 chr8 145138636 + 121500 124210 2340 +81 1 1 +38 1 1 +103 1 0 +77 1 1 +295 1 1 +47 1 1 +1023 1 1 +7 4 0 +38 3 0 +26 8 0 +14 17 0 +230 2 2 +104 1 1 +26 1 1 +17 555 549 +25 + +chain 133624 2 243199373 + 87656842 87726591 chr2_KI270772v1_alt 133041 - 22496 29136 2257 +78 83 122 +71 576 286 +26 0 260 +89 60441 2373 +161 17 19 +108 296 20 +92 59 61 +95 15 15 +128 30 31 +182 9 7 +307 31 14 +102 4095 350 +65 1811 534 +145 12 16 +139 96 27 +71 8 57 +119 138 416 +54 + +chain 118712 2 243199373 + 1219163 1224442 chr2_KI270773v1_alt 70887 + 18364 20487 706025 +173 419 0 +140 140 0 +52 632 1 +85 4 4 +35 173 173 +421 627 277 +140 284 4 +70 112 112 +64 911 1 +107 503 77 +187 + +chain 106697 2 243199373 + 243180604 243181845 chr1 248956422 + 96080 97321 2709 +190 1 1 +38 1 1 +50 15 15 +177 1 1 +72 1 1 +222 1 1 +44 1 1 +50 1 1 +46 1 1 +329 + +chain 90507 2 243199373 + 19221787 19222744 chr2 242193529 + 19022027 19022984 1622545 +957 + +chain 89185 2 243199373 + 36216944 36218225 chr2 242193529 + 35991860 35992816 1648261 +430 325 0 +526 + +chain 88448 2 243199373 + 87724511 87729232 chr2 242193529 + 87425000 87427191 355840 +860 2531 33 +70 11 11 +68 21 21 +129 10 10 +126 0 22 +162 9 0 +89 28 26 +108 298 307 +116 64 12 +21 + +chain 73840 2 243199373 + 36218225 36219010 chr2 242193529 + 35991076 35991861 2001863 +785 + +chain 73315 2 243199373 + 87720014 87720774 chr2 242193529 - 154773811 154774571 2033396 +760 + +chain 47746 2 243199373 + 242745225 242748411 chr2_KI270776v1_alt 174166 + 17490 19775 398 +113 60 655 +31 4 0 +35 4 0 +18 1140 290 +5 9 44 +29 590 382 +31 120 0 +29 941 596 +27 + +chain 45606 2 243199373 + 1219093 1222414 chr2_KI270773v1_alt 70887 + 18364 19865 1087627 +70 173 173 +44 70 0 +24 19 19 +46 209 0 +7 140 140 +44 70 0 +24 284 4 +65 5 5 +65 211 0 +56 785 575 +55 770 0 +85 + +chain 44871 2 243199373 + 243184014 243184620 chr16 90338345 - 130901 131507 2194 +64 19 19 +293 1 1 +43 1 1 +134 25 25 +26 + +chain 43451 2 243199373 + 87657265 87658260 chr1 248956422 - 104850876 104852812 1351 +132 84 58 +86 270 135 +52 50 49 +119 62 71 +57 1 590 +29 0 505 +53 + +chain 36220 2 243199373 + 87658562 87667113 chr2 242193529 - 130674461 130683003 104 +444 1 1 +42 0 1 +312 7 7 +281 14 14 +1143 0 1 +18 1 1 +1255 3 0 +244 1 1 +52 1 1 +692 1 1 +31 1 1 +532 1 1 +35 1 1 +79 1 1 +42 1 1 +60 0 1 +143 1 1 +53 1 1 +210 11 0 +71 5 5 +513 1 1 +31 1 1 +923 5 8 +268 1 1 +44 1 0 +972 + +chain 26305 2 243199373 + 91735935 91736211 chr14 107043718 + 87391719 87391996 8020597 +106 0 1 +170 + +chain 24978 2 243199373 + 91707122 91735921 chr1 248956422 + 144105988 144135628 313 +22 0 126 +19 110 92 +87 17 26 +60 16 16 +72 806 967 +59 1736 1737 +16 0 1 +22 25730 26291 +27 + +chain 20118 2 243199373 + 1226495 1226779 chr2 242193529 + 1223069 1223283 9421716 +65 9 9 +131 70 0 +9 + +chain 18572 2 243199373 + 36217504 36217698 chr18 80373285 - 59228245 59228439 14537976 +194 + +chain 18563 2 243199373 + 1224840 1225260 chr2_KI270773v1_alt 70887 + 19701 19771 6086313 +24 350 0 +46 + +chain 17194 2 243199373 + 1223300 1223645 chr2_KI270773v1_alt 70887 + 19071 19346 3402498 +70 70 0 +205 + +chain 16490 2 243199373 + 87718492 87726980 chr2 242193529 + 87404595 87406791 609478 +296 92 92 +59 238 238 +30 498 498 +5 4 8 +22 6369 138 +96 198 198 +106 25 51 +7 54 54 +4 318 227 +67 + +chain 12724 2 243199373 + 87726505 87726913 chr2 242193529 + 87412256 87412664 783877 +25 65 65 +318 + +chain 12366 2 243199373 + 242760908 242761497 chr2 242193529 + 241819578 241820110 4574004 +69 373 373 +45 57 0 +45 + +chain 12259 2 243199373 + 1224980 1226266 chr2_KI270773v1_alt 70887 + 19841 20217 6189639 +24 4 4 +83 70 0 +29 70 0 +24 71 1 +68 75 5 +42 679 49 +47 + +chain 11706 2 243199373 + 242761930 242762121 chr2_KI270776v1_alt 174166 + 32128 32262 24868503 +56 58 1 +77 + +chain 11047 2 243199373 + 1224864 1224980 chr2_KI270773v1_alt 70887 + 19585 19701 7098977 +116 + +chain 10439 2 243199373 + 36217379 36217504 chr2 242193529 + 234552215 234552340 16844726 +125 + +chain 10182 2 243199373 + 242744776 242745225 chr2_KI270776v1_alt 174166 + 19060 19693 8726255 +34 213 553 +6 157 1 +39 + +chain 8695 2 243199373 + 1220452 1220592 chr2_KI270773v1_alt 70887 + 18744 18814 1440834 +47 70 0 +23 + +chain 8213 2 243199373 + 87720809 87720895 chr2 242193529 + 87426715 87426800 6609902 +41 1 0 +44 + +chain 7395 2 243199373 + 87723775 87724286 chr2 242193529 + 90290484 90290864 967983 +92 239 108 +92 24 24 +64 + +chain 6746 2 243199373 + 1224070 1224140 chr2_KI270773v1_alt 70887 + 19281 19351 17897970 +70 + +chain 6698 2 243199373 + 1225820 1225890 chr2 242193529 + 1222954 1223024 17795697 +70 + +chain 6674 2 243199373 + 91697566 91751412 chr1_KI270712v1_random 176043 + 58804 106297 615 +42 53750 47397 +54 + +chain 6612 2 243199373 + 87722732 87722809 chr2 242193529 + 87410508 87410585 937548 +77 + +chain 6588 2 243199373 + 87721719 87724511 chr2 242193529 + 87422969 87425000 412162 +1013 77 25 +569 4 4 +189 715 6 +225 + +chain 6228 2 243199373 + 1221437 1221502 chr2 242193529 + 1223261 1223326 4648785 +65 + +chain 6094 2 243199373 + 1219590 1222329 chr2 242193529 + 1222604 1223313 1911957 +119 2495 465 +125 + +chain 6006 2 243199373 + 242747027 242747801 chr2_KI270776v1_alt 174166 + 17886 18324 1970798 +29 548 262 +32 39 0 +45 8 0 +38 3 0 +32 + +chain 5759 2 243199373 + 1222414 1222488 chr2_KI270773v1_alt 70887 + 19235 19309 3906342 +74 + +chain 5435 2 243199373 + 87725371 87725531 chr2 242193529 + 87407230 87407390 4243608 +65 44 44 +51 + +chain 5224 2 243199373 + 242762195 242762250 chr2_KI270776v1_alt 174166 + 32165 32220 35533164 +55 + +chain 5212 2 243199373 + 843098 843152 chr2 242193529 + 847400 847454 33249166 +54 + +chain 5044 2 243199373 + 243179488 243179600 chr6 170805979 - 116940 117052 2926 +55 1 1 +26 4 4 +26 + +chain 5037 2 243199373 + 242754963 242755015 chr2 242193529 + 241813884 241813936 32995935 +52 + +chain 5018 2 243199373 + 87727023 87727080 chr2 242193529 + 87423587 87423644 5096362 +57 + +chain 4890 2 243199373 + 842496 842556 chr2 242193529 + 846554 846614 4585334 +60 + +chain 4779 2 243199373 + 1224140 1224255 chr2 242193529 + 1222954 1223069 11667680 +115 + +chain 4714 2 243199373 + 1223790 1223854 chr2_KI270773v1_alt 70887 + 19701 19765 9127079 +64 + +chain 4356 2 243199373 + 1219964 1220009 chr2 242193529 + 1222699 1222744 45308945 +45 + +chain 4347 2 243199373 + 242761806 242761851 chr2 242193529 + 241820020 241820065 45322243 +45 + +chain 4159 2 243199373 + 242756697 242756740 chr2 242193529 + 241815328 241815371 39427401 +43 + +chain 4021 2 243199373 + 1219380 1219590 chr2_KI270773v1_alt 70887 + 18721 18861 1601141 +31 128 58 +51 + +chain 3943 2 243199373 + 1220087 1220128 chr2 242193529 + 1222682 1222723 42834890 +41 + +chain 3910 2 243199373 + 242761245 242761303 chr2_KI270776v1_alt 174166 + 32127 32242 7112408 +1 0 57 +57 + +chain 3910 2 243199373 + 845936 845977 chr2 242193529 + 850329 850370 39398118 +41 + +chain 3888 2 243199373 + 1220219 1220260 chr2 242193529 + 1222674 1222715 13143136 +41 + +chain 3672 2 243199373 + 242761737 242761775 chr2_KI270776v1_alt 174166 + 31707 31745 38145894 +38 + +chain 3617 2 243199373 + 1223752 1223790 chr2_KI270773v1_alt 70887 + 20427 20465 15391781 +38 + +chain 3537 2 243199373 + 87721236 87729031 chr2 242193529 + 87407943 87410802 521904 +237 4 0 +122 0 1 +120 5436 503 +747 831 831 +298 + +chain 3384 2 243199373 + 1225091 1226219 chr2_KI270773v1_alt 70887 + 20162 20444 6588310 +61 923 77 +144 + +chain 3372 2 243199373 + 242765631 242765671 chr2_KI270776v1_alt 174166 + 35423 35463 5127962 +40 + +chain 3080 2 243199373 + 91697841 91697898 chr2 242193529 - 154774548 154774605 29552201 +57 + +chain 3001 2 243199373 + 242761421 242761452 chr2_KI270776v1_alt 174166 + 31676 31707 46008379 +31 + +chain 2905 2 243199373 + 1219411 1219450 chr2 242193529 + 1222705 1222744 10545212 +39 + +chain 2847 2 243199373 + 242760794 242760829 chr2 242193529 + 241819578 241820012 18708835 +34 0 399 +1 + +chain 2813 2 243199373 + 91696458 91696487 chr22 50818468 - 34260153 34260182 39382360 +29 + +chain 2606 2 243199373 + 1223854 1223900 chr2_KI270773v1_alt 70887 + 20115 20161 27302789 +46 + +chain 2558 2 243199373 + 1220526 1220569 chr2 242193529 + 1222701 1222744 2845801 +43 + +chain 2525 2 243199373 + 1220260 1220317 chr2 242193529 + 1222925 1222982 3122011 +57 + +chain 2424 2 243199373 + 91697608 91697633 chr2 242193529 - 154777363 154777388 22784039 +25 + +chain 2325 2 243199373 + 1221576 1221615 chr2 242193529 + 1222910 1222949 10012756 +39 + +chain 2293 2 243199373 + 1223394 1223440 chr2_KI270773v1_alt 70887 + 19725 19771 4337900 +46 + +chain 2127 2 243199373 + 242761908 242761930 chr2 242193529 + 241820065 241820087 29497907 +22 + +chain 2107 2 243199373 + 1219939 1219961 chr2 242193529 + 1222604 1222626 17409087 +22 + +chain 2041 2 243199373 + 1220128 1220149 chr2 242193529 + 1222653 1222674 46071237 +21 + +chain 2027 2 243199373 + 1225449 1225470 chr2_KI270773v1_alt 70887 + 20100 20121 37263498 +21 + +chain 1984 2 243199373 + 91696558 91698697 chr2 242193529 - 154787244 154787866 1399 +5 10 1 +33 1445 161 +29 1 2 +9 8 0 +21 98 2 +21 72 0 +13 85 0 +13 33 0 +33 1 66 +55 0 1 +4 5 8 +145 + +chain 1936 2 243199373 + 242762148 242762195 chr2_KI270776v1_alt 174166 + 31379 31426 28956388 +47 + +chain 1838 2 243199373 + 1225655 1225704 chr2_KI270773v1_alt 70887 + 20026 20075 20454727 +49 + +chain 1718 2 243199373 + 1225470 1225498 chr2 242193529 + 1223024 1223052 21960622 +28 + +chain 1706 2 243199373 + 1225301 1225355 chr2 242193529 + 1222645 1222699 9790036 +54 + +chain 1680 2 243199373 + 1224045 1224070 chr2_KI270773v1_alt 70887 + 20300 20325 16026373 +25 + +chain 1575 2 243199373 + 1221620 1221646 chr2_KI270773v1_alt 70887 + 19211 19237 2335879 +26 + +chain 1550 2 243199373 + 91706942 91706968 chr2_KI270772v1_alt 133041 + 111068 111094 1760087 +26 + +chain 1457 2 243199373 + 89564899 89564923 chr2 242193529 - 152276207 152276231 21452003 +24 + +chain 1399 2 243199373 + 1223949 1224019 chr2_KI270773v1_alt 70887 + 19440 19510 10078511 +70 + +chain 1274 2 243199373 + 87727124 87727155 chr2 242193529 + 87407910 87407941 1326276 +31 + +chain 1244 2 243199373 + 1220499 1220526 chr2 242193529 + 1223304 1223331 2217408 +27 + +chain 1148 2 243199373 + 87727080 87729180 chr2 242193529 + 87426756 87427711 1308028 +44 2023 878 +33 + +chain 1121 2 243199373 + 87723872 87723929 chr2 242193529 + 87422453 87422510 1476025 +57 + +chain 1043 2 243199373 + 843218 843248 chr2 242193529 + 846736 846766 11401273 +30 + +chain 936 2 243199373 + 242762004 242762044 chr2_KI270776v1_alt 174166 + 32088 32128 26542950 +40 + +chain 878 2 243199373 + 1223370 1223394 chr2_KI270773v1_alt 70887 + 19841 19865 4317146 +24 + +chain 865 2 243199373 + 87725760 87725809 chr2 242193529 - 150694029 150694078 927771 +49 + +chain 858 2 243199373 + 87723998 87724048 chr2 242193529 + 90288962 90289012 918741 +50 + +chain 712 2 243199373 + 1226266 1226332 chr2 242193529 + 1223260 1223326 4474010 +66 + +chain 655 2 243199373 + 91698423 91698454 chr2 242193529 - 151896857 151896888 715259 +31 + +chain 627 2 243199373 + 242747636 242747665 chr2_KI270776v1_alt 174166 + 18471 18500 25542183 +29 + +chain 550 2 243199373 + 91697714 91697773 chr2 242193529 - 154775666 154775725 20069337 +59 + +chain 517 2 243199373 + 87720895 87724106 chr2 242193529 + 87426000 87428041 1540008 +59 4 143 +126 0 22 +152 2812 1481 +58 + +chain 515 2 243199373 + 95384347 95384396 chr9 138394717 - 98029024 98029073 2842 +49 + +chain 487 2 243199373 + 91697634 91697694 chr2_KI270894v1_alt 214158 - 107501 107561 32610116 +60 + +chain 426 2 243199373 + 242756641 242756697 chr2_KI270776v1_alt 174166 + 27413 27469 23504027 +56 + +chain 377 2 243199373 + 87723742 87723775 chr2 242193529 + 87410723 87410756 3580959 +33 + +chain 98 2 243199373 + 87725643 87725760 chr2 242193529 + 87417639 87418481 2429092 +67 0 725 +50 + +chain 96 2 243199373 + 87723571 87723742 chr2 242193529 + 87421396 87421567 3771117 +171 + +chain 5642587968 20 63025520 + 60000 62965520 chr20 64444167 + 79359 64334167 20 +218687 3 0 +476416 0 1 +378514 1 0 +286579 1 0 +50526 1 0 +1805931 1 0 +1189077 1 0 +26598 0 1 +8277 0 1 +1448092 7 7 +103540 1 0 +2180068 0 1 +5591 1 0 +1378753 1 0 +2884389 0 1 +263221 1 0 +309214 0 1 +676956 0 1 +1593919 0 1 +2475241 0 1 +119882 0 1 +37230 1 0 +2704477 0 1 +246057 0 1 +9870 0 1 +207424 0 1 +31465 0 1 +10147 0 1 +1713985 0 1 +1154622 0 1 +2264801 3100000 3845960 +234339 150000 796846 +613 5 0 +83 1 1 +32 4 4 +460 0 20 +34 0 10 +137 1 2 +214 0 2 +50 1 0 +1322476 0 1 +179432 1 0 +2619 9 8 +769 3 0 +17281 0 1 +36 1 1 +178 0 1 +270 1 0 +345 0 1 +236 1 0 +1694296 0 1 +93671 0 1 +218493 0 1 +673599 0 1 +1688 0 5 +476 1 1 +46 1 1 +2548 1 1 +43 1 1 +2683 2 0 +1848 0 1 +147 0 1 +411 1 0 +4091 0 18 +2891 12 0 +465 12 0 +39 2 0 +1045 1 0 +2629 1 0 +4371 2 0 +1048 1 0 +492 1 0 +833 0 1 +1768 25 14 +4047 0 1 +3463 2 0 +391 0 3 +2913 5 0 +4901 1 1 +16 1 1 +18263 0 1 +580 2 0 +6250 1 0 +3081 2 0 +6858 0 2 +15 1 1 +417 1 0 +3383 1 0 +12483 11 12 +3739 4 4 +5735 1 0 +2278 1 0 +316 0 3 +942 0 2 +1454 2 0 +544 3 4 +664 2 0 +45 1 3 +1455 0 1 +501 0 1 +3429 0 27 +18 0 23 +137 0 25 +4516 0 4 +788 6 0 +2982 2 0 +1355 1 0 +3878 14 0 +151 3 0 +5368 0 1 +971 0 3 +3520 3 1 +324 0 1 +1103 149 0 +207 0 1 +1136 1 1 +80 1 0 +44 0 1 +6 1 0 +230 1 1 +36 1 1 +246 9 8 +830 1 0 +1927 11 0 +2885 31 39 +737021 50000 9519 +1109387 0 1 +914492 1 0 +6184 0 5 +36 5 0 +36 1 1 +4655 0 3 +2673 258 0 +265 0 4 +4190 1 1 +32 1 1 +1715 7 7 +2864 2 0 +475 0 12 +9063 1 0 +166 0 2 +243 0 1 +3147 0 1 +596 50 0 +8 0 49 +201 1 0 +597 0 1 +2790 1 1 +38 1 1 +14292 0 1 +1645 1 1 +18 1 1 +1641 6 0 +52 1 0 +1269 12 12 +229 0 1 +1819 7 7 +5370 1 0 +5142 0 1 +2907 1 0 +1107 0 1 +4141 0 1 +76 1 1 +1189 1 0 +634 1 0 +1871 0 5 +8931 1 1 +35 1 1 +1162325 0 1 +458549 0 1 +130347 0 1 +1317134 0 1 +261706 1 0 +2723802 1 0 +775110 0 1 +264917 0 1 +784002 0 1 +31373 1 0 +256834 4 4 +559971 6 6 +510 1 1 +23 1 1 +867 1 0 +1181 0 3 +1289 1 1 +21 1 1 +728 1 1 +29 1 1 +621 5 0 +887 4 0 +51 1 1 +869 2 0 +104 12 12 +23098 0 4 +16470 1 0 +8606 5 0 +2560 1 0 +3029 2 0 +3512 88 0 +555 1 0 +491 1 0 +989 3 0 +460 1 0 +903 0 1 +2019 0 1 +1891 0 1 +802898 0 1 +392614 0 1 +21430 0 496 +53111 0 11708 +208375 0 1 +2765241 1 0 +9364 1 0 +1894413 0 1 +22764 1 0 +1947251 0 1 +144118 0 41481 +254 1 0 +139692 0 1 +1072 0 1 +3097958 0 1 +1317980 1 0 +53553 1 0 +2258 1 0 +577022 0 1 +20202 0 1 +1160687 2 0 +18422 0 2 +579098 50000 27849 +71932 50000 15855 +757601 1 0 +310364 0 1 +37201 1 0 +596983 + +chain 1319 20 63025520 + 37007581 37007631 chr12 133275309 - 100712188 100712238 3427043 +50 + +chain 3268960678 21 48129895 + 9411193 48119895 chr21 46709983 + 8522360 46699983 22 +184355 50000 50000 +129889 50000 100000 +209483 50000 50000 +131056 150000 510791 +5502 14 20 +176 1 1 +16 1 1 +88 12 12 +90 1 1 +28 1 1 +188 1 1 +42 1 1 +609 0 2 +4872 1 1 +27 1 1 +2470 2 2 +26 1 1 +1345 1 0 +486 12 12 +1961 1 1 +29 1 1 +475 1 1 +24 1 1 +580 2 0 +1406 0 11 +1237 1 0 +2043 1 1 +38 1 0 +922 17 17 +3631 1 1 +21 1 1 +2645 4 4 +376 14 14 +2547 1 1 +41 1 1 +247881 3690233 2795940 +1276620 4 4 +912112 0 1 +84851 0 1 +654198 1 0 +358779 1 0 +115732 0 1 +51412 8 8 +190141 0 1 +217539 1 0 +174531 0 1 +18883 0 1 +245689 1 0 +163568 0 1 +304486 0 1 +292534 1 0 +100257 0 1 +319638 1 0 +567221 1 0 +63712 0 1 +138387 0 1 +272007 0 1 +47048 0 1 +15533 0 1 +467679 0 1 +254568 0 1 +241241 1 0 +157505 1 0 +21782 1 0 +14564 1 0 +1525 1 0 +13166 1 0 +172935 0 1 +87560 1 0 +6989 0 1 +813 1 0 +11443 0 1 +24306 1 0 +51276 0 1 +11917 1 0 +9469 1 0 +6307 0 1 +80199 1 0 +31352 1 0 +4267 1 0 +10443 0 1 +232620 1 0 +207694 0 1 +23350 8 8 +267008 0 1 +167455 1 0 +32187 0 1 +66343 1 0 +276923 0 1 +152035 1 0 +90680 1 0 +243480 1 0 +389698 0 1 +18423 0 1 +45612 0 1 +105213 0 1 +128791 0 1 +147077 0 1 +95089 0 1 +135778 0 1 +24682 0 1 +47145 1 0 +43301 0 1 +193621 1 0 +614805 0 1 +263 0 1 +37490 1 0 +108856 1 0 +249055 0 1 +10142 0 1 +332253 0 1 +165439 1 0 +47005 1 0 +2458 1 0 +6501 1 0 +8297 0 1 +15260 0 1 +25358 1 0 +4689 1 0 +6371 8 8 +20147 1 0 +7741 0 1 +13975 1 0 +49194 1 0 +16082 0 1 +3259 1 0 +24771 1 0 +41607 1 0 +1775240 0 1 +4881 1 0 +382725 1 0 +21650 1 0 +158670 1 0 +18344 4 4 +256962 1 0 +22040 0 1 +54537 1 1 +30 1 1 +179 1 1 +17 1 1 +111543 0 1 +387554 0 1 +148926 1 0 +42635 0 1 +127551 0 1 +89432 0 1 +4207 0 1 +127159 1 0 +545520 1 0 +31354 0 1 +45922 1 0 +87548 1 1 +29 1 1 +26478 0 1 +181210 1 0 +262042 0 1 +66165 0 1 +27286 0 1 +93303 0 1 +95334 0 1 +9025 0 1 +423650 0 1 +35647 1 0 +55805 0 1 +79600 1 0 +121724 0 1 +27973 0 1 +19761 1 0 +110671 0 1 +61543 0 1 +11061 0 1 +81305 0 1 +58422 1 0 +11189 1 0 +243597 1 0 +69872 0 1 +57461 0 1 +7369 0 1 +94402 0 1 +3694 1 0 +87351 0 1 +9080 0 1 +114285 0 1 +12203 1 0 +4431 0 1 +143291 1 0 +86215 1 0 +110956 0 1 +152512 0 1 +83879 0 1 +187760 0 1 +10469 0 1 +7450 0 1 +69222 0 1 +46307 0 1 +38790 1 0 +54312 1 0 +83991 0 1 +73538 0 1 +46610 0 1 +209967 0 1 +5023 1 0 +11963 1 0 +96641 0 1 +29589 0 1 +507444 1 0 +289445 0 1 +15193 1 0 +1130842 1 0 +2396 1 0 +36242 1 0 +95671 0 1 +343983 1 0 +1930 1 0 +28810 0 1 +96124 1 0 +215754 1 0 +26730 0 1 +157060 1 0 +20091 0 1 +10677 1 0 +105342 0 1 +48214 1 0 +109218 0 1 +89362 2 210 +151755 0 172 +219187 1 0 +56070 1 0 +456726 1 0 +17070 1 0 +61904 0 1 +23889 1 0 +457350 1 0 +355447 0 1 +21587 3 4 +53348 1 0 +5502 1 0 +668310 0 1 +436406 1 0 +534646 1 0 +87 50038 1806 +221231 500 304 +22014 1500 1747 +251555 1 0 +251283 0 1 +100496 1 0 +778393 50104 50335 +3974 7 6 +279093 1 0 +548417 1 1 +19 1 1 +6027 8 8 +30237 1 0 +16478 1 0 +420288 1 0 +1112 1 1 +34 0 1 +738 1 1 +95 1 1 +2919 10 10 +119 1 1 +42 1 1 +151 1 1 +19 1 1 +242 0 6 +5691 1 1 +48 1 1 +430 1 1 +102 2 2 +1924 1 1 +35 1 1 +613 2 0 +596 1 1 +43 1 1 +510 5 0 +18 1 1 +110 2 2 +33 1 2 +80 1 1 +100 1 0 +550 1 1 +59 0 3 +1668 1 1 +33 1 1 +1182 0 1 +17 1 1 +1028 1 1 +20 1 1 +2585 1 0 +67 2 2 +693 1 1 +33 1 1 +726 7 7 +2780 9 0 +190 8 7 +1373 11 11 +66 1 1 +687 1 1 +31 1 1 +409 19 10 +1696 54 50 +887 1 1 +24 1 1 +65 5 5 +403 0 4 +182 15 0 +71 1 1 +436 1 1 +25 1 1 +164 1 1 +19 1 1 +90 14 14 +439 23 21 +78868 0 2 +315767 0 1 +2769 1 0 +429970 0 1 +924920 1 0 +41855 0 1 +36044 0 1 +177024 0 1 +90720 + +chain 46368587 21 48129895 + 10697896 11188129 chr21 46709983 - 35895423 36385656 158 +490233 + +chain 2576558 GL000210.1 27682 + 0 27410 chr21 46709983 - 3419401 3447187 1754 +431 1 0 +6557 8 0 +1731 1 1 +45 1 1 +356 0 1 +128 3 0 +558 1 27 +20 0 313 +25 0 2 +5 3 14 +21 0 5 +38 367 367 +786 1 1 +74 1 1 +3286 0 30 +12962 + +chain 25456 GL000210.1 27682 + 10033 10300 chr21 46709983 - 3428723 3428990 7330225 +267 + +chain 3231095979 22 51304566 + 16847850 51244566 chr22 50818468 + 16367188 50806138 23 +19737 40 0 +43 1 1 +47 24 0 +96 15 15 +8362 1 1 +36 1 1 +312 1 1 +18 1 1 +95 1 1 +33 1 1 +123 1 1 +22 1 0 +272 1 1 +21 1 0 +72 1 1 +31 1 1 +1063 1 1 +38 1 1 +6607 0 2 +16051 1 1 +23 1 1 +1959 1 0 +837 0 2 +2427 10 10 +977 20 0 +659 1 1 +33 0 4 +11 2 0 +528 13 13 +2475 2 3 +49 1 1 +4227 0 2 +1748 0 2 +1140 2 0 +143 1 1 +20 1 1 +531 1 1 +30 1 1 +1833 1 0 +2960 1 1 +17 1 1 +258 1 0 +3735 0 1 +4702 3 4 +29 1 1 +76 1 1 +47 1 1 +5589 1 1 +27 1 1 +1574 2 0 +4928 8 14 +907 1 0 +603 6 0 +1269 0 1 +1523 0 5 +1114 1 0 +417 0 1 +1025 1 1 +36 1 1 +342 1 1 +33 4 0 +4579 2 0 +1448 1 1 +41 1 1 +2417 1 1 +104 1 1 +294 4 0 +853 0 1 +1097 1 1 +44 1 1 +601 16 16 +51 24 24 +373 4 0 +73 1 0 +20 2 0 +17 0 21 +316 158 0 +302 1 1 +33 1 1 +1588 1 1 +18 1 1 +876971 0 1 +350 0 1 +146 1 0 +1294 10 0 +5024 1 959 +40 1 1 +4749 2 0 +1665 14 13 +1277 1 0 +3442 1 1 +17 1 1 +504 19 22 +121 7 7 +976 1 0 +496 1 0 +143 0 55 +10033 1 0 +303 7 6 +5219 0 1 +2412 1 0 +925 0 2 +1076 0 1 +183 0 9 +339 14 4 +288 12 12 +800 7 0 +194 4 4 +3534 1 1 +24 0 849 +11776 1 0 +4424 7 10 +4604 1 1 +28 1 1 +4766 0 1 +9858 0 6 +5379 0 1 +11243 31 31 +1631 1 1 +39 1 1 +517 1 1 +36 1 1 +567 1 0 +2800 4 0 +1495 8 8 +1092 1 0 +300 0 1 +27 1 1 +7631 1 0 +675 0 1 +1391 0 4 +1714 0 5 +619 0 1 +4048 1 1 +18 1 1 +25877 0 1 +1213 0 2 +2359 1 0 +349 9 0 +615 0 4 +879 0 3 +404 1 1 +49 1 1 +704 4 6 +479 18 19 +1230 1 1 +34 1 1 +189 1 1 +99 1 1 +173 0 1 +1485 4 4 +741 0 2 +630 21 0 +105 658 1 +91 1 1 +107 0 1 +592 0 7 +238 11 11 +7159 0 7 +12077 1 1 +24 0 2 +586 2 0 +8 1 1 +2722 1 0 +1655 0 5 +2986 15 0 +3378 0 3 +535 1 1 +42 1 1 +243 1 0 +168 3 0 +4246 1 1 +43 1 1 +604 0 1 +2816 11 0 +19 1 1 +2407 0 5 +32 1 1 +336 358 0 +923 1 0 +43 1 1 +3860 1 0 +151 0 2 +1596 1 0 +934 1 1 +36 1 1 +2373 1 0 +111 2707 0 +288 1 0 +1085 0 8 +6581 4 4 +528742 1 0 +102348 0 495254 +370144 9 9 +102793 0 1 +5696 14 14 +49 1 1 +4712 0 1 +6072 0 1 +5100 1 0 +417 0 1 +4755 0 1 +1358 4 3 +3475 0 1 +4164 14 0 +994375 1 1 +46 1 1 +128485 1 1 +26 1 1 +1316 366761 1 +94 1 1 +103 8 0 +1161 1 1 +35 2 2 +316 1 1 +46 1 1 +643 0 1 +665 6 6 +501 1 1 +31 1 1 +402 1 1 +53 1 1 +187 1 1 +60 1 1 +76318 2 2 +26 0 1 +52 6 8 +59 7 7 +238815 1 0 +305361 1 0 +892377 1 0 +21217 49 0 +7585 0 6 +2195 5 0 +56 1 1 +10160 2 0 +9399 2 0 +703 38 7 +14250 0 1 +51912 25 0 +3546 2 1 +516 0 1 +17925 1 0 +33055 1 0 +4993 0 1 +451 7 7 +6132 9 9 +5606 1 0 +161 1 1 +23 1 1 +2281 1 0 +644 0 1 +126 1 1 +32 1 1 +505 14 0 +2164 0 1 +103 1 1 +45 1 1 +98 7 7 +3385 2 0 +81 1 1 +34 1 0 +31 1 1 +1970 1 1 +63 0 6 +824 4 4 +1681 14 14 +55 2 0 +10831 0 1 +1399 1 2 +19 1 1 +223 5 5 +545 1 0 +1122 7 7 +558 2 0 +590 27 27 +565 6 6 +424 0 1 +545 1 1 +17 1 1 +4132 1 0 +9217 0 2 +16201 1 0 +794 6 6 +567 16 10 +50 8 8 +84 1 1 +392 0 25 +292 1 1 +20 1 0 +118 27 27 +133 0 1 +20 1 1 +94 1 1 +24 1 1 +62 10 10 +257 1 1 +53 1 1 +54 1 1 +92 6 6 +67 1 0 +223 11 11 +366 2 2 +73 1 1 +753 1 1 +113 1 1 +91 1 1 +21 1 1 +65 12 36 +763 1 1 +38 1 1 +1172 1 1 +20 1 1 +68 0 1 +74 0 10 +751 62 26 +1297 1 0 +958 1 1 +27 1 1 +675 4 5 +205 5 5 +753 1 1 +48 1 1 +5028 2 3 +40219 4 0 +456 1 0 +169 0 12 +3092 12 12 +3904 2 0 +127 0 1 +74 3 0 +9820 0 1 +1094 1 1 +46 1 1 +1540 3 0 +912 3 0 +2514 5 0 +1648 1 1 +16 1 1 +2597 10 10 +1241 1 0 +220 1 1 +261 1 1 +357 11 10 +32 0 8 +66 1 1 +37 1 1 +194 2 2 +34 1 1 +476 1 1 +27 1 1 +145 1 1 +51 1 1 +79 1 1 +27 1 1 +120 1 1 +22 1 1 +1079 14 14 +76 1 2 +56 1 1 +69 1 0 +53 1 1 +126 2 3 +45 4 0 +62 1 1 +47 1 1 +839 0 1 +41 1 1 +151 1 6 +822 0 1 +100 1 0 +1075 0 2 +224 1 1 +22 1 1 +728 1 1 +22 1 1 +608 16 16 +110 0 1 +32 1 0 +34 1 1 +605 17 15 +4809 4 4 +821 0 1 +2901 2 0 +4195 1 0 +5348 1 0 +1374 2 0 +3277 4 1 +1228 0 4 +558 16 0 +613 5 4 +425 14 14 +379 1 1 +23 1 1 +97 20 16 +105 6 13 +143 19 19 +1446 1 1 +46 1 1 +174 13 13 +322 1 1 +130 1 1 +201 1 0 +713 1 2 +195 1 0 +67 1 1 +36 1 1 +1519 1 1 +18 0 2 +131 1 1 +54 1 1 +570 1 1 +19 1 0 +412 1 1 +47 1 0 +71 4 4 +73 19 20 +1008 1 0 +68 1 0 +261 13 13 +521 6 6 +201 1 1 +25 1 1 +327 1 0 +49 1 1 +516 1 1 +18 1 1 +2523 1 1 +25 1 1 +447 0 1 +3783 11 7 +230 5 0 +84 1 31 +835 6 0 +878 7 5 +150 4 0 +1698 1 1 +74 1 1 +202 0 1 +745 0 2 +212 0 2 +2047 6 6 +168 9 9 +344 1 1 +43 1 1 +957 1 3 +30 1 1 +812 1 1 +37 0 1 +481 0 4 +1036 0 7 +9935 0 1 +7446 2 0 +6211 4 4 +54 0 22 +60 12 13 +34 16 16 +53 9 9 +234 1 0 +22 1 0 +550 3 0 +4804 0 1 +15079 9 9 +6029 0 10 +6916 1 0 +5684 2 0 +794 1 0 +233 0 1 +7270 8 8 +3163 4 0 +629 0 1 +177 3 11 +2198 1 1 +18 1 1 +2567 0 1 +3040 0 1 +1195 0 1 +5584 0 1 +304 5 5 +169 1 1 +96 1 1 +33 1 1 +78 1 1 +66 0 1 +18 1 1 +81 3 3 +170 1 1 +53 1 1 +53 0 1 +429 1 1 +49 1 1 +672 5 4 +19 1 1 +2345 1 1 +39 1 1 +4724 12 0 +3490 8 0 +9675 1 0 +10321 0 2 +224 23 23 +27 1 1 +1666 11 10 +357 1 1 +18 1 1 +71 1 1 +26 1 1 +673 1 1 +53 1 1 +1421 1 1 +45 1 1 +1521 12 13 +661 7 7 +647 0 1 +39 1 1 +185 1 1 +20 1 1 +111 1 1 +29 0 28 +582 1 1 +30 1 1 +1974 0 1 +2006 0 2 +4690 0 3 +9272 4 0 +8254 1 0 +6613 0 1 +2462 1 1 +46 1 1 +102 1 0 +572 1 0 +5660 0 1 +10768 1 0 +6539 0 1 +24762 3 0 +2236 12 15 +1990 8 0 +1163 0 9 +908 0 1 +584 11 0 +1374 0 4 +1681 0 15 +37 1 3 +2162 0 1 +1776 1 5 +49 1 1 +1097 1 1 +26 1 1 +222 1 1 +27 0 1 +3219 0 1 +258 1 1 +23 1 1 +428 0 1 +390 0 15 +1541 1 1 +28 8 0 +1572 0 2 +666 8 2 +3405 4 1 +953 1 1 +40 1 1 +139 6 0 +473 1 5 +1501 0 1 +120 1 1 +67 1 1 +2776 5 0 +2047 2 0 +398 10 10 +508 0 1 +147 1 1 +60 1 1 +72 1 1 +37 1 1 +364 5 5 +275 4 4 +432 10 10 +319 11 11 +1072 13 1 +482 1 1 +40 1 1 +1055 4 0 +405 1 1 +36 1 1 +157 1 1 +17 1 1 +290 3 0 +509 1 1 +25 1 1 +624 1 1 +47 1 1 +159 1 1 +40 1 1 +254 1 1 +19 1 1 +197 0 6 +526 1 1 +27 1 1 +375 2 1 +944 2 2 +49 1 1 +323 1 1 +43 1 1 +1018 0 11919 +861 0 2 +41 1 1 +626 1 1 +47 4 3 +175 1 0 +30 1 1 +74 1 1 +22 1 1 +326 3 0 +19 1 1 +2620 1 0 +1084 0 1 +84 1 1 +1553 1 1 +20 0 1 +32 1 0 +85 1 0 +127 2 0 +454 1 1 +40 1 1 +338 1 1 +25 1 1 +640 0 1 +547 3 0 +44 3 3 +322 0 1 +19 0 2 +53 0 2 +26 1 1 +2061 1 1 +39 1 1 +4035 0 1 +3587 0 1 +1898 1 1 +39 0 1 +735 0 11 +146 0 1 +15 0 1 +76 1 0 +98 1 1 +555 0 1 +260 1 1 +65 1 1 +318 4 4 +358 1 0 +121 0 1 +68 0 1 +30 1 1 +2572 1 1 +28 1 1 +7003 0 1 +912 16 0 +589 12 0 +44 4 0 +77 4 0 +1687 0 1 +3352 1 0 +1424 48 0 +113 0 24 +474 19 19 +6762 4 0 +11 3 0 +7940 0 1 +31441 1 0 +12143 4 4 +46 1 1 +7409 0 1 +29340 0 1 +469 4 0 +6278 0 1 +1629 2 0 +212 0 2 +3123 0 8 +3225 5 5 +469 20 0 +3042 1 0 +33435 4 0 +6299 0 1 +7658 0 1 +11700 2 0 +9153 4 0 +14312 0 3 +5302 0 1 +18952 0 1 +4832 0 1 +620 1 0 +1227 2 0 +2057 1 1 +69 7 0 +10486 7 7 +3523 0 1 +18 1 1 +160 1 1 +31 1 1 +68 0 1 +137 0 1 +597 0 1 +415 31 3 +2595 1 1 +20 1 1 +1026 1 1 +28 0 1 +56 0 1 +275 0 1 +583 0 338 +2909 1 0 +874 0 4 +341 0 1 +4143 1 1 +36 1 1 +207 1 0 +3653 0 2 +18465 4 0 +14495 1 0 +30540 2 2 +19 1 1 +890 7 17 +793 1 1 +21 1 1 +1075 1 1 +35 1 1 +1527 3 0 +254 0 3 +667 16 16 +3057 1 0 +2458 4 5 +2899 2 0 +6122 1 0 +3014 4 1 +2958 0 1 +252 1 1 +25 1 1 +2231 0 10 +961 1 0 +1048 28 0 +103 1 1 +28 7 22 +1416 1 1 +33 1 1 +1380 0 1 +566 0 12 +1091 0 3 +1488 1 1 +41 1 1 +1317 19 0 +542 2 0 +12245 0 10 +26557 1 0 +9731 0 8 +24081 1 0 +12920 8 0 +8272 1 0 +425 1 1 +48 1 1 +3106 5 4 +85 2 0 +29 1 1 +5925 1 1 +52 0 2 +19251 1 0 +4303 1 1 +40 1 1 +474 7 0 +11468 1 0 +874402 7 7 +3721 1 1 +78 1 1 +664 16 16 +4979 1 0 +3055 1 0 +6894 3 1 +5658 1 1 +23 1 1 +1547 1 1 +32 1 1 +5331 3 0 +3817 0 1 +428 10 10 +263 1 1 +27 1 0 +1083 9 9 +7208 54251 0 +1748 1 0 +8290 4 0 +2077 1 0 +1223 1 0 +4700 0 1 +529 0 1 +1186 1 3 +21979 14 0 +9651 1 0 +12042 2 0 +575 0 514 +3361 2 3 +1100 1 0 +2168 0 1 +1783 0 1 +4937 3 0 +3130 1 0 +5840 1 0 +4762 10 0 +2153 1 2 +15797 1 0 +230 3 0 +42071 1 0 +437670 0 1 +1353497 0 1 +623223 0 1 +14005 0 1 +85395 0 1 +372160 0 1 +101540 0 1 +13283 1 0 +60102 0 1 +403049 0 3 +4049 1 1 +25 1 1 +1587 1 0 +1410 15 15 +1899 5 0 +3790 0 1 +342 2 0 +2215 3 1 +2828 0 2 +5512 2 0 +316 14 14 +8490 0 20 +4673 1 1 +34 2 0 +775 3 0 +490 0 1 +477 4 0 +4430 10 5 +461 1 1 +47 0 1 +3487 0 1 +1628 15 15 +390 4 0 +46 0 1 +520 5 3 +1147 32 18 +3916 25 5 +5301 6 6 +12231 1 0 +6223 20 0 +77 0 20 +10323 1 0 +245 0 1 +1659 12 12 +4044 0 1 +272 1 1 +29 1 1 +328 0 8 +2462 1 1 +32 1 1 +662 0 1 +1481664 1 0 +97961 1 0 +16117 0 1 +1111976 0 1 +3305 0 1 +521313 0 1 +998697 1 0 +585991 0 1 +303768 1 0 +52348 0 1 +14509 0 1 +143706 1 0 +567675 0 1 +2527 0 1 +11139 1 0 +4596 1 0 +107273 1 0 +87247 1 0 +100636 1 0 +27974 0 1 +7992 1 0 +308578 1 0 +152933 1 0 +28925 1 0 +217379 0 1 +182013 0 1 +39384 1 0 +11500 0 1 +23390 0 1 +71463 1 0 +21409 1 0 +2876 1 0 +27140 1 0 +440550 18 0 +294 36 0 +1407 1 1 +46 1 1 +359318 0 1 +3109 1 0 +40932 1 0 +294813 0 2 +117296 0 1 +92380 12 12 +42922 5 0 +47 1 1 +2647 3 6 +223164 0 1 +8737 0 1 +65585 0 1 +82713 0 1 +20180 0 1 +103314 0 1 +83540 0 1 +172192 0 1 +2370 1 0 +54191 1 0 +86337 0 1 +55077 0 1 +16187 0 1 +3971 0 1 +1189 8 0 +486 0 2 +292 0 4 +599 0 4 +973 2 2 +45 1 1 +402 0 3 +1684 4 0 +5097 0 1 +9360 0 1 +1997 3 0 +3930 0 1 +5260 2 0 +35592 0 31 +735759 0 1 +71185 0 1 +150290 1 1 +31 1 1 +154 1 0 +8665 0 1 +1409079 0 1 +2256404 102 102 +149 1 0 +2671 0 3 +4411 32 32 +1447 7 2 +816 8 8 +1238 0 1 +968 3 0 +2983 25 25 +50 1 1 +21 1 1 +716 2 0 +2248 13 14 +68 1 1 +74 1 1 +1190 9 18 +198 1 1 +34 1 1 +171 1 1 +20 1 1 +4183 0 12 +366 5 5 +1064 2 0 +4362 1 1 +44 19 0 +10 1 1 +927 0 4 +1269153 9 10 +1638 1 0 +3295 1 1 +30 1 1 +3018 0 3 +1197 4 0 +418 4 45 +12 1 2 +28 0 2 +10 0 23 +60 0 6 +611 0 12 +310 0 2 +1691 0 1 +6709 16 16 +2100 0 14 +1265 1 0 +326 2 1 +1966 1 1 +32 7 4 +690 0 12 +832 1 0 +454 1 0 +10330 0 6 +3595 0 16 +468 2 0 +1533674 1 0 +354438 0 1 +51852 1 0 +8713 1 1 +44 1 1 +1382 0 1 +23831 1 0 +24 1 1 +52615 0 1 +640488 4 4 +7358 1 1 +32 1 1 +249 4 7 +58 3 6 +2959 4 3 +1724 4 4 +15 1 1 +581 1 0 +2062 27 0 +8565 0 8 +1827 1 1 +23 1 1 +1075 1 0 +1272 3 0 +9156 1 0 +2051 0 1 +1915 0 2 +678901 0 1 +276777 0 253 +48050 1 1 +41 55 0 +12 55 1 +955 1 1 +82 1 1 +335 1 0 +31 1 1 +293 1 1 +16 1 1 +6164 9 11 +2683 0 1 +257886 0 1 +209798 30 30 +347762 7 0 +23 1 1 +8507 1 0 +2552 1 0 +4008 1 1 +22 10 0 +160 1 1 +33 1 1 +8082 1 1 +32 1 1 +1242 65 18 +4349 2 0 +896 7 7 +138437 0 4 +1968 0 1 +921339 0 88 +62 14 14 +49937 12 0 +2471 1 0 +2490 38 0 +516 0 5 +2360 0 19 +412 0 1 +230 0 1 +174 0 6 +241 1 1 +37 1 1 +929 1 1 +29 1 1 +164 17 17 +282 1 1 +91 1 1 +1145 0 96 +82 32 0 +49 224 0 +6 32 0 +50 14 0 +19 62 0 +4499 11 11 +81 1 0 +627 1 1 +32 1 1 +3305 0 86 +133301 0 1 +54673 1 1 +20 1 1 +157 0 1 +4874 8 9 +1555 29 0 +469 1 0 +3318 1 1 +19 1 1 +1085 19 19 +161 0 54 +2371 2 0 +9 2 0 +2706 0 1 +508 1 1 +18 1 1 +1773 1 1 +20 1 1 +109 1 0 +1408 0 1 +1291 4 0 +647 0 14 +2195 28 0 +626 0 1 +3544 1 1 +25 1 1 +863 0 49 +803 7 9 +232 1 1 +27 1 1 +375 1 1 +25 1 1 +77 1 1 +40 2 282 +114 82 436 +120 9 329 +51 7 170 +43 0 85 +37 0 444 +109 0 1 +268 0 569 +1077 1 1 +16 1 1 +926 0 2 +23 1 1 +8998 0 1 +143793 0 1 +428965 50000 5219 +627736 0 1 +202053 + +chain 61356972 22 51304566 + 16050036 16697850 chr22 50818468 - 34890488 35538355 135 +2131 0 8 +4687 0 1 +1997 1 1 +30 1 1 +1633 2 53 +5255 1 1 +49 1 1 +1343 1 1 +39 1 1 +253 1 1 +37 1 1 +192 1 1 +25 1 1 +2051 13 14 +211 0 1 +1931 8 0 +624390 3 2 +1524 + +chain 5187223 22 51304566 + 24343276 24397527 chr22_KI270879v1_alt 304135 + 237451 291702 216 +54251 + +chain 1903041 22 51304566 + 20332745 20509431 chr22 50818468 + 18429207 18659564 203 +635 0 53671 +176051 + +chain 1027915 22 51304566 + 20609431 20699132 chr22 50818468 + 18339129 18428830 304 +62708 7372 7372 +26 5635 5635 +27 1584 1584 +25 488 488 +59 104 104 +162 75 75 +374 214 214 +148 64 64 +392 147 147 +62 320 320 +136 57 57 +43 51 51 +1752 357 357 +106 48 48 +103 139 139 +105 181 181 +42 402 402 +804 51 51 +33 69 69 +37 1372 1372 +26 306 306 +39 694 694 +32 1802 1802 +61 225 225 +40 180 180 +422 + +chain 538227 22 51304566 + 20672139 20699304 chr22 50818468 - 29474641 29499640 227 +387 0 1 +781 1 1 +48 1 1 +3534 7 0 +2613 26 26 +566 1 0 +668 1 0 +464 1 1 +15 1 1 +1039 0 4 +25 1 1 +579 1 0 +200 12 12 +1179 2 1 +694 13 13 +173 27 28 +1046 0 1 +538 25 25 +95 4 0 +389 59 59 +104 162 309 +75 374 470 +158 0 7 +56 148 28 +64 392 368 +63 14 15 +70 62 62 +320 136 136 +57 43 43 +51 1752 133 +107 14 12 +236 106 106 +48 103 103 +139 105 114 +181 42 42 +402 804 152 +51 33 33 +69 37 37 +253 1 0 +750 14 14 +63 10 10 +281 26 26 +306 39 39 +694 32 32 +78 19 19 +867 17 17 +821 61 61 +225 40 40 +180 422 422 +172 + +chain 16833 22 51304566 + 20332543 20332745 chr22_KI270731v1_random 150754 - 29567 29769 1421 +202 + +chain 15145 22 51304566 + 42519214 42534075 chr22_KI270928v1_alt 176103 + 45553 60414 387 +102 7232 7232 +32 7470 7470 +25 + +chain 6814 22 51304566 + 18047417 18047585 chr10 133797422 + 90331452 90331620 6571739 +42 97 97 +29 + +chain 4748 22 51304566 + 18003539 18003588 chr4 190214555 + 89346515 89346564 40074502 +49 + +chain 4372 22 51304566 + 49780264 49780315 chr22 50818468 + 49386246 49386297 2357805 +51 + +chain 4314 22 51304566 + 49780250 49780332 chr22 50818468 + 49384346 49384384 1412612 +14 51 7 +17 + +chain 3439 22 51304566 + 18059147 18059184 chr16 90338345 - 63965949 63965986 45807992 +37 + +chain 3327 22 51304566 + 22920946 22920982 chr22_KI270875v1_alt 259914 + 214139 214175 38147169 +36 + +chain 2586 22 51304566 + 47572082 47572109 chr22 50818468 + 47176357 47176384 15160084 +27 + +chain 2586 22 51304566 + 47572055 47572082 chr22 50818468 + 47176357 47176384 15160085 +27 + +chain 2157 22 51304566 + 47572020 47572042 chr22 50818468 + 47176376 47176398 17551188 +22 + +chain 1508 22 51304566 + 22469649 22469675 chr22 50818468 + 20668231 20668257 735888 +26 + +chain 1431 22 51304566 + 18047459 18047713 chrX 156040895 - 1271932 1272188 4484258 +97 29 31 +128 + +chain 1338 22 51304566 + 22237870 22237899 chr1 248956422 + 226114941 226114970 1705326 +29 + +chain 18412834015 3 198022430 + 60000 197962430 chr3 198295559 + 18322 198235559 3 +3992 0 4 +9072 0 1 +1645 1 1 +37 1 1 +63 1 0 +6896 0 2 +2352 10 0 +1959 9 9 +2695 8 8 +3044 1 0 +1046 1 1 +45 1 1 +575574 1 0 +119801 0 1 +182004 1 0 +738754 12 12 +2471701 1 1 +40 1 1 +568891 14 14 +190614 1 0 +493725 1 0 +70315 1 0 +818647 5 5 +37 1 1 +2012792 1 0 +44843 0 1 +269 1 1 +18 1 1 +355 0 1 +483624 0 1 +11959 0 1 +168663 1 1 +27 1 1 +1586600 1 0 +293468 1 1 +17 1 1 +41278 1 0 +367287 1 213 +648043 1 1 +40 1 1 +63669 1 1 +26 1 1 +62 1 1 +174 26 0 +95 1 1 +242937 0 1 +653541 1 0 +772817 0 1 +45368 0 1 +22696 0 1 +193470 1 0 +170 1 1 +34 1 0 +119 1 0 +116820 11 11 +349883 1 0 +5 1 0 +27 1 0 +7 1 0 +22 1 0 +9 1 0 +7 4 2 +117297 0 1 +981461 1 1 +21 1 1 +1300654 1 0 +5668 0 6 +3369 1 1 +48 1 1 +4680 1 1 +34 1 1 +430 1 0 +1073 1 1 +87 1 1 +3710 1 1 +23 1 1 +2231 0 4 +5269 2 0 +2134 8 8 +1509 1 1 +36 1 1 +5752 3 0 +2790 3 0 +7997 1 0 +1884 2 0 +718 2 0 +2629 7 7 +4304 1 1 +42 1 1 +831 4 0 +1835 4 8 +1105 0 1 +217 1 0 +20 1 1 +388 0 1 +68 1 1 +5232 1 1 +21 1 1 +289 0 8 +1697 0 1 +170 1 0 +7461 1 1 +45 1 1 +368 0 5 +851 14 14 +2671 0 5 +2869 1 0 +53 0 1 +75 4 2 +14 18 15 +4 1 0 +103 1 1 +7272 0 1 +6327 1 1 +66 1 0 +47 13 15 +19 0 1 +3903 1 1 +33 0 4 +5352141 0 1 +8055038 1 0 +6351745 1 1 +42 0 1 +5021762 1 0 +4517597 0 1 +248056 0 1 +1937698 1 0 +478 1 1 +21 1 0 +105 0 4 +3556 0 11 +904 1 0 +429 0 3 +533 0 11 +799 1 0 +10 1 1 +2916 3 2 +688 1 2 +1363 5 1 +1536 0 62 +8922 1 0 +593 1 0 +21713 1 0 +9880 1 0 +535 14 15 +236 1 2 +991 10 11 +1908 0 4 +746 16 16 +2212 1 0 +1273 2 1 +3435 0 6 +5447 0 1 +13095 8 0 +159 2 0 +9866 10 0 +2278 0 48 +507 1 0 +1974 36 155 +2789 0 1 +2954 3 0 +200 0 3822 +1715 1 0 +1890 5 5 +82 0 1 +1714535 0 1 +54919 0 1 +1133245 3 0 +4613 0 1 +804 5 0 +2526 16 0 +11363 0 3 +6455 1 0 +2218 0 1 +969 0 1 +628 0 3440 +123 1 0 +586 1 0 +969 0 1 +111 8 4 +2060 1 0 +1841646 4 0 +3438 0 2 +6221 6 0 +46 6 0 +23872 0 1 +1089 0 1 +838 0 1 +1841757 1 0 +2194632 195 48496 +1400220 0 1 +1308788 1 0 +29025 1 0 +48059 11 11 +85023 1 0 +34429 1 0 +25299 1 0 +17962 1 0 +15831 1 0 +430238 1 1 +19 1 1 +1066 0 12 +679 1 0 +93 0 1 +484 0 4 +43 0 4 +14 1 1 +525 15 15 +167 0 10 +212 1 1 +34 1 1 +336 1 0 +2680 1 0 +11440 1 1 +36 1 1 +2455 0 1 +21 1 1 +308 1 1 +23 1 1 +505 1 1 +30 1 1 +809 1 1 +25 1 1 +550 1 1 +26 0 12 +1962 7 4 +252 1 1 +25 1 1 +231 0 1 +624 11 11 +1364 1 1 +45 2 2 +2606 0 8 +134 0 15 +482 0 10 +6516 1 1 +23 1 1 +1539 2 0 +374 1 0 +7358 31 32 +1025 9 0 +37 1 1 +230230 1 0 +110263 1 0 +1063699 1 0 +749996 1 0 +1809827 0 1 +1376870 100001 35250 +2338 1 0 +1335 0 1 +61 1 1 +1098 17 17 +1786 0 3 +396 1 0 +1729275 1 7 +334 0 1 +1669 1 1 +19 1 1 +536 1 1 +42 1 1 +54 0 2 +327 0 1274 +3256 2 0 +5904 3 0 +6659 1 1 +31 1 1 +2256 2 0 +4250 1 1 +24 1 0 +156 1 1 +47 1 1 +2417 0 6 +20 1 1 +3626 0 2 +304 6 0 +288 0 9 +958 4 0 +4900 1 1 +20 1 1 +3712 16 12 +4353 0 3 +9802 8 8 +1837 1 0 +5749 1 1 +24 1 1 +111 10 7 +1657 0 2 +1962 6 0 +3941 4 5 +400192 1 0 +9792477 0 1 +2379920 1 0 +4509358 0 1 +5345003 3000000 3330306 +624653 1 1 +21 1 1 +11472608 3 0 +19044564 0 3 +788004 0 1 +4679699 1 0 +3855028 0 1 +50 0 1 +10819500 2 0 +1792 0 1094 +5508 0 1 +105 5 5 +230 23 0 +3733 1 0 +440 1 1 +35 1 1 +506 6 3 +1146 0 2 +1290 1 1 +25 1 1 +5138 1 1 +28 7 0 +4871 0 1 +3498 38 0 +1169 14 0 +2613 10 10 +1038 0 1 +1066 7 7 +2105 20 56 +1546 1 0 +1178 1 1 +20 1 1 +3112 0 3 +526 1 1 +21 1 1 +1672 6 6 +59 1 1 +739 9 9 +1258 0 1 +344 3 0 +7960 8 8 +4217 0 1 +1083 1 5 +2216 2 0 +10386 1 0 +2520 0 2 +53 1 0 +2946 5 12 +1759 2 0 +6058798 1 0 +757322 1 0 +7963436 0 1 +57078 0 1 +268086 1 0 +13 1 1 +10223930 1 0 +1069122 1 0 +3690079 0 1 +179012 0 1 +10539409 1 0 +983751 0 1 +1942917 1 0 +5439880 5290 2350 +1132279 0 12 +161 1 0 +940 0 2 +1103 1 1 +118 1 1 +86 0 2 +311 3 0 +2523 1 0 +2182 1 0 +6827 1 1 +23 1 1 +244 1 1 +63 4 15 +23 12 5 +128 0 7 +37 3 3 +279 0 5 +34 1 1 +422 1 1 +20 1 1 +510 49 39 +918 0 1 +658 1 0 +490 1881 1311 +52 691 129 +52 1144 4 +11 798 0 +65 64 3067 +85 837 1 +75 405 139 +67 2357 1 +82 155 421 +57 115 39 +68 232 158 +50 294 245 +51 418 0 +45 1212 72 +52 274 189 +49 760 0 +38 380 0 +56 152 0 +137 689 5 +66 28 28 +89 222 527 +207 44 44 +146 19 19 +307 36 680 +119 57 57 +198 16 16 +122 646 646 +283 75 37 +15 0 38 +288 192 192 +127 638 258 +89 132 19 +93 39 39 +130 13 92 +91 74 74 +68 69 69 +51 38 0 +58 71 71 +149 42 42 +59 89 90 +113 42 42 +76 33 33 +277 111 35 +50 248 248 +112 425 501 +237 49 49 +60 34 34 +137 13 13 +162 22 22 +57 162 162 +195 44 44 +249 73 73 +268 1565 20 +24 478 0 +332 375 376 +57 81 81 +51 45 197 +69 328 24 +21 0 114 +45 114 0 +43 26 178 +39 114 0 +82 896 60 +106 356 14 +50 238 311 +129 38 0 +14 0 114 +47 293 0 +41 214 24 +132 34 34 +222 29 29 +56 8 8 +258 21 21 +452 64 64 +61 42 42 +130 78 78 +221 44 44 +108 263 163 +90 42 42 +226 58 20 +60 0 2 +41 0 38 +50 97 2894 +124 38 0 +470 38 0 +85 16 16 +175 127 127 +283 1 77 +66 197 121 +61 9 9 +64 126 88 +37 0 646 +102 36 36 +188 13 13 +57 4 42 +280 287 1149 +832 1 1 +36 1 1 +356 1 1 +64 1 1 +84 1 0 +19 1 1 +953 11 13 +188 1 0 +2859 0 2 +149 0 5 +304 0 2 +690 0 4 +19 1 1 +2945 1 0 +1199 1 0 +2441 0 1 +322 1 1 +33 1 1 +909 0 2 +1395 3 0 +4789 3 0 +3060 1 1 +35 1 1 +1157 12 12 +1846 1 0 +4078 0 2 +720 1 1 +24 1 1 +172 3 0 +224 1 1 +43 20 0 +1044 1 0 +2930 0 1 +3386 0 10 +619 5 0 +2313 1 0 +3552 1 1 +18 0 1 +3769 6 0 +656 1 0 +326 0 1 +782 17 0 +897 1 0 +1833 1 0 +443 27 0 +6338 1 0 +2669158 + +chain 110856 3 198022430 + 195215692 195232259 chr3 198295559 + 195484139 195496058 6262 +132 1675 779 +111 50 50 +32 11 11 +52 404 24 +58 1990 295 +100 99 278 +152 48 48 +94 30 31 +236 37 37 +143 56 56 +174 31 31 +141 24 24 +200 24 138 +212 37 42 +52 27 27 +150 3068 14 +61 1064 11 +51 1509 1016 +27 20 20 +31 1274 237 +26 124 1596 +34 474 512 +38 277 277 +126 350 350 +141 35 35 +21 134 134 +126 786 2937 +188 + +chain 51916 3 198022430 + 195203637 195212068 chr3 198295559 + 195482059 195502534 535689 +82 327 517 +68 195 450 +54 327 7635 +50 408 245 +51 380 0 +45 432 14 +55 304 0 +62 3 4191 +54 57 57 +29 26 26 +54 0 3202 +6 2422 1850 +41 1181 374 +58 575 157 +140 304 0 +136 38 0 +62 66 66 +28 89 89 +52 153 458 +17 + +chain 47882 3 198022430 + 195213545 195216589 chr3 198295559 + 195490478 195503636 392203 +54 11 11 +57 127 51 +26 93 1864 +61 991 8799 +10 29 29 +257 104 66 +59 106 106 +59 966 1615 +34 + +chain 34689 3 198022430 + 195216190 195222736 chr3 198295559 + 195496820 195505495 88276 +19 15 15 +40 504 466 +42 1210 3437 +139 58 58 +181 284 246 +49 60 60 +34 391 353 +86 271 271 +44 1084 1580 +29 236 237 +4 1 1 +31 144 144 +56 175 175 +20 1 1 +9 601 639 +37 52 52 +27 555 36 +57 + +chain 25336 3 198022430 + 195205002 195229379 chr3 198295559 + 195478711 195486237 88650 +65 953 155 +8 1632 0 +65 689 81 +52 5354 621 +66 5416 1522 +60 6694 1948 +114 134 172 +112 1443 1785 +38 445 407 +28 938 156 +71 + +chain 21421 3 198022430 + 195211123 195213760 chr3 198295559 + 195486052 195502993 1261646 +40 38 294 +63 0 9129 +140 495 495 +52 5 2792 +54 1503 3635 +32 122 122 +93 + +chain 18631 3 198022430 + 57387014 57387209 chr3 198295559 - 140898868 140899063 12802646 +195 + +chain 17398 3 198022430 + 195225970 195228679 chr3 198295559 + 195498232 195503906 714468 +86 594 594 +34 1794 1997 +36 12 2774 +153 + +chain 14662 3 198022430 + 195224526 195225742 chr3 198295559 + 195495084 195500687 1677778 +125 447 4454 +37 7 45 +30 231 41 +50 152 684 +108 16 16 +13 + +chain 9663 3 198022430 + 195224484 195224711 chr3 198295559 + 195503355 195503582 11652369 +42 125 125 +60 + +chain 8051 3 198022430 + 195199153 195203393 chr3 198295559 + 195481029 195499755 2997546 +53 193 607 +72 321 25 +51 1066 154 +150 155 421 +57 132 3108 +58 1694 4875 +50 178 9035 +10 + +chain 5974 3 198022430 + 195206111 195206297 chr3 198295559 + 195499813 195500189 15625949 +17 139 329 +30 + +chain 5594 3 198022430 + 195214702 195214761 chr3 198295559 + 195491065 195491124 41211556 +59 + +chain 5445 3 198022430 + 195199062 195199296 chr3 198295559 + 195481770 195481966 26822326 +27 117 41 +7 22 60 +61 + +chain 5303 3 198022430 + 195224161 195224217 chr3 198295559 + 195495327 195495383 42328279 +56 + +chain 4084 3 198022430 + 195199970 195200013 chr3 198295559 + 195494554 195494597 45479980 +43 + +chain 3875 3 198022430 + 195200829 195200870 chr3 198295559 + 195481079 195481120 45608328 +41 + +chain 3606 3 198022430 + 195216920 195216958 chr3 198295559 + 195494617 195494655 44309730 +38 + +chain 3589 3 198022430 + 195219871 195219920 chr3 198295559 + 195494950 195494999 29940063 +49 + +chain 3413 3 198022430 + 195208735 195208771 chr3 198295559 + 195485801 195485837 43938749 +36 + +chain 3127 3 198022430 + 195212010 195212051 chr3 198295559 + 195485777 195485818 2496931 +41 + +chain 3029 3 198022430 + 195223906 195223938 chr3 198295559 + 195494554 195494586 45986318 +32 + +chain 2717 3 198022430 + 195229099 195229155 chr3 198295559 + 195489199 195489255 3099588 +56 + +chain 2624 3 198022430 + 195213354 195213429 chr3 198295559 + 195484560 195484635 3011685 +75 + +chain 1647 3 198022430 + 195223361 195223512 chr3 198295559 + 195493667 195493856 6699072 +57 43 81 +51 + +chain 1021 3 198022430 + 195225504 195225569 chr3 198295559 + 195486488 195486553 1486858 +65 + +chain 911 3 198022430 + 195210599 195211201 chr3 198295559 + 195483721 195483791 18862883 +30 547 15 +25 + +chain 672 3 198022430 + 195208237 195209037 chr3 198295559 + 195483675 195483829 5961555 +45 692 46 +63 + +chain 626 3 198022430 + 195228702 195228741 chr3 198295559 + 195484507 195484546 1869029 +39 + +chain 496 3 198022430 + 195208670 195209076 chr3 198295559 + 195491492 195491594 17034463 +40 327 23 +39 + +chain 462 3 198022430 + 195223719 195223754 chr3 198295559 + 195480907 195480942 940135 +35 + +chain 362 3 198022430 + 195225575 195225605 chr3 198295559 + 195482428 195482458 1978071 +30 + +chain 176 3 198022430 + 195210067 195210097 chr3 198295559 + 195495483 195495513 40558133 +30 + +chain 17712475813 4 191154276 + 10000 191044276 chr4 190214555 + 10000 190123121 4 +26434 1 1 +8 1 0 +11 2 2 +7700 0 5 +4803 0 101 +485 0 1 +7455 0 1 +4150 0 1 +5076 8 7 +92 0 1 +7421 1 0 +28 1 1 +3047 15 16 +2208 1 0 +3317 0 1 +1231 15 16 +2486 0 1 +20 0 1 +15 12 10 +57 0 1 +1175 1 1 +36 0 1 +291 0 1 +2224 0 1 +6500 1 0 +176 0 2 +2859 1 0 +2575 0 1 +1622 1 0 +1241 0 1 +2655 0 1 +4835 1 0 +26 1 1 +272 0 1 +540 0 1 +412 0 2 +1701 8 11 +118 1 1 +36 0 4 +524 6 0 +3334 0 1 +3374 2 0 +2255 0 1 +25 1 0 +548 11 12 +258 1 0 +151 0 1 +431 677 6816 +325 1 0 +643 14 14 +766 1 0 +225 1 0 +502 37 1 +5439 1 0 +4896 2 0 +5383 0 5 +1719 5 0 +382 11 0 +2684 4 0 +250 3 4 +606 1 4 +1373 0 4 +401 0 1 +6974 0 1 +572403 0 1 +691086 55500 47563 +3003 1 1 +40 1 1 +6984 2 0 +7132889 0 1 +177637 19000 19000 +456439 50000 50000 +138014 0 1 +363 0 1 +4452 14 14 +1498 1 0 +774 1 0 +107 14 14 +995 5 5 +300 1 1 +31 0 1 +9 4 0 +1551 15 15 +529 7 7 +1916 85 0 +536 1 1 +45 1 1 +48 85 0 +422 0 85 +143 26 195 +1377 2 0 +960 1 1 +54 0 1 +1190 16 16 +113 1 1 +56 4 4 +1686 15 15 +461 4 0 +657 1 1 +41 1 1 +442 1 1 +42 1 1 +852 9 12 +1437 7 7 +290 1 1 +27 1 1 +580 12 12 +83 0 2 +381 2 1 +1218 1 1 +84 1 1 +263 1 1 +41 1 1 +940 6 6 +276 0 1 +643 1 2 +9268 1 1 +24 1 1 +3873 9 0 +1445 4 4 +522 8 8 +148 6 10 +1378 1 1 +26 1 1 +7653 6 6 +934 0 6 +363 0 1 +1470 1 1 +47 1 1 +1234 3 0 +870 1 1 +48 1 1 +2017 1 1 +37 1 1 +1695 0 14 +264 0 3 +13 1 1 +1742 1 1 +47 1 1 +65 29 29 +321 0 1 +2080 1 0 +483 1 1 +63 1 1 +686 2 0 +968 1 0 +28 1 1 +192 0 12 +3519 1 1 +27 1 1 +1545 16 16 +603 17 17 +255 2 2 +47 1 1 +1379 15 15 +913 1 1 +16 1 1 +721 1 1 +57 12 12 +4016 1 0 +1832 6 1 +103 1 1 +17 1 1 +597 1 1 +48 1 1 +492 1 1 +49 1 1 +1708 0 4 +1629 1 1 +45 1 1 +1864 0 1 +3528 21 20 +4521 0 1 +983 13 13 +287 4 4 +3056 1 1 +22 1 1 +989 4 0 +5934931 0 1 +9255471 0 1 +7064512 16500 16500 +997221 6000 6000 +5001857 0 1 +1127930 0 1 +1325971 700 303 +9041845 150000 150000 +171176 3000000 2135851 +818256 1 0 +2047806 0 1 +287477 1 0 +786872 0 1 +2785705 0 1 +351987 1 0 +160 1 0 +875 50100 50593 +731 6 6 +392 26 33 +2534 1 0 +725 1 1 +35 0 1 +1234 4 4 +6889 1 0 +2845 0 2 +1387 1 0 +114 0 1 +2385 4 0 +65 6 6 +62 0 4 +18 1 0 +100 51 0 +11038323 0 1 +4578833 2 0 +69 2 9 +17 1 17 +12 6 3 +14 39 0 +59 7 48 +44 77 0 +74 66705 7288 +566 0 10 +1332 15 15 +6279 1 0 +5580 1 0 +16 1 1 +4795 10 10 +2898 4 0 +90 3 0 +9 35 0 +2620 0 3 +665 0 2 +58 12 0 +87 0 16 +168 3 0 +1078 0 1 +892 0 1 +8607 12 12 +2001 18 18 +991 0 1 +2897 0 2 +17115 2 0 +17173 1 1 +55 1 1 +3053 0 6 +3885 1 0 +194 0 13 +7555 1 0 +518 2 0 +868 1 1 +28 0 2 +4970 2 0 +2178 4 0 +2845 1 1 +39 1 1 +8677 0 1 +6609 0 2 +1486 5 0 +1171 2 0 +756 1 1 +29 1 1 +786 1 0 +5877 0 2 +2965 2 0 +1562 1 0 +17321 0 1 +871321 0 26 +160057 1 0 +541 0 1 +364 0 4032 +204 1 0 +1604655 1 0 +4431507 0 1 +5129477 0 1 +1537177 0 1 +10689502 1 0 +2326 5 0 +3501487 1 1 +48 1 1 +4942242 0 1 +9848196 0 1 +19380322 0 1 +4654773 0 1 +2828572 0 1 +3290394 0 1 +627512 1 0 +18367492 0 1 +10094150 3 0 +2790422 0 1 +4891583 1 0 +5462610 1 0 +294575 + +chain 1316309 4 191154276 + 75459031 75472996 chr4 190214555 + 74423500 74437481 3019 +10868 0 16 +3097 + +chain 468739 4 191154276 + 75485974 75490976 chr4 190214555 + 74450500 74455500 63036 +1275 1 0 +1139 1 0 +2586 + +chain 424516 4 191154276 + 75454532 75459031 chr4 190214555 + 74419000 74423500 59643 +3232 0 1 +1267 + +chain 422321 4 191154276 + 75472996 75477455 chr4 190214555 + 74437481 74441970 63987 +3961 0 30 +498 + +chain 417060 4 191154276 + 75481532 75485974 chr4 190214555 + 74446060 74450500 68388 +831 4 0 +3014 0 2 +593 + +chain 384075 4 191154276 + 75477455 75481532 chr4 190214555 + 74441970 74446039 103628 +1775 10 4 +974 2 0 +1316 + +chain 212794 4 191154276 + 75452279 75454532 chr4 190214555 + 74416747 74419000 347437 +2253 + +chain 212059 4 191154276 + 75490976 75493261 chr4 190214555 + 74455500 74457770 361195 +187 8 0 +898 7 3 +406 3 0 +776 + +chain 18001357 GL000193.1 189789 + 0 189789 chr21 46709983 + 9732686 9922475 346 +189789 + +chain 18169122 GL000194.1 191469 + 0 191469 chr14_GL000194v1_random 191469 + 0 191469 333 +191469 + +chain 16794858394 5 180915260 + 10000 180905260 chr5 181538259 + 10000 181478259 5 +8145 7 7 +4862 10 10 +1426 0 1 +1735 1 0 +713 1 0 +10 1 3 +1682 0 1 +104 1 1 +45 1 1 +6213 2 2 +40 1 1 +1643 1 1 +93 1 1 +4624 10 0 +1729 87 0 +701 3 0 +532 6 10 +4513 21 0 +1736479 0 1 +2239819 0 1 +4473615 0 1 +1332794 1 1 +48 1 1 +3603928 0 1 +9444 0 1 +95708 0 1 +3989856 50000 50000 +9327723 0 1 +34618 0 1 +4895012 0 1 +560615 0 1 +37371 1 0 +1012965 0 1 +1609703 0 1 +62 0 1 +77 0 1 +11346837 3000000 3704268 +2766666 0 1 +4651 0 1 +9084 0 1 +7372 0 1 +1741647 0 1 +48572 0 1 +1339815 0 1 +3137396 0 1 +713108 1 0 +5934885 1 0 +2594726 0 1 +5039734 0 2 +4293871 0 1 +708683 0 1 +1727206 0 1 +14057 0 1 +7473 0 1 +2529 0 1 +3884892 0 1 +2317624 0 1 +2107703 1 0 +166527 0 1 +3662263 50000 10110 +658590 0 1 +900225 0 1 +1028602 0 1 +1849231 0 1 +88637 1 0 +6299706 0 2 +1450 0 1 +7572807 0 1 +61333 0 1 +224864 0 1 +64562 1 0 +13956 0 1 +456616 0 1 +4862596 0 1 +1034399 0 1 +5672184 0 1 +858995 0 1 +2280305 0 1 +2078373 1 0 +4002239 0 1 +1137632 0 1 +1026802 0 1 +1116806 0 1 +536044 0 1 +238856 1 0 +3035131 50000 6104 +1619107 0 7 +19 1 1 +2475 0 2 +3596 5 0 +472 2 0 +6405 1 0 +4762 1 0 +271 0 1 +13344 0 2 +32622 0 1 +41020 0 6 +2397 1 1 +188 1 1 +1282 1 1 +36 1 1 +891 0 1 +2060 0 1 +15751 0 1 +33424 0 4 +30699 1 0 +6681 4 0 +114 0 4 +37 0 4 +17481 18 18 +9406 2 0 +506082 0 1 +2731 0 1 +2344172 0 1 +17127 0 1 +6317826 0 1 +525032 0 1 +1583292 0 1 +3160813 50000 2550 +890336 1 0 +565711 0 1 +67959 0 1 +9129 0 1 +2286124 0 1 +1787211 0 1 +4041370 0 1 +3740478 0 1 +3383797 0 1 +3850251 0 2 +3413472 0 1 +1458042 1 0 +222651 + +chain 6613 5 180915260 + 43101 43188 chr5 181538259 + 43266 43352 2269987 +61 22 21 +4 + +chain 15728552471 6 171115067 + 60000 171055067 chr6 170805979 + 60000 170745979 6 +832737 11 11 +60 1 1 +36 1 1 +108 4 3 +223 1 1 +38 1 1 +578 1 1 +47 1 1 +1605 1 0 +2601 7 1 +3730 0 1 +1141 0 1 +499 2 0 +620 1 1 +25 0 8 +673 11 4 +21 4 0 +348 2 0 +16 4 0 +803 7 7 +293 2 0 +70 564 0 +118 5 0 +2549 1 1 +21 1 1 +187 1 1 +20 1 1 +56 1 81 +18 1 1 +84 0 80 +234 0 78 +288 7 7 +407 0 78 +150 5 5 +644 10 10 +45 0 22 +3753 9 9 +138 1 1 +30 1 1 +239 0 3 +20 1 1 +83 6 0 +330 1 1 +140 1 1 +1019 0 4 +5290 7 7 +5134 4 0 +694 3 3 +24 1 1 +5283 1 0 +3716 0 6 +8455 0 4 +494 1 1 +31 3 4 +2398 0 2 +8875 0 2 +865 0 1 +2470 1 0 +2295 5 5 +6091 0 1 +2169 1 1 +87 1 1 +2560 0 2 +2706 3 0 +651 0 1 +3790 0 1 +931 1 1 +66 1 1 +845 0 1 +232 0 1 +652977 0 1 +3576535 0 1 +7088399 0 1 +1520823 0 1 +8153102 0 2 +1061390 0 1 +3660407 1 0 +28368 956 956 +110 245 267 +54 18 18 +60 71 82 +69 192 185 +4067 3 0 +727 0 2 +4921 23009 23 +101 3396 26376 +27618 102 102 +77 34 34 +62 13 13 +293 21 23325 +52 43 44 +77 657 641 +64 887 911 +2368 49 50 +54 373 1268 +54 94 88 +254 162 162 +75 1586 9814 +967266 0 1 +473887 0 1 +8527988 0 1 +3109054 0 32 +17517 0 5 +1209086 0 1 +2398003 0 1 +3474119 0 1 +1653698 0 1 +4143 1 1 +47 1 1 +483 0 1 +11448 1 1 +23 1 1 +5672 0 1 +1742 5 5 +284 1 0 +3834 0 1 +2362 1 0 +434 10 4 +3044 0 1 +1188 1 1 +37 1 1 +1102 3 0 +3476 3 5 +26 4 0 +89 2 0 +283 0 3 +1755 1 1 +20 1 1 +723 1 1 +42 140 0 +22 0 62 +65 1 1 +724 12 0 +258 0 4 +50 0 196 +7040 1 1 +35 0 1 +776 1 1 +38 1 1 +3174 8 8 +2628 4 0 +2123 1 0 +357077 0 1 +173998 0 1 +3896 18 0 +1003 0 6 +402 5 5 +2263 0 3 +4464 1 1 +38 1 1 +513 4 6 +1610 1 1 +22 1 1 +2021 0 1 +1024 12 12 +4767 1 1 +37 1 1 +568 1 1 +49 1 1 +1937 1 1 +17 1 1 +189 1 1 +25 1 1 +699 1 1 +33 1 1 +231 1 0 +1429 1 1 +54 1 1 +654 1 1 +33 1 1 +1128 1 1 +49 1 1 +728 0 3 +736 1 0 +1909 1 1 +45 1 1 +813 6 6 +5342 1 0 +26 1 1 +4298 4 0 +45 1 1 +2190 1 1 +56 1 1 +131 1 1 +29 1 1 +503 18 18 +265 0 1 +9177 1 0 +213 14 9 +1475 14 16 +1373 21 0 +519 1 0 +1672 4 4 +172 0 1 +1568 0 1 +1209 0 1 +165 3 0 +439 0 1 +348 1 1 +48 1 1 +1628 1 1 +34 1 1 +2003 1 1 +39 1 1 +3713 0 1 +3703 2 0 +2198 1 1 +68 1 1 +1796 1 13 +2343 0 5 +575 8 0 +23 1 1 +1971 1 1 +16 1 1 +1124 1 1 +43 0 1 +3952 7 7 +1282 1 1 +18 1 1 +1969 1 1 +38 1 1 +580 5 0 +908 1 0 +298 0 2 +1053 12 0 +332 1 1 +32 1 1 +1113 1 13 +574 1 0 +17 1 1 +2245 2 0 +327 1 0 +685 3 0 +1559 1 1 +37 1 1 +352 4 0 +16 1 1 +1771 1 1 +35 0 1 +343 1 1 +64 1 1 +370 0 1 +575 1 1 +33 1 1 +2570 6 0 +383 0 1 +274 21 21 +971 1 1 +61 1 1 +443 0 1 +268 0 1 +459 1 0 +2228 1 1 +42 1 1 +1734 1 1 +50 1 1 +263 0 3 +192 1 1 +19 1 1 +2509 24 0 +8546 0 1 +627 16 0 +1744059 8 8 +1361 1 1 +70 1 1 +1434 2545 105460 +6215000 1114 2894062 +2026 0 1 +3856 1 1 +47 1 1 +1829 0 1 +3321 0 2 +469 1 2 +6407 1 0 +4881 0 1 +2199 2 0 +4158 0 11 +2284 1 1 +47 1 1 +1764 0 1 +7056 1 1 +44 205 0 +280 0 1 +2633 0 1 +6020 23 26 +2652 1 1 +66 1 0 +1197 1 1 +24 1 1 +2237 1 0 +3589 1 0 +632 1 0 +1999 1 1 +46 1 1 +1585 3 1 +1761 1 0 +5942 10 10 +1612 1 1 +44 1 1 +2746 0 3 +1244 1 1 +9 4 0 +61 1 0 +1208 9 4308 +8081 2 0 +687412 4093746 351588 +2187208 0 4 +29523 44 55 +19560 6 0 +15938 0 3 +4159032 0 1 +2304581 0 188 +20262 0 1 +1438867 1 1 +20 1 1 +697716 0 1 +214017 1 0 +125 1 1 +43 1 1 +1604 2 0 +2155 0 4 +2116 0 12 +37 1 1 +903 3 0 +161 2 0 +140 5 0 +3526 0 1 +1938 2 0 +1609 1 1 +64 1 1 +3535 2 0 +954 17 1 +1546 1 0 +2151 12 0 +5261 1 0 +1537 16 18 +356 0 1 +21 1 1 +7357 13 13 +1124 1 1 +48 1 1 +354 0 1 +28 1 1 +585 0 1 +409 1 0 +517 1 1 +39 1 1 +2185 0 1 +408 1 0 +63281 0 4 +57732 0 1 +1094006 4 4 +162 12 12 +2193 22 22 +293 1 1 +30 1 1 +845 1 0 +45 1 1 +9769 2 0 +6058 1 1 +24 1 1 +2223 1 1 +24 1 1 +182 12 12 +284 1 1 +20 1 1 +1035 7 36 +1007 1 1 +27 1 1 +3279 1 1 +44 0 1 +3012 1 0 +545 17 17 +2562 0 1 +251 0 1 +935 8 0 +37 1 1 +566 6 0 +1483 2 0 +1960 1 0 +4564 1 1 +25 1 1 +832 0 1 +801 8 8 +1131 1 1 +58 5 1 +6177 0 1 +3712 1 0 +2185 1 1 +35 1 1 +710 2 2 +78 1 1 +2201 1 1 +30 1 1 +283 1 1 +30 1 1 +448 1 0 +1866166 1 0 +7053247 1 1 +29 1 1 +2660 11 11 +1083 1 1 +34 1 1 +4200 2 0 +125 0 1 +1012 1 0 +71 10 10 +875 1 1 +25 1 1 +1370368 0 1 +3941475 1 0 +2632706 0 1 +4202737 0 1 +15242 150000 411841 +6173441 0 1 +5301342 1 0 +2458 1 1 +21 0 188 +1940 0 126486 +1488 0 1 +166 0 1 +2611 4 0 +1450565 0 1 +3681720 0 1 +75941 1 2 +40244 1 0 +1532527 1 0 +61418 0 14 +754 0 1 +1795 0 1 +12635 2 0 +36 1 1 +811 0 1 +3730 0 9 +2633 0 3 +3341 1 0 +92 2 1 +515 1 0 +379 0 1 +431 1 2 +1408 9 18 +1225 0 4 +2104 1 0 +17702 1 0 +2122 0 2 +2023598 0 1 +2955249 0 1 +2033 4 1 +15575 4 5 +12576 1 0 +709061 0 1 +11176 0 1 +6761 2 1 +2753 1 0 +1912 0 1 +1240 0 3 +27023 3 7 +44293 0 1 +15 0 2 +21761 1 17 +15439 6 0 +562 2 0 +2562949 0 1 +1919965 1 0 +2448957 0 1 +4116031 0 3 +17328 0 2 +1411896 0 1 +998159 0 1 +3757254 0 1 +7255194 0 1 +6914496 0 1 +525241 1 1 +45 1 1 +2503352 0 1 +3069380 131833 31935 +6984890 1 0 +507719 1 1 +49 1 1 +3228 1 1 +32 1 1 +1736 1 0 +4879 0 4 +2264 0 7522 +5226 20 20 +1283 1 0 +248 1 1 +34 1 1 +1015 11 7 +180 0 18 +1813 1 2 +55 0 5 +3323 1 1 +22 1 1 +3017 1 0 +1344 0 1 +611887 0 1 +2021017 0 1271 +30912 4 0 +5201 2 0 +235 1 1 +37 1 1 +7774 0 1 +369 4 0 +957 1 1 +48 1 1 +982 0 35 +3629 1 0 +2503 15 15 +42791 100000 111512 +1027506 0 140 +1298 0 1 +2575 1 1 +37 1 1 +1814 0 17 +733 13 13 +2494 1 1 +68 1 1 +340 6 5 +199 1 1 +68 1 1 +116 0 2 +270 8 362 +900 0 10 +24 1 1 +427 3 7 +7 3 0 +17 1 1 +569 0 39 +297 0 1 +2508 1 1 +39 1 1 +417 1 1 +32 1 1 +397 1 1 +22 1 1 +580 1 1 +22 1 1 +1136 1 1 +40 1 1 +236 1 1 +13 1 1 +826 0 1 +1695 0 5 +252 6 6 +161 4 0 +3333 1072 1072 +564 13 13 +69 1 1 +44 1 0 +278 1 1 +24 1 1 +1301 1 1 +142 17 0 +897 12 13 +4750 0 3 +2079 7 7 +198 1 1 +24 0 2 +626 1 1 +48 37 1 +71 44 8 +19 36 0 +1614 1 0 +240 13 13 +381 1 1 +25 1 1 +536 23 23 +621 1 1 +40 1 1 +235 1 1 +21 1 1 +191 15 15 +143 1 1 +42 1 1 +433 1 1 +15 1 1 +1378 8 8 +1020 6 6 +432 1 0 +628 1 0 +534 0 7 +1061 0 91 +1728 1 1 +38 1 1 +1530 0 13 +559 0 14 +1780 0 3 +3364 14 14 +2281 0 9 +513 0 3 +1235 0 2 +859 0 19 +4426 1 0 +1695 5 0 +592 3 0 +36 4 0 +3440 8 1 +507 1 1 +45 1 1 +3510 5 5 +39 1 1 +444 0 2 +622 1 0 +5093 4 0 +68 0 1 +825 1 1 +26 0 1 +2823 0 2 +774049 1 0 +352142 50000 134872 +191421 18 16 +586 11 3 +6805 109 4 +50 124 20 +295 0 210 +154 1 1204 +153 0 157 +667 0 1317 +66 1 1560 +55 30 819 +20 0 365 +71 0 53 +71 1 1 +34 1 1 +123 1 1 +32 1 1 +15666 0 432 +317 0 216 +193 0 54 +508018 + +chain 27981917 6 171115067 + 58137659 58780166 chr6 170805979 + 57788603 58453888 138 +3260 27 24 +50 1 10 +48 0 6 +830 11 11 +5395 0 22763 +1681 4 4 +61 1 1 +68 12 12 +2990 0 3 +628068 + +chain 23279652 6 171115067 + 61880169 62128589 chr6 170805979 - 109448950 109696857 262 +4046 6 6 +227 1 1 +40 1 1 +3506 4 4 +584 1 0 +10237 1 1 +22 1 1 +968 1 1 +33 1 1 +2993 4 4 +248 1 1 +46 1 1 +2196 1 1 +48 1 1 +88 9 9 +607 1 0 +7955 55 225 +222 1 0 +4 35 38 +102 1 0 +22 1 1 +4000 0 2 +2015 0 1 +811 2 0 +3075 1 1 +28 1 1 +1529 13 13 +3272 688 1 +3872 0 2 +1618 10 10 +1947 0 2 +2744 1 1 +40 1 1 +5600 18 18 +807 3 0 +6114 0 1 +5026 4 4 +3878 0 1 +4559 1 0 +151941 1 1 +44 1 0 +466 1 0 +2474 1 1 +25 0 3 +1032 0 2 +1201 2 0 +1135 1 1 +22 1 1 +52 0 1 +910 1 0 +977 1 1 +30 1 1 +1012 0 1 +685 1 1 +19 2 2 +381 + +chain 3039255 6 171115067 + 157609467 157641300 chr6 170805979 - 13535814 13567647 1589 +31833 + +chain 2928197 6 171115067 + 26725711 26798779 chr6 170805979 - 144029776 144135326 576 +901 8 8 +46 112 112 +122 0 1 +67 0 1 +6 0 20 +48 134 134 +70 70 81 +64 8 0 +118 9719 9729 +13044 8 8 +46 1 1 +110 1 1 +122 1 0 +62 1 0 +14 20 0 +45 1 1 +54 7 7 +10 1 1 +60 34 34 +2653 0 21 +324 4 0 +6258 1 0 +127 101 101 +3396 27618 60079 +102 77 77 +34 441 441 +43 77 77 +657 64 64 +887 2368 2353 +49 54 54 +373 54 54 +94 254 254 +162 75 75 +1310 0 2 +106 0 2 +8 1 12 +35 4 0 +86 4 0 +14 1 1 +17 + +chain 125406 6 171115067 + 62179513 62181405 chr9 138394717 + 64198500 64200392 2587 +1892 + +chain 101361 6 171115067 + 169093604 169094676 chr6 170805979 - 2111417 2112489 576631 +1072 + +chain 10448 6 171115067 + 170528897 170529096 chr6 170805979 + 170213663 170213862 3712502 +25 50 50 +124 + +chain 9514 6 171115067 + 906374 906654 chr6 170805979 + 906314 906438 28266239 +14 156 0 +27 23 23 +60 + +chain 6877 6 171115067 + 906571 906733 chr6 170805979 + 906314 906355 28155483 +23 121 0 +18 + +chain 3831 6 171115067 + 906856 906898 chr6 170805979 + 906314 906356 25786488 +42 + +chain 3825 6 171115067 + 61914062 61914103 chr6 170805979 - 109381528 109381569 1545 +41 + +chain 3740 6 171115067 + 906815 906856 chr6 170805979 + 906314 906355 25786489 +41 + +chain 3740 6 171115067 + 906774 906815 chr6 170805979 + 906314 906355 25786490 +41 + +chain 3740 6 171115067 + 906733 906774 chr6 170805979 + 906314 906355 25786491 +41 + +chain 3522 6 171115067 + 169105947 169105983 chr6 170805979 + 168705785 168705821 39517110 +36 + +chain 2178 6 171115067 + 26750812 26750846 chr6 170805979 + 26726947 26726981 443883 +34 + +chain 14633688187 7 159138663 + 10000 159128663 chr7 159345973 + 10000 159335973 7 +222484 50000 10034 +183862 17 0 +17294 108 214 +12639 21 163 +232 3 3 +59 1 0 +37 1 0 +19 57 0 +97 10 139 +100 0 29 +12 4 4 +164 3 2 +464483 0 1 +1019205 0 1 +534470 0 1 +674520 0 1 +32501 0 1 +1115776 0 1 +3704773 0 1 +1688027 0 1 +227493 19 21 +278 1 0 +557 8 8 +326 5 0 +200 1 1 +31 4 5 +128 0 1 +601 1 0 +844 1 1 +28 1 1 +5644 1 0 +198 0 1 +286 9 9 +1240 0 2 +451 0 4 +3318 1 0 +1816103 0 1 +821987 0 1 +4214959 0 1 +1009421 0 1 +2971339 0 1 +3458 0 1 +1675 0 1 +10708 0 1 +495665 0 1 +931923 1 0 +3306148 1 0 +989921 0 1 +1938358 0 1 +154880 0 1 +350328 0 1 +7968 1 0 +98 0 1 +1905984 0 1 +190022 1 0 +14921 0 1 +16558 0 1 +782034 0 1 +76736 0 1 +3306390 0 1 +64717 0 1 +828734 0 1 +353021 0 1 +16015 0 1 +61 0 1 +128973 0 1 +307864 1 0 +8677 0 1 +320558 0 1 +79023 0 1 +327537 0 1 +510183 0 1 +196038 0 1 +756061 0 1 +1824408 0 1 +995550 1 0 +4061456 0 1 +1338118 0 1 +41914 1 0 +482804 0 1 +599042 0 1 +1839632 40000 11898 +213137 0 1 +1028412 0 1 +1084696 0 1 +27225 0 1 +91567 0 1 +4095103 4 0 +6214 1 0 +4331 0 1 +535 0 4 +300 0 2 +2988 1 0 +3397 0 3 +37 1 1 +492 0 3 +3097 7 1 +477 0 1 +5017 1 0 +1620 1 0 +1831 4 0 +3820 0 1 +266 1 0 +2892 1 0 +1169 2 0 +519 8 0 +6919 2 0 +568 1 0 +303 0 1 +1051 0 2 +503 0 1 +464474 1 1 +16 1 1 +920 0 3 +7259 2 0 +4685 10 0 +34 1 1 +1334 0 8004 +3662 0 8 +5033 1 0 +79 1 1 +1942 1 0 +565723 3000000 3076981 +256182 50000 698316 +99950 266557 156715 +90903 13 13 +1288 0 1 +1249 146684 130556 +2728544 0 4 +2395 1 1 +16 1 1 +2051 0 5 +1190 0 1 +729 0 1 +125 0 4 +1085 14 14 +2460 1 0 +2606 0 12 +5205 2 0 +198 13 19 +3919 0 1 +425 13 13 +111 4981 0 +70 40 0 +55 1 1 +292 11 11 +44 0 91 +65 0 275 +321 0 49 +10 1 2 +13 1 1 +72 20 62 +888 0 5 +1595 0 10 +11202 7 0 +610 1 2 +1572 1 0 +294 2 0 +1713 0 2 +496 2 0 +81 0 1 +1636 1 1 +39 1 1 +3102 3 0 +484 1 0 +3727 24 0 +107 1 1 +43 1 1 +2562 1 1 +23 2 1 +950 4 0 +77 0 5 +1889 0 2 +5350 1 1 +17 1 1 +397 1 1 +43 1 1 +1898 0 3 +783 2 0 +955 0 1 +8640 1 1 +41 0 14 +1421 1 1 +20 1 1 +317871 0 1 +490 1 1 +59 1 1 +7823 7 7 +1984 20 20 +686 43 43 +601 0 1 +713 1 0 +183 29 29 +1234 1 1 +24 1 0 +1244 1 0 +2464 1 1 +68 0 1 +1757 0 1 +1802 10 10 +756 0 5 +88 5 0 +494 5 0 +502 0 5 +1048 1 0 +2069 1 0 +3811 16 0 +258 0 1 +1594 18 0 +1104 17 17 +3266 1 0 +6756 1 1 +25 1 1 +1178 1 0 +2301 14 0 +1320 4 0 +65 0 1 +1853 3 0 +5415 1 0 +628 0 1 +111 0 2 +1470 0 1 +218 0 1 +452 1 0 +2414 1 0 +1725 4 4 +2114 6 0 +12163 16 24 +3862 7 7 +2117 16 10 +847 3 0 +1168 1 0 +1614 4 0 +64 1 1 +1219 1 1 +46 1 1 +1437 0 6 +424 10 10 +1377 1 1 +33 1 1 +7381 0 6 +4504 1 0 +4269 24 0 +2416 7 17 +633 4 0 +1831 1 0 +3537378 0 1 +2141996 0 1 +1239883 1 1 +10 1 1 +213 16 12 +47 2 2 +1127 0 12 +1331 1 0 +3270 7 0 +2103 2 0 +798 0 12 +1903 0 2 +168 2 0 +456 4 0 +2286 2 0 +757 1 1 +23 6 0 +3079 2 0 +6138 1 0 +851 0 1 +4696 1 0 +1900 0 1 +1203 1 0 +2540 0 1 +1081 0 18 +203 1 1 +36 1 1 +1355 0 1 +1509 0 7 +2827 28 37 +953 1 0 +476 1 2 +1974 0 1 +3044 1 0 +41 1 1 +1955 3 0 +382 1 0 +1281 1 0 +164 0 1 +3331 6 0 +151 1 1 +21 2 0 +839 0 2 +1985 1 0 +2659 1 1 +16 1 1 +1690 12 11 +3822 2 0 +1064 5 5 +1091 1 1 +27 1 1 +910 0 1 +462 1 0 +288 1 1 +32 1 1 +363 3 0 +1081 0 14 +1095 15 0 +545 1 1 +31 0 4 +720 0 1 +292 2 0 +20 1 0 +10 1 1 +1894 1 0 +301 1 0 +826 7 7 +1484 0 1 +61 0 2 +264 1 0 +2791 1 1 +46 1 1 +449 6 0 +530 1 0 +1298 0 4 +1012 1 1 +31 1 1 +1259 4 4 +24 1 1 +291 1 1 +31 1 1 +412 7 7 +844 1 0 +139 1 0 +89 2 1 +1039 0 2 +972 10 10 +100 1 1 +29 1 1 +161 0 1 +414 8 0 +748 2 0 +230 1 1 +23 1 1 +2467 20 0 +481 5 5 +682 1 0 +1871 1 1 +17 1 1 +202 4 0 +2128 1 0 +1691 1 1 +49 1 1 +765 2 0 +298 6 6 +2212 1 0 +740 1 1 +21 1 1 +1282 1 1 +127 2 0 +1641 1 0 +526 0 6 +156 2 2 +37 1 1 +557 1 0 +2625 0 1 +43 1 0 +136 1 1 +30 2 2 +2006 5 0 +115 0 4 +2258 0 1 +778 6 0 +1812 1 1 +69 1 1 +884 1 2 +902 1 0 +761 1 0 +1970 3 4 +473 0 2 +47 1 1 +821 1 0 +346 1 0 +165 1 0 +1990 8 9 +1441 0 3 +4828 5 0 +656 16 15 +63 0 1 +1032 5 5 +31 2 0 +74 1 1 +1029 0 2 +302 1 1 +22 1 1 +1228 0 2 +947 1 1 +46 1 1 +350 0 1 +33 1 1 +533 0 1 +1893 1 1 +30 1 1 +700 5580 0 +966 1 1 +22 0 1 +2291 2 0 +512 0 2 +627 1 0 +321 0 2 +35 1 1 +357 0 6 +779 4 4 +116 0 7 +415 1 1 +62 1 1 +142 0 1 +219 1 0 +18399 1 0 +2331 8 8 +1172 0 1 +3829 0 2 +17 1 0 +8212 3 0 +2324 1 1 +20 1 0 +117 0 2 +6000 0 19 +2184 10 11 +5268 4 0 +1986 15 15 +1847 1 0 +3729 1 0 +4250 5 0 +1515 0 1 +1262 1 0 +4264 0 1 +3540 0 31 +10111 1 1 +33 1 3 +4150 1 0 +184 0 1 +25126 1 0 +14257 1 0 +13958 1 0 +484 0 1 +2281 0 8 +19450 0 1 +10285 8 8 +2563 1 2 +8531 0 6 +635 14 14 +3162 1 1 +15 1 1 +7669 84 84 +1075 0 2 +3698 8 0 +74 1 1 +11700 1 0 +3028 0 56254 +380 0 1 +8499 9 0 +4265 1 1 +79 2 0 +37 16 0 +7938 3 0 +6833 1 0 +375 17 0 +6388 1 0 +9449 0 1 +6937 18 0 +3056 0 4 +105 0 227 +3141 0 6 +1867 1 1 +36 0 8 +2955 0 1 +4964 33 40 +5219 0 2 +1674 0 1 +8950 0 45 +41400 0 4 +11401 0 1 +9413 0 1 +7686 0 1 +13236 0 1 +2025 1 0 +10368 8 0 +1937 3 0 +12728 0 20 +317 0 1 +1316 2 0 +1701 0 8 +2533 0 10 +1131 1 1 +27 0 1 +64 0 1 +80 0 1 +9 0 1 +22 1 1 +137 0 1 +6471 1 0 +2235 0 3 +4662 1 1 +70 1 1 +118 6 6 +1305 0 3 +7086 0 1 +737 1 0 +1961 0 2 +3383 1 0 +1202 4 0 +1675 0 1 +9004 0 1 +398 15 15 +250 6 0 +1389 0 1 +6876 1 0 +1852 0 2 +2174 1 0 +2784 0 1 +823 0 3 +744 1 0 +2929 0 1 +3559 10 0 +7491 1 0 +421 0 1 +1203 0 1 +287 1 0 +5482 1 1 +43 1 1 +1815 0 2 +726 1 1 +24 1 1 +1041 0 1 +1162 0 12 +2076 1 0 +27 1 1 +1261 0 1 +638 0 1 +134 10 10 +758 1 1 +34 1 1 +1947 9 8 +98 301 0 +520 21 0 +2489 1 1 +29 0 5 +554 1 0 +1003 1 0 +369 1 0 +3221 5 0 +916 4 0 +2255 0 1 +200 1 1 +44 1 1 +179 6 0 +767 1 0 +846 1 0 +598 10 11 +664 1 0 +360 0 1 +548 1 0 +1189172 0 1 +13792 0 2 +9176 0 1 +6320 0 3 +2253 0 2 +1129 0 1 +2877 0 1 +3519 0 5 +1337 1 0 +5314 1 0 +11626 16 0 +4188 0 4 +1353 2 0 +517 1 0 +2937 6 0 +309 0 1 +367 0 8 +3347 12 0 +5100 0 13 +2555 2 3 +1385 4 0 +1555 1 0 +1065 6 0 +518 0 8 +299 3 0 +4019 1 0 +281 0 1 +1361 1 0 +158 0 6 +887 0 2 +1853 0 1 +2600 1 0 +389 0 1 +3711 9 0 +437 1 0 +1882 19 18 +2910 0 1 +7535 0 1 +20 0 1 +7357 0 1 +445 0 1 +3837 0 1 +1232 0 2 +807 8 0 +586 0 3 +695 0 1 +2968 4 4 +3961 0 12 +153 1 0 +4678 0 1 +3410 1 0 +2687 13 0 +2103 1 0 +1305 4 0 +4716 0 1 +589 4 0 +1626 1 0 +5128 0 2 +126 0 5 +2029 4 0 +2635 18 18 +2740 0 1 +1340 0 1 +2800 0 1 +311 0 4 +6004 1 0 +22 1 1 +1107 0 3 +3336 8 0 +249 0 4 +239 9 0 +776 2 0 +6880 3 1 +6417 0 1 +4910 1 0 +385 0 1 +497 3 4 +702 0 2 +31 1 1 +1936 3 0 +248 1 1 +41 1 1 +1174 0 2 +3066 1 1 +43 1 1 +1115 5 4 +330 0 2 +682 18 18 +925 0 1 +2350 0 2 +629 0 1 +2641 13 13 +262 1 1 +39 2 2 +1908 2 0 +7197 0 3 +1620 0 1 +739 195 0 +160 2 0 +2214 0 1 +1542 2 0 +42 1 1 +2356 0 8 +1283 2 0 +1357 2 0 +212 0 1 +18 1 1 +3178 0 1 +63 0 1 +268 1 1 +32 1 1 +1410 0 1 +823 13 14 +289 1 1 +63 1 1 +67 3 0 +911 0 1 +896 0 8 +1123 1 0 +58 607 19 +1987 12 0 +1610 2 0 +3201 1 0 +968 1 1 +74 1 1 +235 0 2 +162 1 1 +50 1 1 +1783 1 1 +44 1 1 +350 0 2 +731 1212 7 +655 1 1 +59 1 1 +1151 1 1 +40 1 1 +1097 0 1 +2233 5 1 +503 0 1 +1942 0 6 +574 1 1 +35 1 1 +278 0 1 +3310 0 33 +44 1 1 +245 9 0 +479 0 1 +169 1 0 +474 8 17 +786 6 1 +965 0 1 +3421 4 0 +301 1 1 +35 1 1 +831 1 0 +248 6 8 +807 6 0 +1162 0 1 +457 1 0 +3928 0 1 +32 1 1 +285 1 1 +42 1 1 +1195 1 0 +1472 1 1 +48 0 210 +282 7 7 +972 4 0 +1071 1 0 +626 1 0 +449 15 17 +4743 2 0 +415 22 21 +116 1 1 +48 1 0 +46 1 0 +43 1 1 +589 3 0 +4077 4 0 +28 1 1 +2181 8 0 +1749 0 2 +1269 16 7 +3108 0 2 +2111 0 3 +575 10 11 +893 5 5 +32 1 1 +707 14 9 +81 1 1 +17 1 1 +882 0 3 +953 69 70 +2666 59 59 +261 1 0 +412 51 51 +597 23 23 +521 5 5 +69 0 3 +367 48 48 +263 13 13 +75 5 5 +220 40 40 +877 0 9 +3835 1 1 +35 1 1 +642 1 1 +23 1 1 +416 1 1 +16 1 1 +155 5 9 +366 0 1 +3362 1 0 +376 0 18 +1598 5 0 +38 1 1 +506 13 12 +284 46 46 +401 0 1 +963 0 2 +498 0 1053 +744 0 4 +1404 15 16 +2931 0 21 +3652 0 1 +2635 0 10 +638 1 0 +2336 0 10 +1206 1 2 +1519 11 0 +289 0 1 +291 15 24 +871 1 1 +41 1 0 +745 0 4 +1518 0 4 +910 0 1 +1347 0 2 +1978 8 0 +870 4 0 +468 1 0 +1061 1 1 +46 1 1 +229 0 3 +1293 4 0 +42 0 4 +108 0 62 +26 0 44 +560 0 2 +276 2 2 +27 1 1 +2419 9 1 +775 2 0 +604 2 0 +175 1 1 +17 0 1 +350 0 4 +556 0 1 +1533 4 0 +801 93 259 +2778 0 2 +1952 0 12 +620 9 8 +79 17 17 +730 0 1 +24 0 1 +20 1 1 +859 21 0 +311 0 1 +756 0 631 +64 14 14 +84 35 35 +65 10 10 +680 1 0 +158 74 22 +868 1 0 +763 0 1 +7946 1 1 +99 1 1 +947 0 9 +6481 1 0 +15 1 1 +2548 1 0 +670 1 0 +1932 1 1 +37 1 0 +739 2 0 +299 0 2 +313 1 0 +804 1 0 +165 7 9 +518 2 0 +1530 24 0 +24 1 1 +816 0 3 +352 0 1 +1407 7 7 +165 10 10 +121 7 0 +1234 3 1 +1854 0 1 +1000 0 10 +4855 2 1 +4795 2 0 +13219 0 57 +926 0 7 +5891 0 1 +3708 1 0 +8146 4 0 +3382 1 0 +921 0 1 +2430 1 0 +315 0 2 +9827 38 0 +3 1667 0 +917 1 0 +3145 1 0 +95 1 0 +2073 0 2 +1228 0 1 +458 1 0 +2303 1 0 +3840 23 1 +2618 2 0 +2311 0 2 +332 0 22 +604 0 1 +2542 0 2 +342 0 2 +25 1 1 +1651 6 0 +440 0 1 +2042 0 4 +857 0 3 +152 1 1 +24 1 1 +325 0 4 +689 10 10 +1861 0 3 +1840 0 1 +25 1 1 +755 1 9 +5647 1 0 +1952 0 2 +1024 1 0 +1604 1 0 +2251 8 8 +157 1 1 +27 1 1 +5291 1 1 +36 1 1 +968 0 2 +289 1 1 +33 1 1 +1124 4 0 +1111 15 1 +584 2 0 +1315 0 2 +492 0 2 +326 2 0 +722 1 0 +2551 0 7 +667 1 1 +33 1 1 +283 0 1 +6839 0 1 +444 1 0 +2624 12 0 +2266 0 1 +189 0 4 +995 1 0 +533 1 0 +2065 0 3 +2512 1 0 +769 7 7 +455 0 1 +5839 0 1 +14320 0 1 +6491 1 1 +41 1 1 +150 1 1 +23 1 1 +1076 1 0 +2191 1 1 +15 0 2 +2717 2 0 +163 1 0 +2515 1 80 +572 1 0 +29 1 1 +3316 1 0 +107 2 0 +430 1 1 +44 1 1 +156 1 1 +37 1 1 +760 1 1 +55 1 0 +221 0 1 +30 2 2 +2091 0 12 +1012 0 4 +268 5 0 +2049 1 0 +800 0 1 +1572 1 3 +38 1 1 +3800 5 3 +2493 17 16 +2800 0 8 +919 1 0 +57 1 1 +40 5 0 +6 1 1 +2339 0 3 +537 0 1 +187 1 1 +80 1 1 +640 0 1 +1994 17 17 +1933 3 0 +144 2 0 +916 0 1 +493 2 0 +1818 13 15 +4112 0 6 +419 3 0 +1873 0 1 +895 19 17 +1654 5 4 +4866 1 0 +934 1 0 +628 18 0 +837 23 21 +208 0 38 +142 11 11 +4324 209 209 +1476 2 0 +1738 2 0 +1654 2 0 +5 32 0 +49 8 0 +531 0 1 +618 2 0 +124 6 0 +1498 1 0 +1001 0 1 +309 1 0 +24 0 4 +1033 4 0 +27 14 0 +1310 1 0 +1103 0 1 +21 1 1 +651 4 0 +1858 0 3 +542 1 1 +24 1 1 +269 0 4 +2151 0 4 +239 1 1 +44 1 1 +1486 1 0 +100 4 0 +231 0 1 +1211 41 41 +1226 2 0 +477 2 178 +17 0 22 +185 33 23 +50 30 34 +1610 2 1 +985 1 0 +332 46 2 +1797 2 0 +1172 2 0 +347 0 6 +911 0 1 +2166 4 0 +484 1 0 +1128 0 2 +1232 3 0 +1213 4 0 +297 22 0 +26 1 1 +770 9 9 +1534 0 3 +35 5 5 +291 1 1 +91 1 1 +200 0 13 +735 77 77 +73 43 43 +84 2 0 +217 21 21 +542 75 75 +759 1 0 +442 0 818 +819 0 3 +1543 14 14 +432 0 1 +371 1 0 +357 2 1 +464 10 10 +685 7 3 +898 28 28 +335 9 21 +357 0 1 +635 1 0 +504 21 21 +1867 0 1 +743 1 0 +4382 1 0 +5337 8 8 +466 0 2 +487 11 11 +275 141 0 +48 3 97 +1449 214275 3 +195 0 1 +1756 0 1 +223 3 0 +595 0 6 +744 2 0 +332 0 1 +1208 0 9 +290 1 1 +32 1 1 +119 1 1 +51 1 1 +1010 1 1 +19 1 1 +404 39 0 +1322 0 2 +746 14 9 +1769 28 28 +335 93 84 +294 0 1 +635 1 0 +504 1 1 +19 1 1 +1867 2 0 +744 1 0 +4382 1 0 +5811 0 2 +769 234 210 +421 43 43 +502 0 6 +393 0 1 +64 1 3 +192 3 4 +1756 0 1 +223 1 0 +597 0 6 +744 1 0 +333 0 1 +1208 0 7 +443 53 53 +486 5 0 +500 1 1 +38 1 1 +404 39 0 +1322 0 1 +748 14 9 +1769 1 1 +26 1 1 +335 9 4 +374 0 1 +635 1 0 +504 21 21 +885 12 11 +971 0 3 +741 1 0 +4382 3 0 +2716 0 4 +3091 0 2 +487 11 11 +276 1 7 +21 2 0 +37 2 0 +20 2 0 +18 0 2 +36 33 3 +986 0 6 +443 2 0 +209 3 5 +1027 24 24 +927 0 1 +551 18 0 +427 0 4 +104 121 121 +1169 1 1 +26 1 1 +279 0 9 +97 25 1 +967 1 0 +20 1 1 +1982 0 1 +4338 0 1 +958 8 0 +540 1 1 +58 1 1 +4277 0 1 +5236 27 25 +5137 0 2 +258 1 0 +4002 0 1 +1005 0 1 +1137 1 0 +24 1 1 +1252 0 1 +6769 1 0 +552 2 1 +56 41 41 +281 33 33 +414 8 0 +2695 0 1 +5231 1 0 +2795 0 6 +563 5 0 +51 1 1 +2239 0 3 +481 0 2 +2364 1 1 +45 1 1 +1065 1 0 +845 4 0 +5732 1 1 +22 1 1 +3110 0 1 +3021 0 1 +2122 0 1 +528 0 1 +580 0 3 +1047 2 0 +1348 0 1 +1467 1 0 +3833 1 0 +684 0 1 +1401 0 4 +1965 1 0 +319 0 2 +2748 0 2 +1493 1 0 +864 1 0 +7784 0 8 +7669 1 1 +39 1 1 +1027 1 0 +316 1 0 +1915 0 1 +2115 2 2 +29 1 1 +5241 1 1 +56 1 1 +717 0 1 +819 12 0 +11847 0 1 +1257 1 0 +1487 1 0 +1802 42 0 +1012 0 1 +1883 8 4 +1706 1 0 +4124 3 3 +49 1 1 +2913 0 1 +812 0 1 +422 2 2 +117 1 1 +1643 1 1 +205 1 1 +3423 1 1 +48 2 0 +1764 1 0 +2299 1 0 +2721 3 0 +7734 1 0 +20 1 1 +3025 0 4 +2558 0 1 +177 0 1 +147 0 1 +390 0 1 +296 0 1 +5572 0 1 +45 1 1 +805 1 1 +23 1 1 +964 0 2 +1291 1 0 +382 1 1 +194 1 1 +1512 1 1 +44 1 1 +311 0 1 +219 0 20 +4721 0 1 +238 0 1 +466 0 1 +1349 4 0 +42 1 1 +3963 5 0 +15957 2 0 +1073 0 1 +5106 11 0 +6424 2 0 +701860 0 1 +2328536 0 1 +9170664 0 1 +806742 0 1 +2136605 1 0 +1061918 0 1 +1263306 0 1 +202809 0 1 +5497414 3 0 +211 15 0 +1118 4 1 +2572 0 1 +408 0 31709 +1984213 3 4 +101456 0 1 +21290 0 1 +35363 6 0 +4489 1 1 +46 1 1 +831 1 0 +181 1 0 +145 1 0 +2181 0 2 +251 1 0 +21 1 1 +4285 1 0 +559 1 0 +92 1 1 +1586 1 0 +1140 1 0 +172 1 0 +774 0 1 +1127 1 1 +40 2 0 +371 1 1 +23 1 1 +328 22 22 +361 6 0 +2013 220 5731 +2947 1 0 +264 0 307 +536 6 0 +489 0 2 +211 51251 28 +246 8 8 +74 285 288 +52 8038 7804 +585388 0 1 +711729 0 4 +427 1 1 +22 0 3 +244 0 2 +973 7 7 +1425 1 1 +37 1 1 +3845 1 1 +20 1 1 +2525 22 0 +1365 0 1 +177 1 1 +44 1 1 +2157 13 13 +2078 0 1 +2336 1 0 +30 0 1 +15 0 1 +3363 0 1 +68 5 21 +2318 7 14 +444 2 2 +46 1 1 +42 0 1 +4195 0 2 +1801 21 0 +7135 0 1 +883 1 1 +46 0 1 +4310 1 3 +708 0 2814 +370 1 1 +38 1 1 +235 1 0 +6389 0 37 +516 0 16 +1375 1 0 +137 3 0 +3331 0 1 +957 1 1 +38 1 1 +813 0 2 +140 7 7 +185 9 9 +1463 1 0 +2764 10 11 +640 1 1 +132 1 1 +64 0 2 +1294 4 4 +56 3 3 +158 0 1 +6 1 0 +38 1 0 +189 0 2 +644 13 14 +840 1 1 +62 2 0 +63 0 2 +36 13 1 +17 20 0 +11 1 0 +1055 1 0 +4104 1 1 +118 1 1 +1086 0 1 +21 1 1 +182 1 1 +40 4 7 +54 0 1 +38 1 1 +96 18 18 +83 1 1 +52 1 1 +2033 12 12 +1806 1 0 +1216 0 1 +1565 1 1 +109 3 0 +1712 0 2 +391 4 0 +4315 3 0 +1314 0 3 +2664 2 0 +1774855 1 0 +378444 0 1 +1186651 0 1 +1124589 0 1 +1352359 0 1 +688497 0 387 +1722178 0 1 +1320109 0 1 +3076357 0 1 +12834833 0 1 +226008 0 1 +114726 1 0 +168862 1 0 +562270 0 1 +17166 1 0 +234038 4 218 +2262 1 0 +496034 0 1 +703067 1 0 +168435 100000 55570 +1594 7 5 +21 1 1 +1340 0 1 +4553 0 1 +6037 0 2 +6737 1 1 +43 1 1 +754 1 1 +43 1 0 +4 352 0 +35 1 0 +4 255 0 +53 1 0 +4320 0 1 +6087 0 1 +4348 2 0 +1000 0 8 +14695 0 1 +4456 0 1 +15844 1 0 +4713 0 28 +4508 0 2 +26882 0 2 +8313 0 2 +1793 1 0 +1869 4 0 +75 0 12 +412 1 0 +2400 12 12 +1416 0 1 +18821 0 1 +10960 0 1 +5504 1 0 +871 15 15 +1811 0 1 +1191 1 1 +54 1 1 +139 0 67 +185 1 0 +7954 9 9 +273 0 2 +2006593 1 0 +28177 1 0 +46956 0 1 +289058 0 1 +42228 0 1 +69163 13 14 +18281 0 1 +14622 0 1 +19272 0 1 +345463 0 1 +539762 0 1 +566274 0 1 +344536 1 0 +333331 0 2 +5638 0 1 +20005 0 1 +1227971 0 1 +671169 0 1 +925365 0 1 +594636 1 0 +843555 25000 9947 +298664 1 0 +2231180 2 0 +3747 16 0 +2314 1 0 +2442 21 21 +5527 1 0 +11312 0 1 +1928 0 1 +488 0 1 +4110 1 0 +1422 0 1 +1578 15 13 +6845 1 0 +4607 10 12 +905 12 0 +918 1 0 +1645 0 2 +2117 1 1 +21 1 1 +2432 13 13 +878 0 1 +346 14 14 +83 0 1 +108 12 12 +1134 0 2 +164 1 0 +1524 14 0 +306 1 1 +43 1 1 +6066 1 1 +24 1 1 +363 1 0 +54 11 29 +542 1 1 +63 1 1 +2637 0 1 +127 0 1 +928 0 1 +1166 0 2 +784 4 0 +170 0 1 +939 2 0 +5070 1 1 +29 1 1 +1393 15 13 +61 15 15 +3615 3 0 +1866 0 9 +45 1 1 +1135 1 1 +22 1 1 +1057 3 1 +2130 1 1 +38 1 1 +1793 0 1 +1460 0 1 +185 6 0 +143 0 1 +826 11 11 +3997 2 0 +5781 1 0 +1733 10 0 +317 0 1 +560 0 4 +1588 0 2 +1544 1 0 +2872 1 1 +83 1 1 +638 1 1 +16 1 1 +255 1 1 +48 1 1 +71 1 1 +45 1 1 +321 1 1 +117 1 1 +67 278046 270363 +11584 1 1 +28 1 1 +134 2 0 +5406 0 12 +223 0 1 +6267 1 1 +20 5 0 +1570 0 1 +2094 0 10 +915 1 1 +25 1 1 +2485 1 1 +20 1 1 +9986 5 5 +225 5 0 +149 331 0 +1372 1 1 +35 1 1 +464 11 10 +615 0 2 +17 1 1 +337 1 1 +21 1 1 +843 6 6 +10233 1 1 +27 1 1 +2028 1 7 +37 1 1 +1262 1 0 +2138 0 5 +2182 15 15 +1214 0 3 +32 1 1 +2132 0 5 +1853 1 1 +20 0 1 +531 0 1 +22 1 1 +1659 1 1 +45 1 1 +3564 1 0 +2303 9 10 +2292 1 1 +48 1 1 +3920 1 0 +272 15 15 +569 0 4 +2976 2 4 +993 20 0 +1281 6 0 +307 1 1 +21 1 1 +2527 1 1 +78 1 1 +661 0 5 +2682 1 0 +876 1 1 +24 1 1 +479 0 2 +3065 0 1 +371 0 2 +31 1 1 +572 16 16 +1725 16 16 +651 1 1 +27 1 1 +2483 31 3 +175 1 0 +20 1 1 +3673 1 1 +27 0 4 +3021 0 1 +1827 13 13 +1618 0 2 +5282 1 0 +150 6 6 +3565 0 1 +1297 5 0 +2918 1 1 +48 1 1 +55 12 12 +5997 13 13 +2646 0 4 +3146 16 16 +82 1 1 +27 1 1 +566 2 0 +5401 1 1 +28 1 1 +801 0 1 +671 1 1 +17 1 1 +390 1 1 +28 1 1 +84 7 7 +380 12962 13000 +4029 0 1 +1191 18 10143 +15289 11 10 +2500 1 0 +8855 1 1 +30 1 1 +1913 0 1 +1905 0 1 +1579 0 2 +1321 1 0 +374 1 3 +25 2 0 +48 28 0 +28 60 0 +2592 0 1 +395 10 10 +212 0 3 +854 0 1 +1175 1 1 +45 1 1 +198 16 21 +596 1 1 +39 1 1 +1067 1 1 +138 0 1 +6 0 14 +71 2 0 +21 21 1 +44 5 1 +589 1 1 +49 1 1 +1189 0 1 +48 1 1 +628 1 1 +23 1 1 +407 1 0 +652 0 1 +955 1 1 +45 2 0 +287 0 1 +565 0 8 +2627 0 1 +1350 0 2 +1391 1 1 +49 1 1 +629 0 1 +566 1 1 +16 1 1 +2729 2 0 +5843 0 2 +177 3 0 +543 0 5 +5143 0 3 +4589 1 1 +43 0 2 +9330 8 8 +410 0 8 +8872 2 0 +7 5 0 +765 1 0 +948 4 4 +349 9 10 +66 6 0 +42 1 1 +390 2 24 +6 4 0 +29 7 363 +17 11 7 +19 57 6 +12 8 0 +9 28 0 +24 26 11 +33 1 1 +98 0 16 +433 4 0 +2369 5 0 +55 1 317 +321 1 0 +4082 0 1 +862 1 0 +4367 1 3 +1929 1 0 +562 0 1 +6721 4 0 +2279 10 10 +1774 2 1 +3116 1 1 +22 1 1 +2397 1 1 +16 1 1 +1843 0 76 +6640 2 0 +9089 0 10 +7270 1 1 +46 1 1 +23087 4 8 +859 2 1 +522 1 2 +7176 1 0 +10183 1 0 +9210 2 0 +42549 14 0 +9259 0 4 +32869 0 10 +92 6 0 +567539 50000 50000 +2399164 0 1 +3124805 0 1 +504439 0 1 +2891 0 1 +47470 0 1 +38522 1 0 +564035 0 1 +634678 0 1 +178782 0 1 +653588 0 1 +2724362 100000 5375 +754529 1 1 +45 1 1 +1486 18 18 +173 145 1 +139 65 1 +41 16 0 +32 368 0 +44 2 50 +40 1 1 +95 52 4 +60 8 39 +12 0 16 +93 0 16 +1591 1 0 +897 13 13 +28 3 3 +2454 1 1 +44 1 1 +305 468 0 +2026 1 1 +45 1 1 +1276 0 8 +1717 0 1 +1575 4 0 +14 1 1 +2428 0 36 +50 10 154 +247 185 6 +2096 11 13 +192 1 1 +48 1 1 +130 1 1 +22 1 1 +970 1 1 +22 0 4 +76 14 0 +118 11 17 +154 1 0 +12 1 1 +53 5 15 +48 1 1 +47 2 0 +114 16 18 +363 1 1 +43 1 1 +559 1 1 +32 1 1 +234024 0 1 +1971540 0 1 +4087 0 1 +1130745 0 1 +443485 1 0 +20851 0 1 +32020 0 1 +4424 0 1 +28815 1 0 +35111 0 1 +64442 1 0 +10460 + +chain 16864051 7 159138663 + 142098195 142276197 chr7_KI270803v1_alt 1111570 - 594223 772223 383 +134968 1 0 +595 1 1 +39 1 1 +389 0 2 +843 1 0 +1674 1 1 +23 0 2 +165 0 1 +11672 5 12 +17 7 0 +898 1 0 +26 1 1 +1414 1 1 +49 1 1 +539 1 1 +25 1 1 +669 1 1 +42 1 1 +134 7 7 +1341 2 1 +940 0 1 +1594 10 0 +581 4 0 +41 0 2 +2140 8 8 +1228 0 2 +5307 0 3 +5272 0 3 +3588 1 1 +69 1 1 +1662 + +chain 9936377 7 159138663 + 74765724 74938835 chr7 159345973 - 84281094 84433200 370 +533 0 1 +2090 1 0 +3052 0 1 +1104 211 0 +4 1494 0 +2176 1 1 +33 1 1 +6200 0 1 +383 3 1 +1011 0 2 +2751 0 1 +639 1 1 +55 1 1 +2955 0 1 +515 1 1 +70 1 1 +53 0 4 +8143 3 0 +9611 0 7 +935 0 57 +8044 4 0 +967 0 1 +1724 4 2 +2459 2 0 +4820 2 1 +4830 2 0 +4111 10 0 +1708 0 1 +348 0 2 +598 14 14 +2298 7 9 +1270 0 1 +298 0 1 +109 2 0 +848 1 0 +601 0 1 +4090 3 0 +4 1 0 +17 1 1 +285 0 1 +1792 18 20 +1796 0 6 +1113 1 1 +46 1 1 +139 0 2 +39 8 0 +838 2 0 +30 1 1 +584 153 68 +826 9 9 +208 0 38 +992 42 42 +63 45 45 +963 0 4 +674 21 20 +645 45 45 +905 81 81 +1685 1 0 +1737 0 4 +94 36 36 +650 1 0 +840 101 73 +531 0 1 +731 24 11 +1191 0 1 +287 19 20 +923 0 2 +381 26 29 +433 15 14 +594 32 34 +261 51 51 +998 1 0 +305 1 2 +2458 0 2 +292 0 1 +1316 22 22 +56 18 21 +367 9 7 +78 16 16 +1370 16 0 +239 43 55 +239 46 46 +207 2 0 +590 1 3 +610 1 1 +25 1 1 +149 0 4 +2417 1 1 +27 2 2 +263 0 2 +459 11 0 +49 0 22 +180 0 1 +18 0 4 +31 0 8 +62 0 18 +49 0 4 +56 1 1 +755 0 928 +454 1 2 +46 0 4 +15 4 0 +298 0 2 +343 1 1 +26 0 9 +41 1 1 +76 1 1 +124 2 2 +154 1 1 +19 1 1 +78 1 1 +32 1 1 +421 38 2 +140 1 1 +28 1 1 +1837 0 4 +75 1 1 +645 1 1 +34 1 1 +591 3 0 +15 1 1 +877 0 5 +467 1 1 +29 0 1 +1001 0 16 +659 17 17 +70 17 16 +393 4 0 +74 1 0 +22 1 1 +158 1 3 +116 1 1 +76 1 1 +89 2 0 +197 17 14 +105 0 13 +261 4 0 +1519 1 2 +1052 18 18 +145 38 0 +66 1 1 +167 1 1 +22 1 1 +2059 1 0 +644 0 10 +2646 45 49 +836 33515 13283 +26 + +chain 4938420 7 159138663 + 72477961 75027222 chr7 159345973 - 84016200 86378825 131 +67 1764381 211674 +89 1 1 +39 1 1 +477 11216 11193 +1212 396740 1948816 +27 16510 16518 +41 1909 1997 +33 50 54 +30 2930 2934 +33 14497 14470 +77 73 73 +43 866 866 +75 6805 6799 +28 17081 17094 +196 0 1 +1979 0 2 +257 193118 6871 +1937 1 0 +396 0 2 +1125 30 30 +882 1 0 +991 0 1 +2496 14 14 +2615 1 0 +6582 230 320 +966 0 6 +458 6989 7002 +39 3851 3851 +28 16115 16217 +43 6461 6479 +53 1435 1435 +39 24313 24261 +37 1573 1573 +25 38613 38614 +41 + +chain 3075858 7 159138663 + 61511262 61677020 chr7 159345973 - 97599473 97765231 437 +15609 5151 5151 +324 58786 58786 +172 69198 69198 +16518 + +chain 1856486 7 159138663 + 61820473 61915056 chr7 159345973 - 97068900 97163473 679 +3833 1 1 +16 1 0 +2537 51 42 +4432 21 21 +1580 1 1 +25 1 1 +778 0 3 +2234 9 9 +544 0 2 +593 0 1 +2115 1 0 +1108 1 1 +23 1 1 +5143 11 0 +10074 1 1 +24 1 1 +1295 0 1 +46 1 1 +1880 1 0 +70 0 1 +7579 14167 14168 +166 13139 13140 +178 0 1 +3256 0 3 +525 1 1 +29 1 1 +446 1 1 +42 1 1 +4410 11662 11661 +527 + +chain 1703745 7 159138663 + 61526871 61914529 chr7 159345973 - 97185521 97581973 137 +229 4 4 +296 1 1 +45 4 4 +103 1 1 +43 1 1 +362 1 1 +37 1 1 +1079 1 1 +20 1 1 +721 1 1 +27 1 1 +270 1 1 +199 1 1 +80 1 1 +43 1 1 +310 5 5 +125 14 14 +216 1 1 +44 0 1 +14 2 2 +362 3 3 +10 5 1 +45 1 1 +68 3 1236 +175 1 1 +58 1 1 +113 324 0 +102 1 1 +1566 13 13 +727 1 1 +18 1 1 +1922 1 1 +36 1 1 +527 14 14 +2130 1 1 +25 1 1 +1093 0 3 +9358 8 8 +5943 0 4 +2346 0 2 +7909 1 0 +3992 1 1 +24 1 1 +4005 1 0 +92 1 1 +150 1 1 +12400 1 1 +17 2 0 +879 10 10 +998 1 1 +38 2 0 +487 14 14 +1924 172 0 +1333 1 1 +34 1 1 +2241 1 1 +28 1 1 +6727 16 16 +913 1 1 +37 1 1 +256 1 1 +201 1 1 +133 1 1 +7 1 0 +50 1 1 +286 23 22 +136 10 10 +11327 1 1 +41 1 1 +277 1 1 +35 1 1 +4099 1 1 +84 1 1 +1718 17 17 +2490 1 1 +47 1 1 +9130 1 1 +37 1 1 +815 14 0 +4483 1 1 +41 1 1 +4291 1 1 +47 1 1 +194 1 1 +29 1 1 +6290 1 1 +41 1 1 +3468 0 1 +43 1 1 +3018 1 1 +22 1 1 +2761 1 1 +34 1 1 +1159 1 1 +41 1 1 +419 5 0 +214 206003 207605 +125 0 173 +258 0 1 +23 1 1 +248 1 1 +19 1 1 +484 0 2 +171 8 8 +336 1 1 +19 1 1 +141 4 4 +62 1 1 +103 1 1 +27 1 1 +297 1 1 +85 1 0 +125 1 1 +67 2 2 +30 1 1 +291 2 2 +122 1 1 +110 1 1 +24 4 4 +60 7 7 +56 12 12 +498 12 12 +678 1 1 +15 1 1 +227 10 10 +1446 1 1 +43 1 1 +913 1 1 +32 1 1 +829 0 1 +3118 1 0 +32 1 1 +1176 4 4 +184 1 1 +80 0 2 +81 1 1 +614 0 1 +497 4 4 +73 1 0 +254 166 0 +35 1 1 +1868 1 1 +31 1 1 +109 1 1 +30 1 1 +741 1 1 +19 1 1 +378 1 1 +67 1 1 +329 1 1 +58 1 1 +568 20 20 +95 1 1 +37 1 1 +52 0 3 +504 16 16 +75 1 1 +92 1 1 +174 1 1 +56 1 1 +164 1 1 +32 4 0 +557 13 14 +58 6 6 +51 1 1 +17 1 1 +191 1 1 +35 1 1 +920 2 0 +668 1 1 +25 1 1 +850 1 0 +236 1 0 +441 1 1 +27 1 1 +66 1 1 +38 1 1 +178 1 1 +32 1 1 +265 22 22 +404 1 1 +23 1 1 +297 4 4 +28 1 1 +240 1 1 +121 1 1 +721 1 1 +166 1 1 +66 1 1 +23 1 1 +213 1 1 +50 10 10 +166 1 1 +57 1 1 +42 1 1 +211 8890 8548 +214 1 1 +21 0 1 +34 1 1 +73 1 1 +101 1 1 +75 1 1 +121 1 1 +86 1 1 +107 13 0 +16 1 1 +227 1 0 +3799 1 1 +29 1 1 +272 0 6825 +91 1 1 +49 1 1 +371 18 18 +1035 16 16 +116 1 1 +50 1 1 +966 1 1 +31 4 4 +1160 5 5 +30 1 1 +547 1 1 +37 1 1 +279 12 12 +80 1 1 +27 1 1 +792 11 9 +726 + +chain 918294 7 159138663 + 142367396 142528021 chr7_KI270803v1_alt 1111570 + 662116 853313 123 +12 0 1 +319 108121 108146 +10534 8 20426 +2420 39095 49223 +28 28 28 +60 + +chain 391608 7 159138663 + 74860286 74986933 chr7 159345973 - 86183654 86310605 604 +45 905 905 +81 3517 3517 +36 1566 1600 +26 4087 4089 +26 1335 1344 +51 7562 7569 +42 240 244 +46 8108 8128 +33 10775 10736 +38 5617 5622 +36 836 836 +188 0 1 +2527 0 1 +357 2 1 +474 3459 3440 +30 13582 13579 +59 60894 61177 +67 + +chain 38012 7 159138663 + 64722835 64723352 chr20 64444167 + 4031884 4032441 186214 +407 70 110 +40 + +chain 37410 7 159138663 + 72273082 72273908 chr7 159345973 + 67019504 67020338 4444464 +63 242 250 +143 45 45 +68 86 86 +51 4 4 +124 + +chain 26426 7 159138663 + 64718856 64719138 chr9 138394717 - 49435700 49435982 7951049 +282 + +chain 26047 7 159138663 + 100614016 100614287 chrX 156040895 + 45216629 45216900 8165766 +271 + +chain 17875 7 159138663 + 74223818 74224006 chrX 156040895 + 92475005 92475193 14776950 +188 + +chain 14990 7 159138663 + 72789004 72789160 chr7 159345973 + 73375010 73375166 16591751 +156 + +chain 14762 7 159138663 + 100606193 100606348 chr7 159345973 + 100963148 100963303 19339393 +155 + +chain 14326 7 159138663 + 74855645 74855798 chr7 159345973 - 86179072 86179165 22963 +53 94 34 +6 + +chain 13657 7 159138663 + 74953999 74954145 chr7 159345973 - 86249361 86249503 1572 +24 2 0 +36 2 0 +82 + +chain 11033 7 159138663 + 155133717 155133867 chr7 159345973 + 155341204 155341354 4022711 +150 + +chain 7603 7 159138663 + 100606043 100606122 chr7 159345973 + 100962998 100963077 35094578 +79 + +chain 7544 7 159138663 + 130276053 130276308 chr1 248956422 - 172844206 172844334 2017207 +26 196 69 +33 + +chain 6817 7 159138663 + 74711651 74711723 chr7 159345973 - 86277341 86277498 2431 +1 0 43 +10 0 2 +52 0 40 +9 + +chain 5921 7 159138663 + 155127373 155127435 chr7 159345973 + 155335535 155335597 40051175 +62 + +chain 5707 7 159138663 + 155133639 155133717 chr7 159345973 + 155341204 155341282 4050020 +78 + +chain 5649 7 159138663 + 61510793 61510853 chr22 50818468 + 15765317 15765377 41031821 +60 + +chain 5321 7 159138663 + 64718577 64718696 chr2 242193529 - 106918319 106918438 8546011 +119 + +chain 5238 7 159138663 + 155133561 155133639 chr7 159345973 + 155341204 155341282 4140044 +78 + +chain 4904 7 159138663 + 64718776 64718854 chr22 50818468 + 30060084 30060162 10757975 +78 + +chain 4272 7 159138663 + 65105916 65107486 chr7 159345973 - 93784350 93785920 739 +43 1498 1498 +29 + +chain 3996 7 159138663 + 74857833 74857875 chr7 159345973 + 75227909 75227951 20032 +42 + +chain 3694 7 159138663 + 130276177 130276253 chrX 156040895 + 41211745 41211821 2952748 +76 + +chain 3199 7 159138663 + 64718375 64718408 chr13 114364328 - 93177612 93177645 44285909 +33 + +chain 3136 7 159138663 + 155133873 155133906 chr7 159345973 + 155341204 155341237 3936927 +33 + +chain 2837 7 159138663 + 155133483 155133522 chr7 159345973 + 155341282 155341321 6714537 +39 + +chain 2525 7 159138663 + 155133522 155133561 chr7 159345973 + 155341243 155341282 4734264 +39 + +chain 2271 7 159138663 + 64722750 64722801 chr16 90338345 - 85134536 85134587 1342764 +51 + +chain 2208 7 159138663 + 155127213 155127236 chr7 159345973 + 155335615 155335638 45204274 +23 + +chain 2170 7 159138663 + 64722810 64722835 chr22 50818468 + 42980497 42980522 593774 +25 + +chain 1463 7 159138663 + 74315726 74315768 chr7 159345973 - 59018916 59018958 1683 +42 + +chain 1037 7 159138663 + 130275780 130275833 chrX 156040895 - 113755212 113755265 3138246 +53 + +chain 777 7 159138663 + 74711723 74711792 chr7 159345973 - 82303093 82303174 1729 +22 0 12 +47 + +chain 708 7 159138663 + 130276104 130276140 chr16 90338345 - 31941534 31941570 3904522 +36 + +chain 643 7 159138663 + 130275748 130275780 chr2 242193529 - 216470223 216470255 3286204 +32 + +chain 635 7 159138663 + 74857938 74857968 chr7 159345973 + 100266629 100266659 1860 +30 + +chain 473 7 159138663 + 130275927 130275994 chr3 198295559 - 85248917 85248984 1859079 +67 + +chain 360 7 159138663 + 61510920 61510970 chrX 156040895 + 58466378 58466428 38371501 +50 + +chain 313 7 159138663 + 64718303 64718357 chr14 107043718 + 94658026 94658080 3795574 +54 + +chain 174 7 159138663 + 74318716 74318756 chr7 159345973 + 73074297 73074337 827 +40 + +chain 161 7 159138663 + 75122782 75122824 chr7 159345973 - 82803929 82803971 1118 +42 + +chain 17312866 GL000195.1 182896 + 0 182896 chrUn_GL000195v1 182896 + 0 182896 371 +182896 + +chain 13497911059 8 146364022 + 10000 146304022 chr8 145138636 + 60000 145078636 9 +1221986 0 2 +60 0 38 +110 0 39 +144 6 312 +10 0 231 +2888 1 1 +43 1 1 +1055 1 1 +41 1 1 +168 4 0 +73 0 4 +74 5 0 +49 1 1 +158 0 11 +27 2 0 +77 0 554 +58 10 573 +5041 0 4 +925 1 1 +33 1 1 +77 17 16 +2555 0 2 +268 42 0 +30 1 1 +115 1 45 +143 3 0 +31 1 1 +2159 1 1 +28 5 3 +100 17 17 +1066 0 2 +846 0 100 +926 1 1 +87 1 5 +2654 11 0 +712528 0 5 +6239 2 0 +4758 11 8 +1899 0 1 +729 0 1 +213 3 25 +3107 1 1 +18 1 1 +2264 13 2 +400 11 9 +1647 1 1 +18 4 0 +210 1 2 +76 14 14 +260 1 9 +23 1 1 +298 1 1 +22 1 1 +646 0 34 +141 1 1 +41 1 1 +581 1 1 +117 1 1 +1338 1 1 +36 1 1 +713 0 1 +1926 1 1 +36 1 1 +2323 0 1 +75 1 1 +2295 4 0 +6820 3 0 +2292 6 6 +460 0 1 +3037 1 1 +26 1 1 +3924 0 1 +4264 1 0 +234 12 52 +444 6 6 +3609 10 10 +943 1 0 +3134 1 1 +47 1 1 +517 52 0 +310 1 1 +39 1 1 +1035 0 1 +946 63 0 +49 15 78 +1987 1 1 +89 2 0 +23 3 1 +15 0 135 +51 214 12 +50 1 321 +51 1 26 +65 0 27 +18 1 55 +582 1 1 +19 1 1 +1956 1 1 +18 5 5 +136 1 0 +97 60 15 +1789 4 0 +910 1 1 +17 1 1 +135 1 0 +682 0 1 +1568 13 0 +2191 1 1 +62 1 1 +182 1 1 +28 1 1 +268 12 12 +895 2 12 +357 1 1 +22 1 1 +740 16 16 +334 1 1 +68 1 1 +488 0 93 +40 53 0 +873 1 1 +19 1 1 +486 9 9 +4844 1 1 +23 1 1 +281 1 0 +295 1 1 +40 1 1 +516 1 1 +51 1 1 +7582 19 18 +936 2 0 +818 0 4 +315 0 1 +3415 84 0 +4923 0 1 +2150 117 1 +1797 1 1 +29 1 1 +2059 0 1 +7306 0 66 +1380 3 1 +1681 2 0 +665 0 1 +4310 1 1 +31 1 1 +576 0 1 +2905 2 1 +275 1 1 +32 1 1 +456 17 17 +1078 1 1 +25 1 1 +319 1 1 +36 1 1 +124 2 0 +111 1 1 +17 1 1 +110 2 0 +728 1 1 +48 1 1 +611 1 1 +115 0 1 +350 11 11 +204 3 0 +11 1 1 +2857 0 5 +6043 0 2 +38 1 1 +2532 1 1 +21 1 1 +4803 1 1 +12 0 4 +553 1 1 +31 1 1 +147 11 11 +160 16 0 +262 0 7 +20 1 1 +394 18 18 +80 1 1 +40 1 1 +650 13 13 +181 264 0 +342 1 1 +26 1 1 +63 1 1 +32 0 1 +614 1 1 +42 0 1 +409 1 1 +48 1 1 +1058 3 3 +142 1 1 +249 1 1 +15 1 1 +824 1 1 +28 1 0 +477 12 0 +3700 1 7 +2895 1 1 +36 1 1 +351 1 1 +63 1 1 +534 0 1 +41 1 1 +993 5 5 +3955 0 654 +29 0 30 +121 8 8 +115 20 0 +190 0 1 +5206 22 0 +2634 8 8 +684 86 0 +4227 9 5 +4459 28 0 +2345 1 1 +45 1 1 +113 0 4 +2493 1 0 +21 1 1 +185 1 1 +28 1 2 +1124 2 0 +1370 1 1 +55 0 1 +1385 1 0 +819 8 8 +1069 0 1 +3927 4 4 +3447 1 1 +95 1 1 +2798 1 1 +85 1 1 +625 0 1 +1739 92 0 +3062 1 1 +37 2 0 +1627 0 3 +169 2 0 +152 0 1 +61 4 4 +1559 1 1 +114 0 1 +299 2 2 +32 1 1 +267 1 1 +17 1 1 +54 1 1 +78 1 1 +391 1 1 +43 3 3 +101 15 15 +664 1 1 +37 4 0 +259 1 1 +20 1 1 +61 1 0 +280 1 1 +133 1 1 +152 1 1 +28 1 1 +111 1 1 +32 0 2 +34 1 1 +188 1 1 +34 1 1 +72 0 1 +468 1 1 +41 1 1 +229 11 11 +30 183 0 +72 0 63 +671 5 5 +101 1 1 +34 1 1 +1272 1 1 +44 1 1 +560 1 1 +102 1 1 +57 39 1 +56 0 38 +58 2 116 +75 1 191 +18 4 4 +81 0 1 +39 0 1861 +224 8 8 +202 1 1 +136 1 1 +356 0 1 +3400 71 0 +5299 0 2 +501 7 7 +111 1 1 +23 1 1 +238 2 3 +1092 0 1 +20 4 4 +165 1 1 +42 1 1 +107 10 10 +535 1 1 +20 8 0 +133 0 1 +135 1 1 +75 1 1 +95 1 1 +190 1 1 +50 1 1 +49 1 1 +78 1 1 +53 1 1 +99 30 30 +243 2 2 +35 1 1 +94 1 1 +82 1 1 +332 30 30 +130 3 3 +22 1 1 +53 38 38 +80 2 2 +17 3 3 +303 3 3 +40 1 1 +83 1 1 +30 1 1 +118 1 1 +94 1 1 +339 1 1 +36 1 1 +80 1 1 +43 1 0 +22 1 15 +272 1 1 +33 1 1 +406 1 1 +44 1 1 +79 1 1 +34 1 1 +942 13 13 +588 5 0 +1027 10 11 +360 174 0 +65 80 78 +14 19 23 +58 1 1 +160 87 0 +549 1 0 +47 1 1 +674 7 7 +239 1 1 +48 1 1 +71 10 10 +51 21 15 +2467 12 0 +3815 0 1 +11096 17 17 +18610 7 7 +4052 16 16 +545 1 1 +29 1 1 +226 8 8 +4007 0 3 +2166 4 4 +4487 0 4 +760 12 0 +9137 1 0 +5688 1 1 +18 5 5 +136 1 1 +265 9 0 +94 5 5 +63 2 2 +59 4 4 +116 1 1 +107 1 1 +142 1 1 +36 5 5 +126 0 4 +15 12 16 +24 1 0 +28 4 8 +79 1 1 +262 6 6 +322 1 1 +21 1 1 +488 10 6 +42 1 1 +385 1 1 +80 1 1 +1247 0 6 +82 1 1 +37 1 1 +136 35307 35212 +55 1 1 +24 1 1 +1035 1 0 +12 1 1 +2886 0 10 +18 1 1 +537 81 88826 +130 1 39 +44 0 76 +65 0 76 +57 1 1 +101 2 2 +1741 16 16 +336 0 18 +572 32 123 +50 11 11 +229 1 1 +41 1 1 +469 1 0 +23 0 1 +20 1 1 +4564 9 0 +862 2 0 +312 1 1 +49 1 1 +981 0 4 +2606 4 4 +168 1 1 +26 1 1 +1523 8 0 +1612 2 0 +5411 1 1 +32 1 1 +103 1 1 +26 1 1 +318 1 1 +43 1 1 +295 1 1 +28 1 1 +147 1 1 +130 1 1 +367 1 1 +33 0 2 +706 1 1 +64 1 1 +1704 1 1 +45 1 1 +269 1 1 +51 1 1 +955 1 1 +34 0 1 +135 1 1 +33 1 1 +2354 1 1 +26 1 1 +15434 20 7 +18 1 1 +10269 10 10 +172 1 1 +33 1 1 +1295 1 0 +1600 1 1 +42 1 1 +461 0 2 +921 1 0 +58 1 1 +206 10 10 +353 7 7 +950 1 1 +43 1 1 +1882 0 4 +1294 0 1 +62 0 2 +3931 0 26 +546 0 1 +23546 0 2 +18328 1 0 +24897 0 1 +8704 0 4 +1221 2 0 +4823 17 0 +24 0 2 +19 0 2 +7 1 0 +5 365 0 +281 1 0 +427 1 1 +22 1 1 +1117 4 0 +513 20 20 +424 1 1 +84 1 1 +174 1 0 +697 15 15 +233 4 0 +42 4 0 +50 14 4 +1841 1 0 +33 1 1 +5127 0 1 +348 1 0 +119 1 0 +1347 2 0 +416 1 0 +5175 1 0 +1026 0 2 +106 1 0 +495 1 1 +63 1 1 +330 1 1 +20 1 1 +109 12 0 +382 1 0 +842 1 1 +39 1 1 +2834 8 0 +4110 1 1 +65 1 1 +3508 4 4 +144 0 1 +4339 1 1 +31 1 1 +717 1 1 +29 0 8 +32 1 1 +171 10 10 +378 9 9 +930 4 0 +187 13 13 +1454 1 0 +731 1 2 +5869 0 4 +5967 1 0 +349 1 1 +30 1 1 +726 1 1 +33 0 8 +1332 0 2 +382 0 3 +133 1 1 +80 1 1 +338 0 1 +6746 5 0 +4137 2 0 +179 1 1 +17 1 1 +511 1 1 +37 1 1 +2310 0 1 +364 2 1 +5000 0 1 +3484 33 7 +21 2 0 +460 3 1 +231 1 1 +30 1 1 +4719 4 0 +953 1 0 +308 2 0 +6130 0 5 +3916 14 14 +596 1 1 +38 1 1 +619 1 0 +1993 8 0 +85 1 1 +935 10 10 +164 0 1 +1842 0 1 +584 1 1 +16 1 1 +1296 1 1 +47 1 1 +685 13 13 +1715 5 14 +465 5 5 +23 1 1 +2838 0 3 +6939 3 2 +4469 16 19 +2790 8 0 +3031 1 1 +35 0 2 +332 7 7 +1382 1 1 +37 1 1 +3610 1 0 +4037 5 0 +30886 1 3 +6287 0 14 +36 0 4 +7232 4 0 +3355828 0 1 +654952 1 0 +801271 50000 50000 +651738 0 6 +58481 0 6 +2788931 0 1 +1068055 50000 50000 +6094558 1 0 +891304 1 0 +2377046 1 0 +197680 0 1 +264257 1 0 +4 1 0 +2844356 1 0 +45480 1 0 +194808 1 0 +1471397 1 0 +2911594 0 1 +914287 1 0 +272205 0 1 +1761128 1 0 +14675 1 0 +95669 1 0 +41313 0 1 +3858914 1 1 +22 1 1 +2434619 1 0 +2690772 0 1 +851496 19 19 +5413 2 0 +2075 1 0 +565 2 0 +406 0 2375 +52 0 7 +40 0 2 +17 0 2 +1879 4 0 +793 0 1 +1090 1 0 +709 0 1 +929 1 1 +40 1 1 +613 3 0 +1454778 3000000 1943521 +1036947 1 0 +254664 5100 4131 +54306 0 5 +778 1 0 +2298 1 0 +21967 1 1 +28 1 1 +169 1 1 +26 1 0 +51 1 5 +167 0 1 +75 3 1 +87 0 1 +6 17 23 +41 1 0 +46 1 1 +55 19 19 +56 14116 14115 +56 19 19 +55 1 1 +46 0 1 +41 23 17 +6 1 0 +87 1 3 +79 1 0 +163 5 1 +51 0 1 +26 1 1 +79 1 1 +34 1 1 +54 1 1 +40 7 8 +158 10 10 +13589 0 23 +10339 1 0 +20871 1 0 +5144 0 4 +21341 1 0 +3985 0 5 +11613 2 0 +357397 0 1 +130566 0 1 +801748 0 1 +942241 1 0 +1423763 1 1 +41 1 1 +4432302 0 1 +7692815 0 1 +587738 0 1 +1073297 1 323 +9601287 10 10 +11807 1 1 +25 1 1 +504 1 1 +45 1 1 +2259234 1 0 +999010 0 1 +7495135 0 6 +449624 150000 50000 +800240 0 1 +1593817 1 0 +1520630 0 1 +392975 6 6 +3050612 1 0 +165185 0 1 +2854846 1 1 +30 1 1 +12052901 1 0 +7254815 0 1 +57032 0 1 +69168 1 1 +33 1 1 +90413 1 1 +39 1 1 +72147 0 1 +10487 1 0 +18879 0 1 +177571 0 1 +280056 4 6 +28994 21 0 +7771 0 2 +2823 1 0 +19 1 1 +322 2 0 +3787 1 0 +2666 0 10 +327 14 15 +2882 2 0 +356 2 0 +10 1 1 +2967 1 0 +2014 1 3 +1085 0 1 +510 1 1 +16 1 1 +514 1 1 +15 1 1 +505 4 4 +966 1 0 +9494 0 1 +1082 5 5 +18 1 0 +29 1 0 +29 1 0 +4147 0 1 +1477 5 4 +8 1 0 +27 0 1 +31 9 9 +1314 1 1 +92 2 4 +25 0 1 +24 0 1 +16 6 0 +8 10 18 +622 0 1 +9594 1 1 +32 1 1 +11500 3 1 +136 19 19 +4655 1 1 +17 1 1 +538 0 1 +6234 1 0 +30 1 0 +45 1 0 +1389 0 2 +6423 1 0 +15 1 0 +38 1 0 +283221 1 0 +1165425 1 1 +51 1 1 +1465960 1 0 +783566 0 1 +422740 1 0 +1420764 0 1 +1067361 1 0 +1130076 1 0 +700444 1 0 +823148 2 0 +687301 1 0 +1097748 1 0 +34866 0 1 +338719 1 0 +3341262 1 0 +1512600 1 0 +8841 0 1 +13063 0 1 +158421 1 1 +21 1 1 +51444 0 1 +278031 0 1 +3232 1 1 +36 1 1 +31540 1 1 +16 1 1 +8034 5 5 +62011 0 1 +186919 4 4 +4979297 7 7 +947217 1 0 +86921 0 1 +485078 1 0 +66385 0 3 +1310 42 0 +8083 1 1 +36 1 1 +440 0 6 +1272 1 0 +1060 0 1 +7 4 0 +18 26 0 +18 4 0 +323 0 16 +5329 3 0 +1748 1 1 +32 1 1 +2171 1 1 +41 1 1 +1294 54 0 +54 0 27 +54 108 0 +1588 3 2300 +423 1 1 +64 1 1 +354 0 13 +482 2 0 +605 12 12 +249 1 0 +603 79 0 +2435 1 0 +927 13 13 +2260 1 1 +88 1 1 +285 1 1 +38 12 0 +38 0 4 +1683 1 1 +21 1 1 +1190 1 1 +48 1 1 +2912 0 4 +567 10 10 +660 0 1 +1903 1 0 +3896 1 1 +42 1 1 +2798 0 2 +1760 2 0 +2281 1 0 +1980 1 1 +31 1 1 +710 4 4 +665 0 1 +1152 1 0 +25 2 0 +1416 0 90 +209 1 24 +2192 1 1 +38 1 1 +1254 0 3 +46332 1 0 +29959 1 0 +1273987 1 0 +362159 46 1 +101 4 0 +56 4 1 +20 27 3 +1587 6 5 +8025 1 0 +2368 20 0 +6474 5 0 +1051 0 1 +4404 3 0 +157 71156 0 +778 1 1 +26 1 1 +893214 0 10 +1991 0 1 +1130 1 0 +1788 3 1 +2403 24 0 +1065 2 0 +63 7 7 +430 1 1 +19 1 1 +615 8 8 +1540 2 0 +45 1 1 +1471 3 0 +1004 2 3 +306 1 0 +990 13 13 +1977 1 1 +90 1 1 +339 1 1 +33 1 1 +2109 0 5 +982 1 1 +32 5 0 +2064 2 0 +105 7 7 +165 3 0 +662 1 1 +32 2 0 +126 1 1 +27 1 1 +238 1 1 +19 1 1 +263 11 11 +172 25 3 +27 1 1 +266 11 10 +336 1 1 +55 1 1 +1220 0 2 +1569 7 7 +2229 1 1 +41 1 1 +228 1 0 +542 4 0 +1621 1 1 +37 2 0 +2537 0 1 +108815 0 2 +171175 1 0 +246821 36 0 +962 9 0 +4851 10 11 +5264 4 4 +57 0 57 +84 2 2 +55 2 2 +84 58 1 +14 0 57 +338 1 1 +16 1 1 +283 114 0 +348 0 114 +4798 539 0 +160 0 68 +4631 0 1 +1771 65 1 +164 0 68 +59 343 21 +499 0 22 +4288 5 5 +613515 2 0 +17354 1 0 +2948 1057 9062 +151747 4 19271 +14957 2 0 +218825 169085 0 +6957 46 1 +3212 1 1 +44 30 0 +59 0 360 +114 60 0 +302 1 0 +1289 2 0 +3154 0 65 +2027 0 20 +47 1 1 +1823 1 0 +9097 1 0 +5512 1 0 +776 2 0 +338 1 1 +28 1 1 +7537 0 76 +52 92 39 +18605 0 1 +8364 2 0 +146 0 2 +5026 1 0 +20 1 1 +225 1 1 +77 1 0 +147 5 5 +57 1 1 +69 1 0 +288 0 13 +943 12 0 +134 1 0 +872 1 1 +32 1 1 +3072 0 6 +414 1 0 +13784 1 0 +1494 10 12 +1845 12 0 +634 0 1 +1038 0 3 +1764 22 0 +7763 1890 0 +604 2 164 +52 2 56 +58 0 108 +24 0 162 +379 108 0 +1623 0 1 +8458 15 0 +5922 196 21 +1846 14 10 +2018 1 0 +936 0 2 +617 1 0 +1352 0 1 +1101 0 2 +1208 0 7 +13128 1 0 +1004 0 1 +211 6 7 +91645 1 0 +92126 1 0 +74931 1 1 +22 1 1 +240628 1 0 +157543 + +chain 3539027 8 146364022 + 2029090 2480890 chr8_KI270821v1_alt 985506 + 264300 791460 116 +52 2332 2332 +63 2235 2235 +214 3004 3004 +60 10834 10834 +53 20533 20533 +84 7073 7073 +117 46338 46338 +264 26011 26011 +86 8695 8695 +28 23794 23794 +92 11001 11001 +183 2924 2924 +39 4662 4662 +71 9154 9154 +30 791 791 +30 209 209 +38 5122 5122 +174 65 65 +80 252 252 +87 73371 73371 +5642 1 0 +1050 0 4 +81 4276 4258 +50 0 1 +27 1 0 +78 21 21 +375 1 1 +18 3 3 +212 0 1 +20 1 1 +287 1 1 +54 1 1 +619 0 1 +288 5 6 +515 1 8 +242 0 2 +42 1 1 +119 11 11 +1009 14 14 +1945 0 30 +45 1 1 +93 17 18 +166 1 1 +20 1 1 +159 1 1 +56 1 1 +211 5 5 +474 2 0 +1728 9 9 +248 1 0 +857 14 14 +469 1 0 +31 0 1 +294 1 0 +376 1 1 +41 1 1 +389 38 0 +91 80 0 +1201 1 1 +45 1 1 +5993 1 0 +2655 1 0 +2475 4572 79289 +48 0 38 +26 0 227 +7 151230 151704 +365 + +chain 1551619 8 146364022 + 142748282 142766515 chr8 145138636 + 141738195 141888945 2596 +6067 0 1 +76 0 132516 +12090 + +chain 1306432 8 146364022 + 48215803 48229641 chr8 145138636 - 97821299 97835136 3003 +9781 1 0 +4056 + +chain 916792 8 146364022 + 145462956 145472456 chr8 145138636 + 144239000 144248500 4185 +9500 + +chain 915930 8 146364022 + 145440111 145449611 chr8 145138636 + 144140000 144149500 4189 +9500 + +chain 866610 8 146364022 + 145472456 145481456 chr8 145138636 + 144248500 144257500 4193 +9000 + +chain 657198 8 146364022 + 145325765 145332588 chr8 145138636 + 144270862 144277712 5382 +2514 24 16 +2048 0 35 +2237 + +chain 470977 8 146364022 + 145489989 145494850 chr8 145138636 + 144266000 144270862 46230 +2944 0 1 +1917 + +chain 435622 8 146364022 + 145481456 145485956 chr8 145138636 + 144257500 144262000 46567 +4500 + +chain 433784 8 146364022 + 145435611 145440111 chr8 145138636 + 144135500 144140000 48563 +4500 + +chain 429294 8 146364022 + 145449611 145454110 chr8 145138636 + 144149500 144154000 53687 +2893 0 1 +1606 + +chain 427195 8 146364022 + 145454110 145458610 chr8 145138636 + 144154000 144158500 56302 +2708 1 0 +72 0 1 +1719 + +chain 396999 8 146364022 + 2296109 2312269 chr8 145138636 - 142766946 142783109 515 +136 0 2 +44 0 2 +6 1 1 +84 0 2 +106 2 0 +110 2 0 +1641 13 13 +2131 11675 11676 +38 91 91 +80 + +chain 388102 8 146364022 + 145485956 145489989 chr8 145138636 + 144262000 144266000 46734 +788 33 0 +3212 + +chain 377709 8 146364022 + 145458996 145462956 chr8 145138636 + 144235040 144239000 106071 +3960 + +chain 287321 8 146364022 + 145432588 145435611 chr8 145138636 + 144132477 144135500 197111 +3023 + +chain 212606 8 146364022 + 142816515 142818732 chr8 145138636 + 141735283 141737500 537060 +2217 + +chain 55504 8 146364022 + 145604494 145607420 chr8 145138636 + 144380211 144381247 1620183 +458 432 0 +82 648 0 +108 1134 324 +64 + +chain 40434 8 146364022 + 142818732 142819152 chr8 145138636 + 141737500 141737920 1660354 +420 + +chain 36669 8 146364022 + 145458610 145458996 chr8 145138636 + 144158500 144158886 1736751 +386 + +chain 27437 8 146364022 + 145604345 145606114 chr8 145138636 + 144380602 144381723 1867734 +64 55 1 +30 510 294 +50 55 1 +46 324 0 +118 109 163 +53 36 198 +51 238 22 +30 + +chain 21480 8 146364022 + 142819155 142819377 chr8 145138636 + 141737920 141738142 11672353 +222 + +chain 11530 8 146364022 + 144293250 144293368 chr8 145138636 + 143211308 143211426 24374757 +118 + +chain 9810 8 146364022 + 145623502 145623658 chr8 145138636 + 144398159 144398267 29968985 +25 48 0 +83 + +chain 8499 8 146364022 + 140971343 140971451 chr8 145138636 + 139958937 139959072 16460579 +53 0 27 +55 + +chain 5525 8 146364022 + 145604409 145605965 chr8 145138636 + 144381206 144382222 4172139 +36 0 54 +19 590 320 +55 171 225 +58 573 195 +54 + +chain 4893 8 146364022 + 144286858 144286916 chr8 145138636 + 143205625 143205683 2731368 +58 + +chain 4870 8 146364022 + 145604952 145605003 chr8 145138636 + 144380615 144380666 8380570 +51 + +chain 3556 8 146364022 + 145605597 145606029 chr8 145138636 + 144380936 144381206 11825448 +39 329 167 +64 + +chain 3037 8 146364022 + 1245971 1246009 chr8_KI270811v1_alt 292436 + 17103 17141 7702061 +38 + +chain 2863 8 146364022 + 145505110 145505140 chr8 145138636 + 144280897 144280927 42586484 +30 + +chain 2114 8 146364022 + 140949223 140949246 chr8 145138636 + 139936939 139936962 18147557 +23 + +chain 2091 8 146364022 + 145605641 145605795 chr8 145138636 + 144380440 144380594 6328079 +65 53 53 +36 + +chain 1308 8 146364022 + 145607435 145607464 chr8 145138636 + 144381532 144381561 9863663 +29 + +chain 1216 8 146364022 + 145606029 145606070 chr8 145138636 + 144380774 144380815 12832140 +41 + +chain 3678780 GL000196.1 38914 + 8 38909 chr8 145138636 - 97831723 97870624 1395 +38901 + +chain 2208541 GL000197.1 37175 + 1 23053 chr8 145138636 - 123334080 123357133 1977 +14765 0 1 +8287 + +chain 1343629 GL000197.1 37175 + 23153 37175 chr8 145138636 + 21767029 21781060 2950 +687 0 1 +241 0 2 +8029 0 6 +5065 + +chain 10667661548 9 141213431 + 10000 141153431 chr9 138394717 + 10000 138262981 13 +12702749 0 1 +1693832 0 1 +6130444 1 0 +2647777 0 1 +11416593 0 1 +4833761 1 0 +3712 1 0 +6628 2145019 0 +1023437 575458 827619 +418 36 36 +1375 0 1 +536 19 19 +103 6 6 +371 21 21 +308 0 1 +1165 4 4 +1258 0 1 +94 1 0 +142 29 29 +141 0 1 +367 51 51 +98 8 0 +144 39 39 +145 23 31 +1175 10 10 +304 47 47 +1178 13 13 +50 0 1 +228 2 0 +757 31 47 +748 23 23 +347 6 6 +350 32 34 +117 0 2 +240 48 48 +3098 41 40 +395 31 0 +766 53 53 +1416 51 51 +83 63 63 +297 39 39 +381 35 35 +341 49 49 +383 23 23 +500 6 6 +1011 31 31 +235 62 62 +431 2 9 +135 30 0 +254 47 47 +853 12 7 +523 962826 1180658 +271 188 130 +64 140 141 +52 15 15 +81 13339 13285 +311 2 1 +198 14 8 +108 26 26 +245 29 29 +156 91 91 +201 78 82 +57 136 136 +75 9 9 +237 41 41 +174 63 63 +65 97 97 +89 48 48 +60 20 20 +72 48 51 +53 34 31 +58 70 68 +61 1445 79 +61 57 41 +61 25 25 +59 223 225 +89 52 48 +58 74 74 +386 3 2 +94 36 36 +74 228 243 +80 66 66 +96 118 118 +249 395 394 +62 281 276 +131 428 430 +340 108 109 +51 267 293 +94 71 70 +114 151 150 +168 31 34 +57 330 330 +122 104 104 +61 14 14 +63 102 104 +53 93 122 +55 13395 13414 +183 29 29 +63 34 34 +76 29 29 +144 9 18 +131 4 4 +124 8 8 +140 97 97 +93 4 4 +166 19 18 +138 26 26 +173 585 590 +56 52 52 +91 85 85 +50 63 61 +138 11 11 +118 167 167 +257 14 14 +142 17 13 +332 7 7 +73 94 94 +151 44 44 +285 4 4 +104 99 100 +116 2 0 +59 33 34 +237 137 138 +86 85 85 +62 13 13 +147 101 101 +198 31 38 +416 23 23 +253 191 192 +159 15 17 +65 78 78 +160 137 136 +288 38 38 +188 56 56 +157 28 28 +184 175 175 +52 12 12 +54 44 44 +66 68 65 +85 27 27 +176 58 58 +73 45 40 +84 17857 17592 +108 171 171 +173 46 47 +198 34 34 +450 8 8 +77 77 77 +58 483 493 +143 80 80 +263 52 52 +333 96 96 +61 76 76 +132 46 47 +115 103 103 +287 86 86 +117 41 40 +71 53 54 +157 1 0 +220 8 9 +65 126 119 +243 173 167 +129 343 342 +74 45 45 +156 5 0 +100 76 76 +105 40 40 +79 27 27 +100 71 71 +93 39 39 +139 76 79 +122 26 26 +61 50 50 +63 110 111 +163 146 136 +51 27 29 +69 85 79 +129 514 525 +65 32 32 +64 8 7 +202 69 69 +98 148 148 +78 5 0 +188 241 241 +97 56 56 +205 59 59 +50 9 9 +60 250 253 +71 161 162 +180 117 117 +171 196 196 +114 129 129 +58 2 3 +65 250 250 +89 160 138 +401 51 51 +61 48 48 +272 215 215 +54 76 76 +114 17 17 +87 350 331 +67 532 536 +136 133 133 +135 204 204 +53 180 177 +141 312 319 +126 23 21 +56 12 12 +248 78 78 +68 21 21 +59 9 6 +112 86 85 +264 82 82 +179 20 20 +125 44 44 +168 146 140 +51 323 320 +63 195 193 +62 155 157 +57 103 103 +104 102 102 +72 146 146 +64 51 48 +153 169 170 +101 114 114 +270 147 147 +68 5 5 +275 27 27 +51 21 22 +77 7 7 +124 77 79 +58 11 11 +233 35 35 +117 233 246 +184 4 4 +85 93 94 +154 32 32 +86 43 43 +56 58 58 +113 284 286 +51 54 54 +97 409 411 +72 37 37 +63 68 72 +52 69 69 +100 149 149 +53 203 206 +74 7 6 +97 5 0 +169 47 46 +82 20 20 +135 4 4 +50 147 147 +420 6 6 +55 107 105 +52 15 19 +54 40 40 +68 47 47 +138 107 107 +82 40 40 +105 104 104 +60 151 152 +128 6 6 +137 49 49 +151 37 37 +138 4080 4061 +90 18 18 +201 50 50 +93 86 86 +90 216 215 +77 340 340 +87 26 26 +107 18 18 +104 78 78 +64 165 164 +114 11 11 +378 40 40 +55 110 110 +308 60 60 +112 127 127 +337 409 394 +124 103 103 +73 48 46 +84 47 45 +158 24 24 +134 37 36 +56 7 7 +208 366 361 +90 86 90 +137 313 313 +277 1 0 +212 26 25 +98 53 53 +82 30 29 +198 8 8 +265 48 48 +135 88 87 +1970 10 15 +288 33 33 +149 57 57 +786 39 40 +613 20 20 +940 40 40 +83 18 18 +82 32 36 +55 13 13 +53 9 9 +117 0 5 +4835 1 0 +267 2 0 +4741 1 0 +3246 4 0 +9559 8 0 +69 45 1 +17 1 1 +782 53 53 +73 166 166 +126 37 36 +60 5 0 +211 89 88 +110 166 166 +52 18 17 +118 223 223 +82 43 43 +46 8 0 +155 161 156 +301 29 29 +204 35 35 +87 147 165 +83 138 137 +98 99 99 +115 21591 21591 +115 99 99 +98 137 138 +83 165 147 +87 35 35 +204 29 29 +301 156 161 +139 0 8 +62 43 43 +82 223 223 +118 17 18 +52 166 166 +110 88 89 +208 0 5 +63 36 37 +126 166 166 +73 53 53 +782 85 137 +9517 0 4 +3267 0 1 +4763 0 2 +256 0 1 +4846 5 0 +119 9 9 +53 13 13 +55 1 1 +33 4 0 +80 18 18 +83 1 1 +38 1 1 +940 1 1 +18 1 1 +613 40 39 +786 57 57 +149 33 33 +288 15 10 +1970 87 88 +135 48 48 +265 8 8 +198 29 30 +82 53 53 +98 25 26 +204 0 1 +285 313 313 +137 90 86 +90 361 366 +208 7 7 +56 36 37 +134 24 24 +158 45 47 +84 46 48 +73 103 103 +124 394 409 +337 127 127 +112 60 60 +308 110 110 +55 40 40 +378 11 11 +114 8625 8643 +82 46 47 +169 0 5 +97 6 7 +74 206 203 +53 149 149 +100 69 69 +52 72 68 +63 37 37 +72 411 409 +97 54 54 +51 286 284 +113 58 58 +56 43 43 +86 32 32 +154 94 93 +85 4 4 +184 246 233 +117 35 35 +233 11 11 +58 79 77 +124 7 7 +77 22 21 +51 27 27 +275 5 5 +68 147 147 +270 114 114 +101 170 169 +153 48 51 +64 146 146 +72 102 102 +104 103 103 +57 157 155 +62 193 195 +63 320 323 +51 140 146 +168 44 44 +125 20 20 +179 82 82 +264 85 86 +112 6 9 +59 21 21 +68 78 78 +248 12 12 +56 21 23 +126 319 312 +141 177 180 +53 204 204 +135 133 133 +169 269 269 +50 184 180 +67 331 350 +87 17 17 +114 76 76 +54 215 215 +272 48 48 +61 51 51 +401 138 160 +89 250 250 +65 3 2 +58 129 129 +114 196 196 +171 21764 22111 +271 59 59 +619 35 35 +101 71 71 +573 138 137 +351 61 60 +189 22 22 +55 51 31 +52 96 97 +199 67 78 +55 210 217 +102 87 87 +329 173 173 +132 0 1 +68 70 0 +585 49 49 +81 103 102 +169 58 58 +68 8 9 +71 95 95 +124 14 14 +80 4 4 +74 216 216 +239 72 70 +160 20 20 +54 14 14 +167 40 45 +73 58 58 +176 27 27 +85 65 68 +66 44 44 +54 12 12 +52 175 175 +184 28 28 +157 56 56 +188 38 38 +288 136 137 +160 78 78 +65 17 15 +159 192 191 +253 23 23 +416 38 31 +198 101 101 +147 13 13 +62 85 85 +86 138 137 +237 34 33 +49 0 2 +126 100 99 +104 4 4 +285 44 44 +151 94 94 +73 7 7 +332 13 17 +142 14 14 +257 167 167 +118 11 11 +138 61 63 +50 85 85 +91 52 52 +56 590 585 +173 26 26 +138 18 19 +166 4 4 +93 97 97 +140 8 8 +124 4 4 +131 18 9 +144 29 29 +76 34 34 +63 29 29 +204 119 120 +54 358 358 +77 0 2 +119 23 23 +45 0 3 +129 47 47 +298 0 1 +65 13 13 +70 54 54 +72 66 49 +93 24 24 +249 81 81 +66 30 28 +141 30 30 +63 94 94 +332 35 34 +143 5 5 +90 48 29 +279 71 71 +109 93 93 +135 31 31 +221 4 4 +326 99 99 +50 147 147 +90 46 46 +76 53 53 +60 86 89 +73 46 46 +64 83 83 +91 46 46 +137 40 40 +124 77 77 +64 172 168 +246 64 64 +71 75 75 +126 7 7 +75 159 159 +65 54 54 +51 27 27 +72 68 68 +163 39 39 +144 30 29 +114 44 44 +113 45 44 +95 171 171 +54 185 185 +83 142 142 +79 53 53 +53 24 24 +133 75 75 +93 40 41 +152 144 142 +55 105 107 +75 57 57 +374 6 0 +447 35 36 +161 13 13 +64 17 17 +338 8 8 +50 39 39 +65 90 92 +500 78 78 +166 49 49 +259 788 806 +55 122 93 +53 104 102 +63 14 14 +61 104 104 +122 330 330 +57 34 31 +168 150 151 +114 70 71 +94 293 267 +51 109 108 +340 430 428 +131 276 281 +62 394 395 +249 118 118 +96 66 66 +80 243 228 +74 36 36 +94 2 3 +386 74 74 +58 48 52 +89 225 223 +59 25 25 +61 41 57 +61 79 1445 +61 157 162 +53 51 48 +72 20 20 +60 48 48 +89 97 97 +65 63 63 +174 41 41 +237 9 9 +75 136 136 +57 82 78 +201 91 91 +156 29 29 +245 26 26 +108 8 14 +198 1 2 +427 4 0 +50 26 26 +66 137 137 +143 64 65 +57 67 67 +114 118 118 +291 79 79 +88 21 21 +83 49 49 +507 181 176 +116 131 130 +131 129 129 +121 41 41 +91 37 37 +117 13 13 +122 26 26 +216 230 230 +56 35 35 +50 72 72 +692 30 30 +237 58 59 +77 45 43 +197 30 30 +350 56 56 +79 49 49 +126 90 90 +60 163 163 +120 95 95 +120 81 81 +204 0 4 +93 37 37 +84 81 81 +55 37 37 +117 125 124 +78 20 20 +93 184 183 +179 51 51 +143 45 47 +192 210 208 +52 15 15 +53 1 0 +59 45 45 +66 278 278 +92 65 65 +144 6 6 +86 56 59 +57 53 53 +68 14832 17948032 +101 87 87 +71 151 151 +129 22 22 +76 28 28 +145 50 50 +234 51 51 +71 30 30 +54 1 0 +88 69 69 +155 11 11 +94 44 44 +115 5 5 +341 14 14 +208 125 125 +133 43 43 +179 54 60 +84 9 10 +76 8 12 +79 14 14 +225 73 73 +66 33 56 +139 94 95 +181 52 52 +140 35 35 +140 17 16 +64 24 24 +57 13 13 +91 2 0 +180 47 47 +231 143 143 +78 24 24 +453 10 10 +275 73 72 +130 15 15 +109 32 32 +153 5 5 +76 0 2 +224 69 69 +97 17 17 +619 114 112 +50 55 56 +113 59 59 +183 33 33 +172 40 40 +67 6 6 +174 38 38 +97 24 26 +191 13 13 +107 42 42 +143 11 10 +185 59 60 +168 25 25 +72 15 15 +154 82 81 +138 24 24 +51 93 93 +125 103 109 +87 115 114 +241 205 208 +92 28 28 +253 79 79 +52 89 85 +228 34 35 +210 16 16 +190 6 6 +64 11 65 +149 16 16 +63 9 9 +220 29 29 +85 232 239 +890 4 4 +85 31 31 +120 39 39 +65 11 11 +91 26 21 +80 141 141 +224 65 64 +70 18 18 +316 66 66 +299 70 70 +168 71 70 +92 93 93 +157 40 40 +89 33 33 +87 69 69 +58 41 41 +190 2 0 +130 10 10 +109 28 45 +111 60 59 +181 63 50 +229 71 71 +258 10 10 +70 149 149 +195 13 5 +123 56 35 +365 25 25 +56 44 44 +81 35 35 +62 65 65 +56 42 42 +190 45 45 +603 62 62 +204 58 58 +102 4 4 +104 10 10 +187 47 47 +558 16 16 +219 40 39 +305 33 35 +74 42 42 +265 49 49 +59 4 4 +111 19 20 +431 83 82 +58 17 17 +138 10 15 +290 49 49 +1028 67 66 +244 77 77 +305 10 10 +137 43 43 +323 25 28 +271 33 33 +212 96 96 +68 168 351 +359 88 88 +521 65 66 +249 22 22 +81 20 20 +130 0 1 +143 124 125 +168 103 103 +61 118 126 +57 6 6 +112 39 39 +70 60 60 +294 90 90 +143 80 105 +197 39 39 +87 0 14 +53 28 29 +97 1484 126 +81 104 105 +65 3 1 +76 247 249 +69 48 48 +324 4 4 +88 53 53 +237 71 71 +58 33 27 +52 53 53 +276 29 32 +163 19 19 +227 200 203 +100 322 0 +188 66 66 +206 0 334 +142 26 26 +192 42 42 +78 66 65 +96 131 131 +105 447 129 +78 29 29 +147 0 1 +88 54 54 +57 45 45 +86 156 154 +60 121 123 +113 57 57 +81 37 38 +238 4 4 +79 10 10 +123 41 41 +733 14 14 +331 0 1 +193 48 48 +108 37 37 +133 49 49 +85 40 40 +217 3 1 +199 86 86 +428 81 80 +178 203805 739306 +181647 50000 121686 +291910 1310836 135687 +499094 19394523 50000 +159539 299148 50000 +194491 100000 50000 +158462 771702 130940 +376183 698006 50000 +292 28 28 +303 59 59 +148 1 0 +534 52 56 +191 53 49 +263 19 21 +156 82 95 +421 70 70 +246 17 17 +371 28 28 +344 92 71 +90 42 42 +51 46 51 +336 17 16 +137 69 69 +249 9 6 +61 31 31 +99 79 79 +233 31 31 +58 23 21 +331 26 26 +289 15 15 +200 8 8 +275 0 1 +466 41 40 +76 9 10 +90 34 34 +78 76 85 +79 1 0 +203 0 321 +111 50 50 +104 16 16 +411 33 32 +198 18 18 +66 34 33 +96 13 13 +217 1 0 +391 73 73 +160 33 26 +127 106 106 +101 10 9 +160 0 3 +153 35 35 +286 34 34 +138 45 45 +92 403 402 +152 59 58 +62 8 22 +177 56 56 +62 49 49 +85 13 13 +216 99 99 +94 56 56 +133 37 37 +350 1 0 +205 73 73 +54 9 9 +1450 42 42 +135 96 96 +220 33 33 +158 21 21 +53 37 37 +61 226 227 +181 168 168 +179 14 37 +107 52 52 +218 103 110 +53 22 22 +79 140 140 +59 11 10 +153 1 0 +299 2 0 +343 221 221 +78 1 0 +136 38 39 +565 1 0 +226 10 0 +72 4 4 +315 87 81 +173 32 32 +238 34 34 +75 37 37 +452 32 32 +343 205 194 +598 38 38 +188 21 21 +156 17 17 +170 4 3 +376 46 46 +461 22 22 +65 20 20 +174 109 109 +118 13 13 +173 47 47 +188 1 0 +515 108 110 +204 16 16 +50 21 21 +132 68 66 +217 187 189 +139 20 20 +255 3 0 +95 0 2 +88 23 23 +515 158 161 +70 28 14 +126 86 86 +253 6 6 +357 29 29 +689 35 35 +232 25 25 +133 0 3 +226 11 11 +58 3 0 +630 35 35 +382 1 16 +1106 15 15 +115 10 11 +281 26 26 +343 80 78 +357 55 55 +1161 4 0 +346 38 38 +146 49 49 +134 9 9 +125 64 56 +80 76 76 +423 75 75 +211 41 41 +52 21 21 +93 30 30 +1510 9 13 +114 0 3 +59 73 164 +215 43 43 +58 127 124 +414 38 38 +261 8 8 +290 0 24 +226 118 121 +514 36 15 +397 42 42 +148 50 49 +76 0 1 +63 50 46 +371 107 97 +138 114 114 +310 30 33 +78 51 51 +464 27 27 +52 73133 304051 +682157 50000 168818 +545 6 0 +69 19 19 +157548 616739 2895429 +36324 1 1 +42 1 1 +10868765 0 1 +10602815 100000 13468 +85380 150000 89165 +13825345 0 1 +4355094 0 1 +6911665 0 1 +2378143 0 1 +4110614 1 0 +8813402 150000 36892 +2910320 3 0 +122 1 1 +24 1 1 +51 1 0 +115 1 1 +43 1 1 +1303 1 1 +90 13 0 +39 14 14 +33 2 2 +205 1 1 +33 1 1 +180 1 1 +26 0 1 +510 1 1 +45 1 1 +822 1 1 +40 1 1 +2804 8 0 +1522 1 0 +205 2 0 +350 2 3 +202 15 15 +310 0 1 +465 8 7 +119 17 18 +1147 26 26 +650 1 1 +33 1 1 +409 1 4 +5 1 0 +73 1 1 +423 0 1 +66 1 1 +21 22 0 +51 0 1 +8 1 1 +353 1 1 +17 5 0 +42 0 20 +1504 1 1 +34 1 1 +332 1 1 +40 1 1 +686 3 2 +2481 36 0 +1257 0 8 +578 1 1 +29 1 1 +822 130 1 +4530 1 1 +33 1 1 +1861 0 1 +6662 1 1 +42 1 1 +3440 1 0 +1233 1 0 +83 1 0 +54 1 1 +1143 1 1 +85 1 1 +847 1 1 +28 1 1 +560 5 5 +411 0 1 +245 13 97 +113 16 16 +493 0 4 +252 0 3 +382 1 1 +20 1 1 +2156 0 1 +531 0 1 +18 1 1 +1765 0 85 +69 1 1 +46 1 1 +794 11 11 +400 547 9105 +55 1 2 +541 0 2 +817 4 4 +31 1 1 +1881 1 0 +949 1 1 +31 1 1 +3859 2 0 +1028 10 11 +2666 0 1 +516 3 3 +38 1 1 +1502 9 9 +4870 1 0 +3580 1 1 +36 1 1 +1515 13 0 +2100 5 0 +13814 21 0 +17542 0 5 +7217 1 0 +1546 0 1088 +6429 0 8 +2381 0 653 +422 4 0 +5175 2 0 +1045 0 1 +1264 1 0 +1765 1 1 +45 1 1 +384 0 5 +5588 0 4 +7860 1 1 +48 1 1 +2083 1 1 +47 1 1 +12366 1 0 +46 1 1 +1590 0 1 +5928 1 0 +12984 1 0 +724177 50000 23251 +133 0 5 +478 0 19 +283 10 11 +2074900 50000 47392 +1532 2 0 +7289 1 0 +10002 0 5 +3343 1 0 +3021 0 1 +36 1 1 +1845141 0 4002 +66065 + +chain 66349731 9 141213431 + 39445499 46461039 chr9 138394717 + 39445500 67790609 88 +4347 1 0 +317 0 2 +2929 1 0 +1333 1 0 +7527 14 14 +3091 0 1 +391 1 0 +11239 0 1 +281 34 33 +1752 48 48 +273 0 1 +1570 73 73 +1143 16 16 +561 2 0 +3673 0 1 +806 54 54 +10740 0 1 +1026 0 6 +3504 10 0 +13435 1 0 +167 1 0 +12392 0 1 +7088 0 4 +16108 0 1 +2242 1 3 +1666 0 1 +935 89 88 +148 2 1 +773 1 11 +135 21 21 +368 0 8 +2675 0 2 +1655 18 18 +485 6 0 +563 12 12 +6151 6 0 +5691 94 90 +508 91 91 +199 12 13 +3616 1 0 +1490 2 0 +3467 3 0 +475 1 0 +1324 0 1 +2797 1 0 +101 0 1 +189 0 1 +179 2 0 +84 1 0 +1750 40 40 +651 0 17 +213 4 4 +255 0 1 +900 0 1 +761 35 35 +610 31 31 +61 0 1 +2998 31 30 +182 0 1 +156 1 0 +1060 20 18 +135 2 0 +2311 15 15 +3136 0 20 +3259 1 0 +6852 5 1 +3037 9 0 +572 6 6 +1131 0 3 +4410 51 51 +545 34 34 +2149 15 15 +302 9 9 +3051 29 20 +362 4 11 +643 22 22 +1301 49 42 +300 0 1 +3567 4 0 +1010 5 5 +968 1 0 +2916 17 15 +3406 0 2 +563 51 50 +4286 28 28 +1214 47 47 +2757 1 0 +453 1 0 +2548 0 1 +587 48 48 +4557 0 6 +1367 181402 167014 +164 163 168 +84 11 11 +147 66 66 +92 38 7 +56 20 20 +99 194 193 +178 5 5 +89 103 94 +73 261 261 +225 120 120 +67 28 29 +61 70 70 +53 3330 13031 +77 7 7 +74 46 46 +91 20 20 +341 20 20 +52 55 52 +165 184 182 +61 102 102 +83 24 24 +72 38 38 +245 0 1 +78 281 281 +85 765 459 +53 4 4 +129 175 175 +58 17 17 +79 102 101 +93 148 148 +121 54 54 +148 28 25 +83 20 20 +62 311 314 +108 208 205 +186 72 72 +345 431 412 +107 120 120 +192 321 318 +52 218 221 +130 7 7 +84 453 438 +189 54 54 +56 46 41 +54 82 82 +172 294 294 +190 69 114 +102 48 48 +59 86 92 +185 144 140 +66 10533 8715 +80 64 64 +62 216 211 +70 43 40 +63 164 462 +67 451 449 +348 362 354 +56 288 288 +157 111 111 +58 185 185 +51 833 835 +77 379 379 +93 600606 2101753 +3 445131 388411 +26 1710 1671 +33 13706 13672 +78 48 48 +60 58 58 +191 65 65 +175 44 44 +69 36 37 +163 34 34 +212 34 34 +52 6 6 +239 20 20 +114 43 39 +163 29 29 +195 42 37 +54 27 27 +76 136 119 +123 8 8 +135 134 105 +159 62 62 +109 118 118 +85 172 172 +57 26 26 +240 411286 209773 +55 144 140 +60 30 30 +113 68 73 +59 81 84 +66 8 8 +60 1 46 +268 203 203 +59 110 113 +246 33 33 +82 35 35 +148 10 9 +91 297 283 +84 17 17 +101 237 240 +52 431 429 +82 24 24 +53 43 43 +107 434 413 +307 133 133 +134 6387 17734 +54 18 19 +143 46 46 +52 0 1 +91 295 293 +108 29 33 +72 25 26 +62 4 4 +51 0 1 +58 63 63 +307 191 191 +123 182 182 +72 109 110 +72 33 33 +290 261 258 +152 50257 18216380 +174366 1073796 4679147 +4760 0 1 +8613 66499 66833 +43 15 15 +154 48064 48063 +166 0 10 +355 1195 1195 +67 342 342 +29 485 485 +58 65 65 +40 605 605 +42 10425 10424 +26 49548 49548 +47 700 700 +38 20599 20599 +49 1044 1044 +66 1222 1222 +45 105 105 +84 317 317 +32 2581 2581 +28 713 713 +37 2355 2355 +29 109 109 +35 1085 1085 +47 489 489 +38 741 741 +150 109 109 +46 96 96 +38 73 73 +126 68 68 +106 131 131 +29 968 968 +100 320 320 +27 104 104 +47 2317 2317 +26 708 708 +48 1619 1619 +207 82 82 +97 972 972 +43 2433 2433 +39 63 63 +159 186 186 +77 1580 1580 +38 709 709 +35 4660 4660 +45 542 542 +35 1687 1687 +50 443 443 +43 297 297 +36 471 471 +41 311 311 +44 937 937 +37 611 611 +88 543 543 +31 3692 3692 +79 4288 4288 +58 2642 2642 +39 3380 3380 +33 115 115 +49 3670 3670 +51 1590 1590 +48 380 380 +37 45808 45808 +29 12094 12094 +48 12390 12390 +33 40984 40984 +29 44 44 +6209 105194 105194 +4038 90 90 +187 474 474 +37 98 98 +28362 6394 6394 +51 250 250 +39 3932 3932 +31 1474 1474 +32 357 357 +48 3534 3534 +31 766 766 +53 1416 1416 +51 83 83 +63 297 297 +39 381 381 +35 341 341 +49 1923 1923 +31 235 235 +62 568 568 +30 101689 404964 +244 162 162 +101 60 59 +107 4 4 +56 16 16 +116 176 192 +297 80 82 +288 47 47 +78 16 16 +73 59 60 +213 0 4 +74 91 90 +153 23 23 +77 44 44 +308 1 0 +155 6 0 +122 52 50 +191 60 60 +147 52 49 +885 43 43 +231 62 60 +262 28 26 +111 56 54 +726 27 27 +143 17 17 +151 50 50 +204 65 65 +558 146 152 +78 32 32 +84 29 29 +178 318 318 +126 21 21 +56 28 28 +145 31 31 +281 124 124 +54 1 0 +64 93 93 +131 35 35 +92 46 46 +115 84 84 +262 14 14 +238 38 38 +190 41 41 +205 30 38 +176 0 4 +263 58 58 +145 26 49 +108 32 32 +50 3 6 +221 76 76 +116 102 102 +90 0 3 +249 2 0 +272 5 0 +215 109 108 +440 15 15 +104 24 24 +213 107 107 +125 30 30 +109 32 32 +139 19 19 +75 1 0 +51 80 80 +896 114 112 +50 55 56 +51 121 121 +51 33 33 +52 55 55 +197 40 40 +75 50 50 +122 38 38 +97 24 26 +311 42 42 +339 59 60 +168 25 25 +172 81 80 +208 168 168 +125 103 109 +87 136 135 +220 228 231 +69 28 28 +65 19 19 +169 49 49 +82 89 85 +124 53 53 +51 34 35 +210 16 16 +190 81 117 +53 45 45 +51 16 16 +63 9 9 +220 29 29 +84 222 230 +900 4 4 +85 31 31 +120 39 39 +50 26 26 +197 141 141 +224 65 64 +70 18 18 +316 66 66 +247 122 122 +168 71 70 +92 93 93 +157 53 53 +76 33 33 +87 69 69 +58 41 41 +322 10 10 +62 75 92 +111 110 109 +131 24 17 +296 56 56 +244 10 10 +70 149 149 +195 76 68 +60 56 35 +365 25 25 +56 160 160 +62 163 163 +190 21 21 +627 62 62 +177 85 85 +159 61 61 +175 13 13 +444 24 24 +136 46 46 +219 10 10 +305 33 35 +74 119 119 +188 49 49 +59 4 4 +111 19 20 +115 16 16 +345 38 38 +58 17 17 +103 45 50 +1019 40 40 +308 22 21 +362 4 4 +305 10 10 +137 43 43 +321 0 3 +178 6 6 +114 33 33 +208 119 128 +52 164 351 +359 88 88 +521 37 38 +68 0 2 +209 22 22 +81 37 37 +62 51 52 +143 124 125 +108 73 73 +89 181 207 +57 32 32 +86 35 35 +74 60 60 +313 71 71 +84 140 164 +322 0 10 +205 1459 100 +106 85 85 +58 4 1 +76 259 250 +66 51 51 +324 145 145 +229 9 9 +128 33 27 +52 53 53 +258 47 54 +163 19 19 +104 55 55 +68 49 49 +56 111 114 +84 322 0 +188 19 19 +133 5 5 +114 1 0 +142 26 26 +192 42 42 +78 66 65 +66 161 161 +105 447 133 +78 26 26 +150 0 1 +88 54 54 +57 45 45 +86 156 154 +60 121 123 +113 57 57 +81 37 38 +238 4 4 +79 10 10 +123 44 44 +730 14 14 +429 4 0 +91 48 48 +108 37 37 +133 49 49 +85 40 40 +210 0 13 +233 99 99 +376 81 80 +483 8 8 +57 28 28 +288 91 90 +53 147 147 +51 81 81 +416 111 109 +63 64 63 +51 45 45 +290 148 148 +110 47 47 +128 16 117 +98 47 47 +263 218 218 +59 34 34 +123 44 44 +185 20 20 +83 87 73 +54 51 51 +193 26 26 +81 40 40 +73 162 168 +95 147 147 +67 10 10 +78 121 121 +130 32 31 +950 45 52 +141 44 44 +228 24 24 +473 6 5 +789 5 5 +66 42 42 +559 66 66 +325 8 8 +362 34 30 +1554 74 74 +421 11 11 +196 32 32 +455 55 55 +57 27 27 +219 23 23 +60 83 83 +78 271 271 +89 13 13 +181 141 141 +76 9 9 +306 35 35 +114 15 1 +59 112 112 +168 92 92 +131 4 0 +74 47 47 +169 70 74 +128 66 66 +89 0 4 +91 288 290 +345 44 44 +404 61 61 +77 39 38 +217 17 17 +65 24 24 +142 48 48 +89 42 42 +176 78 78 +93 200 196 +122 91 91 +157 102 102 +98 34 34 +55 0 2 +146 25 25 +284 36 37 +131 69 68 +164 3 0 +77 160 475 +186 301 305 +60 43 43 +80 25 25 +51 114 114 +218 7 7 +89 8 8 +67 34 34 +306 44 44 +124 49 49 +137 264 252 +65 34 34 +299 47 47 +79 6 6 +85 5 6 +121 15 13 +130 83 79 +140 6 6 +136 15 21 +340 1 0 +63 31 31 +335 43 43 +546 13 13 +110 52 52 +116 78 81 +55 196 198 +65 163 163 +72 11 11 +139 65 65 +52 152 153 +58 29 31 +152 14 14 +185 36 36 +301 30 30 +177 8 8 +86 68 68 +59 93 93 +114 41 46 +165 42 42 +122 3 0 +209 17 17 +57 15 15 +81 69 65 +77 102 102 +108 59 59 +241 11 11 +100 18 18 +121 49 49 +73 156 156 +303 0 10 +94 120 120 +295 15 15 +53 35 29 +60 135 135 +72 10 10 +57 130 136 +179 162 161 +129 107 105 +121 9 9 +104 25 25 +52 63 63 +121 55 55 +274 286 290 +112 95 95 +270 36 37 +161 135 135 +148 89 86 +307 60 60 +67 60 60 +189 56 58 +331 60 60 +89 136 136 +117 62 62 +153 157 155 +95 144 144 +338 17 17 +74 114 114 +59 9 9 +60 67 67 +184 39 39 +59 122 122 +448 10 10 +109 13 13 +56 42 50 +335 33 0 +180 21 21 +637 46 46 +96 37 37 +90 45 44 +366 5 5 +107 14 14 +493 5 5 +50 48 48 +406 13 13 +748 23 23 +564 135 135 +184 48 48 +170 28 27 +262 32 32 +51 22 34 +87 389 68 +192 86 86 +140 0 32 +508 14 14 +202 41 41 +349 98 98 +507 48 48 +121 31 32 +52 0 1 +70 69 69 +226 114 111 +98 87 87 +290 47 48 +359 151 151 +59 328 340 +267 39 39 +243 2 6 +300 37 37 +65 31 31 +56 63 63 +138 26 26 +146 39 39 +77 91 91 +53 139 157 +73 33 33 +240 7 7 +123 33 33 +548 109 109 +71 261 260 +63 40 39 +357 10 11 +95 50 50 +167 336 336 +50 57 57 +113 31 31 +270 0 1 +424 15 15 +270 20 20 +78 65 65 +68 60 55 +76 48 48 +177 36 36 +85 85 85 +185 37 37 +307 79 79 +134 40 40 +448 0 314 +164 10 0 +334 50 50 +52 55 55 +137 51 51 +197 1 0 +200 87 87 +92 57 56 +379 143 149 +61 100 100 +60 52 52 +75 17 17 +121 0 9 +209 83 83 +121 113 113 +70 32 32 +83 73 73 +79 151 151 +56 2978 343 +94 46 46 +353 53 52 +109 64 64 +109 24 24 +69 44 46 +295 34 34 +142 65 103 +212 72 72 +134 16 16 +99 41 41 +115 30 30 +111 25 0 +117 73 73 +53 9 9 +180 10 10 +228 200 188 +268 101 101 +112 56 56 +217 28 27 +270 34 36 +278 89 89 +124 22 22 +151 44 45 +149 26 26 +99 55 55 +116 36 36 +553 107 108 +269 67 67 +215 74 74 +96 6 6 +73 35 35 +218 20 20 +424 27 27 +72 45 49 +54 125 125 +56 55 31 +87 42 42 +91 44 44 +65 145 144 +164 102 102 +57 172 172 +85 62 62 +193 34 34 +141 90 119 +77 39 39 +98 45 45 +77 176 183 +84 0 2 +403 39 43 +114 20 20 +239 6 6 +52 18 18 +71 83 83 +61 47 47 +163 37 36 +288 90 90 +150 93 93 +140 79 74 +450 66 62 +66 11 11 +992 0 1 +345 49 49 +182 0 7 +270 100 100 +78 29 29 +276 22 16 +56 8 11 +590 4 1 +294 96 97 +113 0 1 +163 60 57 +86 25 27 +158 33 33 +110 24 24 +303 138 146 +207 30 30 +78 39 39 +191 11 11 +87 77 77 +148 83 84 +299 49 50 +76 44 44 +64 84 85 +179 55 55 +166 147 147 +98 89 89 +229 214 214 +83 123 123 +83 169 169 +191 2 1 +53 130 134 +52 4 4 +145 31 31 +376 139 139 +533 12 12 +74 104 104 +75 56 67 +89 7 7 +54 130 130 +237 27 27 +114 181 181 +143 38 37 +119 19 19 +102 165 163 +159 52 41 +232 182 181 +263 32 32 +107 47 44 +64 44 44 +261 18 18 +91 47 47 +158 4 0 +189 29 33 +118 68 68 +50 92 92 +68 97 97 +225 76 76 +139 167 167 +378 9 11 +75 136 138 +75 36 36 +365 62 62 +278 122 122 +78 79 79 +53 61 61 +100 29 29 +304 20 20 +602 41 41 +87 32 32 +53 96 96 +77 21 19 +174 35 35 +239 16 16 +67 23 23 +131 5 5 +131 82 82 +98 17 17 +228 43 43 +98 38 38 +688 102 103 +128 104 118 +51 12 12 +78 20 20 +88 3 0 +102 84 84 +106 7 7 +64 58 58 +157 9 9 +59 103 105 +58 179 177 +250 8 4 +65 29 29 +52 5 0 +55 0 1 +223 229 227 +110 113 113 +406 7 7 +691 28 28 +159 88 88 +288 91 91 +60 27 27 +113 42 48 +161 31 31 +306 40 39 +271 17 17 +105 126 142 +89 0 1 +77 66 66 +362 63 62 +363 20 19 +105 72 72 +106 153 158 +102 73 73 +121 10 10 +173 1 0 +144 32 32 +70 59 59 +198 3 0 +107 11267 8 +94 196 183 +54 63 63 +68 67 67 +67 36 36 +279 2 0 +107 151 150 +64 83 82 +164 161 144 +298 35 35 +52 82 83 +263 39 39 +81 0 1 +301 55 51 +191 16 16 +71 44 44 +368 0 1 +103 84 84 +77 14 14 +54 138 124 +154 45 47 +56 224 227 +81 119 112 +51 62 61 +88 85 85 +78 137 135 +156 11 11 +306 0 37 +283 28 28 +207 15 7 +246 8 8 +212 391 68 +98 21 21 +252 194 188 +146 137 135 +64 327 325 +63 138 138 +76 56 58 +98 136 136 +85 47 47 +159 22 22 +275 1 0 +93 28 28 +128 48 48 +237 102 103 +343 43 43 +292 6 0 +156 15 15 +278 13 13 +190 54 53 +532 90 90 +76 158 174 +80 43 43 +339 11 11 +358 115 115 +100 29 29 +125 23 23 +135 37 37 +88 6 6 +54 74 74 +74 39 39 +213 316 316 +526 100 100 +307 40 40 +59 24 24 +380 61 61 +315 30 31 +131 9 9 +76 27 23 +73 180 180 +82 34 34 +414 0 2 +27 2 0 +169 91 92 +135 63 63 +92 90 90 +67 22 22 +313 18 18 +159 48 48 +129 14 14 +60 63 63 +433 1 0 +79 3 4 +146 29 29 +85 78 76 +237 23 23 +97 187 187 +53 59 59 +69 60 57 +101 20 0 +179 45 45 +53 69 69 +170 24 24 +1005 0 7 +205 44 44 +283 6 0 +87 4 3 +155 51 52 +112 1 0 +85 20 18 +262 39 25 +85 136 133 +88 141 141 +169 11 12 +173 203 203 +84 79 65 +75 109 109 +104 5 5 +74 17 17 +56 16 16 +344 39 39 +142 22 22 +550 153 155 +138 117 117 +234 1635 38 +407 2 0 +256 39 39 +416 1 0 +85 34 34 +780 31 31 +84 92 92 +249 41 41 +736 24 24 +389 1 0 +153 12 12 +178 26 26 +405 50 50 +71 124 125 +235 23 23 +137 12 11 +242 14 14 +288 1 6 +542 59 59 +313 40 40 +176 268 263 +492 46 46 +467 3 5 +308 87 87 +400 51 52 +918 9 9 +260 56 56 +106 4 4 +281 258 258 +90 50 50 +60 293 298 +157 72 72 +234 18 18 +57 58 58 +273 41 41 +240 27 27 +137 7 2 +52 33 33 +75 38 38 +199 14 16 +52 66 66 +55 32 32 +344 43 43 +65 5 5 +66 46 45 +381 38 38 +526 0 313 +129 82 82 +112 21 21 +260 52 61 +57 38 38 +125 162 162 +197 50 50 +149 22 24 +194 61 61 +99 75 75 +66 10 10 +157 36 36 +73 12 12 +200 443 103 +185 23 23 +280 1 0 +82 245 243 +956 92 92 +147 104 104 +314 60 60 +153 134 134 +85 185 185 +64 29 30 +219 68 70 +147 47 46 +72 327 331 +108 125 126 +305 8 8 +312 18 18 +129 182 189 +333 37 37 +53 67 67 +54 2 0 +216 16 16 +199 42 42 +309 74 385 +341 38 355 +130 35 31 +54 74 74 +227 32 32 +223 132 132 +442 4 0 +83 112 112 +114 97 106 +90 26 26 +151 34 34 +55 44 44 +356 51 57 +75 28 28 +167 153 157 +127 0 12 +247 79 79 +88 249 257 +168 18 18 +228 20 19 +327 109 110 +209 48 48 +71 102 102 +133 44 44 +301 64 64 +140 120 120 +147 26 26 +380 105 105 +102 106 102 +64 84 84 +57 76 76 +55 17 17 +131 51 51 +127 13 13 +56 40 40 +58 103 98 +224 25 25 +120 106 106 +67 37 37 +50 137 137 +171 113 113 +258 5 5 +143 101 102 +64 67 67 +62 6 9 +60 46 43 +84 84 84 +425 365 367 +53 86 86 +62 27 27 +149 31 31 +471 13 12 +72 25 25 +63 20 20 +65 79 77 +79 71 72 +182 179 185 +63 43 48 +65 213 216 +111 121 121 +151 13 13 +67 83 83 +73 14 14 +108 52 52 +52 78 78 +200 13 13 +77 4 0 +287 115 110 +159 43 43 +151 38 38 +56 28 22 +53 65 65 +254 283 286 +162 10 10 +101 11 11 +93 43 43 +319 38 38 +63 65 65 +173 65 65 +21 0 29 +184 15 15 +57 5318 4089 +341 40 40 +111 23 23 +74 87 87 +58 46 46 +102 0 8 +201 53 52 +78 50 50 +93 2 0 +119 97 97 +177 44 44 +54 59 60 +348 7890 61401 +207 15 15 +99 44 44 +68 39 39 +109 67 71 +196 8 8 +59 41 41 +69 14 14 +114 75 75 +53 53 53 +98 110 110 +52 0 1 +99 90 90 +51 140 140 +225 59 59 +224 43 25 +154 28 28 +301 66 66 +129 2 0 +206 6 6 +281 12 12 +122 13 13 +80 14 14 +109 25 25 +58 28 29 +86 57 63 +182 0 1 +258 4 0 +437 28 28 +245 38 38 +190 57 53 +51 9 9 +486 24 24 +243 3812 6301 +174 40 40 +57 13 13 +58 13 13 +144 22 22 +384 6 6 +59 46 44 +187 65 65 +51 25 25 +54 42 42 +235 36 36 +198 87 86 +67 50 50 +218 37 37 +481 24 24 +240 75 75 +79 101 99 +134 54 714 +172 33 33 +77 2 0 +121 75 75 +57 60 60 +552 0 21 +418 22 22 +571 92 92 +70 58 58 +134 72 77 +315 41 41 +100 141 145 +396 10 10 +65 87 85 +75 14 14 +249 12 12 +224 48 48 +86 18 18 +142 3 0 +178 53 53 +144 21 21 +335 27 27 +217 106 106 +135 53 53 +71 46 46 +89 128 128 +257 24 24 +166 24 11 +132 54 54 +73 1 0 +86 29 29 +177 27 27 +338 40 40 +197 0 1 +92 38 37 +220 31 31 +101 28 28 +341 55 55 +979 0 27 +150 0 4 +413 7 7 +184 6 2 +103 61 61 +114 31 31 +75 22 24 +218 7 0 +506 1217 1238 +43 39 39 +33 437 425 +94 239 242 +45 162 162 +24 60 66 +2 470 469 +35 145 145 +52 1091 1096 +39 117 117 +65 813 813 +41 915 918 +36 86 86 +3 129 128 +45 105 105 +45 392 392 +59 445 445 +58 58 65 +39 2338 2341 +35 631 634 +71 245 245 +35 106 109 +40 1100 1100 +39 97 97 +40 2 0 +51 581 581 +147 75 75 +7 687 677 +46 245 247 +45 1101 1101 +38 185 185 +36 1280 1280 +49 59 59 +39 407 407 +41 150 150 +27 267 267 +27 1005 1007 +84 952 949 +44 1757 1747 +27 585 561 +30 1854 1885 +65 469 469 +273 1218 1222 +60 1510 1509 +30 378 378 +40 1833 1845 +27 702 703 +40 1324 1323 +26 1021 1021 +58 14 14 +61 7192 7202 +62 5934 5946 +28 2042 2039 +52 510 510 +48 1105 1105 +42 268 268 +44 813 813 +68 3097 3094 +63 5541 5867 +84 1072 1073 +72 1236 1234 +41 10847 22529 +29 285 285 +137 119 123 +47 449 438 +53 354 686 +33 1264 1252 +53 983 983 +35 1798 1796 +50 9 7 +11 409 400 +27 1227 1229 +29 797 800 +35 38 39 +29 487 484 +36 1832 1835 +38 1067 1070 +42 187 185 +43 425 426 +47 626 626 +7 72 73 +68 754 778 +120 133 132 +39 263 263 +34 161 161 +44 94 94 +42 240 239 +19 1 1 +33 1 1 +136 12 12 +86 2 0 +42 4 128 +155 99 99 +40 170 170 +41 131 131 +68 98 98 +37 479 480 +46 111 111 +41 649 631 +24 1 1 +165 60 60 +32 246 246 +72 313 313 +35 130 128 +39 245 225 +60 57 57 +58 182 182 +97 4 4 +38 0 1 +38 100 100 +39 1 1 +9 105 113 +40 255 255 +44 450 450 +37 62 62 +40 94 94 +72 1 0 +44 101 102 +41 60 60 +82 1 1 +42 548 544 +37 446 446 +37 407 428 +58 346 346 +41 320 320 +47 57 57 +77 1263 161 +51 238 238 +320 464 464 +110 98 98 +27 14 14 +57 1 1 +30 1 1 +70 86 86 +48 85 85 +32 387 386 +30 354 354 +58 62 62 +31 158 158 +9 1 1 +66 1 1 +91 261 261 +51 1 1 +15 1 1 +14 377 377 +30 604 604 +10 1 1 +35 86 86 +31 1 1 +30 262 262 +30 190 190 +29 62 62 +43 1 1 +44 1 1 +147 1 1 +48 0 3 +530 12 12 +181 2 2 +7 0 1 +236 1 1 +93 3 3 +120 1 1 +465 7 7 +294 1 1 +35 1 1 +267 3 3 +57 1 1 +156 124 0 +784 1 1 +58 1 1 +181 1 1 +84 0 1 +333 2 2 +32 1 1 +409 1 1 +173 1 1 +1140 9 9 +270 1 1 +65 1 1 +256 1 1 +63 1 1 +149 2 2 +16 1 1 +155 7 7 +894 7 7 +292 6 6 +615 1 1 +70 1 2 +481 2 2 +46 1 1 +195 1 1 +37 1 1 +106 4 4 +82 1 1 +47 1 1 +166 1 1 +108 1 1 +386 1 1 +25 1 1 +103 1 1 +23 1 1 +196 1 1 +47 1 1 +306 8 10 +103 1 1 +59 1 1 +101 1 1 +52 1 1 +63 0 2 +47 1 1 +96 1 1 +19 1 1 +451 1 1 +37 1 1 +48 0 1 +281 1 1 +30 1 1 +52 12 8 +275 1 1 +107 1 1 +716 2 0 +30 1 1 +197 1 1 +42 1 1 +1320 1 0 +621 6 7 +289 1 1 +46 1 1 +443 13 13 +655 1 0 +728 1 3 +273 18 18 +1305 1 1 +54 1 1 +1684 0 2 +1032 10 10 +550 0 1 +33 0 1 +77 1 1 +120 0 6 +16 1 1 +219 1 1 +42 1 1 +551 8 8 +439 1 1 +97 2 2 +795 1 1 +35 1 1 +53 1 1 +49 1 1 +116 5 5 +1217 0 4 +348 1 1 +47 1 1 +74 0 1 +55 1 1 +51 1 1 +40 1 1 +765 0 1 +25 1 1 +2375 5 3 +108 6 0 +77 0 26 +41 0 2 +768 1 1 +46 1 1 +452 1 1 +36 2 2 +242 10 0 +31 0 16 +47 1 1 +162 1 1 +42 1 1 +306 1 1 +60 4 0 +947 1 1 +39 1 1 +472 1 0 +620 10 0 +30 0 1 +212 1 1 +33 1 1 +1777 1 1 +39 1 1 +1424 1 1 +67 1 1 +2147 1 0 +36 0 1 +73 1 1 +175 1 1 +30 1 1 +86 1 1 +28 1 1 +731 1 0 +1896 1 1 +30 1 1 +159 1 1 +24 1 1 +977 0 4 +60 1 1 +42 1 1 +65 1 0 +401 0 15 +296 1 1 +40 1 1 +2562 1 1 +24 1 1 +1356 1 1 +39 1 1 +75 1 1 +44 3 0 +1214 0 1 +2171 1 1 +38 1 1 +1530 1 1 +29 0 1 +1862 1 1 +17 1 1 +810 1 1 +25 1 1 +842 1 0 +251 1 0 +571 0 2 +709 16 12 +1298 19 16 +1728 7 7 +1743 1 1 +67 1 1 +116 13 1 +1036 0 18 +184 1 0 +328 1 1 +42 1 1 +568 0 2 +2756 1 1 +41 1 1 +1257 1 1 +22 1 1 +2393 4 0 +64 32 28 +238 6 6 +1283 1 1 +42 1 1 +1747 1 0 +1281 4 1 +769 12 11 +828 1 0 +4110 8 0 +1483 14 14 +248 1 0 +1314 8 0 +1138 1 1 +46 1 1 +2010 1 1 +25 1 1 +159 22 0 +19 4 0 +626 0 1 +606 1 0 +2724 1 1 +43 1 1 +167 1 0 +1834 1 1 +36 1 1 +54 3 0 +2825 35 0 +278 1 1 +31 1 1 +905 1 1 +36 1 1 +789 2 0 +165 0 1 +124 1 1 +18 1 1 +2253 18 18 +674 17 17 +980 0 2 +480 0 2 +236 0 2 +280 1 1 +43 1 1 +1562 1 1 +47 1 1 +1227 1 1 +42 1 1 +5523 1 1 +29 1 1 +1258 1 1 +47 1 1 +1329 0 1 +231 1 1 +25 1 1 +303 1 1 +61 1 1 +317 14 14 +1036 2 1 +1850 0 4 +1814 0 1 +22 1 1 +78 1 1 +19 1 1 +242 1 1 +38 6 0 +30 4 0 +983 17 17 +561 0 8 +1121 1 0 +1166 10 10 +2513 1 1 +27 1 1 +234 0 1 +468 9 9 +1934 1 0 +1780 1 1 +37 1 1 +169 1 1 +41 1 1 +2904 1 1 +46 1 1 +82 0 1 +39 1 1 +1077 4 0 +161 0 15 +51 0 1 +1898 3 0 +75 0 4 +203 1 1 +20 1 35 +1673 0 1 +118 1 1 +70 5 0 +164 1 0 +697 11 11 +1827 1 1 +44 1 1 +692 0 2 +609 0 3 +643 2 1 +16 1 1 +121 16 15 +135 0 5 +1210 257 257 +46 227 227 +78 257 257 +55 679 679 +30 323 322 +30 517 517 +62 58935 58965 +76 33 33 +179 9 9 +293 41 41 +151 52 52 +111 43 43 +1435 51 46 +79 17 17 +114 92 91 +1160 18 18 +1098 13 13 +330 19 19 +356 2 9 +513 4 0 +149 26 26 +225 40 44 +212 25 25 +219 43 43 +94 26 26 +86 27 27 +425 0 2 +68 197 200 +1173 0 20 +869 25 25 +1490 7 7 +4078 1 0 +796 1 0 +510 3 0 +3860 0 2 +564 0 15 +166 69 68 +3452 26 26 +2192 75 72 +83 0 1 +257 1 0 +203 52 0 +1117 0 1 +888 0 3 +5219 47 47 +629 0 1 +3797 20 17 +983 0 1 +1489 2320550 288930 +122 17 17 +348 19 19 +202 42 42 +126 11 11 +63 72 72 +66 6 6 +217 92 93 +97 45 45 +106 10 10 +190 24 44 +86 11 11 +79 0 1 +263 6 6 +116 79 79 +357 59 59 +338 43 43 +79 80 82 +353 10 10 +267 13 14 +144 45 45 +279 0 1 +152 0 2 +146 23 23 +464 50 50 +203 50 50 +397 51 51 +376 45 45 +155 35 35 +461 104 104 +465 34 34 +362 49 49 +351 13 13 +1100 0 8 +225 24 24 +242 27 27 +134 48 97 +114 1 0 +669 46 46 +558 11 11 +135 19 19 +240 1 0 +434 109 109 +478 14 14 +85 16 18 +230 19 19 +477 12 12 +486 23 22 +372 66 65 +343 65 40 +224 63 43 +303 67 63 +226 77 77 +375 9 9 +141 99 103 +137 35 35 +468 0 4 +186 71 70 +204 41 40 +149 18 18 +864 34 34 +374 37 34 +372 48 49 +63 37 37 +300 0 2 +215 8 0 +553 13 13 +631 0 2 +241 64 64 +106 12 11 +146 29 29 +90 27 27 +58 1 0 +398 0 2 +739 48 48 +232 0 2 +351 1 0 +643 5 5 +798 9 9 +784 36 36 +747 84 90 +52 89 89 +60 9 8 +96 46 46 +331 57 57 +98 7 10 +64 31 31 +137 15 15 +115 138 121 +206 28 28 +221 32 32 +105 150 147 +59 5 5 +54 23 22 +81 1 0 +113 107 126 +73 249 247 +86 96 98 +50 139 140 +456 0 1 +171 42 46 +494 33 33 +388 38 38 +633 20 21 +258 1 0 +622 29 29 +1275 37 41 +103 55 55 +1092 2 0 +547 47 47 +520 13 0 +1517 40 39 +57 2 0 +638 12 9 +1960 10 2 +1321 4 11 +1235 41 41 +1090 1 0 +435 8 0 +197 2 0 +2197 13 0 +1107 34 34 +73 36 36 +124 112 112 +885 29 27 +158 0 8 +137 74 74 +67 55 55 +190 1 0 +318 67 75 +106 0 1 +614 1 0 +60 6 7 +52 39 39 +961 31 31 +293 30 30 +907 27 31 +430 31 31 +752 38 38 +719 45 49 +349 92 97 +159 52 52 +82 37 37 +504 35 35 +79 41 41 +648 15 36 +230 38 38 +302 67 67 +143 65 65 +66 8 14 +97 3 0 +377 44 44 +153 35 35 +63 7394 51 +290 50 50 +2589 26 26 +82 0 1 +1028 46 46 +757 33 33 +551 24 24 +921 12 13 +412 56 56 +263 35 35 +418 13 13 +168 1 5 +734 26 25 +232 6 6 +993 88 88 +116 46 47 +204 18 18 +124 121 121 +96 50 50 +460 28 28 +294 21 21 +706 14 14 +477 7 7 +72 4 4 +2686 80 80 +238 0 5 +1137 47 45 +223 40 40 +315 31 30 +482 54 54 +217 5 6 +2562 1 0 +2267 10 0 +177 47 47 +184 57 56 +439 0 316 +671 37 37 +479 58 58 +313 71 71 +252 33 32 +73 26 25 +72 4 4 +119 5 5 +278 16 16 +85 1 2 +99 0 4 +148 35 35 +104 27 27 +283 84 84 +175 12 22 +550 0 1 +103 18 18 +55 21 27 +1367 28 28 +960 42 42 +192 25 25 +143 91 91 +1067 19 21 +85 27 27 +365 21 21 +92 19 19 +57 6 6 +450 23 22 +68 23 21 +254 15 15 +92 13 0 +202 25 25 +1729 27 27 +59 39 38 +70 122 128 +490 48 48 +116 38 38 +710 29 29 +67 14 14 +915 31 31 +1092 110 42 +471 2613 0 +93 45 45 +113 16 16 +53 64 65 +54 0 6 +72 0 18 +436 0 10 +328 90 88 +237 83 83 +292 4 4 +216 114 113 +131 20 20 +281 44 48 +276 47 47 +83 34 42 +694 15 15 +425 43 7 +152 129 129 +216 22 22 +80 3 0 +312 44 44 +123 29 29 +98 65 65 +66 41 41 +345 93 93 +380 25 25 +53 58 62 +162 61 61 +97 77 77 +69 9 9 +518 69 69 +230 36 36 +481 0 2 +303 17 14 +70 83 83 +93 38 38 +270 1 0 +132 100 106 +77 92 92 +56 12 12 +109 85 85 +143 42 42 +97 108 108 +72 70 70 +153 58 58 +296 200 204 +206 19 19 +53 32 35 +68 49 49 +61 39 39 +77 36 36 +126 70 75 +98 1 0 +119 0 1405 +63 479 2899 +52 114 114 +78 40 40 +358 1 0 +105 13 13 +75 56 59 +455 26 26 +127 11 10 +301 56 62 +307 45 45 +160 29 29 +298 29 30 +101 6 6 +54 9 9 +141 0 1 +531 25 25 +120 23 23 +203 58 58 +161 4 0 +45 10 0 +310 75 75 +199 15 15 +430 0 1 +136 34 35 +211 11 11 +338 11 11 +122 81 82 +167 47 47 +529 0 2 +488 78 78 +50 32 30 +173 27 27 +414 105 105 +578 5 5 +721 159 159 +155 40 40 +74 82 82 +251 62 62 +91 176 176 +387 44 44 +201 33 33 +1023 5 5 +625 47 47 +137 1 0 +858 2 0 +2128 25 9 +121 150 150 +288 39 47 +174 35 35 +73 81 81 +338 37 37 +567 24 24 +186 1 0 +309 32 32 +1826 0 2 +751 7 7 +312 85 85 +2470 0 1 +507 35 35 +299 36 36 +1165 7 7 +177 13 13 +294 77 77 +549 30 30 +1664 0 1 +2954 40 40 +271 44 44 +750 50 50 +355 25 25 +173 47 47 +388 12 13 +535 6 6 +1994 60 52 +349 16 16 +1545 16 16 +2206 0 8 +161 1 0 +2870 45 45 +681 21 21 +2223 0 1 +490 0 1 +1264 6067 0 +141 2 1 +248 34 35 +3409 46 46 +3807 9 9 +337 42 42 +549 1 0 +134 1 0 +141 9 9 +3372 76 76 +412 17 17 +2549 + +chain 29944677 9 141213431 + 40475837 67657867 chr9 138394717 - 71177714 99624961 72 +364567 0 1 +2980 0 1 +10625 7 2 +1775 0 2 +2446 1 0 +7060 5 3 +7638 0 1 +52 1 1 +1141 0 1 +4150 1 0 +181 2 0 +15 1 1 +3068 2 0 +32 1 1 +1577 1 1 +53 0 1 +1149 0 1 +712 1 0 +89 29 0 +498 0 4 +673 0 1 +859 1 1 +46 1 1 +3011 3 0 +233 2 0 +5216 0 4 +1516 2 0 +1776 0 3 +366 0 1 +1079 1 0 +2450 1 0 +908 0 1 +4996 0 1 +2526 12 13 +835 8 8 +76 4 4 +2242 1 1 +23 1 0 +160 1 0 +728 1 0 +328 13 3 +1353 1 1 +36 1 1 +97 1 1 +47 1 1 +2315 1 1 +37 1 1 +98 1 1 +34 2 2 +420 1 1 +19 1 1 +62 11 11 +605 53 54 +84 30 0 +603 10 10 +681 6 5 +296 34 34 +73 4 0 +158 11 11 +128 29 29 +329 31 28 +456 4 3 +383 3 0 +573 1 1 +40 1 0 +136 1 1 +49 1 1 +101 1 1 +31 1 1 +3293 1 0 +608 0 1 +25 2 2 +386 0 1 +3778 0 2 +825 3 0 +1733 1 0 +494 1740896 1431369 +976 0 1 +360 0 1 +1145 15 15 +1840 0 1 +1337 1 0 +1486 1 1 +43 3 0 +71 10 10 +104 1 0 +836 13 13 +85 0 1 +188 0 1 +1540 1 0 +530 0 6 +865 2 0 +1474 1 0 +1226 10 10 +579 0 2 +970 13 13 +286 1 1 +27 1 1 +1952 5 5 +863 1 1 +56 1 1 +908 1 1 +24 1 1 +663 0 1 +598 0 1 +162 12 13 +1255 0 3 +411 15 15 +465 0 2 +138 0 3 +135 1 1 +46 1 1 +494 1 1 +39 1 1 +288 3 0 +20 1 1 +1108 3 0 +581 5 1 +1985 11 11 +1621 1 1 +24 1 1 +806 1 1 +27 1 1 +155 1 0 +1177 0 3 +5152 1 1 +43 1 1 +1368 1 1 +27 2 0 +61 1 1 +130 4 4 +156 0 1 +180 0 4 +178 21 20 +1034 1 1 +20 1 1 +143 4 4 +2317 4 4 +43 1 1 +67 4 4 +737 1 1 +18 1 0 +2196 0 6 +2929 1 0 +16 1 1 +502 2 0 +601 0 2 +4990 1 0 +683 3 11 +4 0 1 +71 4 4 +8687 1 0 +583 0 4 +1084 1 0 +45 3 4 +8 0 8 +7 46 108 +6 2 0 +15 34 3 +16 20 0 +13 0 3 +6 11 11 +16 0 23 +59 43 19 +15 154 10 +13 3 0 +33 3 42 +52 1 1 +24 24 0 +662 10 19 +1873 14 0 +1539 1 0 +22 1 1 +3354 1 1 +29 1 1 +5408 2 0 +1255 1 0 +1837 3 0 +345 1 0 +4412 1 0 +392 1 0 +171 1 0 +3913 0 1 +155 0 1 +85 17 22 +323 19 0 +15 1 1 +1793 2 0 +1276 2 0 +364 3 0 +2364 14 0 +1587 9 9 +154 0 5 +1054 0 12 +1342 22 0 +53 0 8 +7 4 0 +31 0 5 +12 15 1 +498 1 0 +2064 2 0 +7986 0 6 +269 0 3 +687 4 0 +156 1 6 +64 0 5 +66 3 0 +137 521 0 +177 5 0 +171 5 0 +191 0 8 +114 0 3 +65 5 0 +129 0 4 +87 0 3 +246 67 70 +78 1 838 +88 13 0 +47 0 3 +115 29 18 +234 13 0 +51 5 0 +82 2 0 +98 58 67 +65 40 24 +519 19 29 +67 42 37 +370 0 3 +77 0 7 +228 0 16 +2164 12 12 +1849 1 1 +29 0 6 +5083 1 1 +27 1 1 +583 26 0 +58 8 0 +116 0 11 +58 17 52 +463 2 0 +1955 0 1 +6041 6 0 +3079 1 0 +11442 1 0 +1324 0 170 +4015 12 0 +730 6 0 +1119 19 17 +2012 0 2 +505 18 505221 +977 16 16 +230 23 23 +915 4 0 +6385 6 0 +1228 1 1 +18 1 1 +1376 1 1 +34 1 1 +355 1 1 +22 1 1 +1426 0 1 +3520 47 47 +700 38 38 +500 5 0 +1074 1 1 +31 1 1 +183 16 16 +729 0 6 +930 13 11 +180 9 9 +58 1 1 +42 1 1 +1671 0 2 +2034 1 0 +485 0 3 +253 1 1 +29 1 1 +1250 1 0 +439 2 0 +2756 0 1 +1234 0 1 +1438 0 1 +11 1 1 +1475 1 1 +47 1 1 +993 16 16 +424 0 1 +1933 0 1 +328 49 49 +818 17 9 +209 66 64 +168 8 30 +380 20 20 +646 45 45 +105 84 84 +317 32 37 +2325 13 12 +243 28 28 +713 37 37 +258 0 3 +2097 29 30 +109 35 35 +1085 47 48 +489 38 38 +499 23 23 +219 150 150 +109 46 46 +96 38 38 +73 126 126 +68 106 36 +131 29 29 +51 18 18 +509 1 0 +389 100 100 +104 12 12 +123 17 17 +64 27 28 +104 47 47 +92 1 0 +2224 26 26 +708 48 48 +197 15 16 +603 22 22 +241 8 12 +533 207 208 +82 97 95 +678 1 0 +293 43 43 +375 0 1 +939 2 0 +161 0 6 +51 2 0 +903 39 39 +63 159 160 +186 77 77 +30 2 0 +1548 38 38 +709 35 35 +2007 16 16 +2579 0 6 +58 45 45 +255 0 2 +287 35 35 +1313 24 24 +98 17 17 +235 50 50 +232 13 12 +198 43 43 +84 16 20 +197 36 36 +471 41 41 +148 1 3 +162 44 45 +283 1 0 +175 1 0 +477 37 37 +363 0 1 +248 88 86 +543 31 24 +280 1 0 +1713 21 21 +202 1 0 +1218 9 9 +131 17 17 +99 79 79 +1254 0 1 +531 9 9 +904 0 6 +1590 58 57 +188 1 0 +74 12 12 +399 1 0 +1967 39 39 +3380 33 33 +115 49 49 +324 0 6 +48 0 1 +3088 0 1 +210 51 51 +1590 48 48 +136 5 4 +239 37 39 +346 1 1 +73 1 1 +207 0 1 +1020 1 1 +77 1 1 +186 1 1 +15 1 1 +1257 9 9 +322 1 1 +67 1 1 +468 2 2 +41 1 1 +395 1 0 +130 12 12 +143 6 0 +464 3 4 +250 1 1 +22 1 1 +317 16 17 +451 1 1 +16 1 1 +514 1 3 +63 0 1 +229 1 0 +580 2 0 +467 1 1 +49 1 1 +497 1 0 +234 16 16 +76 1 1 +43 1 1 +193 0 1 +1709 2 0 +167 0 1 +642 1 1 +31 1 1 +127 1 1 +131 0 6 +933 18 18 +572 1 1 +24 1 1 +59 7 6 +828 3 0 +27 1 1 +281 1 1 +33 1 1 +293 6 6 +566 0 2 +1757 1 1 +55 1 0 +25 1 1 +588 1 0 +40 1 1 +1299 8 8 +376 1 1 +31 1 1 +590 13 16 +984 4 4 +51 9 9 +678 1 1 +38 1 1 +796 0 1 +248 1 1 +36 1 1 +1747 1 1 +22 4 0 +47 1 1 +94 0 2 +547 4 4 +260 23 26 +399 16 16 +2474 16 17 +699 17 17 +2264 1 1 +44 0 4 +621 1 1 +69 1 1 +189 20 21 +175 1 1 +25 1 1 +655 1 0 +1160 1 1 +28 1 1 +217 1 0 +696 0 2 +384 0 1 +40 1 0 +16 0 1 +64 1 1 +276 9 9 +370 1 1 +18 1 1 +240 0 2 +1255 1 1 +20 1 1 +1007 0 4 +223 18 18 +1216 7 7 +1576 0 3 +1718 1 1 +24 1 1 +62 1 1 +165 0 1 +137 1 1 +33 10 9 +121 1 1 +40 3 0 +16 1 1 +343 1 1 +10 1 0 +27 6 4 +190 10 0 +194 29 29 +301 1 1 +30 1 1 +675 1 1 +121 1 1 +296 1 1 +30 1 1 +312 1 1 +40 1 1 +305 5 1 +902 1 1 +130 1 1 +165 6 6 +854 10 10 +62 1 1 +26 0 4 +232 1 1 +31 1 1 +83 1 1 +29 1 1 +2531 16 11 +142 1 1 +41 1 1 +723 14 14 +360 1 1 +25 1 1 +153 1 1 +33 1 1 +288 1 0 +44 1 1 +2296 1 1 +63 6 0 +373 9 9 +308 48 40 +789 16 16 +924 1 1 +40 1 1 +355 1 1 +32 1 1 +372 1 1 +115 0 10 +74 1 1 +33 0 5 +703 1 1 +62 1 1 +54 13 13 +300 3 0 +24 1 1 +532 21 20 +234 1 1 +21 1 1 +70 1 1 +24 1 1 +248 15 15 +95 1 1 +38 1 1 +749 18 18 +117 1 0 +30 1 1 +117 0 1 +44 1 1 +52 1 1 +27 4 4 +54 1 1 +27 1 1 +79 1 1 +37 1 1 +427 1 1 +111 1 1 +501 17 17 +369 9 88 +222 1 1 +81 1 1 +115 1 0 +41 1 1 +226 1 1 +15 1 2 +57 1 1 +663 4 4 +44 1 1 +523 1 0 +715 1 0 +91 1 1 +200 2 1 +26 0 1 +309 1 1 +35 1 1 +119 7 8 +861 33 33 +388 11 11 +870 1 1 +18 11 0 +105 1 1 +39 1 1 +1570 2 0 +45 1 1 +254 0 1 +259 1 1 +36 1 1 +106 1 1 +27 1 1 +229 1 1 +47 1 1 +187 1 1 +21 1 1 +132 1 1 +155 1 1 +203 1 1 +31 1 1 +363 1 1 +28 1 1 +275 1 1 +30 0 10 +119 1 1 +43 1 1 +139 6 6 +129 24 0 +707 1 1 +28 1 1 +843 1 0 +142 1 1 +18 1 1 +93 5 5 +307 1 1 +26 1 1 +188 1 0 +58 1 1 +278 1 1 +49 1 1 +215 2 0 +237 1 1 +40 2 0 +246 13 13 +140 1 1 +37 4 0 +45 2 0 +200 1 1 +35 1 1 +110 1 1 +31 3 3 +810 1 1 +30 1 1 +293 1 1 +61 8 1 +206 2 2 +48 1 1 +88 1 0 +198 0 1 +169 1 0 +122 1 1 +38 1 1 +566 7 7 +32 1 1 +90 0 1 +1128 1 1 +34 1 0 +663 1 1 +42 2 0 +14 4 0 +458 0 1 +527 1 0 +34 9 0 +69 1 1 +745 1 0 +254 1 1 +74 0 5 +49 6 0 +20 0 4 +89 1 0 +97 1 1 +30 1 1 +105 1 1 +19 1 1 +633 1 1 +76 1 1 +50 1 1 +40 1 1 +358 1 1 +68 1 1 +1425 0 1 +1221 4 0 +37 1 0 +73 1 1 +731 1 1 +27 0 2 +126 1 13 +125 1 1 +35 1 1 +128 2 0 +42 0 14 +893 1 2 +1848 16 16 +233 1 1 +26 1 1 +642 0 10 +551 17 17 +247 1 1 +36 1 1 +317 1 1 +15 1 0 +514 0 2 +1178 1 1 +81 1 1 +1484 14 14 +693 4 4 +3073 1 1 +38 1 1 +779 1 1 +43 1 1 +663 1 1 +26 1 1 +272 1 0 +263 2 0 +1122 1 1 +25 1 1 +415 16 16 +624 1 1 +59 1 1 +186 1 1 +45 1 1 +632 1 1 +19 1 1 +90 14 14 +330 1 1 +33 1 1 +327 12 12 +321 10 10 +90 23 23 +21 9 7 +4 0 1 +46 29 30 +44 6209 3 +679 1 1 +36 1 1 +55 1 1 +68 0 1 +26 1 1 +446 9 9 +45 1 1 +351 15 15 +1283 1 1 +30 0 1 +279 1 1 +50 1 1 +940 1 1 +86 1 0 +1378 1 1 +15 1 1 +134 1 1 +68 1 1 +256 0 10 +20 1 1 +301 1 1 +35 1 1 +114 1 1 +34 1 1 +354 1 1 +31 1 1 +71 1 1 +60 4 4 +608 17 18 +1361 1 1 +34 1 1 +757 1 1 +32 1 1 +239 1 0 +585 21 21 +641 1 1 +39 1 1 +531 1 1 +49 1 1 +334 7 7 +189 1 1 +22 1 1 +107 1 0 +71 3 0 +75 1 1 +41 1 1 +71 1 1 +26 1 1 +506 1 1 +28 1 1 +511 1 1 +64 12 0 +191 0 1 +20 1 1 +472 1 1 +16 1 1 +71 0 4 +119 1 1 +47 1 1 +503 1 1 +44 1 1 +273 1 1 +34 1 1 +791 1 1 +15 1 1 +477 1 1 +44 1 1 +328 8 8 +579 1 1 +47 1 1 +124 0 3 +129 5 0 +59 0 5 +830 9 9 +52 1 1 +82 1 1 +216 0 6 +16 0 10 +44 1 1 +995 10 9 +557 1 1 +103 1 1 +161 1 1 +49 1 1 +643 0 2 +206 1 1 +26 1 1 +271 1 1 +45 1 1 +427 1 1 +15 1 1 +350 1 1 +20 1 1 +465 1 1 +44 1 1 +179 5 5 +369 0 1 +236 1 1 +19 1 1 +1716 1 0 +197 1 3 +421 1 1 +43 1 1 +904 2 0 +27 1 1 +1208 1 1 +31 1 1 +405 5 5 +177 1 1 +36 1 1 +57 1 0 +215 1 0 +418 8 9 +51 1 1 +78 1 1 +269 1 1 +40 1 0 +645 18 18 +366 1 1 +33 1 1 +257 7 7 +472 1 1 +29 1 0 +56 4 4 +49 1 1 +257 9 0 +410 11 7 +231 3 1 +509 3 3 +39 1 1 +307 19 19 +385 10 8 +658 1 1 +23 1 1 +149 3 1 +214 0 1 +539 1 1 +38 1 1 +952 1 1 +43 0 4 +210 1 1 +20 1 1 +128 1 1 +25 0 1 +307 0 2 +192 2 0 +478 1 1 +36 1 1 +489 0 6 +282 1 1 +47 1 1 +1154 3 1 +91 1 1 +85 1 1 +1026 5 5 +122 1 1 +25 1 1 +286 4 4 +160 1 1 +30 1 1 +209 11 11 +143 1 1 +45 1 1 +126 1 1 +71 1 1 +66 1 0 +343 15 15 +58 8 8 +109 15 15 +143 1 0 +516 2 0 +798 0 1 +982 0 1 +724 1 1 +107 1 1 +278 1 1 +35 1 1 +94 1 1 +48 1 1 +216 1 1 +29 1 1 +130 5 0 +232 4 4 +188 3 3 +33 0 1 +87 1 1 +17 1 1 +1230 5 0 +729 12 12 +404 1 0 +19 2 2 +216 0 4 +935 4 0 +172 0 1 +1047 1 1 +18 1 1 +53 0 1 +852 1 1 +47 1 1 +183 2 12 +1640 13 29 +77 6 6 +99 12 12 +1181 4 4 +1931 0 5 +147 1 1 +47 1 1 +332 1 0 +731 1 1 +38 4 0 +2489 4 4 +317 25 25 +1036 2 0 +500 0 1 +2517 1 1 +24 1 1 +1577 6 4 +21 1 1 +1663 1 1 +21 1 1 +1239 5 0 +876 1 1 +47 1 1 +451 5 5 +254 0 1 +56 1 1 +28 1 1 +57 1 1 +40 1 1 +893 1 1 +48 1 1 +980 1 1 +34 3 0 +441 1 2 +726 17 16 +240 9 11 +3447 4 0 +159 1 0 +63 1 3 +359 1 1 +63 1 1 +529 1 1 +30 1 1 +714 8 8 +476 1 1 +29 1 1 +478 1 1 +38 1 1 +959 1 0 +477 0 1 +32 1 1 +205 11 0 +101 2 1 +216 6 6 +961 0 1 +461 2 3 +22 1 1 +368 1 1 +151 0 3 +660 1 1 +35 6 4 +111 1 1 +43 1 1 +462 6 5 +115 1 1 +38 5 0 +505 3 0 +107 1 1 +59 4 0 +996 5 5 +223 18 18 +73 1 1 +30 1 1 +195 1 1 +64 1 1 +371 10 10 +134 1 0 +2420 1 0 +475 1 1 +30 1 1 +68 14 14 +829 15 15 +1992 1 1 +72 1 1 +847 1 1 +64 1 1 +327 1 1 +44 1 1 +215 0 4 +59 1 1 +47 1 1 +267 10 10 +133 1 1 +29 1 1 +162 1 1 +78 1 1 +468 1 1 +19 1 1 +472 4 4 +42 1 1 +523 1 0 +80 1 1 +572 7 9 +411 4 0 +236 18 18 +112 6 0 +196 3 0 +55 1 1 +228 1 1 +37 1 1 +71 0 1 +219 1 0 +273 4038 4011 +90 187 187 +104 4 4 +124 14 17 +170 6 2 +52 37 37 +98 28780 583375 +36 5403 5398 +28 2506 2525 +47 7268 7257 +41 7104 964 +46 376302 2510514 +125 20 20 +42 0 17 +94 54 54 +55 0 4 +254 41 41 +122 66 66 +253 11 11 +72 115 115 +163 32 20 +90 36 36 +116 134 137 +199 123 123 +84 86 94 +123 46 46 +57 161 160 +83 35 35 +81 116 116 +51 159 154 +117 84 84 +223 22 22 +53 82 82 +181 63 63 +56 39 39 +117 144 143 +527 7 7 +121 4 4 +75 41 41 +441 62 62 +117 1 4 +133 24 24 +137 63 64 +59 177 176 +99 51 51 +392 59 59 +91 6 6 +62 8 8 +120 39 39 +119 155 154 +91 64 64 +381 61 61 +50 63 54 +69 15 19 +470 48 46 +126 70 71 +191 2 0 +354 43 43 +61 22 23 +157 35 40 +116 7 7 +125 89 89 +166 47 48 +81 111 111 +205 35 35 +54 0 3 +52 40 39 +710 26 26 +360 43 43 +97 148 146 +446 309 49 +504 48 46 +134 47 47 +245 45 47 +54 24 24 +79 14 14 +930 39 39 +184 36 36 +88 42 42 +160 119 120 +317 7 9 +333 14 13 +67 71 71 +59 52 52 +59 39 39 +407 41 41 +149 28 28 +267 27 27 +128 69 68 +408 19 19 +74 54 54 +253 84 84 +174 62 62 +75 71 71 +106 141 137 +56 67 67 +200 44 44 +332 65 56 +82 132 136 +256 24 24 +866 27 27 +107 148 124 +330 30 30 +280 16 16 +424 7 7 +163 12 15 +234 1 0 +286 4 4 +58 7 37 +70 0 1 +240 144 142 +442 274 275 +243 0 4 +476 41 21 +430 87 59 +66 16 16 +240 18 18 +658 0 1 +78 11 11 +110 0 1 +313 30 30 +378 49 49 +149 98 105 +64 41 41 +1472 27 28 +188 0 1 +95 77 77 +55 38 38 +249 40 40 +308 17 17 +108 27 27 +507 48 48 +145 7 8 +157 26 26 +66 27 27 +74 16 8 +494 41 41 +118 7 7 +150 245 245 +196 6 6 +439 74 74 +99 90 90 +53 4 4 +102 70 68 +619 23 23 +105 45 45 +301 102 102 +468 26 26 +146 24 24 +1382 48 48 +499 122 134 +210 20 20 +101 33 33 +950 8 8 +275 20 20 +448 188 188 +221 177 184 +692 34 34 +69 41 41 +94 92 92 +195 51 51 +159 53 55 +137 35 35 +377 30 30 +91 21 21 +563 7 7 +582 15 15 +413 52 52 +81 12 12 +241 38 38 +343 8 8 +124 37 38 +468 33 33 +172 78 78 +176 85 84 +156 23 23 +251 37 37 +125 10 10 +516 85 85 +66 62 62 +166 36 34 +110 58 58 +80 52 50 +59 16 16 +98 36 36 +301 48 49 +187 5 5 +230 1 0 +168 91 91 +64 94 94 +55 19 19 +165 68 68 +190 8 8 +70 83 83 +113 55 55 +88 21 21 +90 69 69 +88 33 33 +55 45 45 +100 120 120 +56 45 45 +125 107 100 +307 17 22 +398 52 52 +437 56 56 +533 65 65 +102 71 69 +167 50 50 +75 20 24 +357 100 95 +235 36 37 +183 45 45 +60 1 0 +145 137 136 +80 45 45 +137 17 17 +124 1 0 +107 35 35 +52 14 14 +338 16 16 +607 76 77 +289 90 75 +204 54 54 +209 32 44 +63 70 70 +84 6 6 +119 4 4 +52 0 336 +224 44 45 +340 32 32 +403 28 28 +182 48 48 +77 1 0 +55 14 15 +257 158 159 +273 20 20 +53 15 16 +75 2 0 +82 61 61 +290 23 23 +96 134 135 +163 50 50 +883 1 0 +139 274 217 +125 5723 18562 +451 37 37 +289 141 145 +51 22 23 +229 69 72 +59 752 5 +111 44 44 +194 14 14 +53 73 74 +352 0 5 +69 9 8 +277 49 49 +56 9 8 +90 45 45 +152 327 0 +198 69 69 +114 27 27 +334 29 29 +53 86 86 +146 137 137 +119 47 51 +123 17 17 +66 12 1 +220 64 64 +132 48 390 +174 96 96 +511 60 53 +396 0 4 +82 76 76 +76 84 84 +314 75 75 +80 23 23 +459 36 36 +68 75 75 +206 12 12 +53 45 45 +319 0 315 +131 44 44 +198 1 0 +86 61 61 +154 96 96 +89 1 0 +159 70 68 +129 128 128 +145 34 25 +180 76 76 +153 12 13 +161 14 15 +431 80 80 +120 29 29 +76 85 87 +51 1 0 +344 0 2 +240 102 103 +148 152 150 +187 36 36 +158 79 79 +249 0 1 +730 82 82 +441 131 139 +78 16 16 +252 0 12 +111 19 19 +127 113 113 +182 113 113 +56 47 47 +110 3 1 +69 106 106 +209 66 71 +87 86 86 +83 21 21 +346 31 31 +106 147 152 +86 32 33 +78 18 36 +539 124 126 +99 70 70 +263 34 34 +161 44 44 +80 56 56 +240 491 584 +99 40 42 +169 42 42 +131 68 68 +98 37 37 +177 0 2 +220 11 12 +71 46 46 +111 41 40 +389 6 6 +68 25 25 +68 25 6 +68 190 189 +60 32 32 +169 13 9 +63 73 100 +313 35 35 +55 16 15 +58 50 50 +140 25 26 +70 60 60 +56 60 60 +181 177 180 +100 49 49 +103 42 49 +255 44 44 +64 8 4 +98 11 11 +168 6 6 +94 39 39 +61 41 41 +93 117 118 +40 1 0 +59 42 42 +60 126 126 +160 0 9 +104 25 32 +257 39 39 +92 15 15 +116 0 2 +53 5 5 +163 40 40 +54 20 20 +194 7 28 +130 58 46 +110 20 20 +52 1 9 +163 41 41 +215 19 19 +86 47 49 +57 100 100 +73 132 127 +56 4 4 +60 186 186 +56 83 83 +66 3 6 +65 14 26 +133 56 56 +253 51 51 +64 23 23 +151 320 324 +108 1 0 +355 110 110 +98 201 199 +85 48 48 +85 32 34 +387 30 29 +67 17 17 +197 9 9 +64 58 58 +62 31 31 +158 168 168 +91 19 19 +151 82 84 +377 30 30 +62 25 20 +517 46 46 +86 63 63 +261 30 30 +63 13 13 +114 30 30 +61 150278 64 +257 46 46 +227 78 74 +257 55 55 +678 32 32 +183 1 0 +137 32 32 +515 64 64 +185 45 50 +819 26 26 +418 0 8 +262 88 88 +324 6 6 +153 75 75 +101 35 35 +774 46 46 +410 76 76 +234 30 30 +208 10 25 +143 7 7 +232 12 11 +475 3 0 +899 72 72 +66 30 30 +965 112 112 +264 16 16 +380 23 23 +866 13 13 +54 32 32 +41 3 0 +234 9 9 +790 92 92 +149 10 0 +400 1 4 +39 0 15 +314 44 44 +78 101 97 +1348 0 24 +307 9 10 +265 0 1 +60 43 43 +568 40 40 +247 36 37 +306 24 25 +1044 26 30 +110 12 12 +72 51 51 +144 47 47 +565 45 45 +371 76 76 +1040 22 22 +101 8 0 +115 1 0 +568 0 2 +1182 16 16 +514 0 5 +237 90 91 +227 24 26 +56 6 6 +164 8 8 +235 40 40 +728 27 27 +545 10 10 +90 15 15 +1366 6 6 +553 14 14 +63 48 48 +152 16 16 +108 177 171 +74 25 25 +73 10 10 +69 35 35 +200 40 40 +283 53 53 +230 49 49 +167 142 142 +981 8 13 +136 4 4 +271 50 50 +210 0 6 +159 172 171 +406 40 41 +445 50 50 +119 6 7 +138 10 10 +935 36 36 +613 81 68 +852 33 33 +229 4 5 +86 26 26 +110 44 44 +42 0 8 +185 8 8 +271 0 2 +737 43 43 +70 16 16 +70 105 95 +537 10 6 +243 10 10 +518 36 36 +149 15 15 +70 9 0 +827 40 40 +164 19 21 +270 44 44 +651 78 75 +1798 19 19 +656 12 12 +208 0 1 +238 0 20 +1065 52 47 +117 48 48 +891 29 29 +238 30 30 +133 40 40 +158 0 6 +772 28 28 +137 44 44 +268 37 30 +895 35 33 +389 42 42 +397 23 0 +128 66 66 +330 39 39 +828 21 21 +641 29 29 +467 34 34 +560 10 10 +476 6 6 +1504 22 22 +369 45 45 +304 25 23 +2070 17 17 +2048 0 2 +262 0 1 +83 0 1 +211 30 30 +608 92572 18079522 +179955 271 271 +188 64 64 +140 148 148 +13339 633 633 +26 245 245 +29 156 156 +91 201 201 +78 57 57 +136 321 321 +41 174 174 +63 65 65 +97 89 89 +48 152 152 +48 53 53 +34 58 58 +70 61 61 +1445 61 61 +57 145 145 +223 89 89 +52 58 58 +74 483 483 +36 74 74 +228 80 80 +66 96 96 +118 249 249 +395 62 62 +281 131 131 +428 340 340 +108 51 51 +267 94 94 +71 114 114 +151 168 168 +31 57 57 +330 122 122 +104 138 138 +102 53 53 +93 55 55 +13395 183 183 +29 63 63 +34 76 76 +29 560 560 +97 420 420 +26 173 173 +585 56 56 +52 91 91 +85 50 50 +63 267 267 +167 842 842 +94 151 151 +44 393 393 +99 177 177 +33 237 237 +137 86 86 +85 222 222 +101 198 198 +31 692 692 +191 239 239 +78 160 160 +137 288 288 +38 188 188 +56 157 157 +28 184 184 +175 118 118 +44 66 66 +68 85 85 +27 176 176 +58 73 73 +45 84 84 +17857 108 108 +171 173 173 +46 198 198 +34 535 535 +77 58 58 +483 143 143 +80 263 263 +52 333 333 +96 61 61 +76 132 132 +46 115 115 +103 287 287 +86 117 117 +41 71 71 +53 451 451 +126 243 243 +173 129 129 +343 74 74 +45 261 261 +76 105 105 +40 79 79 +27 100 100 +71 93 93 +39 139 139 +76 122 122 +26 61 61 +50 63 63 +110 163 163 +146 51 51 +27 69 69 +85 129 129 +514 65 65 +32 274 274 +69 98 98 +148 271 271 +241 97 97 +56 205 205 +59 119 119 +250 71 71 +161 180 180 +117 171 171 +196 114 114 +129 125 125 +250 89 89 +160 401 401 +51 61 61 +48 272 272 +215 54 54 +76 218 218 +350 67 67 +532 136 136 +133 135 135 +204 53 53 +180 141 141 +312 465 465 +78 269 269 +86 264 264 +82 324 324 +44 168 168 +146 51 51 +323 63 63 +195 62 62 +155 57 57 +103 104 104 +102 72 72 +146 64 64 +51 153 153 +169 101 101 +114 270 270 +147 348 348 +27 280 280 +77 302 302 +35 117 117 +233 273 273 +93 154 154 +32 86 86 +43 56 56 +58 113 113 +284 51 51 +54 97 97 +409 72 72 +37 63 63 +68 52 52 +69 100 100 +149 53 53 +203 352 352 +47 291 291 +147 481 481 +107 121 121 +40 68 68 +47 138 138 +107 82 82 +40 105 105 +104 60 60 +151 271 271 +49 151 151 +37 138 138 +4080 309 309 +50 93 93 +86 90 90 +216 77 77 +340 87 87 +26 229 229 +78 64 64 +165 503 503 +40 55 55 +110 308 308 +60 112 112 +127 337 337 +409 124 124 +103 73 73 +48 84 84 +47 316 316 +37 271 271 +366 90 90 +86 137 137 +313 490 490 +26 98 98 +53 82 82 +30 471 471 +48 135 135 +88 2268 2268 +33 149 149 +57 786 786 +39 1573 1573 +40 183 183 +32 22980 22980 +45 800 800 +53 73 73 +166 126 126 +37 276 276 +89 110 110 +166 188 188 +223 82 82 +43 209 209 +161 301 301 +29 204 204 +35 87 87 +147 83 83 +138 98 98 +99 115 115 +21591 115 115 +99 98 98 +137 83 83 +165 87 87 +35 204 204 +29 301 301 +156 201 201 +43 82 82 +223 187 187 +166 110 110 +88 271 271 +36 126 126 +166 73 73 +53 782 782 +85 24735 24735 +40 786 786 +57 149 149 +33 2273 2273 +87 135 135 +48 471 471 +29 82 82 +53 612 612 +313 137 137 +90 90 90 +361 271 271 +36 316 316 +45 84 84 +46 73 73 +103 124 124 +394 337 337 +127 112 112 +60 308 308 +110 55 55 +40 503 503 +8625 82 82 +46 346 346 +206 53 53 +149 100 100 +69 52 52 +72 63 63 +37 72 72 +411 97 97 +54 51 51 +286 113 113 +58 56 56 +43 86 86 +32 154 154 +94 273 273 +246 117 117 +35 302 302 +79 281 281 +27 348 348 +147 270 270 +114 101 101 +170 153 153 +48 64 64 +146 72 72 +102 104 104 +103 57 57 +157 62 62 +193 63 63 +320 51 51 +140 168 168 +44 324 324 +82 264 264 +85 266 266 +78 463 463 +319 141 141 +177 53 53 +204 135 135 +133 169 169 +269 50 50 +184 67 67 +331 218 218 +76 54 54 +215 272 272 +48 61 61 +51 401 401 +138 89 89 +250 126 126 +129 114 114 +196 171 171 +21764 271 271 +59 619 619 +35 101 101 +71 573 573 +138 351 351 +61 266 266 +51 52 52 +96 199 199 +67 55 55 +210 102 102 +87 329 329 +173 200 200 +70 585 585 +49 81 81 +103 169 169 +58 147 147 +95 296 296 +216 239 239 +72 415 415 +40 73 73 +58 176 176 +27 85 85 +65 66 66 +44 118 118 +175 184 184 +28 157 157 +56 188 188 +38 288 288 +136 160 160 +78 241 241 +192 692 692 +38 198 198 +101 222 222 +85 86 86 +138 237 237 +34 175 175 +100 393 393 +44 151 151 +94 838 838 +167 267 267 +61 50 50 +85 91 91 +52 56 56 +590 173 173 +26 419 419 +97 569 569 +29 76 76 +34 63 63 +29 204 204 +119 54 54 +358 393 393 +47 446 446 +54 72 72 +66 366 366 +81 66 66 +30 141 141 +30 63 63 +94 332 332 +35 238 238 +48 279 279 +71 109 109 +93 135 135 +31 551 551 +99 50 50 +147 90 90 +46 76 76 +53 60 60 +86 73 73 +46 64 64 +83 91 91 +46 137 137 +40 124 124 +77 64 64 +172 246 246 +64 71 71 +75 208 208 +159 65 65 +54 51 51 +27 72 72 +68 163 163 +39 144 144 +30 114 114 +44 113 113 +45 95 95 +171 54 54 +185 83 83 +142 79 79 +53 210 210 +75 93 93 +40 152 152 +144 55 55 +105 75 75 +57 827 827 +35 651 651 +39 65 65 +90 500 500 +78 166 166 +49 259 259 +788 55 55 +122 53 53 +104 138 138 +104 122 122 +330 57 57 +34 168 168 +150 114 114 +70 94 94 +293 51 51 +109 340 340 +430 131 131 +276 62 62 +394 249 249 +118 96 96 +66 80 80 +243 74 74 +36 482 482 +74 58 58 +48 89 89 +225 145 145 +41 61 61 +79 61 61 +157 53 53 +51 152 152 +48 89 89 +97 65 65 +63 174 174 +41 321 321 +136 57 57 +82 201 201 +91 156 156 +29 245 245 +26 796 796 +26 66 66 +137 143 143 +64 57 57 +67 114 114 +118 291 291 +79 192 192 +49 507 507 +181 116 116 +131 131 131 +129 121 121 +41 91 91 +37 252 252 +26 216 216 +230 56 56 +35 50 50 +72 692 692 +30 237 237 +58 77 77 +45 197 197 +30 350 350 +56 79 79 +49 126 126 +90 60 60 +163 120 120 +95 120 120 +81 297 297 +37 84 84 +81 55 55 +37 117 117 +125 191 191 +184 179 179 +51 143 143 +45 192 192 +210 180 180 +45 66 66 +278 92 92 +65 236 236 +56 57 57 +53 68 68 +14832 101 101 +87 71 71 +151 227 227 +28 145 145 +50 234 234 +51 71 71 +30 143 143 +69 260 260 +44 683 683 +125 133 133 +43 179 179 +54 495 495 +73 66 66 +33 139 139 +94 181 181 +52 140 140 +35 588 588 +47 231 231 +143 840 840 +73 254 254 +32 458 458 +69 733 733 +114 50 50 +55 113 113 +59 183 183 +33 172 172 +40 247 247 +38 432 432 +42 339 339 +59 434 434 +82 213 213 +93 125 125 +103 87 87 +115 241 241 +205 92 92 +28 253 253 +79 52 52 +89 228 228 +34 954 954 +29 85 85 +232 979 979 +31 120 120 +39 167 167 +26 80 80 +141 224 224 +65 404 404 +66 299 299 +70 168 168 +71 92 92 +93 157 157 +40 89 89 +33 87 87 +69 58 58 +41 441 441 +28 111 111 +60 181 181 +63 229 229 +71 338 338 +149 331 331 +56 446 446 +44 81 81 +35 62 62 +65 56 56 +42 190 190 +45 603 603 +62 204 204 +58 407 407 +47 793 793 +40 305 305 +33 74 74 +42 265 265 +49 624 624 +83 513 513 +49 1028 1028 +67 244 244 +77 452 452 +43 619 619 +33 212 212 +96 68 68 +168 359 359 +88 521 521 +65 645 645 +124 168 168 +103 61 61 +118 175 175 +39 70 70 +60 294 294 +90 143 143 +80 197 197 +39 140 140 +28 97 97 +1484 81 81 +104 144 144 +247 69 69 +48 416 416 +53 237 237 +71 58 58 +33 52 52 +53 276 276 +29 409 409 +200 100 100 +322 188 188 +66 348 348 +26 192 192 +42 78 78 +66 96 96 +131 105 105 +447 78 78 +29 235 235 +54 57 57 +45 86 86 +156 60 60 +121 113 113 +57 81 81 +37 454 454 +41 1271 1271 +48 108 108 +37 133 133 +49 85 85 +40 419 419 +86 428 428 +81 178 178 +108517 13 13 +76 32 33 +321 107 107 +44 0 12 +382 22 22 +618 1 0 +1377 22 22 +2267 39 39 +82 89 88 +211 1 3 +991 48 48 +189 27 27 +458 16 16 +160 1 0 +977 37 0 +525 0 8 +811 72 64 +83 22 22 +373 44 41 +1035 0 1 +821 0 1 +552 1 0 +762 4 0 +698 13 14 +1686 245 245 +125 23 23 +71 101 101 +53 41 41 +91 37 37 +74 39 39 +212 317 317 +526 64 64 +343 40 40 +59 24 24 +380 61 61 +560 25 28 +73 206 206 +56 34 34 +280 28 28 +106 2 0 +27 12 0 +171 90 91 +197 183 183 +67 22 22 +313 18 18 +159 48 48 +138 5 5 +60 63 63 +185 4 0 +248 0 1 +79 23 22 +127 29 29 +85 76 78 +237 23 23 +97 187 187 +57 55 55 +56 70 73 +103 1 21 +176 45 45 +53 69 69 +169 25 25 +1006 7 0 +204 44 44 +277 0 9 +249 52 51 +112 0 1 +85 18 20 +262 22 39 +85 133 136 +88 31 31 +54 56 56 +162 18 18 +173 129 129 +158 63 79 +75 109 109 +183 17 17 +416 39 39 +714 127 123 +154 74 74 +291 38 1635 +407 0 2 +256 39 39 +416 0 1 +85 34 34 +129 37 37 +308 0 4 +250 13 13 +54 16 16 +84 45 45 +300 2 0 +174 38 36 +564 23 23 +389 0 1 +153 12 12 +178 54 54 +377 51 51 +70 125 124 +235 23 23 +137 11 12 +544 6 1 +542 59 59 +313 40 40 +176 261 268 +492 46 46 +268 5 5 +96 15 15 +86 2 0 +308 87 87 +399 53 52 +918 9 9 +260 56 56 +106 4 4 +281 258 258 +90 50 50 +60 250 250 +200 72 72 +234 18 18 +57 58 58 +273 41 41 +240 27 27 +140 0 4 +59 26 26 +63 102 102 +147 16 14 +61 57 57 +55 32 32 +72 4 4 +268 43 43 +65 32 32 +65 28 29 +372 38 38 +535 323 0 +253 702933 2125786 +418 36 36 +1126 2 3 +235 13 12 +536 19 19 +103 6 6 +708 99 97 +2321 1 0 +94 0 1 +142 29 29 +141 1 0 +367 51 51 +98 0 8 +144 39 39 +145 31 23 +1175 10 10 +304 47 47 +1178 13 13 +50 1 0 +228 0 2 +757 47 31 +748 23 23 +347 6 6 +215 1 0 +134 34 32 +117 2 0 +240 48 48 +3098 40 41 +394 0 62 +767 53 53 +577 42 42 +797 51 51 +83 63 63 +297 39 39 +381 35 35 +274 116 116 +383 23 23 +1517 31 31 +250 47 47 +431 9 2 +135 0 30 +217 84 84 +853 7 15 +1176 1 1 +43 0 11 +451 1 1 +103 1 1 +363 1 1 +40 1 1 +663 1 1 +34 1 1 +63 1 1 +46 1 1 +182 2 0 +47 1 1 +202 1 1 +21 1 1 +594 0 2 +50 1 1 +37 1 1 +56 1 1 +40 1 1 +728 0 1 +55 1 1 +73 1 1 +711 1 1 +42 1 1 +418 0 1 +45 1 1 +103 1 1 +41 1 1 +303 1 1 +40 5 0 +24 1 1 +265 1 1 +74 1 1 +237 1 1 +26 1 1 +109 1 1 +30 1 1 +1890 3 1 +12 0 1 +40 1 1 +869 1 4 +1232 1 1 +32 2 2 +1693 1 1 +17 4 4 +348 18 20 +205 14 14 +139 1 1 +36 0 6 +29 1 1 +71 1 1 +36 1 1 +323 7 7 +243 1 1 +48 1 1 +88 1 1 +39 2 3 +17 1 1 +73 6 0 +11 4 0 +56 0 2 +47 4 4 +878 15 0 +55 1 1 +93 1 1 +22 1 1 +449 0 27 +119 1 1 +45 1 1 +66 27 0 +22 2 0 +50 6 297 +436 1 1 +43 1 1 +86 0 1 +456 1 1 +50 1 1 +1291 1 1 +45 1 1 +107 12 15 +63 0 1 +30 0 12 +18 1 1 +1471 12 12 +514 1 1 +92 0 7 +11 0 4 +318 1 1 +126 1 1 +380 1 1 +41 1 1 +772 9 9 +221 0 4 +336 0 27 +416 1 1 +50 1 1 +115 1 1 +54 1 1 +642 1 1 +21 18 0 +35 1 1 +241 10 10 +1061 1 1 +46 1 0 +495 13 13 +950 1 1 +28 1 1 +369 1323 0 +43 1 1 +97 1 1 +43 1 1 +149 1 1 +36 2 2 +179 1 1 +43 1 1 +666 1 1 +41 1 1 +734 638 0 +199 1 1 +28 0 1 +97 1 1 +36 1 1 +60 0 1 +395 0 2 +68 1 1 +426 1 1 +45 1 1 +273 0 1 +40 0 4 +39 1 1 +136 24 15 +817 1 0 +285 1 1 +29 1 1 +308 1 0 +203 0 1 +913 17 18 +211 1 1 +47 1 0 +332 8 8 +106 1 1 +77 1 1 +200 4 4 +247 4 5 +131 1 1 +110 0 1 +82 20 20 +249 1 1 +63 1 1 +69 1 9 +15 11 1 +18 0 8 +37 8 0 +264 17 17 +1329 11 11 +969 1 1 +57 1 1 +1050 1 1 +32 1 1 +2560 1 1 +18 3 3 +512 1 1 +58 3 0 +156 5 0 +38 1 1 +506 3 36 +20 11 0 +398 0 5 +30 0 6 +76 13 13 +503 1 1 +51 1 0 +406 1 1 +57 1 1 +104 0 2 +171 1 1 +30 1 1 +324 1 0 +658 0 8 +2146 31 25 +778 0 1 +36 1 1 +182 0 2 +946 0 1 +23 1 1 +701 1 1 +31 1 1 +245 5 0 +1885 17 17 +1545 2 0 +25 1 1 +85 4 4 +366 1 1 +20 1 1 +60 0 4 +64 12 0 +374 1 1 +31 7 0 +121 1 1 +58 2 0 +73 1 1 +188 1 1 +38 1 1 +344 1 1 +25 1 1 +314 1 1 +35 1 1 +474 0 1 +364 1 1 +29 1 1 +463 23 42 +1547 4 0 +378 1 0 +72 5 4 +622 0 1 +835 1 1 +81 1 1 +593 15 12 +122 1 0 +230 1 1 +89 1 1 +698 18 18 +437 1 1 +30 1 1 +956 1 1 +35 1 1 +75 1 1 +48 1 1 +79 1 1 +19 1 1 +236 1 1 +43 1 1 +576 0 1 +243 1 1 +28 1 0 +556 0 10 +1070 1 1 +32 1 1 +121 1 1 +73 4 0 +736 1 1 +50 1 1 +473 1 1 +37 3 0 +5 6 0 +26 1 0 +89 1 1 +49 4 7 +71 1 1 +62 1 1 +1437 1 0 +136 1 1 +46 1 1 +219 0 1 +1367 4 0 +1075 1 1 +72 1 1 +705 18 18 +768 4 0 +172 1 0 +1326 11 11 +352 1 1 +109 1 1 +54 1 0 +453 386245 0 +237 1 0 +1713 21 22 +75 0 4 +98 1 1 +42 1 1 +1027 0 3 +458 0 42 +445 0 318 +188 15 15 +337 0 3 +577 1 1 +32 1 1 +126 1 1 +26 1 1 +690 10 10 +123 0 5 +225 1 1 +67 1 1 +969 1 1 +22 1 1 +592 0 1 +217 0 4 +278 1 1 +72 1 1 +404 30 30 +524 8 0 +186 88 89 +1127 18 14 +217 48 42 +310 16 16 +549 13 12 +164 2 2 +37 1 1 +200 1 1 +23 0 3 +142 7 7 +1104 1 0 +18 1 0 +7 87 0 +26 1 1 +205 1 1 +38 1 1 +418 1 1 +37 1 1 +375 0 3 +167 1 1 +167 1 1 +150 5 5 +272 16 15 +220 3 0 +125 10 6 +74 1 1 +51 0 2 +22 1 1 +163 21 25 +136 1 1 +20 1 1 +57 21 20 +191 13 13 +230 1 1 +94 10 0 +84 9 9 +53 1 1 +18 1 1 +143 4 4 +196 1 1 +50 1 1 +87 162 162 +162 58 58 +221 4 0 +99 66 66 +70 68 68 +167 24 24 +54 66 90 +148 24 24 +50 122 122 +65 23 23 +213 49 46 +135 66 66 +120 27 27 +617 82 82 +793 441 437 +347 73 73 +51 40 40 +71 61 61 +57 49 49 +216 77 77 +79 95 95 +121 38 38 +99 15 15 +129 219 216 +77 429 420 +192 102 99 +115 23 23 +117 79 79 +115 15 15 +84 38 38 +67 69 69 +114 16 19 +72 76 76 +405 171 171 +358 27 27 +62 94 94 +499 56 56 +579 56 56 +457 1 1 +80 1 1 +120 1 1 +43 1 1 +135 1 1 +92 1 1 +440 1 1 +47 1 1 +66 1 1 +112 1 0 +20 7 7 +64 9 9 +192 1 1 +46 1 1 +116 18 18 +161 1 0 +797 1 1 +33 1 1 +194 1 1 +49 1 1 +553 4 0 +29 1 1 +982 1 1 +21 1 1 +973 27 27 +561 1 1 +77 1 0 +101 1 1 +35 1 1 +473 0 1 +227 0 2 +32 6 0 +55 4 4 +1106 2 0 +224 47 47 +514 13 338 +84 28 28 +225 2 0 +167 76 76 +661 9 9 +125 1 1 +28 1 1 +758 0 3 +89 3 0 +2041 2 0 +695 1 1 +27 0 5 +11 1 1 +146 5 6 +516 1 1 +59 1 1 +652 1 1 +29 1 1 +189 11 11 +348 12 12 +1271 44 332 +515 1 1 +27 1 1 +1156 1 1 +32 1 1 +388 0 1 +75 17 14 +1247 1 0 +1387 2 0 +126 18 18 +157 33 1 +2218 1 1 +45 1 1 +730 50 50 +859 114 110 +563 9 9 +300 0 1 +289 0 4 +78 1 1 +84 1 1 +595 1 1 +36 1 1 +1077 1 1 +55 1 1 +92 0 1 +190 18 18 +125 1 5 +32 1 1 +513 6 6 +322 1 1 +39 1 1 +653 0 1 +255 1 1 +38 1 1 +190 0 6 +926 1 1 +43 1 1 +65 19534723 603186 +489 6 0 +827 14 13 +135 0 1 +392 1 1 +54 1 1 +479 2 0 +87 2 0 +139 1 1 +28 1 1 +300 1 1 +47 1 1 +2095 7 7 +200 1 1 +39 1 1 +1171 55 55 +80 14 14 +439 13 13 +491 47 47 +85 22 32 +657 44 45 +1607 3 0 +351 33 33 +289 43 43 +1011 1 0 +1309 31 291 +494 62 52 +92 37 37 +337 18 18 +723 1 1 +21 1 1 +561 1 1 +34 1 1 +98 1 1 +38 1 1 +129 1 1 +48 1 1 +92 0 1 +660 13 14 +961 11 11 +268 1 1 +24 1 1 +479 0 1 +50 1 1 +210 1 1 +59 1 1 +203 1 1 +134 1 1 +183 4 4 +25 1 1 +223 97 96 +113 50 50 +556 0 3 +146 29 29 +1265 27 27 +2064 26 0 +307 7 7 +49 0 2 +604 1 0 +1283 77 9 +4095 0 1 +21 1 0 +1721 1 0 +59 29 0 +69 1 1 +72 1 1 +119 8 16 +1288 1 1 +33 1 1 +589 1 1 +62 1 1 +223 0 2 +29 1 1 +1708 14 14 +70 24 24 +139 1 1 +48 1 1 +70 1 1 +37 1 1 +1084 1 1 +46 1 1 +969 1 1 +30 1 1 +73 1 1 +49 2 2 +547 7 7 +173 1 1 +45 1 1 +268 1 1 +61 1 1 +1034 28 41 +903 18 0 +42 2 2 +278 23 23 +159 22 16 +525 42 41 +445 6 6 +212 28 28 +105 9 9 +1065 12 12 +622 8 8 +725 5 5 +13 1 1 +344 0 1 +422 12 12 +306 0 316 +120 0 2 +392 1 1 +34 1 1 +328 0 1 +286 12 14 +129 1 1 +125 1 1 +229 1 1 +67 1 0 +595 1 1 +89 1 1 +286 1 1 +29 4 0 +77 1 1 +24 1 1 +239 1 1 +152 1 1 +113 22 22 +287 16 16 +43 0 3 +276 57 57 +119 45 45 +553 4 4 +297 49 49 +912 31 31 +332 0 2 +656 35 35 +69 135 135 +2597 6 0 +137 102 103 +177 42 42 +633 55 55 +163 135 117 +622 18 18 +1593 82 84 +82 61 61 +95 8 8 +304 42 41 +53 42 42 +1096 0 1 +339 5 3 +128 63 63 +167 17 18 +888 33 31 +118 0 3 +1372 83 83 +369 25 25 +83 13 13 +167 34 37 +216 15 15 +57 71 71 +87 19 19 +62 343 346 +54 41 46 +88 22 22 +2022 43 43 +145 7 3 +665 127 127 +199 27 34 +486 0 3 +135 17 17 +190 90 90 +176 57 58 +261 19 19 +477 136 137 +436 40 40 +227 63 66 +61 11 11 +234 35 35 +946 43 46 +68 24 24 +399 93 93 +898 24 24 +139 77 77 +34 4 0 +2231 2 0 +129 1 1 +94 3 3 +418 10 10 +209 27 16 +320 1 1 +178 1 1 +73 20 20 +551 6 2 +83 1 1 +26 1 1 +171 1 1 +141 1 1 +465 1 1 +51 1 1 +74 1 1 +46 1 1 +371 1 1 +43 1 1 +90 1 1 +13 1 1 +230 1 1 +30 1 1 +64 1 1 +59 1 1 +258 19 19 +488 24 24 +556 5 1 +446 4 4 +50 1 1 +663 8 8 +104 0 1 +30 3 0 +35 3 0 +37 1 0 +59 1 1 +351 1 1 +41 1 1 +774 0 5 +887 1 0 +399 1 0 +63 1 1 +85 1 1 +87 1 1 +82 1 1 +508 1 1 +41 1 1 +407 1 1 +27 1 1 +432 1 1 +28 1 1 +328 0 3 +958 1 1 +20 1 1 +341 1 1 +49 7 9 +26 1 1 +182 18 18 +978 1 1 +17 1 1 +1030 1 0 +213 1 1 +27 1 1 +365 1 1 +33 1 0 +911 1 1 +58 3 3 +733 1 1 +38 1 1 +264 1 1 +32 5 0 +53 1 1 +173 1 1 +69 1 1 +104 6 0 +648 1 1 +76 1 1 +226 1 1 +34 1 1 +247 1 1 +38 1 1 +823 1 1 +47 1 1 +588 30 31 +304 1 1 +39 1 1 +179 9 9 +1184 14 0 +65 9 1 +195 1 0 +112 1 1 +23 1 1 +188 1 1 +19 1 1 +530 1 0 +500 1 1 +38 1 1 +518 0 1 +212 1 1 +33 1 1 +700 1 1 +60 1 1 +87 2 1 +73 1 1 +48 1 1 +141 1 0 +153 1 1 +39 1 1 +689 5 0 +888 1 1 +40 1 1 +250 0 1 +58 1 1 +41 2 2 +141 1 1 +36 1 1 +168 9 0 +128 7 0 +67 1 1 +47 4 0 +123 0 4 +9 14 0 +25 1 1 +227 1 0 +222 1 1 +38 1 1 +54 4 4 +15 1 1 +177 1 1 +37 1 1 +85 1 1 +37 1 1 +168 1 1 +18 1 1 +51 4 0 +66 14 13 +152 2 0 +20 1 1 +198 1 1 +20 1 1 +334 0 1 +27 0 4 +538 17 17 +645 1 1 +19 1 1 +211 8 8 +73 1 1 +44 6 0 +32 1 1 +50 0 1 +208 16 17 +356 1 1 +83 1 1 +129 1 1 +20 10 0 +142 1 1 +236 1 1 +8 5 3 +87 1 1 +319 0 1 +22 1 1 +53 1 1 +68 1 1 +222 1 0 +71 9 6 +54 31 31 +158 36 36 +223 19 19 +79 27 27 +119 10 8 +469 20 25 +1350 46 129498 +221 95 94 +166 74 78 +343 30 30 +51 25 25 +303 13 13 +439 78 79 +60 32 39 +62 99 99 +112 31 27 +147 9 9 +61 1 1 +71 1 1 +114 1 1 +26 2 2 +51 2 2 +19 1 0 +150 1 1 +61 1 1 +610 1 1 +24 1 1 +77 1 1 +55 1 1 +148 1 1 +50 1 1 +59 3 1 +24 12 0 +72 0 1 +82 1 1 +122 1 1 +65 1 1 +43 1 1 +186 0 8 +243 1 1 +81 8 8 +62 1 1 +149 5 5 +59 1 1 +259 10 10 +782 9 14 +740 1 1 +51 1 1 +110 87 87 +93 35 34 +330 17 23 +166 39 39 +176 21 19 +62 21 21 +219 12 12 +135 49 35 +62 105 105 +66 4 4 +85 40 40 +84 49 49 +127 31 31 +134 113 85 +213 195 195 +119 35 35 +61 56 56 +215 33 33 +79 33 32 +164 4 4 +88 9 9 +95 213 212 +145 151 151 +52 75 73 +240 4117 4097 +232 45 45 +124 103 103 +351 24 24 +139 0 1 +119 63 62 +87 101 88 +67 63 63 +549 18 18 +183 104 104 +57 148 148 +56 64 64 +140 76 76 +205 71 72 +80 38 37 +110 47 47 +72 33 33 +172 13 13 +300 128 128 +551 219 220 +55 25 26 +239 41 41 +366 76 76 +497 0 4 +282 35 33 +206 26 26 +233 43 43 +240 45 45 +78 10 10 +242 27 27 +156 84 84 +168 8 8 +235 93 93 +62 15 15 +528 71 71 +556 116 116 +180 9 11 +69 20 20 +62 34 34 +415 36 36 +183 83 83 +261 60 60 +527 14 14 +266 12 12 +109 171 173 +74 25 25 +73 190 192 +311 46 46 +104 38 38 +96 184 49 +162 147 168 +158 63 63 +51 4111 4092 +86 51 51 +83 11 11 +187 15 18 +52 66 66 +286 58 58 +443 56 56 +857 31 32 +343 29 28 +60 169 169 +149 196 196 +96 108 129 +301 8 8 +214 6 10 +85 0 8 +158 10 10 +54 36 35 +71 48 48 +125 39 39 +145 51 51 +68 223 219 +257 4 0 +58 28 28 +97 19 20 +197 23 26 +251 26 26 +204 5 5 +81 44 44 +87 160 164 +307 172 175 +728 52 62 +238 89 89 +673 210 210 +72 71 71 +221 4 4 +300 36 35 +261 171 165 +891 47 52 +144 31 34 +150 21 9 +93 23 23 +72 42 42 +118 17 17 +58 267 271 +94 9 9 +64 9 9 +51 61 64 +201 59 59 +145 3 7 +105 58 58 +201 20 20 +320 235 236 +77 97 97 +94 41 48 +777 34 37 +87 9 14 +415 26 26 +422 55 56 +67 47 47 +223 42 42 +65 39 39 +203 84 83 +105 231 227 +205 21 21 +375 0 1 +85 9 9 +117 124 124 +225 130 133 +72 61 61 +66 140 141 +289 48 48 +94 9 9 +352 92 92 +66 29 29 +164 1 0 +150 30 30 +81 58 59 +62 25 25 +50 62 58 +57 40 40 +142 103 103 +200 141 142 +241 28 28 +91 93 91 +136 34 34 +118 1 0 +122 50 47 +82 25 25 +50 39 39 +537 1 1 +48 1 1 +224 1 1 +24 0 1 +4 1 0 +99 1 1 +22 1 1 +72 2 0 +110 4 0 +279 1 1 +30 1 1 +260 1 1 +46 4 0 +52 1 0 +381 0 1 +62 1 1 +60 1 1 +88 5 0 +420 1 1 +43 1 1 +425 1 1 +23 1 1 +101 4 0 +44 1 1 +276 1 1 +49 1 1 +95 1 1 +15 0 1 +21 1 1 +93 0 3 +100 1 1 +125 1 1 +557 1 1 +75 1 1 +74 4306 4300 +77 48 48 +104 5 0 +136 10 10 +94 24 24 +466 42 41 +52 30 30 +260 154 154 +54 100 100 +69 8 0 +59 21 17 +427 3 6 +168 97 97 +54 52 52 +54 1 2 +219 36 37 +139 14 14 +57 54 54 +60 35 35 +111 93 93 +260 370 353 +92 30 26 +197 51 51 +362 2 2 +40 0 3 +43 3 0 +116 1 1 +46 1 1 +113 2 2 +28 4 4 +41 17 0 +59 5 5 +878 1 1 +60 3 1 +95 1 1 +27 1 1 +312 1 1 +45 1 1 +105 1 1 +48 1 1 +511 2 0 +86 1 1 +531 1 1 +141 1 1 +174 0 17 +24 1 1 +294 5 5 +109 1 1 +18 1 1 +125 1 1 +45 1 1 +359 11 11 +149 41 41 +196 0 5 +163 7 7 +317 44 44 +559 44 44 +132 10 10 +684 39 40 +439 42 43 +315 0 1 +510 0 3 +92 1 0 +117 63 63 +334 24 34 +532 15 15 +77 71 71 +198 109 109 +333 18 16 +413 15 15 +856 76 71 +58 25 25 +458 41 41 +131 31 31 +298 90 75 +77 122 124 +92 53 53 +60 37 37 +98 76 76 +212 128 128 +258 36 36 +333 67 67 +484 50 51 +129 31 32 +82 29 29 +187 14 14 +1306 0 1 +202 5 6 +170 4 0 +285 20 20 +452 0 1 +127 24 24 +432 46 46 +105 140 141 +63 6 3 +178 73 72 +131 73 58 +534 19 19 +561 65 64 +266 27 27 +170 80 80 +55 50 50 +164 14 0 +55 55 55 +61 9 9 +178 45 45 +257 42 42 +120 8 8 +72 7 7 +208 45 45 +59 50 61 +57 26 26 +66 49 49 +103 57 57 +101 0 1 +59 50 61 +91 67 67 +58 64 64 +198 4 5 +177 63 63 +294 349 349 +55 68 68 +515 10 10 +67 41 41 +195 11 11 +216 64 64 +79 36 36 +233 30 17 +215 105 102 +148 35 35 +134 24 24 +263 1 1 +111 1 1 +62 1 1 +15 1 1 +94 1 1 +22 1 1 +74 2 2 +15 1 1 +190 1 1 +117 1 1 +55 1 1 +22 1 1 +424 33 28 +74 2 0 +9 4 0 +168 1 1 +102 0 5 +50 2 0 +36 1 1 +278 10 9 +132 1 1 +42 3 0 +32 1 1 +181 1 1 +100 1 1 +728 1 1 +31 3 3 +67 1 1 +14 0 5 +38 1 1 +563 29 32 +66 1 1 +93 1 1 +97 1 1 +359 1 1 +35 1 1 +254 104 104 +109 123 123 +103 47 47 +703 11 11 +137 61 58 +69 89 89 +103 17 17 +161 65 58 +91 16 12 +57 12 12 +77 167 171 +67 17 16 +191 58 43 +246 56 56 +54 43 43 +189 77 77 +65 48 48 +112 31 31 +92 33 33 +159 37 37 +52 66 68 +337 4810 4425 +52 5 5 +125 69 73 +109 103 103 +241 118 121 +52 0 2 +102 0 1 +1089 62 62 +77 155 150 +234 5 4 +109 12 12 +84 152 2161 +216 46 46 +698 23 24 +391 45 36 +112 23 23 +328 28 28 +409 12 8 +142 7 7 +262 21 18 +880 81 82 +1115 54 54 +441 0 1 +119 57 53 +196 52 51 +332 39 49 +394 7 7 +51 39 43 +307 293 292 +53 47 47 +94 97 97 +132 192 192 +187 22 22 +74 168 168 +72 57 56 +443 71 71 +130 214 212 +158 43 42 +398 45 45 +69 68 68 +95 164 164 +96 387 383 +185 42 41 +73 32 32 +203 3 9 +145 82 84 +58 81 81 +56 50 53 +98 19 19 +179 54 54 +156 8 15 +326 80 80 +112 106 87 +52 1 5 +121 3948 4000 +363 72 59 +183 43 39 +63 58 58 +82 25 25 +59 31 31 +67 32 32 +156 0 1511 +55 104 105 +276 89 89 +287 50 50 +856 78 76 +175 152 152 +319 17 19 +188 0 1 +53 45 45 +68 32 32 +69 98 377 +50 14 14 +75 45 46 +187 101 102 +67 158 157 +145 55 55 +53 381 387 +95 4 6 +54 246 246 +85 76 76 +227 46 46 +157 24 24 +116 25 25 +78 6 6 +83 11 11 +62 148 148 +125 18 18 +215 7 7 +107 65 65 +81 131 131 +77 3 0 +100 5 5 +160 27 27 +105 20 38 +417 117 114 +265 44 44 +146 40 40 +198 55 55 +217 110 106 +316 1 0 +59 37 34 +98 0 2 +151 39 38 +52 37 39 +54 23 23 +259 94 94 +120 98 107 +53 123 123 +261 18 18 +156 64 64 +201 48 48 +52 116 116 +56 12 11 +140 135 135 +54 15 15 +63 18 18 +112 41 41 +488 30 30 +151 29 29 +442 33 33 +219 25 25 +52 29 29 +396 14 15 +208 18 18 +266 31 31 +70 13 17 +439 19 19 +560 1 4 +118 18 18 +156 29 29 +208 47 47 +141 25 25 +122 39 39 +239 31 31 +687 53 56 +82 115 115 +181 23 23 +116 11 11 +153 12 11 +96 1 3 +282 49 49 +383 111 110 +228 20 20 +73 229 229 +64 49 52 +108 33 33 +79 127 130 +92 13 13 +137 77 77 +566 56 60 +91 22 22 +71 23 23 +83 6 6 +89 147 147 +464 14 14 +528 36 36 +309 20 20 +57 24 24 +657 1 3 +88 45 45 +360 36 34 +1316 34 34 +169 30 29 +428 5 6 +59 74 74 +84 19 19 +795 30 31 +1711 9 7 +342 39 39 +2541 0 1 +1777 1 1 +38 1 1 +935 1 0 +1058 0 2 +781 1 1 +19 0 3 +1189 2 0 +1473 0 2 +1253 1 0 +2316 83 84 +2678 17 0 +3751 5 5 +57 46 46 +195 17 16 +588 48 48 +317 0 3 +184 73 75 +135 91 91 +260 2 2 +17 1 1 +1175 1 1 +19 0 3 +521 2 0 +3774 7 7 +185 1 1 +36 5 5 +249 1 1 +49 1 1 +235 8 8 +1416 3 0 +520 1 1 +43 0 2 +3194 1 1 +27 1 1 +995 1 0 +399 0 1 +59 0 1 +745 0 2 +580 67 64 +354 15 15 +1215 36 36 +623 38 38 +539 33 33 +431 9 7 +2050 4 0 +38 1 1 +1655 5 0 +9909 9 0 +159 5 5 +846 8 0 +572 1 0 +1829 12 12 +876 4 0 +1532 6 6 +2132 0 15 +850 16 16 +165 34 23 +998 2 3 +1225 1 1 +14 1 1 +882 3 0 +1720 1 1 +41 1 1 +375 1 1 +36 1 1 +89 0 1 +398 0 2 +352 1 1 +123 1 1 +169 6 21 +63 1 1 +41 1 1 +368 1 1 +19 1 1 +1145 4 4 +95 1 1 +395 0 1 +165 1 1 +31 1 1 +229 1 1 +77 1 1 +371 0 4 +792 1699280 0 +92 1 1 +796 1 0 +34 1 1 +299 1 1 +45 1 1 +123 1 1 +17 1 1 +85 2 0 +216 1 1 +24 1 1 +4716 0 6 +375 20 24 +5357 12 12 +2078 9 9 +1605 10 0 +48 6 0 +1972 45 45 +549 7 0 +235 43 36 +2276 39 39 +1273 0 1 +444 13 13 +561 11 11 +57 0 16 +247 0 6 +2417 40 40 +1229 5 5 +83 0 1 +1793 0 2 +50 0 1 +165 49 49 +3991 0 1 +109 1 1 +23 1 1 +2103 0 1 +405 15 15 +198 4 0 +478 20 20 +882 31 31 +1471 2 0 +1213 7 6 +2434 6 6 +63 39 39 +676 0 1 +114 1 0 +3662 5 5 +23 1 1 +317 1 1 +63 1 1 +281 0 1 +951 22 22 +703 91 91 +1903 36 37 +728 129 129 +101 1 0 +862 0 7 +1581 49 49 +653 7 5 +4132 2 2 +62 1 1 +347 1 0 +363 1 1 +49 0 1 +222 0 3 +151 2 0 +160 2 1 +76 1 1 +3295 0 2 +391 0 1 +972 8 0 +555 19 20 +2809 1 1 +29 0 2 +5293 1 0 +817 1 0 +167 1 7 +182 1 1 +74 1 1 +1492 1 1 +26 10 0 +48 1 1 +1250 1 0 +49 0 1 +758 1 0 +179 1 1 +48 1 1 +357 0 1 +152 7 7 +739 46 46 +357 51 51 +1145 24 24 +793 56 61 +68 38 38 +72 44 50 +812 1 1 +44 1 1 +372 1 0 +520 2 0 +153 1 0 +639 7 0 +671 1 1 +35 1 1 +2232 0 20 +453 10 10 +585 71 71 +133 8 8 +90 18 0 +47 2 0 +2055 4 0 +168 3 0 +1513 0 1 +1130 73 73 +1064 55 58 +89 26 26 +678 18 18 +242 1 1 +18 1 1 +160 19 0 +97 1 1 +255 1 1 +45 1 1 +80 13 16 +54 11 17 +700 8 8 +944 1 1 +10 4 0 +30 1 1 +322 1 1 +71 1 1 +306 0 3 +763 1 0 +172 1 1 +18 1 1 +341 1 1 +19 1 1 +75 1 1 +22 1 1 +358 12 12 +171 10 0 +54 0 7 +539 0 4 +188 15 15 +132 4 4 +51 5 5 +426 0 2 +122 1 1 +97 1 1 +648 1 1 +22 7 7 +402 5 9 +95 1 1 +90 4 4 +158 2 0 +11 1 1 +376 1 1 +41 2 2 +898 1 1 +33 1 1 +350 0 3 +94 11 11 +241 1 1 +48 5 5 +1947 1 1 +46 1 1 +204 1 1 +26 1 1 +156 1 0 +21 1 1 +209 2 2 +85 1 1 +354 1 1 +59 1 1 +121 1 1 +46 2 0 +263 0 4 +237 1 1 +49 1 1 +148 1 1 +48 1 1 +54 11 11 +640 0 1 +50 1 1 +974 5 0 +44 1 1 +507 1 1 +15 1 1 +259 0 3 +773 1 1 +18 1 1 +593 1 1 +35 1 1 +78 1 1 +55 1 1 +122 1 1 +125 1 1 +59 11 14 +102 1 1 +28 1 1 +233 1 1 +41 1 1 +186 1 1 +68 1 1 +63 1 0 +171 8 8 +87 1 0 +529 1 1 +22 1 1 +130 0 1 +921 1 2 +163 1 0 +543 1 1 +19 0 1 +353 12 6 +118 15 18 +207 1 1 +41 1 1 +402 3 46 +111 1 1 +127 5 5 +77 0 1 +270 1 1 +46 1 1 +187 1 1 +64 1 1 +574 1 1 +22 1 1 +355 476 0 +497 1 0 +88 1 1 +67 1 1 +1430 0 1 +164 27 27 +1784 1 1 +22 1 1 +583 1 1 +105 1 1 +128 0 4 +156 1 1 +50 1 1 +1000 1 1 +70 1 1 +123 1 1 +18 1 1 +1136 12 12 +385 1 1 +40 1 1 +588 1 1 +33 1 1 +393 9 9 +826 2 2 +48 1 1 +934 1 1 +41 1 1 +250 1 1 +46 1 1 +1205 17 17 +824 1 0 +557 2 3 +1112 1 1 +24 1 1 +392 5 7 +630 0 4540 +325 + +chain 23483856 9 141213431 + 39478759 43546069 chr9 138394717 - 71508211 98881749 99 +47 1843 1801 +73 110757 99795 +40 2784 4036664 +35 610 610 +31 3060 3061 +29 26897 26852 +34 5528 5536 +27 2332 2333 +1 1 0 +47 12757 12755 +51 11922 11920 +48 194332 281328 +54 4888 4561 +53 2134 2115 +60 595 640 +28 922 926 +57 22 22 +92 43 43 +86 48 48 +159 17 18 +143 72 72 +113 14455 12616 +63 301307 231681 +110 1 1 +25 1 1 +2223 0 1 +1782 1 1 +29 1 1 +351 8 5 +5421 0 6 +960 1 1 +27 3 3 +670 1 1 +139 1 1 +1384 105 106 +4810 3 0 +381 3 0 +649 23 23 +6785 37 37 +1619 44 55 +775 51 51 +1721 8 6 +3924 1 0 +397 7 7 +608 0 4 +268 4 0 +2268 321 0 +112 77 77 +1229 5 5 +1926 0 1 +164 49 49 +3991 1 0 +5736 5 7 +296 2 0 +691 9 9 +217 7 8 +3105 757312 19644218 +98 1 0 +193 48 48 +108 37 37 +133 49 49 +85 40 40 +217 1 3 +238 47 47 +428 80 81 +483 8 8 +57 28 28 +288 90 91 +53 147 147 +51 81 81 +416 49 49 +59 1 3 +63 63 64 +51 45 45 +243 205 205 +275 150 49 +65 47 47 +263 218 218 +59 34 34 +123 44 44 +185 20 20 +83 73 87 +54 51 51 +193 26 26 +81 40 40 +73 171 162 +95 147 147 +67 10 10 +78 121 121 +129 0 1 +1032 7 0 +156 24 24 +228 24 24 +473 5 6 +599 17 17 +173 5 5 +66 42 42 +1320 54 58 +1559 33 45 +421 38 38 +656 55 55 +399 70 70 +67 113 113 +63 106 106 +89 13 13 +181 129 122 +88 9 9 +211 31 34 +61 35 35 +114 1 13 +60 112 112 +168 92 92 +131 0 4 +84 37 37 +169 95 93 +130 41 41 +89 4 0 +91 172 167 +87 34 34 +52 8 8 +180 45 45 +508 61 61 +77 11 12 +244 17 17 +231 48 48 +89 42 42 +324 219 223 +175 38 38 +157 102 102 +98 34 34 +55 2 0 +163 18 18 +274 37 36 +131 68 69 +164 0 3 +77 482 160 +202 148 145 +80 60 61 +58 43 43 +156 114 114 +218 8 8 +52 44 44 +67 34 34 +232 79 79 +349 273 272 +58 90 90 +253 37 37 +79 6 6 +85 28 27 +99 13 15 +142 67 107 +297 6 0 +340 94 95 +315 53 53 +158 15 15 +383 33 33 +123 10 10 +70 615 612 +374 116 115 +55 29 34 +152 14 14 +73 38 38 +74 21 21 +274 72 72 +92 247 247 +59 93 93 +103 57 57 +165 42 42 +122 0 3 +105 45 45 +133 15 15 +81 65 69 +77 102 102 +108 59 59 +1075 6 0 +5638 1 0 +4557 5 5 +6165 0 1 +270 1 10 +1113 1 0 +250 51 51 +3078 10 0 +9605 1 0 +1128 42 43 +2713 12 5 +10039 1 0 +499 1 0 +1729 1 0 +9841 1 0 +7035 0 8 +1342 3 0 +143 74 74 +4029 28 28 +294 8 6 +5430 1 0 +4048 13 13 +76 32 33 +321 107 107 +44 0 12 +382 22 22 +429 15 15 +174 1 0 +1377 22 22 +1525 8 0 +742 39 39 +82 89 88 +212 1 2 +991 30 30 +54 0 1 +152 27 27 +201 1 0 +433 1 0 +977 37 0 +525 0 8 +811 73 46 +496 15 13 +1063 0 1 +821 0 1 +552 1 0 +762 2 0 +698 13 14 +1686 245 245 +125 23 23 +107 65 65 +53 41 41 +91 37 37 +74 39 39 +212 317 317 +526 64 64 +343 40 40 +59 24 24 +380 61 61 +470 15 15 +75 27 28 +73 51 51 +82 73 73 +56 34 34 +280 28 28 +133 8 0 +171 47 47 +44 0 2 +251 127 127 +67 22 22 +313 18 18 +159 48 48 +138 5 5 +78 45 45 +185 4 0 +248 0 1 +79 9 8 +141 29 29 +85 76 78 +237 23 23 +97 187 187 +57 55 55 +56 70 73 +103 1 21 +146 75 75 +53 69 69 +170 24 24 +1006 7 0 +204 44 44 +271 0 18 +246 52 51 +112 0 1 +85 56 58 +224 22 39 +85 134 136 +88 141 141 +162 18 18 +173 129 129 +158 64 79 +75 109 109 +104 5 5 +74 17 17 +416 39 39 +714 127 123 +154 74 74 +291 38 1635 +407 0 2 +256 39 39 +416 0 1 +85 34 34 +129 37 37 +308 0 4 +250 13 13 +54 16 16 +84 45 45 +300 2 0 +174 38 36 +564 23 23 +389 0 1 +153 12 12 +178 54 54 +377 50 50 +71 125 124 +235 23 23 +137 11 12 +544 6 1 +557 44 44 +215 4 0 +150 71397 0 +164 261 268 +492 46 46 +268 5 5 +96 15 15 +86 2 0 +308 87 87 +399 53 52 +918 9 9 +260 56 56 +106 4 4 +281 258 258 +90 50 50 +60 250 250 +200 72 72 +234 18 18 +57 58 58 +273 41 41 +240 27 27 +140 0 4 +59 26 26 +63 102 102 +147 16 14 +61 57 57 +55 32 32 +72 4 4 +268 43 43 +65 32 32 +65 28 29 +372 38 38 +535 323 0 +518 1 0 +130 6 0 +333 48 48 +309 40 40 +166 50 50 +1747 0 5 +1052 11 11 +1144 21 21 +147 1 0 +62 29 31 +211 10 10 +186 23 19 +1772 4 5 +1417 51 51 +2401 34 34 +1667 2 0 +466 9 9 +1418 21 17 +2271 19 20 +381 26 26 +901 1 0 +970 4 0 +2126 0 1 +173 4 5 +944 41 41 +340 19 18 +541 75 75 +694 10 8 +152 0 2 +1348 14 18 +1077 17 17 +402 1 0 +230 62 62 +1420 33 35 +402 28 28 +2616 8 0 +981 5 5 +396 4 3 +370 11 11 +1069 25 25 +81 0 3 +1289 31 31 +2899 11 11 +1946 96 96 +2532 0 11 +1631 28 28 +1573 9 9 +1440 3 0 +119 46 46 +599 48 48 +808 5 5 +4827 27 29 +1517 1 0 +310 22 22 +509 49 49 +935 67 63 +934 12 12 +71 87 87 +66 48 48 +86 18 18 +142 0 3 +67 26 26 +111 22 22 +83 6 6 +80 33 33 +121 78 81 +345 82 82 +159 53 53 +71 30 30 +105 238 238 +147 24 24 +177 0 5 +140 78 78 +136 29 29 +142 61 62 +319 59 59 +197 1 0 +92 37 38 +272 81 81 +115 0 1 +1286 27 0 +53 6 6 +98 68 64 +342 7 7 +292 62 62 +220 24 22 +78 31 31 +110 0 6 +475 39 39 +125 20 20 +46 17 0 +90 54 54 +55 3 0 +249 46 46 +122 66 66 +253 11 11 +72 115 115 +163 20 32 +90 36 36 +116 137 134 +199 123 123 +84 93 86 +123 46 46 +57 74 75 +67 19 19 +83 35 35 +81 116 116 +51 355 360 +298 82 82 +181 63 63 +56 39 39 +117 143 144 +655 4 4 +84 32 32 +278 20 20 +143 62 62 +117 4 1 +133 24 24 +137 64 63 +59 176 177 +99 51 51 +404 47 47 +159 8 8 +120 39 39 +165 107 109 +91 64 64 +381 61 61 +50 47 52 +80 19 15 +470 46 48 +126 71 70 +191 0 2 +354 43 43 +61 23 22 +157 40 35 +116 7 7 +125 89 89 +166 48 47 +104 89 88 +205 35 35 +54 3 0 +52 39 40 +690 46 46 +327 76 76 +97 42 43 +50 55 55 +673 75 75 +535 24 24 +426 47 45 +54 24 24 +79 14 14 +930 39 39 +184 36 36 +88 42 42 +160 120 119 +317 9 7 +206 15 15 +125 0 1 +67 71 71 +59 52 52 +59 70 70 +376 41 41 +149 28 28 +267 64 64 +91 68 69 +333 94 94 +74 54 54 +253 84 84 +174 62 62 +75 71 71 +106 137 141 +56 67 67 +200 44 44 +186 34 36 +110 274 279 +256 16 16 +874 27 27 +107 124 148 +330 30 30 +280 16 16 +424 7 7 +163 17 12 +234 0 1 +286 4 4 +58 11 7 +70 1 0 +240 142 144 +442 107 106 +144 24 24 +243 4 0 +476 21 41 +272 149 245 +66 16 16 +240 18 18 +658 1 0 +78 11 11 +110 1 0 +313 30 30 +349 78 78 +149 26 19 +62 17 17 +64 41 41 +1472 28 27 +189 171 171 +55 38 38 +249 40 40 +308 17 17 +108 27 27 +508 47 47 +145 8 7 +157 26 26 +66 27 27 +74 8 16 +494 41 41 +118 7 7 +150 28 28 +58 159 159 +196 6 6 +439 74 74 +95 94 94 +53 4 4 +102 68 70 +619 23 23 +105 45 45 +301 102 102 +640 24 24 +1382 48 48 +499 134 122 +210 20 20 +101 33 33 +950 8 8 +63 29 29 +183 20 20 +329 26 26 +155 126 126 +221 184 167 +646 90 90 +204 92 92 +195 51 51 +159 55 53 +137 67 67 +288 87 87 +91 21 21 +563 7 7 +582 15 15 +413 52 52 +81 12 12 +241 38 38 +475 38 37 +468 33 33 +172 78 78 +176 84 85 +156 23 23 +251 37 37 +125 54 54 +472 85 85 +66 62 62 +166 34 36 +110 58 58 +80 50 52 +59 16 16 +98 36 36 +301 70 69 +166 5 5 +230 0 1 +168 91 91 +64 94 94 +55 27 27 +157 68 68 +190 14 14 +64 83 83 +134 34 34 +88 21 21 +90 69 69 +88 33 33 +55 45 45 +100 120 120 +56 45 45 +125 100 107 +307 22 17 +398 52 52 +437 56 56 +493 105 105 +102 69 71 +292 24 20 +357 95 100 +235 37 36 +183 45 45 +60 0 1 +145 136 137 +80 45 45 +137 17 17 +117 5 8 +107 35 35 +52 14 14 +338 16 16 +441 9 9 +157 77 76 +238 56 72 +273 54 54 +90 5 5 +114 44 32 +63 70 70 +84 6 6 +119 4 4 +54 337 0 +222 45 44 +340 32 32 +403 28 28 +182 48 48 +77 0 1 +55 15 14 +257 54 54 +84 21 20 +281 12 12 +53 83 82 +443 23 23 +103 127 127 +163 50 50 +883 0 1 +180 168 233 +125 1968384 2425428 +59 2604 2597 +27 3335 3347 +46 120 120 +79 4132 4166 +44 1620 1619 +69 201 200 +62 4059 4065 +53 635 685 +45 660 668 +34 2599 2593 +52 1462 1461 +47 199 215 +50 1188 1168 +63 606 585 +81 162 162 +98 1321 1321 +51 802 802 +46 710 712 +50 1122 1123 +35 4939 5141 +51 375 377 +73 89 89 +65 928 930 +60 4335 2995 +55 6440 5820 +52 2209 2207 +59 2825 2909 +65 664 669 +32 950 951 +45 5428 5430 +32 4240 4230 +44 1401 1400 +78 415 411 +53 1926 2241 +80 1167 1169 +39 3322 3315 +33 1031 1021 +35 175 176 +29 1116 1116 +86 908 910 +34 849 849 +37 709 727 +37 1332 1332 +55 8671 8646 +48 6991 6712 +66 4 4 +1 1935 1946 +72 2255 2273 +50 358 358 +65 2034 2031 +73 530 529 +48 3744 4057 +32 3913 1275 +37 1504 1543 +41 4046 4017 +40 1721 1725 +50 9112 9123 +33 1963 1981 +31 1171 1174 +82 1532 1534 +120 1372 1384 +27 241 241 +54 527 525 +59 1552 1541 +47 1441 1445 +39 1626 1675 +51 1766 1764 +34 1905 1905 +84 604 949 +45 737 739 +58 812 800 +53 284 284 +34 1335 1336 +44 331 331 +48 200 200 +22 1 0 +19 161 161 +31 746 749 +50 663 973 +45 525 528 +53 361 372 +50 11 11 +12 449 449 +31 438 438 +33 6 6 +544 92 92 +94 17 17 +199 68 68 +102 2 6 +31 1 1 +415 1 1 +26 1 0 +33 1 1 +80 2 2 +74 6 1 +7 4 0 +91 0 2 +92 1 1 +266 1 1 +78 1 1 +114 1 1 +37 1 1 +715 20 18 +393 3 3 +23 1 1 +414 8 6 +215 12 12 +80 1 0 +319 0 1 +130 1 1 +33 1 1 +977 14 14 +100 127 127 +330 109 101 +136 21 26 +66 91 91 +147 85 85 +496 8 8 +114 96 96 +168 35 35 +173 65 65 +73 50 50 +172 24 24 +65 4 9 +74 246 232 +72 222 226 +139 6 6 +172 28 28 +104 35 35 +77 48 48 +118 12 9 +126 34 34 +584 108 108 +67 15 14 +263 74 74 +6 476 464 +65 69 69 +35 437 437 +54 112 112 +50 656 639 +35 1151 1153 +44 729 716 +74 423 426 +91 416 409 +69 80 80 +61 1559 1586 +57 1110 778 +60 313 310 +51 90 90 +11 68 68 +59 1204 1202 +48 299 300 +40 1336 1330 +40 546 545 +90 76 76 +113 1403 1403 +37 148 148 +37 111 111 +39 213 213 +164 141 142 +11 590 590 +36 1186 1186 +30 367 365 +129 728 732 +84 346 344 +41 579 579 +48 203 203 +18 31 31 +14 662 667 +28 571 575 +137 53 53 +59 527 504 +35 2909 2922 +72 861 848 +97 617 613 +39 714 714 +27 324 328 +57 3075 1476 +34 5312 5321 +40 1810 1817 +37 400 400 +51 1863 1865 +29 100 100 +40 110 110 +56 344 353 +38 674 674 +37 2674 2670 +82 502 496 +38 2842 2507 +55 2 0 +48 956 956 +92 571 571 +50 157 157 +38 430 429 +29 9669 10329 +60 2791 2782 +57 3065 3061 +44 3349 3346 +62 + +chain 21183730 9 141213431 + 65968360 66192215 chr9 138394717 + 66630954 66854809 282 +223855 + +chain 20106231 9 141213431 + 45563821 45815521 chr9 138394717 + 41480798 41732567 274 +37 225 225 +71 67 67 +43 116 116 +82 68 68 +71 297 297 +249 241 241 +54 195 195 +95 457 457 +36 0 1 +1 335 335 +106 55 55 +33 1744 1745 +38 1560 1560 +30 866 866 +30 187 187 +52 53 53 +58 265 265 +51 639 639 +32 200 200 +133 84 84 +78 60 60 +17 7 7 +6 170 170 +92 237 237 +50 168 168 +58 366 366 +34 1048 1048 +79 10026 10030 +50 264 264 +66 585 585 +123 136 136 +51 86 86 +25 91 91 +43 65 65 +66 52 52 +49 58 58 +26 62 62 +32 77 77 +126 313 313 +27 564 564 +81 59 59 +33 157 157 +91 108 108 +171 76 76 +26 256 256 +7524 24 24 +5663 13 13 +1317 0 2 +659 29 29 +153 116 32 +463 51 51 +1180 141 147 +4136 17 17 +560 9 10 +266 0 3 +10153 2 13 +3776 35 35 +486 27 27 +1796 12 12 +80 8 8 +141 50 50 +71 4 4 +755 39 39 +141 9 9 +114 2 0 +445 24 28 +2223 6 6 +7337 15 14 +177 19 18 +237 6 6 +541 10 10 +5395 23 22 +1103 7 7 +54 25 25 +1034 28 28 +1717 35 35 +2049 43 43 +4167 5 0 +1468 22 21 +917 3 0 +1788 35 39 +2839 4 0 +165 33 29 +2135 1 0 +1861 0 1 +551 0 1 +796 0 2 +2412 6 0 +1514 65 65 +1429 0 1 +552 16 16 +3629 1 7 +6134 42 42 +4839 6 0 +1282 21 21 +608 18 18 +1135 0 1 +947 15 15 +4264 0 1 +55 27 27 +201 1 0 +1167 16 16 +186 90 90 +875 53 53 +184 22 22 +1246 68 68 +1033 53 52 +427 7 7 +764 14 14 +508 17 17 +91 4 0 +613 118 118 +167 43 43 +101 44 44 +77 39 39 +159 0 1 +55 165 167 +77 42 42 +159 29 29 +165 8 8 +52 30 30 +408 21 21 +1046 112 112 +384 62 62 +442 48 47 +107 8 8 +375 40 40 +77 147 147 +62 41 53 +255 28 28 +124 144 148 +397 6 0 +99 0 1 +393 28 28 +839 15 15 +348 0 4 +103 9 9 +238 56 56 +273 26 26 +136 63 61 +658 48 48 +1343 44 44 +140 48 48 +95 50 50 +54 329 329 +293 40 40 +74 40 40 +155 159 159 +115 24 24 +461 25 25 +96 5 5 +597 29 29 +671 30 31 +52 41 41 +497 28 26 +785 42 41 +52 16 16 +403 11 11 +202 44 43 +123 6 9 +688 51 51 +283 0 6 +129 15 15 +65 73 73 +894 1 0 +212 6 6 +101 51 50 +466 45 45 +305 4 0 +57 1 5 +297 10 11 +127 26 26 +420 94 91 +75 13 13 +104 0 1 +52 42 44 +230 83 83 +87 353 353 +106 46 46 +59 64 60 +64 2424 0 +120 0 1 +134 45 34 +239 39 39 +61 49 49 +68 35 32 +53 42 42 +146 130 129 +78 30 30 +265 32 32 +210 12 12 +128 43 43 +54 13 13 +52 90 90 +140 127 127 +158 69 69 +60 123 117 +130 0 1 +88 33 15 +175 32 32 +75 33 33 +138 38 41 +728 68 65 +386 4 4 +427 9 9 +69 77 77 +51 47 47 +222 58 58 +504 47 47 +452 65 65 +102 25 25 +123 14 14 +342 1 4 +317 32 32 +56 41 41 +87 74 98 +313 52 52 +66 15 15 +88 28 28 +65 3 1 +235 63 63 +188 60 66 +77 47 47 +182 1 0 +109 42 38 +404 72 73 +122 60 60 +94 4 4 +292 190 124 +176 0 1 +61 36 36 +311 4 0 +447 18 0 +59 24 8 +56 65 64 +53 16 16 +113 45 45 +90 0 2608 +469 47 115 +97 66 66 +104 32 32 +126 28 28 +639 50 50 +977 29 29 +315 62 62 +165 16 16 +245 8 8 +53 96 96 +447 93 93 +132 0 1 +244 30 30 +1422 21 22 +416 55 55 +235 0 2 +541 6 6 +57 19 19 +92 21 21 +477 0 1 +1536 20 20 +1965 8 8 +425 5 0 +147 46 46 +634 63 63 +283 24 24 +406 7 4 +182 24 24 +375 20 20 +980 42 42 +553 21 21 +929 36 28 +127 2 1 +293 1 10 +1743 58 58 +462 5 0 +421 33 33 +69 0 1 +2039 1 15 +624 39 39 +66 44 45 +315 39 39 +223 60 60 +134 62 62 +93 55 56 +116 47 42 +569 0 15 +280 75 75 +283 6 6 +1425 48 48 +2176 29 29 +3640 21 17 +599 43 43 +511 4 4 +208 13 12 +921 24 24 +216 91 91 +244 33 33 +757 46 46 +179 15 15 +793 15 15 +108 26 26 +264 43 42 +285 5 5 +135 62 62 +155 7 7 +297 39 39 +181 46 46 +177 5 5 +136 56 55 +747 41 41 +643 32 32 +190 24 24 +70 0 8 +489 10 16 +131 1 0 +834 9 9 +207 1 0 +2804 58 58 +443 88 88 +632 4 0 +338 46 46 +249 22 22 +213 4 0 +77 21 21 +62 36 36 +153 46 46 +372 0 3 +67 175 172 +143 67 67 +302 38 38 +230 36 15 +261 8 8 +172 39 39 +168 18 18 +760 52 52 +159 145 140 +262 40 40 +174 7 7 +1372 31 31 +430 33 27 +2307 1 0 +66 0 1 +726 53 44 +63 10 9 +109 157 158 +335 51 51 +119 3 0 +166 0 2 +474 19 21 +110 16 16 +573 27 27 +3377 2 0 +179 0 4 +461 0 1 +3765 21 21 +1872 1 0 +764 29 29 +2577 0 12 +1188 + +chain 15706054 9 141213431 + 68664181 68838878 chr9 138394717 + 40929925 41103545 434 +325 16 16 +457 0 48 +1857 41 41 +69 31 31 +109 0 10 +1535 23 22 +926 7 7 +1099 20 20 +1232 2 0 +1259 66 65 +800 31 31 +1638 7 7 +490 20 20 +156 1 0 +786 2 0 +2695 23 23 +947 1 0 +1205 1 0 +1601 35 35 +2767 9 9 +92 1 2 +635 2 0 +2977 8 0 +185 8 11 +4293 19 19 +1029 22 22 +1063 1 0 +1259 19 20 +682 2 0 +605 57 57 +402 0 1 +1052 0 2 +3608 0 1 +1580 1 5 +2767 0 2 +3097 0 1 +5483 0 1 +4150 1 0 +7203 9 9 +90 3 0 +957 2 0 +253 0 1 +605 2 0 +603 1 0 +788 2 0 +392 0 1 +501 18 18 +447 39 39 +195 31 26 +272 43 40 +323 57 54 +980 0 2 +480 50 50 +707 0 2 +279 53 53 +75 29 29 +280 28 24 +50 26 26 +58 51 51 +231 8 8 +104 52 52 +408 73 73 +2889 27 27 +850 97 97 +119 31 30 +1311 2 0 +749 10 0 +898 1 0 +3420 48 48 +304 24 24 +821 78 78 +431 12 0 +1085 26 26 +3085 8 8 +158 1 5 +555 9 9 +312 0 6 +690 2 0 +3193 56 0 +987 4 0 +70 3 0 +53 13 13 +574 0 2 +1480 13 13 +1176 52 62 +347 0 4 +2243 1 0 +1388 76 76 +927 16 0 +574 51 51 +524 22 22 +67 41 40 +2605 2 0 +753 22 22 +2846 16 16 +2135 10 10 +69 42 42 +983 3 0 +950 59 59 +86 16 16 +156 0 3 +963 790 1 +354 56 56 +91 27 28 +90 41 41 +143 63 63 +374 32 32 +977 26 26 +302 1 15 +921 7 7 +281 30 30 +130 0 1 +2089 39 39 +417 17 17 +181 30 30 +332 94 95 +161 198 163 +231 12 11 +119 60 56 +1124 39 39 +314 23 23 +495 66 66 +618 42 42 +180 19 22 +1401 12 12 +417 18 11 +1174 0 1 +329 87 79 +380 9 9 +281 12 12 +228 6 6 +1201 45 45 +165 8 8 +201 4 0 +444 36 36 +255 40 40 +1177 31 31 +805 32 32 +765 52 53 +449 7 7 +143 0 1 +464 5 5 +1001 64 64 +220 22 22 +227 1 0 +475 8 8 +377 10 10 +213 51 51 +601 181 41 +227 40 40 +489 24 25 +238 14 6 +388 21 21 +890 29 18 +138 54 58 +131 66 68 +75 38 38 +1048 12 11 +1217 134 134 +391 0 2 +340 36 36 +530 2 0 +676 36 36 +682 11 0 +318 0 1 +138 0 2 +520 38 38 +473 29 29 +843 43 31 +1112 32 32 +1649 32 32 +322 0 1 +54 52 54 +1442 9 9 +746 11 0 +712 20 20 +490 99 99 +1287 0 1 +248 0 3 +892 8 0 +643 40 40 +364 24 24 +67 24 24 +548 1 0 +330 28 28 +123 19 19 +928 14 14 +455 27 27 +344 39 39 +507 31 31 +451 4 0 +1354 10 0 +2139 48 48 +128 4 1 +1214 10 10 +283 44 44 +117 0 2 +83 25 25 +53 8 10 +109 13 13 +105 7 7 +157 85 85 +126 49 49 +182 + +chain 12754029 9 141213431 + 40024796 40218969 chr9 138394717 + 67289525 67479847 368 +265 4 0 +152 10 11 +290 39 39 +89 47 47 +193 71 71 +95 11 11 +149 41 41 +197 30 25 +110 34 34 +352 12 22 +513 77 77 +126 14 14 +730 1 2 +314 38 38 +110 40 40 +287 1 0 +510 3 0 +92 0 1 +487 28 28 +52 0 2 +2598 0 1 +148 18 18 +428 75 71 +104 58 58 +298 70 90 +73 121 126 +78 15 15 +119 14 14 +104 86 86 +113 227 227 +687 7 7 +673 21 21 +982 37 37 +240 50 50 +90 48 48 +378 2 0 +563 0 4 +504 11 11 +425 8 8 +150 50 49 +90 7 7 +45 0 1 +195 62 66 +93 244 132 +1100 64 65 +284 17 17 +93 0 2 +92 33 33 +142 14 28 +116 1 13 +88 28 28 +709 11 11 +331 21 21 +238 79 79 +431 32 32 +300 18 18 +856 21 21 +441 1 0 +253 69 69 +433 32 32 +403 0 13 +274 18 30 +214 8 8 +560 1 0 +377 28 28 +126 6 6 +828 18 18 +135 0 2 +305 1 0 +985 20 20 +190 80 80 +627 91 88 +552 45 45 +312 31 31 +231 74 74 +103 102 103 +250 5 5 +670 89 89 +185 30 30 +55 13 20 +220 12 12 +203 45 41 +275 2 17 +264 79 79 +286 76 77 +65 62 62 +98 31 31 +92 33 33 +119 3942 4335 +54 177 167 +101 122 124 +58 648 632 +53 74 69 +109 23 23 +65 15 15 +246 113 113 +55 12 10 +91 69 68 +1019 78 78 +124 21 21 +61 10 10 +108 51 51 +189 12 12 +57 2173 179 +203 59 59 +353 15 15 +330 24 23 +391 37 54 +402 2 0 +293 22 22 +57 18 18 +298 150 154 +51 103 89 +131 78 78 +331 4 0 +52 19 19 +106 5 0 +94 99 101 +304 0 1 +85 92 88 +66 20 20 +281 0 2 +763 1 0 +119 105 107 +146 42 43 +284 92 78 +470 43 39 +349 349 351 +156 31 35 +84 240 240 +54 49 49 +80 31 31 +69 166 168 +72 56 57 +124 0 3 +316 71 71 +130 9 7 +64 141 143 +158 42 43 +71 50 45 +178 51 51 +53 44 44 +70 68 68 +95 212 212 +71 371 372 +167 2 0 +51 0 1 +73 32 32 +125 20 20 +197 91 91 +202 43 44 +505 43 36 +651 16 0 +136 2 7 +163 6 21 +874 158 158 +95 6 0 +432 69 69 +826 6 1 +481 50 50 +119 17 17 +179 13 13 +556 46 46 +777 26 26 +255 1510 0 +91 70 68 +376 13 14 +236 76 76 +932 0 1 +647 19 17 +188 1 0 +291 74 74 +225 0 6 +174 20 19 +259 20 20 +247 42 37 +85 124 124 +65 50 50 +190 35 35 +925 89 89 +113 65 65 +93 17 17 +1260 17 0 +358 159 161 +302 48 48 +358 77 77 +89 27 27 +169 42 42 +516 30 29 +208 39 37 +336 128 128 +122 31 22 +123 111 115 +256 12 12 +457 43 43 +731 10 10 +519 30 30 +622 33 33 +145 10 10 +64 25 25 +477 15 14 +137 88 89 +98 16 16 +152 120 114 +439 19 19 +160 30 30 +186 11 11 +157 23 17 +118 18 18 +156 29 29 +208 60 53 +135 25 25 +269 8 8 +460 45 45 +373 90 87 +54 13 13 +363 25 24 +264 2 1 +186 28 28 +1129 144 145 +315 32 32 +885 60 56 +91 22 22 +177 21 21 +252 21 21 +954 36 36 +309 20 20 +57 24 24 +657 2 1 +493 34 36 +1316 65 65 +138 29 30 +433 1 0 +132 11 11 +74 19 19 +795 31 30 +1712 7 8 +342 39 39 +82 1 0 +2459 1 0 +1777 40 40 +231 13 12 +692 0 1 +878 46 47 +133 29 0 +520 49 49 +212 41 42 +1167 0 1 +182 15 15 +317 28 28 +932 2 0 +1254 2 1 +2315 84 83 +2684 0 9 +3246 5 0 +109 332 0 +1304 21 21 +106 39 39 +201 3 0 +2479 0 2 +221 21 21 +203 0 3 +289 24 24 +4597 50 50 +559 0 1 +1529 1 0 +3140 3 0 +1884 82 82 +1456 40 40 +747 38 38 +1676 42 42 +1021 56 55 +290 23 31 +444 44 96 +1105 5 0 +2264 4 0 +4329 48 48 +3499 86 86 +705 0 4 +578 0 1 +2717 0 1 +3374 13139 13125 +105 12655 12673 +36 2438 2437 +51 9640 9323 +76 3324 3324 +49 + +chain 9570916 9 141213431 + 65487180 65918360 chr9 138394717 + 66970065 67549861 171 +49 2159 2158 +27 19355 19409 +26 0 2 +2 10341 10343 +57 119 119 +45 2939 2941 +41 1 1 +47 1 1 +5 2779 2779 +75 205 205 +40 852 852 +4 1 1 +112 5 0 +13 2397 2395 +61 407 407 +42 54 54 +40 1569 1554 +63 1072 1072 +33 1490 1488 +83 369 369 +25 263 263 +34 289 289 +70 168 168 +138 15 15 +63 32 32 +95 54 54 +41 2132 2132 +30 830 828 +127 199 199 +27 828 828 +90 176 176 +57 757 757 +136 436 436 +40 227 227 +63 306 306 +35 946 946 +43 491 491 +66 1 1 +26 1061 1061 +77 37139 35613 +31 4454 154563 +32 6837 6837 +30 965 965 +112 1616 1616 +32 1074 1074 +92 921 921 +44 78 78 +97 2015 2015 +43 1198 1198 +25 1268 1268 +51 144 144 +47 572 572 +38 1487 1487 +80 1900 1900 +26 1074 1074 +26 469 469 +40 3741 3741 +171 74 74 +25 152 152 +35 537 537 +38 231 231 +49 162 162 +147 1405 1405 +50 375 375 +171 406 406 +41 445 445 +50 1209 1209 +36 1533 1533 +33 1753 1753 +43 157 157 +94 1314 1314 +36 1556 1556 +44 651 651 +75 4017 4017 +47 144 144 +31 2287 2287 +28 137 137 +44 268 268 +41 1322 1322 +26 544 544 +47 330 330 +39 1490 1490 +29 467 467 +34 2947 2947 +45 119700 119700 +83 22736 22736 +67 1584 1584 +36 623 623 +38 539 539 +33 23124 23124 +34 10245 10245 +99604 + +chain 8042473 9 141213431 + 67517326 67987998 chr9 138394717 + 67449547 67920552 165 +29 158010 158343 +28 69 69 +38 431 431 +77 708 708 +42 200 200 +72 289 289 +93 1054 1054 +79 754 754 +43 79 79 +82 788 788 +45 1067 1067 +50 203 203 +50 397 397 +51 376 376 +45 714 714 +41 7679 7679 +65 343 343 +40 224 224 +43 303 303 +63 226 226 +77 525 525 +103 830 830 +70 1683 1683 +34 372 372 +49 7462 7462 +151 164 164 +46 341 341 +47 172 172 +31 594 594 +28 221 221 +32 105 105 +147 334 334 +126 73 73 +245 88 88 +98 50 50 +140 1168 1168 +33 389 389 +37 117700 117700 +40 271 271 +44 750 750 +50 355 355 +25 173 173 +45 10010 10010 +44 833 833 +28 2309 2309 +54 874 874 +44 23028 23028 +34 1071 1071 +316 1585 1585 +33 100 100 +36 139 139 +37 84 84 +60 55 55 +259 107 107 +40 238 238 +69 130 130 +56 75 75 +136 61 61 +60 67 67 +64 568 568 +59 397 397 +41 135 135 +42 459 459 +35 248 248 +57 2643 2643 +26 1006 1006 +25 2132 2132 +27 3533 3533 +59 104 104 +26 60 60 +60 188 188 +88 349 349 +68 222 222 +36 174 174 +87 168 168 +126 157 157 +119 68 68 +71 320 320 +46 65 65 +43 157 157 +41 103 103 +123 412 412 +151 423 423 +42 1119 1119 +42 126 126 +121 292 292 +158 234 234 +93 324 324 +88 461 461 +188 50 50 +52 107 107 +47 195 195 +33 57 57 +31 701 701 +69 361 361 +28 82 82 +287 141 141 +27 128 128 +51 160 160 +121 1047 1047 +27 2954 2954 +42 1152 1152 +41 106 106 +38 202 202 +146 84 84 +174 57 57 +26 271 271 +76 129 129 +89 669 669 +80 139 139 +148 539 539 +25 56 56 +33 53 53 +48 52 52 +49 548 548 +48 241 241 +102 149 149 +30 137 137 +51 159 159 +166 92 92 +50 176 176 +41 312 312 +67 213 213 +51 393 393 +152 143 143 +65 213 213 +108 113 113 +28 148 148 +35 51 51 +220 61 61 +59 184 184 +116 192 192 +85 132 132 +180 159 159 +271 72 72 +74 71 71 +27 66 66 +51 512 512 +60 427 427 +30 391 391 +67 174 174 +97 519 519 +89 76 76 +84 138 138 +34 377 377 +166 188 188 +4100 306 306 +73 537 537 +56 113 113 +34 170 170 +60 86 86 +32 427 427 +59 320 320 +35 126 126 +44 314 314 +91 50 50 +70 238 238 +62 53 53 +33 92 92 +43 1143 1143 +69615 + +chain 7596233 9 141213431 + 66664195 69278385 chr9 138394717 + 40711178 41205156 167 +3419 0 1 +1257 1 0 +2986 2 2 +29 1 0 +4954 4 0 +10568 4 0 +1487 1 1 +40 1 1 +6798 2 0 +167594 2125603 5402 +223241 292 292 +28 303 303 +59 683 683 +52 191 191 +53 438 438 +82 421 421 +70 634 634 +28 344 344 +92 90 90 +42 51 51 +46 490 490 +69 319 319 +31 99 99 +79 233 233 +31 412 412 +26 1253 1253 +41 175 175 +34 78 78 +76 394 394 +50 531 531 +33 282 282 +34 718 718 +73 160 160 +33 127 127 +106 424 424 +35 286 286 +34 138 138 +45 92 92 +403 152 152 +59 247 247 +56 62 62 +49 314 314 +99 94 94 +56 133 133 +37 556 556 +73 1513 1513 +42 135 135 +96 220 220 +33 232 232 +37 61 61 +226 181 181 +168 300 300 +52 218 218 +103 154 154 +140 868 868 +221 215 215 +38 1193 1193 +87 173 173 +32 238 238 +34 75 75 +37 452 452 +32 343 343 +205 598 598 +38 932 932 +46 742 742 +109 304 304 +47 704 704 +108 423 423 +68 217 217 +187 1138 1138 +158 70 70 +28 126 126 +86 616 616 +29 689 689 +35 232 232 +25 1061 1061 +35 1910 1910 +26 343 343 +80 357 357 +55 1511 1511 +38 146 146 +49 268 268 +64 80 80 +76 423 423 +75 211 211 +41 166 166 +30 1692 1692 +73 215 215 +43 58 58 +127 414 414 +38 785 785 +118 514 514 +36 397 397 +42 148 148 +50 139 139 +50 371 371 +107 138 138 +114 310 310 +30 78 78 +51 464 464 +27 52 52 +23133 + +chain 5568618 9 141213431 + 65481473 70707635 chr9 138394717 - 96182901 97098161 124 +36 12247 12261 +77 5898 5914 +29 11010 10999 +42 663 663 +28 8711 8717 +49 912 912 +31 988 986 +35 69 69 +1 95 100 +39 2815 2831 +27 852 840 +32 2561 2222 +75 38959 26555 +30 14555 14398 +27 1968 152185 +46 255 255 +61 583 587 +30 51 51 +25 755 755 +1 0 1 +77 154 154 +99 112 112 +31 4934 4906 +76 104 105 +35 513 516 +39 646 646 +48 72 72 +66 185 185 +40 84 84 +49 127 127 +31 134 134 +113 213 213 +19 112 112 +64 119 119 +35 62 62 +55 215 215 +33 472 472 +213 145 145 +136 13 13 +2 84 84 +41 0 3 +2 241 241 +790 92 92 +149 0 10 +400 4 1 +40 15 0 +313 44 44 +78 97 101 +1348 24 0 +307 10 9 +265 1 0 +60 43 43 +36 232 232 +45 124 124 +103 633 632 +25 25 24 +13 87 87 +101 67 67 +63 750 746 +103 58 58 +26 51 51 +71 260 260 +76 205 205 +71 228 228 +47 72 72 +33 485 485 +128 551 551 +61 80 80 +43 0 8 +35 55 55 +25 239 240 +41 366 364 +76 779 779 +35 465 465 +43 243 238 +42 330 329 +27 182 180 +56 453 453 +53 605 605 +70 557 557 +15 10 10 +90 341 341 +34 415 415 +36 183 183 +83 261 261 +28 6 6 +26 1281 1287 +69 35 35 +76 311 311 +46 238 238 +135 516 516 +63 51 51 +709 13 8 +136 4 4 +271 50 50 +211 6 0 +158 171 172 +406 41 40 +445 50 50 +119 7 6 +138 10 10 +935 36 36 +195 86 86 +51 349 362 +65 286 286 +58 1356 1347 +31 343 341 +29 60 60 +169 149 149 +92 43 43 +61 1040 1054 +36 71 71 +48 125 125 +39 264 264 +66 15 15 +70 0 9 +72 319 319 +28 587 587 +25 422 420 +160 307 307 +97 803 806 +52 238 238 +89 673 673 +18 19 19 +173 72 72 +71 525 525 +35 262 241 +171 1472 1477 +42 193 193 +267 227 227 +60 203 203 +58 253 247 +58 541 541 +26 28 28 +137 121 121 +97 912 919 +34 959 984 +55 337 337 +42 307 307 +84 105 105 +231 812 812 +55 29 29 +40 225 225 +130 106 106 +27 66 66 +140 289 289 +38 465 465 +21 6 6 +65 66 66 +29 315 315 +30 81 81 +58 62 62 +25 50 50 +62 57 57 +40 142 142 +103 200 200 +119 263 263 +28 91 91 +9 45 45 +39 136 136 +34 241 243 +50 82 82 +25 50 50 +39 4978 4978 +4306 77 77 +48 839 839 +42 52 52 +30 260 260 +154 54 54 +100 755 756 +97 54 54 +52 274 274 +36 210 210 +54 60 60 +35 111 111 +93 260 260 +370 92 92 +30 197 197 +51 5055 5054 +41 683 683 +44 559 559 +44 826 826 +39 439 440 +42 1035 1035 +63 982 982 +71 198 198 +109 1635 1635 +76 58 58 +25 458 458 +41 131 131 +31 298 298 +90 77 77 +122 92 92 +53 60 60 +37 98 98 +76 212 212 +128 258 258 +36 333 333 +67 484 484 +50 129 129 +31 82 82 +29 3228 3228 +46 105 105 +140 247 247 +62 0 1 +11 131 131 +73 1114 1114 +65 266 266 +27 170 170 +80 55 55 +50 233 233 +55 248 248 +45 257 257 +42 415 415 +45 59 59 +50 57 57 +26 66 66 +49 103 103 +57 160 160 +50 91 91 +67 58 58 +64 379 379 +63 294 294 +349 55 55 +68 592 592 +41 422 422 +64 79 79 +36 233 233 +30 215 215 +105 148 148 +35 1635 1635 +33 2678 2678 +29 909 909 +104 109 109 +123 103 103 +47 851 851 +61 69 69 +89 281 281 +65 253 253 +167 275 275 +58 246 246 +56 54 54 +43 189 189 +77 65 65 +48 112 112 +31 92 92 +33 159 159 +37 52 52 +66 337 337 +4810 182 182 +69 109 109 +103 241 241 +118 1243 1243 +62 77 77 +155 444 444 +152 216 216 +46 1112 1112 +45 463 463 +28 1733 1733 +81 1115 1115 +54 560 560 +57 196 196 +52 332 332 +39 452 452 +39 307 307 +293 53 53 +47 94 94 +97 132 132 +192 283 283 +168 72 72 +57 443 443 +71 130 130 +214 158 158 +43 398 398 +45 69 69 +68 95 95 +164 96 96 +387 185 185 +42 73 73 +32 351 351 +82 58 58 +81 56 56 +50 296 296 +54 490 490 +80 112 112 +106 174 174 +208 0 11 +3740 363 363 +72 183 183 +43 63 63 +58 82 82 +25 59 59 +31 67 67 +32 211 211 +104 276 276 +89 287 287 +50 856 856 +78 175 175 +152 577 577 +45 68 68 +32 69 69 +98 139 139 +45 187 187 +101 67 67 +158 145 145 +55 53 53 +381 153 153 +246 85 85 +76 227 227 +46 297 297 +25 240 240 +148 472 472 +65 81 81 +131 345 345 +27 542 542 +117 265 265 +44 146 146 +40 198 198 +55 217 217 +110 376 376 +37 249 249 +39 52 52 +37 336 336 +94 120 120 +98 53 53 +123 435 435 +64 201 201 +48 52 52 +116 208 208 +135 262 262 +41 488 488 +30 151 151 +29 442 442 +33 219 219 +25 52 52 +29 902 902 +31 1394 1394 +29 208 208 +47 141 141 +25 122 122 +39 239 239 +31 687 687 +53 82 82 +115 875 876 +49 383 383 +111 321 321 +229 64 64 +49 108 108 +33 79 79 +127 242 242 +77 566 566 +56 385 385 +147 1006 1006 +36 1156 1156 +45 360 360 +36 1316 1316 +34 169 169 +30 492 492 +74 898 898 +30 2062 2059 +39 19978 21327 +46 800 800 +18 1 1 +29 502 505 +46 0 2 +25 137 137 +85 1 0 +4 1890302 233 +47 1 1 +154 1 0 +391 1 1 +27 1 1 +542 1 1 +93 0 4 +13 1 1 +85 1 1 +25 1 1 +88 7 7 +285 0 1 +107 14 14 +309 1 1 +38 1 1 +496 0 2 +59 1 1 +19 1 1 +80 1 1 +49 5 5 +618 15 15 +390 71 0 +173 1 1 +50 1 1 +140 4 0 +95 1 1 +22 0 15 +86 56 0 +21 1 1 +50 5 902 +147 13 15 +96 1 1 +40 1 1 +56 0 13 +19 0 2 +291 1 1 +38 4 4 +66 3 0 +88 1 1 +31 1 1 +66 1 1 +39 1 1 +444 1 1 +40 1 1 +95 1 0 +16 1 0 +12 1 1 +245 78 0 +121 0 79 +281 1 1 +36 3 0 +90 1 1 +24 1 1 +239 1 1 +31 1 1 +149 9 9 +176 1 1 +30 1 1 +58 8 8 +65 1 1 +36 1 1 +160 1 1 +30 1 1 +845 1 1 +69 5 0 +130 1 1 +54 1 1 +47 1 1 +117 10 10 +246 1 1 +17 1 1 +220 11 47 +1845 6 6 +1008 60 0 +810 1 1 +27 1 1 +1647 1 0 +133 7 0 +998 1 1 +54 1 4 +13 2 1 +251 6 6 +273 28 28 +69 38 38 +253 80 80 +98 77 77 +122 17 17 +348 19 19 +202 42 42 +126 11 11 +63 72 72 +66 6 6 +217 93 92 +97 45 45 +106 10 10 +215 20 0 +85 11 11 +79 1 0 +263 6 6 +116 79 79 +357 59 59 +338 43 43 +79 82 80 +353 10 10 +267 14 13 +144 45 45 +279 1 0 +152 2 0 +146 23 23 +464 50 50 +203 50 50 +397 51 51 +376 45 45 +155 35 35 +461 104 104 +465 34 34 +362 49 49 +351 13 13 +1100 8 0 +225 24 24 +242 27 27 +134 97 48 +114 0 1 +669 46 46 +558 11 11 +135 19 19 +240 0 1 +434 109 109 +478 14 14 +85 18 16 +230 19 19 +477 12 12 +486 22 23 +372 65 66 +343 40 65 +224 43 63 +303 63 67 +226 77 77 +375 9 9 +141 103 99 +137 35 35 +468 4 0 +186 70 71 +204 40 41 +149 18 18 +864 34 34 +374 34 37 +372 49 48 +63 37 37 +300 2 0 +213 0 8 +523 45 45 +631 3 0 +410 11 12 +236 56 56 +58 0 1 +301 0 2 +984 29 29 +121 24 21 +313 0 3 +655 2 0 +765 33 33 +695 19 19 +228 19 19 +612 6 8 +68 151 151 +60 8 9 +96 46 46 +341 47 47 +98 148 145 +224 12 12 +100 5 37 +163 83 83 +156 89 89 +105 147 150 +118 52 53 +51 0 1 +113 126 146 +73 245 249 +88 98 96 +50 140 140 +456 1 0 +171 18 14 +221 39 39 +211 84 84 +143 51 51 +195 37 37 +167 16 18 +382 51 53 +682 9 0 +66 53 53 +108 28 28 +1276 43 24 +101 32 32 +1115 0 12 +547 47 47 +520 0 1 +1480 76 77 +57 0 1 +628 0 1 +3302 11 4 +1235 41 41 +1087 0 1 +436 0 8 +199 0 2 +2098 33 33 +64 0 9 +1376 99 99 +898 27 29 +158 7 0 +138 74 74 +312 108 109 +166 119 108 +106 1 0 +614 0 1 +60 7 6 +1052 31 31 +293 30 30 +907 31 27 +430 31 31 +752 38 38 +719 49 45 +349 97 92 +159 52 52 +737 41 41 +379 8 8 +261 36 15 +230 38 38 +302 67 67 +194 14 14 +66 14 8 +97 0 3 +377 44 44 +153 36 36 +62 51 7394 +290 50 50 +2589 26 26 +82 1 0 +1028 46 46 +757 33 33 +244 91 91 +216 24 24 +921 13 12 +723 43 43 +418 13 13 +168 21 17 +718 25 26 +232 6 6 +993 51 51 +153 47 46 +204 18 18 +124 121 121 +96 50 50 +460 28 28 +294 21 21 +1197 7 7 +72 4 4 +2686 80 80 +240 5 0 +1135 45 47 +223 40 40 +314 31 33 +482 54 54 +223 7 0 +2035 0 1 +70 33 33 +1289 11 12 +1383 1 2 +167 11 11 +124 1 0 +105 1 1 +26 6 0 +468 316 0 +484 1 1 +30 1 1 +662 4 4 +1221 21 21 +51 1 1 +22 1 1 +171 5 0 +728 1 1 +46 2 2 +617 1 1 +53 1 0 +22 1 1 +147 3 0 +24 3 0 +6 1 1 +1431 4 4 +491 30 30 +389 42 42 +192 25 25 +143 91 91 +1067 21 19 +85 27 27 +365 21 21 +92 19 19 +513 0 1 +90 21 23 +254 15 15 +294 25 25 +1729 27 27 +56 0 1 +111 123 117 +495 48 48 +53 8 8 +55 38 38 +710 29 29 +977 50 50 +639 28 28 +425 42 110 +471 0 2608 +93 45 45 +113 16 16 +53 65 64 +56 24 8 +54 18 0 +434 9 0 +329 88 90 +184 136 124 +292 4 4 +276 53 54 +131 20 20 +281 48 44 +276 47 47 +81 44 36 +578 28 28 +88 15 15 +432 0 32 +152 41 41 +56 32 32 +216 22 22 +79 1 4 +342 14 14 +250 65 65 +66 41 41 +345 93 93 +458 54 50 +328 77 77 +69 9 9 +177 30 30 +311 69 69 +230 36 33 +481 2 0 +279 38 41 +70 83 83 +93 38 38 +270 0 1 +132 99 93 +84 92 92 +177 85 85 +143 42 42 +97 108 108 +72 70 70 +71 6 6 +76 58 58 +296 204 200 +206 19 19 +53 35 32 +68 49 49 +61 39 39 +77 36 36 +126 75 70 +98 0 1 +120 1405 0 +62 2482 62 +59 46 46 +106 206 206 +52 90 90 +102 40 40 +358 0 1 +105 13 13 +75 59 56 +455 26 26 +127 10 11 +301 62 56 +307 45 45 +160 29 29 +277 51 50 +101 6 6 +204 1 0 +676 23 23 +203 58 58 +160 0 4 +46 0 6 +310 38 38 +689 6 8 +123 35 34 +211 11 11 +338 11 11 +54 16 16 +52 42 41 +207 47 47 +531 28 26 +497 41 41 +50 30 33 +614 105 105 +578 5 5 +721 159 159 +155 40 40 +74 82 82 +251 62 62 +91 176 176 +93 11 11 +283 44 44 +201 33 33 +1653 47 47 +995 0 3 +371 15 15 +1742 9 25 +121 169 169 +255 9 1 +226 35 35 +73 81 81 +338 37 37 +567 24 24 +186 0 1 +309 32 32 +1826 2 0 +751 7 7 +312 118 118 +2437 1 0 +507 12 12 +322 36 36 +1165 7 7 +177 13 13 +294 77 77 +185 32 32 +332 67 67 +1627 1 0 +116 21 20 +2817 40 40 +271 44 44 +750 50 50 +355 25 25 +173 45 45 +402 1 0 +535 6 7 +2039 7 16 +349 16 16 +3770 8 0 +158 0 1 +2719 44 44 +833 28 28 +2216 0 1 +93 94 94 +304 1 0 +529 44 44 +829 4 0 +603 22 22 +744 46 47 +112 21 21 +355 18 18 +228 1 1 +12 1 1 +184 0 5 +3345 1 1 +15 1 1 +1836 9 9 +928 0 1 +134 0 1 +3070 1 1 +44 1 1 +1088 1 0 +1372 8 7 +955 4 0 +815 1 1 +27 1 1 +489 0 4 +133 1 1 +28 4 4 +539 8 2 +719 1 1 +17 1 1 +54 0 4 +281 1 1 +44 1 1 +578 1 1 +33 1 1 +281 0 1 +274 5 5 +329 3 0 +917 1 1 +20 1 0 +578 7 0 +281 7 7 +79 1 1 +15 1 1 +457 34 49 +477 1 1 +49 3 0 +211 1 1 +46 1 1 +125 4 3 +94 9 9 +50 316 5 +32 1 1 +65 4 4 +46 1 1 +125 1 1 +34 1 1 +95 1 1 +25 1 1 +114 1 1 +30 1 1 +90 1 1 +24 1 1 +144 12 11 +73 1 1 +19 1 1 +267 1 1 +103 2 2 +268 33 33 +100 36 36 +139 37 30 +84 60 60 +55 259 259 +107 40 40 +238 69 69 +130 56 56 +75 136 136 +61 60 60 +67 64 64 +568 59 59 +173 1 0 +117 1 4 +105 41 41 +135 42 43 +459 35 35 +248 57 57 +56 2 2 +31 1 1 +215 11 11 +176 1 1 +20 1 1 +194 13 13 +50 1 1 +16 1 1 +810 1 1 +32 0 1 +258 1 1 +30 2 2 +280 1 1 +44 1 1 +68 1 0 +25 0 3 +71 1 1 +135 7 7 +86 26 11 +544 1 1 +100 1 1 +238 1 1 +32 1 1 +88 25 22 +380 1 1 +34 1 1 +73 1 1 +121 1 1 +550 0 4 +138 1 1 +78 1 1 +752 27 24 +337 1 0 +65 3 3 +283 9 9 +695 12 12 +826 1 1 +17 1 1 +301 1 0 +54 1 1 +233 1 1 +37 1 1 +52 7 7 +258 1 1 +49 1 1 +80 1 1 +67 5 1 +39 1 1 +93 59 59 +104 26 28 +60 60 60 +69 0 317 +119 88 89 +252 14 14 +83 68 68 +222 36 36 +174 87 87 +168 126 126 +157 119 119 +68 71 2530 +320 46 46 +65 43 43 +157 41 41 +103 123 123 +72 5 0 +335 151 151 +423 42 46 +215 21 21 +102 5 5 +155 20 20 +278 15 15 +50 17 17 +98 9 9 +134 42 42 +126 121 117 +292 158 161 +162 0 2 +72 93 91 +133 5 5 +109 12 11 +65 88 112 +461 188 189 +50 52 52 +107 47 48 +195 33 33 +57 31 29 +701 69 69 +361 28 28 +82 287 281 +141 27 27 +128 51 51 +160 121 117 +298 18 21 +460 15 15 +108 6 6 +142 27 27 +1065 1 0 +1888 42 44 +502 0 1 +650 41 41 +106 38 49 +202 146 126 +84 174 174 +57 26 30 +135 24 25 +112 76 76 +129 89 89 +149 7 7 +89 14 14 +149 10 10 +107 20 20 +54 7 7 +63 80 80 +58 1 0 +80 148 148 +65 2657341 88008 +520 32 32 +202 44 44 +529 19 19 +807 24 8 +526 18 17 +101 83 79 +149 46 46 +360 177 176 +162 29 24 +683 0 3 +109 37 37 +665 20 20 +1314 0 2 +637 6 6 +941 1 1 +26 1 1 +215 0 1 +226 1 1 +26 1 1 +787 12 12 +71 0 1 +1119 1 1 +58 0 19 +32 2 0 +701 1 1 +35 1 1 +132 1 1 +46 1 1 +561 27 27 +1732 0 1 +118 14 14 +112 1 1 +22 0 8 +48 4 0 +749 1 1 +33 1 1 +500 4 4 +292 0 1 +816 1 1 +47 1 1 +518 1 1 +35 1 1 +336 1 1 +23 1 1 +1647 1 1 +71 1 1 +83 1 1 +25 1 1 +400 1 1 +126 2 2 +433 10 10 +37 1 1 +72 19 16 +114 1 1 +20 1 1 +114 1 1 +36 1 1 +68 5 5 +25 1 1 +115 1 1 +77 1 1 +117 1 1 +21 1 1 +115 1 1 +39 0 1 +21 0 2 +37 1 1 +192 432 441 +77 217 219 +129 15 15 +104 33 33 +72 143 144 +79 43 43 +250 49 49 +57 61 61 +71 21 21 +70 73 73 +360 7 7 +78 31 31 +292 51 51 +795 49 49 +617 27 27 +120 38 38 +163 46 49 +213 23 23 +65 122 122 +50 24 24 +148 90 66 +54 24 24 +167 68 68 +70 66 66 +324 58 58 +162 123 123 +126 52 52 +196 4 4 +131 32 32 +53 9 9 +84 95 105 +230 13 13 +154 57 58 +57 22 22 +135 27 22 +104 136 134 +74 57 61 +72 0 3 +92 43 42 +87 0 1 +103 1 1 +183 5 5 +150 1 1 +139 0 2 +26 1 1 +128 1 1 +36 3 0 +377 12 12 +445 1 1 +38 1 1 +332 12 14 +119 1 1 +38 1 1 +464 1 1 +27 1 1 +601 3 0 +18 1 1 +205 1 1 +37 2 2 +132 1 1 +45 0 1 +71 1 1 +843 0 6 +1449 2 1 +154 0 4 +552 1 1 +28 1 1 +658 1 1 +71 0 1 +19 4 0 +155 8 8 +59 1 0 +201 1 1 +21 1 1 +369 1 1 +22 1 1 +268 1 1 +22 1 1 +361 16 16 +319 56 56 +218 5 0 +124 10 10 +345 42 43 +828 31 31 +208 8 6 +331 15 15 +185 324 0 +67 48 48 +333 21 0 +450 3 0 +1257 16 16 +1032 62 62 +646 14 14 +101 1 0 +572 146 144 +352 11 11 +1497 0 4 +1542 25 25 +577 39 39 +423 4 0 +743 33 33 +455 38 38 +357 37 37 +138 0 1 +315 26 26 +1105 40 40 +95 7 4 +139 32 40 +512 22 22 +766 78 78 +482 25 25 +672 52 52 +541 0 1 +377 51 51 +429 45 45 +236 21 21 +79 50 50 +75 37 37 +53 14 14 +246 54 54 +598 23 23 +437 18 18 +242 1 0 +503 44 44 +222 0 1 +142 1 3 +1542 1 1 +38 1 1 +551 15 5 +62 0 1 +204 1 1 +19 1 1 +160 0 4 +264 6 6 +1279 7 0 +487 31 31 +145 14 14 +198 1 0 +356 33 32 +444 27 27 +344 40 40 +188 133 135 +121 32 39 +374 68 76 +60 22 22 +366 4 4 +111 0 1 +162 48 51 +480 0 8 +60 17 17 +588 39 40 +140 17 17 +1879 0 5 +124 13 13 +848 25 24 +694 63 67 +185 55 52 +90 0 1 +855 24 30 +2130 15 5 +143 79 79 +365 82 83 +324 10 10 +190 2 0 +318 1 1 +45 1 1 +57 1 1 +17 1 1 +677 11 11 +76 6 0 +45 5 0 +422 22 0 +61 1 1 +493 7 0 +1994 0 27 +2307 0 1 +69 1 1 +57 1 1 +2574 28 0 +58 10 0 +47 23 9 +384 9 9 +78 1 0 +248 5 4 +247 4 4 +385 8 8 +186 1 1 +30 1 1 +114 10 11 +984 17 17 +362 1 4 +330 1 1 +23 1 1 +265 0 2 +363 1 1 +36 0 1 +425 34 34 +136 1 1 +43 4 1 +36 1 0 +169 0 1 +102 1 1 +45 1 1 +73 1 8 +140 7 6 +50 3 0 +131 1 1 +87 1 0 +4 1 2 +351 1 1 +23 1 0 +73 1 1 +36 1 1 +97 8 7 +313 1 1 +93 2 0 +8 1 1 +182 0 1 +191 0 1 +802 1 1 +41 1 1 +428 1 1 +31 1 1 +205 1 1 +43 1 1 +56 9 9 +114 20 20 +207 6 6 +97 29 1352 +384 22 24 +371 28 28 +1065 47 48 +279 33 34 +748 10 10 +241 1 1 +49 8 26 +209 1 1 +45 1 1 +386 1 1 +54 1 1 +115 1 1 +50 1 1 +396 27 0 +1358 1 1 +41 1 1 +387 1 1 +78 4 4 +336 7 0 +33 7 0 +50 1 1 +39 1 1 +1319 18 18 +631 91 78 +63 15 12 +153 37 37 +273 18 0 +260 0 1 +78 33 29 +660 6 6 +542 45 45 +418 205 105 +86 47 47 +26 0 27 +515 8 8 +109 1 1 +15 1 1 +40 0 16 +876 4 4 +47 2 0 +56 1 9 +28 1 1 +56 1 1 +17 3 2 +39 1 1 +88 1 1 +48 1 1 +216 1 1 +32 1 1 +163 11 11 +258 1 1 +29 6 0 +36 1 1 +139 1 1 +12 1 1 +571 1 1 +20 1 1 +254 6 6 +312 6 6 +319 9 9 +787 35 35 +1232 4 1 +781 134 135 +617 0 1 +1422 1 1 +26 1 1 +237 1 1 +74 1 1 +291 0 4 +40 1 1 +303 1 1 +41 1 1 +103 1 1 +45 1 0 +438 1 1 +22 1 1 +711 1 1 +73 1 1 +55 1 0 +728 11 11 +87 1 1 +37 1 1 +47 2 0 +587 1 1 +31 1 1 +150 1 1 +99 0 2 +191 1 1 +37 1 1 +63 1 1 +73 1 1 +1076 1 1 +42 5 1 +10 0 4 +450 11 0 +44 1 1 +109 1 1 +46 1 1 +864 1 1 +38 1 1 +115 10 7 +3596 5 5 +379 1 1 +41 7 7 +164 12 16 +195 1 1 +110 1 1 +270 1 1 +37 1 1 +257 1 1 +39 5 5 +1028 3 3 +19 1 1 +1771 1 1 +39 1 0 +1879 1 1 +17 1 0 +3918 2 0 +3465 1 1 +49 1 1 +3193 0 1 +140 7 7 +170 1 1 +19 1 1 +372 6 6 +622 1 1 +31 0 1 +1378 1 1 +34 1 1 +103 1 1 +60 1 1 +253 + +chain 5159254 9 141213431 + 43316945 44675535 chr9 138394717 - 95899476 98855806 113 +52 398 398 +52 885 885 +43 231 231 +62 262 262 +26 1 0 +1 111 111 +56 1064 1064 +50 204 204 +65 558 558 +59 4 0 +83 78 78 +32 84 84 +29 178 178 +318 203 203 +28 145 145 +31 281 281 +124 143 143 +69 131 131 +35 851 851 +38 190 190 +41 205 205 +30 439 438 +58 145 145 +26 108 108 +32 274 274 +76 116 116 +102 833 833 +109 840 840 +63 125 125 +30 109 109 +32 285 284 +65 980 980 +45 50 50 +55 113 113 +59 51 51 +33 52 52 +55 197 197 +40 75 75 +50 122 122 +38 432 432 +42 339 339 +59 168 168 +25 172 172 +81 208 208 +168 125 125 +103 87 87 +136 220 220 +205 92 92 +28 253 253 +49 82 82 +89 228 228 +34 416 416 +81 457 457 +29 84 85 +188 1023 1023 +31 120 120 +39 273 273 +141 224 224 +65 404 404 +66 299 299 +70 168 168 +71 92 92 +93 157 157 +53 76 76 +33 87 87 +69 58 58 +41 441 441 +28 111 111 +60 501 502 +42 338 338 +68 24 24 +57 331 331 +56 365 365 +25 56 56 +44 81 81 +35 62 62 +65 936 936 +62 177 177 +85 1592 1592 +33 74 74 +69 238 238 +49 669 669 +38 1242 1242 +40 1148 1148 +43 619 619 +33 208 208 +100 71 72 +164 359 359 +88 521 521 +37 673 673 +124 335 335 +92 1 0 +23 175 175 +35 74 74 +60 313 313 +71 144 143 +80 527 527 +333 1 0 +1125 106 106 +85 138 138 +9 12 0 +238 66 66 +51 324 324 +145 366 366 +33 52 52 +53 258 258 +47 409 409 +49 56 56 +111 84 84 +322 602 602 +26 192 192 +42 78 78 +66 66 66 +161 105 105 +447 78 78 +26 238 238 +54 57 57 +45 86 86 +156 60 60 +121 113 113 +57 81 81 +37 454 454 +44 1268 1268 +48 108 108 +37 133 133 +49 85 85 +40 443 458 +47 428 428 +81 548 548 +28 288 288 +91 53 53 +147 51 51 +81 416 416 +49 125 125 +64 51 51 +45 290 290 +148 110 110 +47 242 242 +47 263 263 +218 59 59 +34 123 123 +44 288 288 +87 54 54 +51 193 193 +26 81 81 +40 73 73 +81 176 176 +147 155 155 +121 2933 2933 +42 559 559 +66 695 695 +34 1577 1577 +51 1115 1115 +55 57 57 +27 315 315 +70 78 78 +271 283 283 +111 7 0 +11 403 403 +35 188 187 +112 168 168 +92 209 209 +47 169 169 +70 128 128 +66 180 180 +138 15 15 +135 793 793 +61 77 77 +39 465 465 +48 89 89 +42 347 347 +200 175 175 +38 157 157 +102 98 98 +34 510 510 +36 131 131 +69 244 244 +160 186 186 +161 80 80 +60 60 59 +43 80 80 +25 51 51 +114 389 389 +34 474 474 +49 137 137 +252 0 1 +12 65 65 +34 299 299 +47 441 441 +42 3 39 +38 701 701 +31 335 335 +43 837 837 +78 55 55 +196 65 65 +163 222 222 +65 87 87 +117 775 775 +30 271 271 +68 266 266 +40 0 5 +1 165 165 +42 504 504 +35 111 111 +102 108 108 +59 634 634 +72 460 468 +48 436 436 +34 334 334 +130 550 548 +27 234 234 +25 997 1001 +61 508 509 +54 727 726 +44 761 763 +54 378 378 +25 94 87 +38 678 678 +66 2793 2769 +42 2842 2842 +135 184 184 +48 170 171 +28 262 262 +32 160 160 +79 34 33 +61 206 206 +9 192 192 +86 1254 1253 +98 507 507 +48 121 121 +31 122 122 +69 226 226 +96 0 337 +18 475 475 +34 372 373 +80 130 130 +3 1 0 +324 267 267 +39 545 545 +37 65 65 +31 56 56 +63 138 138 +26 146 146 +39 221 221 +139 73 73 +33 370 370 +33 548 548 +109 71 71 +6 10 0 +245 63 63 +40 679 679 +191 65 65 +80 50 50 +57 113 113 +31 1077 1077 +65 68 68 +60 76 76 +48 177 177 +36 355 355 +37 355 355 +31 134 134 +40 956 956 +50 52 52 +55 137 137 +51 398 398 +43 136 136 +57 379 379 +143 108 108 +53 534 537 +83 121 121 +113 185 185 +73 79 79 +151 56 56 +884 10 10 +533 34 33 +1517 94 94 +46 515 515 +64 202 202 +44 295 295 +34 142 142 +65 212 212 +72 405 405 +30 302 281 +24 494 494 +151 8 8 +27 268 268 +73 140 140 +56 217 217 +28 270 273 +34 278 278 +23 61 61 +5 297 297 +44 149 149 +26 270 270 +29 560 560 +67 591 591 +74 175 175 +35 662 663 +27 72 72 +45 54 54 +26 155 155 +55 87 87 +42 200 200 +145 164 164 +3 26 26 +73 57 57 +172 85 85 +62 193 193 +34 180 180 +51 77 77 +39 98 98 +44 78 78 +34 629 629 +39 520 520 +83 61 61 +47 764 764 +56 151 149 +69 450 447 +66 1414 1415 +49 452 454 +100 78 78 +29 1251 1248 +64 307 309 +60 86 86 +25 628 628 +85 368 368 +39 289 289 +59 166 166 +57 325 326 +49 226 222 +42 179 179 +55 166 166 +18 65 59 +63 99 99 +43 4 4 +42 229 229 +60 82 81 +72 83 83 +65 47 47 +11 83 83 +21 91 91 +57 283 283 +93 201 201 +31 1313 1313 +56 184 184 +96 378 378 +127 475 475 +106 235 235 +34 233 230 +182 1325 1325 +29 236 236 +28 34 34 +30 390 386 +30 185 185 +128 527 529 +110 75 75 +36 403 402 +24 348 348 +52 2554 2552 +56 1970 1987 +38 3043 3033 +28 2092 2095 +65 1970 1961 +36 914 914 +92 310 310 +68 4982 2483 +74 330 330 +83 19 16 +7 265 264 +49 147 147 +85 618 618 +96 168 168 +35 173 173 +65 73 73 +50 339 339 +246 72 72 +222 317 317 +28 104 104 +35 77 77 +48 256 256 +34 584 584 +108 345 345 +74 100 100 +196 54 54 +63 626 626 +49 54 54 +48 114 114 +33 164 164 +161 385 385 +82 263 263 +39 1230 1230 +84 145 145 +29 74 74 +35 154 154 +45 56 56 +133 172 172 +119 51 51 +42 333 333 +75 756 756 +28 757 757 +322 371 371 +194 146 146 +77 124 124 +249 51 51 +27 74 74 +68 135 135 +56 98 98 +136 85 85 +47 550 550 +28 413 413 +62 383 383 +43 1815 1815 +45 80 80 +43 708 708 +115 100 100 +29 505 505 +37 490 490 +141 537 537 +64 343 343 +40 463 463 +61 561 561 +27 73 73 +51 211 211 +34 838 838 +63 92 92 +49 889 889 +31 790 790 +78 357 357 +50 318 318 +60 300 300 +45 88 88 +34 1983 1983 +51 480 480 +39 85 85 +136 173 173 +56 353 353 +203 84 84 +79 1580 1580 +126 138 138 +60 291 291 +1635 665 665 +39 1316 1316 +31 84 84 +92 249 249 +41 1493 1493 +26 405 405 +50 71 71 +124 1509 1509 +44 529 529 +268 492 492 +46 778 778 +50 1675 1675 +56 391 391 +229 229 229 +50 56 56 +187 195 195 +34 309 309 +58 554 554 +27 196 196 +33 75 75 +38 265 265 +66 55 55 +32 344 344 +43 136 136 +46 381 381 +38 1130 1130 +52 220 220 +162 197 197 +50 365 365 +61 99 99 +75 233 233 +36 285 285 +443 571 571 +140 1300 1300 +104 565 565 +96 85 85 +166 331 331 +50 165 165 +47 72 72 +327 128 128 +105 772 772 +182 333 333 +37 53 53 +67 487 487 +42 309 309 +74 341 341 +38 130 130 +35 54 54 +74 227 227 +32 223 223 +132 529 529 +112 114 114 +97 90 90 +26 151 151 +34 55 55 +44 356 356 +51 75 75 +28 167 167 +153 374 374 +79 88 88 +249 761 761 +109 209 209 +48 71 71 +102 133 133 +44 301 301 +64 140 140 +60 207 207 +26 380 380 +105 102 102 +106 64 64 +84 57 57 +76 203 203 +51 196 196 +40 58 58 +103 224 224 +25 120 120 +106 67 67 +37 50 50 +137 171 171 +56 463 463 +101 64 64 +67 128 128 +46 84 84 +84 425 425 +365 53 53 +86 62 62 +27 149 149 +31 556 556 +25 148 148 +79 123 123 +27 182 182 +179 63 63 +43 65 65 +213 111 111 +121 231 231 +83 195 195 +52 52 52 +78 581 581 +103 171 171 +43 151 151 +38 56 56 +28 53 53 +65 254 254 +111 62 62 +110 377 377 +43 319 319 +38 63 63 +65 173 173 +65 277 277 +5318 341 341 +40 208 208 +87 58 58 +46 303 303 +53 78 78 +50 214 214 +97 177 177 +44 54 54 +59 348 348 +7890 321 321 +44 68 68 +39 109 109 +67 263 263 +41 197 197 +75 53 53 +53 98 98 +110 151 151 +90 51 51 +140 225 225 +59 224 224 +43 154 154 +28 301 301 +66 974 974 +25 58 58 +28 86 86 +57 881 881 +28 245 245 +38 190 190 +57 813 813 +3812 174 174 +40 756 756 +46 187 187 +65 51 51 +25 54 54 +42 235 235 +36 198 198 +87 67 67 +50 218 218 +37 745 745 +75 79 79 +101 134 134 +54 172 172 +33 200 200 +75 57 57 +60 1563 1563 +92 70 70 +58 134 134 +72 315 315 +41 100 100 +141 471 471 +87 574 574 +48 427 427 +53 500 500 +27 217 217 +106 135 135 +53 71 71 +46 89 89 +128 603 603 +54 160 160 +29 177 177 +27 338 338 +40 289 289 +38 220 220 +31 101 101 +28 341 341 +55 1842 1842 +61 114 114 +31 1131 1131 +40 309 309 +41 122 122 +66 379 379 +39 196 196 +32 90 90 +36 210 210 +40 244 244 +78 108 108 +60 125 125 +46 57 57 +161 199 199 +64 103 103 +159 117 117 +84 320 320 +60 181 181 +63 277 277 +79 1216 1216 +62 448 448 +27 62 62 +129 933 933 +39 177 177 +58 130 130 +43 402 402 +61 50 50 +39 578 578 +48 126 126 +70 547 547 +43 523 523 +89 166 166 +47 152 152 +40 1096 1096 +26 593 593 +55 446 446 +80 147 147 +75 511 511 +48 1919 1919 +42 160 160 +119 738 738 +71 1256 1256 +69 501 501 +54 511 511 +62 75 75 +71 130 130 +117 56 56 +67 576 576 +65 82 82 +132 1280 1280 +148 2162 2162 +52 65 65 +27 1435 1435 +29 442 442 +27 2176 2176 +82 80 80 +41 1782 1782 +77 55 55 +38 722 722 +27 507 507 +48 401 401 +27 584 584 +41 275 275 +28 133 133 +84 641 641 +74 99 99 +90 159 159 +70 747 747 +45 301 301 +102 468 468 +26 1552 1552 +48 499 499 +122 331 331 +33 1763 1763 +126 221 221 +177 692 692 +34 69 69 +41 94 94 +92 195 195 +51 159 159 +53 137 137 +35 377 377 +30 1692 1692 +52 334 334 +38 475 475 +37 468 468 +33 172 172 +50 204 204 +85 430 430 +37 651 651 +85 66 66 +62 166 166 +36 110 110 +58 305 305 +36 940 940 +91 64 64 +94 239 239 +26 354 354 +39 134 134 +34 199 199 +69 88 88 +33 55 55 +45 185 185 +35 56 56 +45 125 125 +107 722 722 +52 437 437 +56 533 533 +65 340 340 +50 787 787 +36 183 183 +45 206 206 +137 80 80 +45 386 386 +35 1027 1027 +76 289 289 +90 222 222 +36 209 209 +32 63 63 +70 489 489 +44 340 340 +32 403 403 +28 182 182 +48 404 404 +54 624 624 +61 409 409 +62 235 235 +50 1064 1064 +233 125 125 +5723 451 451 +37 289 289 +141 302 302 +69 59 59 +752 111 111 +44 261 261 +73 707 707 +49 155 155 +45 152 152 +327 198 198 +69 114 114 +27 416 416 +86 1083 1083 +27 228 228 +63 511 511 +60 478 478 +76 129 129 +31 314 314 +75 678 678 +63 271 271 +45 463 463 +31 298 298 +48 154 154 +96 448 448 +128 359 359 +76 771 771 +80 225 225 +85 671 671 +38 177 177 +128 405 405 +79 979 979 +82 441 441 +93 641 641 +113 182 182 +113 328 328 +63 209 209 +66 134 134 +39 450 450 +31 113 113 +72 154 154 +32 858 858 +31 9551 9551 +132 120 120 +186 56 56 +83 281 281 +56 8112 8112 +124 71365 71365 +32 25751 25751 +35 52960 52960 +45 819 819 +26 680 680 +88 483 483 +75 101 101 +35 774 774 +46 410 410 +76 234 234 +30 1989 1989 +72 66 66 +30 965 965 +112 1616 1616 +32 1077 1077 +92 913 913 +44 78 78 +101 1989 1989 +43 568 568 +40 247 247 +36 1374 1374 +26 194 194 +51 144 144 +47 565 565 +45 371 371 +76 3804 3804 +90 720 720 +40 728 728 +27 2662 2662 +48 276 276 +177 74 74 +25 152 152 +35 200 200 +40 283 283 +53 230 230 +49 167 167 +142 1400 1400 +50 369 369 +172 406 406 +40 445 445 +50 1208 1208 +36 613 613 +81 852 852 +33 319 319 +26 110 110 +44 1243 1243 +43 156 156 +105 1318 1318 +36 1070 1070 +40 453 453 +44 651 651 +78 3996 3996 +52 117 117 +48 891 891 +29 238 238 +30 133 133 +40 930 930 +28 137 137 +44 268 268 +37 895 895 +35 389 389 +42 548 548 +66 330 330 +39 1490 1490 +29 467 467 +34 2947 2947 +45 304 304 +25 733132 2333407 +107 4733 4713 +39 82 82 +89 3079 3060 +37 7502 7146 +56 89 89 +100 505 505 +37 413 413 +107 11 11 +72 565 566 +64 343 343 +40 463 463 +61 560 561 +25 73 73 +91 43 43 +72 56 56 +34 280 280 +28 605 594 +183 830 830 +52 677 678 +29 85 85 +53 0 6 +23 712 712 +70 280 280 +45 53 53 +69 169 169 +25 2458 2496 +98 173 172 +56 353 354 +129 355 357 +50 616 612 +39 995 995 +74 291 291 +38 663 663 +38 502 503 +34 129 129 +37 725 727 +45 476 481 +38 1319 1318 +54 499 499 +52 56 56 +16 1533 1528 +24 529 533 +64 689 692 +46 780 789 +49 465 465 +25 1187 1188 +56 391 391 +195 153 153 +49 61 61 +49 59 59 +101 241 250 +72 309 309 +58 273 273 +41 240 240 +27 199 199 +26 63 63 +102 224 224 +57 55 55 +32 344 344 +43 65 65 +31 66 66 +28 372 372 +38 + +chain 3714383 9 141213431 + 39713686 41365793 chr9 138394717 + 42004629 67030952 214 +558 56 56 +50 48 48 +133 27 28 +546 132 132 +247 4 4 +257 98 98 +233 23 23 +132 50 51 +70 85 85 +183 29 29 +89 57 57 +281 13 13 +292 16 16 +158 2 0 +165 99 99 +60 20 19 +620 83 83 +65 0 3 +178 52 52 +64 148 148 +238 27 27 +278 18 18 +336 0 2 +63 57 57 +176 0 4 +392 29 29 +341 28 28 +180 6 6 +191 49 49 +134 36 36 +234 50 50 +78 40 40 +156 34 34 +487 7 6 +161 17 17 +133 47 47 +80 48 48 +73 28 27 +104 71 71 +57 19 19 +137 168 167 +98 162 144 +64 83 83 +123 30 30 +76 72 70 +463 19 19 +407 9 9 +54 79 78 +64 75 75 +191 0 4 +151 146 146 +389 62 62 +243 37 37 +79 9 9 +287 144 144 +73 23 23 +65 95 95 +80 33 33 +59 110 109 +218 40 44 +188 38 38 +89 133 132 +66 4 6 +129 15 15 +199 0 4 +147 80 80 +383 23 23 +424 36 36 +124 133 126 +160 8 12 +52 10 10 +89 60 59 +65 47 47 +119 33 33 +236 51 51 +55 5 5 +59 52 17833 +283 56 56 +225 11 11 +695 54 54 +86 42 42 +159 60 60 +166 79 80 +423 10 10 +279 9 0 +101 116 113 +90 34 34 +487 72 72 +51 51 51 +69 12 12 +303 5 5 +172 49 51 +61 37 37 +110 109 109 +372 46 43 +123 48 48 +95 38 38 +105 0 1 +410 24 24 +101 1 0 +86 13 12 +211 49 49 +80 31 31 +77 65 65 +163 12 1 +138 182 182 +62 18 18 +162 87 172 +480 85 85 +114 14 14 +411 98 98 +463 57 49 +185 20 8 +299 0 3 +131 14 14 +56 79 80 +152 37 34 +113 241 236 +65 39 39 +238 10 0 +231 43 43 +227 42 42 +218 13 13 +119 35 37 +287 205 202 +67 30 35 +135 31 31 +90 45 26 +262 56 56 +201 115 115 +193 71 72 +126 107 108 +94 8 23 +64 49 47 +321 194 194 +99 32 32 +87 266 261 +71 16 15 +112 0 4 +132 14 14 +391 144 143 +57 4 4 +76 8 0 +62 279 279 +57 133 134 +71 121 121 +129 145 145 +83 26 26 +50 13 13 +62 66 66 +173 23 23 +461 7 7 +186 26 26 +317 51 51 +57 17 17 +121 47 48 +337 49 55 +254 42 42 +207 72 71 +55 189 189 +151 50 50 +56 41 41 +80 25 24 +164 3 0 +66 33 28 +135 39 39 +154 65 70 +62 38 38 +66 75 76 +112 30 30 +169 0 2 +75 57 39 +107 91 91 +124 144 144 +113 58 58 +52 61 61 +63 83 86 +200 39 39 +173 21 21 +238 46 49 +57 74 66 +83 41 40 +206 35 34 +68 102 99 +126 170 169 +67 179 136 +356 76 76 +211 32 32 +287 36 36 +136 54 55 +140 84 83 +175 73 67 +101 10 10 +64 90 89 +202 459 446 +193 99 101 +64 108 108 +180 12 12 +1045 65 66 +550 18 21 +105 60 88 +452 16 16 +128 63 63 +149 41 41 +130 32 32 +168 53 53 +79 28 28 +63 64 65 +479 97 96 +58 88 88 +202 76 75 +189 84 84 +317 20 20 +586 54 54 +213 69 68 +88 8 8 +149 24 24 +148 126 126 +276 55 55 +189 52 52 +284 27 27 +237 77 77 +485 40 40 +56 207 192 +203 39 39 +63 10 5 +308 67 66 +144 22 22 +111 60 60 +115 20 20 +161 155 157 +91 12 12 +57 7 7 +206 51 3 +209 129 135 +65 52 52 +308 199 201 +190 97 95 +136 189 190 +117 4 14 +153 36 36 +205 28 32 +175 138 137 +542 86 82 +87 17 17 +168 19 18 +53 217 216 +68 51 51 +58 48 48 +56 0 4 +56 32 32 +146 21 21 +75 32 33 +286 21 25 +143 37 41 +50 90 90 +600 62 62 +149 220 217 +109 53 53 +211 11 10 +81 46 46 +81 60 60 +102 214 214 +94 8 8 +53 16 16 +113 36 36 +198 1 0 +60 18 18 +64 36 36 +267 26 26 +63 0 1 +138 2 0 +181 129 129 +55 57 57 +311 62 62 +65 21 21 +82 128 127 +233 68 68 +443 39 39 +129 0 3 +66 116 116 +111 39 40 +171 17 17 +633 26 26 +173 89 89 +870 113 87 +57 12 0 +134 95 96 +209 84 84 +240 51 56 +58 67 67 +59 40 40 +309 3 0 +124 1 0 +108 11 11 +53 35 35 +108 1 0 +108 30 34 +310 209 218 +53 25 26 +95 0 5 +58 134 134 +191 26 26 +224 74 74 +96 136 134 +240 105 105 +122 41 41 +118 40 40 +97 42 42 +147 46 46 +265 31 31 +391 99 99 +254 46 46 +159 46 46 +202 21 11 +121 88 88 +72 20 20 +97 35 35 +53 38 38 +74 77 77 +436 38 38 +185 404 395 +126 36 36 +143 79 79 +84 92 92 +170 4 4 +309 32 32 +79 72 71 +201 98 98 +68 129 127 +98 1 0 +151 74 74 +154 29 29 +258 28 28 +240 114 114 +284 90 90 +51 50 50 +68 4 0 +479 39 39 +195 28 28 +53 65 65 +92 42 42 +173 75 75 +121 0 4 +66 9 9 +55 674 588 +51 9 9 +103 25 28 +68 47 47 +119 45 10 +152 18 18 +115 114 114 +155 27 27 +279 65 3282 +735 10 11 +62 62 62 +296 18 18 +54 55 55 +98 155 153 +56 45 45 +74 96 95 +287 35 35 +56 54 54 +134 25 25 +286 128 128 +109 42 42 +169 40 40 +139 159 159 +175 68 68 +106 28 28 +67 30 30 +66 40 40 +91 220 222 +164 19 19 +157 12 12 +144 74 74 +54 3 9 +95 14 14 +75 43 43 +57 20 20 +91 30 30 +660 25 25 +50 7 7 +91 7 7 +66 17 16 +50 82 83 +108 6 6 +122 21 21 +69 62 62 +235 6 6 +201 415 225 +122 32 32 +150 76 76 +105 39 39 +163 175 175 +94 19 19 +204 43 43 +53 34 34 +184 331 328 +140 4 4 +73 44 44 +51 28 28 +346 73 352 +170 61 61 +110 92 92 +65 63 58 +350 32 32 +78 88 88 +66 255 255 +141 276 275 +63 119 123 +55 33 33 +140 24 24 +57 98 97 +54 96 97 +122 0 18717934 +272 19 19 +1059 25 20 +469 8 10 +119 27 27 +79 19 19 +223 36 36 +158 31 31 +54 6 9 +70 0 1 +223 70 70 +53 21 21 +321 100 102 +151 1 0 +85 164 174 +129 85 85 +181 40 40 +135 17 16 +206 1 0 +52 78 84 +73 8 8 +231 51 51 +1150 4 0 +50 51 51 +260 22 22 +219 0 2 +152 13 14 +53 0 7 +62 20 20 +292 39 39 +133 64 64 +54 40 40 +445 41 40 +122 0 4 +100 0 7 +136 0 9 +176 38 38 +141 44 44 +45 1 0 +419 42 42 +730 0 6 +690 41 41 +150 1 0 +132 62 62 +73 156 157 +694 35 35 +209 34 28 +490 40 40 +491 0 1 +539 21 21 +188 25 25 +100 0 1 +198 3 7 +74 5 3 +1181 9 9 +179 41 41 +922 49 49 +757 0 4 +676 13 13 +514 0 1 +107 0 6 +163 5 5 +261 35 34 +51 0 3 +983 138 138 +835 39 40 +258 30 30 +72 37 37 +196 0 1 +154 48 48 +855 49 49 +363 68 68 +699 32 32 +140 36 36 +219 22 22 +182 14 14 +251 0 1 +202 318 0 +54 51 51 +217 30 30 +910 40 40 +211 39 39 +219 46 46 +125 87 87 +46 0 1 +1246 93 82 +1203 97 103 +796 34 34 +446 1 4 +118 48 48 +203 0 1 +187 24 24 +765 35 35 +90 32 32 +751 48 48 +440 1 0 +308 164 158 +59 47 51 +57 242 242 +66 305 305 +97 4 4 +93 272 272 +8 17 25 +78 73 73 +58 38 38 +165 501 504 +70 53 53 +847 18 18 +1238 67 67 +1061 28 29 +71 158 158 +46 524 524 +55 165 165 +184 703 703 +48 10 10 +223 85 85 +225 63 64 +477 186 186 +175 349 348 +113 551 548 +270 14 15 +27 124 124 +94 25 25 +73 186 186 +72 345 345 +91 6 5 +148 37 37 +149 107 107 +43 269 269 +321 52 52 +218 221 221 +423 13 13 +17 1137 1134 +69 209 209 +74 197 197 +94 37 37 +13 66 66 +81 73 73 +208 171 171 +43 86 86 +48 319 319 +70 115 115 +294 0 1 +106 53 53 +430 20 20 +81 21 21 +59 4 0 +283 18 17 +167 63 63 +113 20 0 +329 0 2 +173 7 5 +287 15 15 +519 40 40 +158 64 65 +284 30 30 +195 105 105 +278 49 48 +424 17 21 +125 26 26 +2557 47 46 +348 1 0 +161 22 22 +1326 80 80 +64 62 62 +92 49 49 +75 70 70 +43 63 63 +164 67 67 +53 46 46 +158 35 35 +159 348 348 +130 2 0 +230 56 56 +288 157 157 +111 58 58 +185 51 51 +833 77 77 +379 93 93 +858 63 63 +3270 7 0 +2565 13 13 +1467 39 39 +1278 35 35 +932 0 6 +60 1 6 +646 26 26 +348 63 63 +268 47 47 +727 52 52 +1074 48 48 +1382 24 24 +70 14 14 +1708 31 30 +2335 74 74 +141 3 0 +1597 162 160 +283 35 35 +1521 4 3 +2253 9 77 +789 21 21 +470 0 1 +587 0 1 +360 7 11 +600 2 0 +396 32 32 +2362 29 29 +126 2 0 +266 48 48 +262 50 50 +112 2 0 +50 45 48 +223 30 30 +285 34 34 +588 39 39 +51 9 9 +185 1 2 +616 6 6 +3737 1 0 +1342 0 2 +8373 23 23 +931 3 0 +814 0 12 +1063 0 1 +810 39 36 +2647 0 1 +2734 10 13 +2901 0 3 +1894 9 9 +468 1 0 +57 46 0 +2221 0 25 +560 31 31 +3608 0 4 +2284 2 0 +618 6 6 +1988 74 75 +8628 5 5 +106 51 51 +6698 41 41 +2490 0 2 +1350 0 1 +709 0 4 +5557 1016257 1644835 +48 278 278 +49 581 581 +47 428 428 +80 864 864 +90 53 53 +147 51 51 +81 416 416 +49 123 123 +63 51 51 +45 243 243 +205 275 275 +150 65 65 +47 263 263 +218 216 216 +44 288 288 +73 54 54 +51 413 413 +127 19 28 +25 95 95 +147 155 155 +121 4300 4300 +54 2707 2719 +55 399 399 +70 67 67 +113 63 63 +106 283 283 +129 610 610 +112 168 168 +92 421 421 +95 355 355 +147 386 385 +45 508 508 +61 580 580 +48 455 455 +219 370 370 +102 812 812 +68 241 241 +261 171 163 +50 430 428 +60 58 63 +43 156 156 +114 278 278 +44 333 333 +79 349 349 +200 66 52 +7 58 58 +37 16 16 +37 745 745 +64 643 643 +94 315 315 +52 793 793 +241 3 10 +371 374 374 +116 730 734 +72 92 92 +9 195 195 +43 59 59 +93 103 103 +57 434 434 +45 229 229 +65 77 74 +102 108 108 +59 85680 4108608 +19 44 44 +26 10635 10262 +56 114 114 +75 255 255 +65 547 547 +317 526 526 +61 849 849 +61 660 658 +51 82 82 +73 710 702 +47 295 298 +127 579 579 +48 221 221 +45 780 776 +76 357 357 +187 58 58 +54 71713 319 +1987 2 5 +87 4 3 +689 9 12 +617 0 1 +530 0 2 +451 16 16 +525 22 22 +575 132 130 +206 49 49 +1663 12 12 +308 0 4 +259 44 44 +455 43 41 +173 2 0 +1759 42 42 +2117 164 164 +75 133 135 +53 492 492 +46 780 780 +87 399 399 +53 1187 1187 +56 391 391 +258 90 90 +50 60 60 +250 200 205 +72 309 309 +58 876 875 +52 755 755 +43 1135 1135 +2 10 0 +311 988 990 +48 27252 27599 +61 29777 85221 +48 935 940 +63 1021 1019 +1 1 1 +84 67 67 +48 795 795 +7 1 1 +70 345 348 +82 159 159 +53 206 206 +170 1 1 +66 489 481 +77 308 308 +51 1 1 +9 319 319 +59 599 599 +81 1585 1586 +45 664 660 +62 1276 1275 +39 1 1 +13 308 308 +42 1 1 +2 122 123 +66 336 336 +115 425 425 +26 1 1 +39 1 1 +70 199 199 +123 90 91 +78 235 233 +7 1 1 +65 286 286 +16 1 1 +53 1 1 +45 51 53 +174 1 1 +180 298 298 +82 182 182 +62 212 220 +25 1 1 +91 0 1 +26 1216 1216 +62 417 416 +62 59 59 +51 1 1 +39 1 1 +84 99 99 +50 405 405 +47 491 491 +85 0 9 +22 91 91 +56 389 393 +61 666 664 +46 126 126 +71 545 545 +43 529 528 +43 1 1 +28 0 2 +17 166 166 +40 1 1 +7 105 105 +66 1 0 +21 1452 1453 +74 190 189 +55 673 673 +75 985 975 +46 1651 1651 +120 739 737 +71 59 59 +52 59 59 +70 861 861 +1 1 1 +61 92 92 +6 1 4 +61 334 334 +32 1 1 +60 74 74 +54 254 254 +32 1 1 +50 174 174 +58 79 79 +71 107 107 +44 3 0 +36 0 2 +47 0 2 +6 56 56 +17 1 1 +48 201 201 +44 330 331 +126 45 41 +103 1280 1280 +124 2171 2192 +27 0 3 +115 442 442 +49 44 43 +14 1184 1204 +40 31 99 +78 5538 5568 +47 1407 1413 +159 641 641 +74 95 95 +94 159 159 +68 747 747 +45 301 301 +102 2046 2046 +48 499 499 +134 2127 2127 +126 221 221 +184 646 638 +90 204 204 +92 195 195 +51 159 159 +55 137 137 +67 288 288 +87 1692 1692 +52 1558 1558 +78 176 176 +84 592 592 +54 472 472 +85 66 66 +62 310 310 +58 80 80 +38 0 2 +12 511 511 +48 1 0 +19 570 571 +91 65 65 +93 239 239 +68 268 268 +83 368 368 +68 176 176 +45 100 100 +120 56 56 +45 125 125 +100 727 727 +52 437 437 +56 493 493 +105 844 846 +41 49 49 +5 456 456 +44 205 205 +17 30 30 +89 80 80 +45 1445 1447 +77 238 238 +31 0 1 +25 273 273 +54 316 316 +70 290 290 +167 119 113 +28 222 222 +45 985 985 +48 404 402 +54 451 451 +77 575 574 +85 205 205 +50 1063 1062 +159 6 0 +3 125 125 +68 86 86 +1138 11 6 +1513 55 55 +144 203 203 +68 59 59 +81 403 403 +36 9 9 +158 74 74 +63 1 1 +30 646 646 +297 202 202 +237 52 52 +431 159 159 +43 107 107 +179 13 13 +145 12 11 +85 307 307 +133 134 134 +2539 0 1 +2510 38 38 +1161 8 0 +131 215 215 +46 143 143 +295 409 409 +63 307 307 +191 123 123 +182 72 72 +50 1 0 +58 395 395 +261 152 152 +13 4 0 +240 + +chain 3604380 9 141213431 + 70320044 70506535 chr9 138394717 - 72548717 72735179 249 +185146 30 0 +548 0 1 +767 + +chain 3137754 9 141213431 + 70556535 70735457 chr9 138394717 - 72034745 72213579 391 +101 520 520 +32 202 202 +44 2024 2024 +83 149 149 +46 360 360 +177 162 162 +29 792 792 +37 7641 7641 +27 9470 9470 +432 77 77 +217 248 248 +33 72 72 +143 79 79 +43 250 250 +49 57 57 +61 162 162 +73 445 445 +31 292 292 +51 795 795 +49 617 617 +27 120 120 +38 163 163 +46 301 301 +122 222 222 +90 245 245 +68 70 70 +66 324 324 +58 162 162 +123 126 126 +52 331 331 +32 146 146 +95 397 397 +57 214 214 +27 104 104 +136 74 74 +57 164 164 +43 9463 9463 +56 702 702 +42 828 828 +31 747 747 +324 67 67 +48 3112 3112 +62 1334 1334 +146 3402 3402 +25 577 577 +39 1170 1170 +33 455 455 +38 357 357 +37 453 453 +26 1105 1105 +40 241 241 +32 1300 1300 +78 482 482 +25 672 672 +52 918 918 +51 429 429 +45 336 336 +50 75 75 +37 313 313 +54 1822 1822 +44 5003 5003 +31 714 714 +33 444 444 +27 344 344 +40 188 188 +133 121 121 +32 374 374 +68 725 725 +48 1145 1145 +39 3021 3021 +25 694 694 +63 185 185 +55 3257 3257 +79 365 365 +82 9796 9796 +28 4658 4658 +34 4486 4486 +29 777 777 +28 1065 1065 +47 279 279 +33 2318 2318 +27 4313 4313 +91 231 231 +37 629 629 +33 1208 1208 +45 418 418 +205 86 86 +47 5179 5179 +35 2017 2017 +134 33205 33242 +1980 33 33 +1544 1 1 +18 1 1 +1659 1 1 +61 1 1 +830 1 2 +2210 6 8 +1089 0 6 +601 0 1 +715 10 10 +2095 1 1 +47 1 1 +815 10 0 +1271 0 6 +6425 41 35 +183 1 2 +623 39 44 +551 47 47 +147 30 30 +179 35 35 +117 5 5 +514 286 286 +154 30 30 +299 14 14 +129 9 9 +280 6 0 +65 73 73 +75 19 20 +95 133 133 +152 5 5 +183 15 15 +125 27 26 +79 4 4 +142 39 40 +176 19 21 +120 0 1 +179 132 0 +163 87 87 +303 15 18 +252 + +chain 2612293 9 141213431 + 39714244 41348958 chr9 138394717 - 76960686 99060893 251 +56 50 50 +48 706 706 +132 508 508 +98 388 388 +50 70 70 +85 301 301 +57 927 927 +99 700 700 +83 243 243 +52 64 64 +148 960 960 +57 1343 1343 +49 404 404 +50 1113 1113 +47 80 80 +48 205 205 +71 213 213 +168 98 98 +162 64 64 +83 229 229 +72 952 952 +79 64 64 +75 342 342 +146 389 389 +62 655 655 +144 161 161 +95 172 172 +110 573 573 +133 560 560 +80 990 990 +133 319 319 +60 65 65 +47 388 388 +51 119 119 +52 283 283 +56 931 931 +54 86 86 +42 159 159 +60 166 166 +79 822 822 +116 611 611 +72 51 51 +51 561 561 +49 208 208 +109 372 372 +46 123 123 +48 1084 1084 +49 188 188 +65 313 313 +182 242 242 +87 480 480 +85 539 539 +98 463 463 +57 705 705 +79 302 302 +241 583 583 +43 227 227 +42 672 672 +205 353 353 +45 262 262 +56 201 201 +115 193 193 +71 126 126 +107 166 166 +49 321 321 +194 218 218 +266 736 736 +144 207 207 +279 57 57 +133 71 71 +121 129 129 +145 234 234 +66 1193 1193 +51 195 195 +47 337 337 +49 254 254 +42 207 207 +72 55 55 +189 151 151 +50 796 796 +65 166 166 +75 386 386 +57 107 107 +91 124 124 +144 113 113 +58 52 52 +61 63 63 +83 671 671 +46 57 57 +74 433 433 +102 126 126 +170 67 67 +179 356 356 +76 702 702 +54 140 140 +84 175 175 +73 175 175 +90 202 202 +459 193 193 +99 64 64 +108 1237 1237 +65 673 673 +60 596 596 +63 520 520 +53 170 170 +64 479 479 +97 58 58 +88 202 202 +76 189 189 +84 923 923 +54 213 213 +69 417 417 +126 276 276 +55 189 189 +52 548 548 +77 581 581 +207 623 623 +67 277 277 +60 296 296 +155 373 373 +51 209 209 +129 65 65 +52 308 308 +199 190 190 +97 136 136 +189 718 718 +138 542 542 +86 344 344 +217 68 68 +51 58 58 +48 955 955 +90 600 600 +62 149 149 +220 109 109 +53 303 303 +46 81 81 +60 102 102 +214 1374 1374 +129 55 55 +57 311 311 +62 168 168 +128 233 233 +68 677 677 +116 1170 1170 +89 870 870 +113 203 203 +95 209 209 +84 240 240 +51 58 58 +67 1300 1300 +209 231 231 +134 441 441 +74 96 96 +136 240 240 +105 418 418 +42 147 147 +46 687 687 +99 254 254 +46 159 159 +46 344 344 +88 389 389 +77 659 659 +404 305 305 +79 84 84 +92 594 594 +72 201 201 +98 68 68 +129 250 250 +74 709 709 +114 284 284 +90 51 51 +50 866 866 +65 92 92 +42 173 173 +75 251 251 +674 256 256 +47 119 119 +45 285 285 +114 461 461 +65 807 807 +62 368 368 +55 98 98 +155 56 56 +45 74 74 +96 378 378 +54 445 445 +128 109 109 +42 348 348 +159 175 175 +68 428 428 +220 496 496 +74 241 241 +43 1171 1171 +82 326 326 +62 442 442 +415 304 304 +76 307 307 +175 317 317 +43 271 271 +331 217 217 +44 425 425 +73 170 170 +61 110 110 +92 65 65 +63 460 460 +88 66 66 +255 141 141 +276 63 63 +119 309 309 +98 54 54 +96 3019 3019 +70 395 395 +100 237 237 +164 129 129 +85 632 632 +78 312 312 +51 1204 1204 +51 1265 1265 +64 1293 1293 +44 465 465 +42 1744 1744 +62 73 73 +156 5478 5478 +49 3565 3565 +138 1621 1621 +48 855 855 +49 363 363 +68 1797 1797 +318 54 54 +51 1666 1666 +46 125 125 +87 1292 1292 +93 1203 1203 +97 1395 1395 +48 2087 2087 +48 972 972 +47 1798 1798 +98 2404 2404 +67 3586 3586 +63 992 992 +65 4328 4328 +54 156 156 +82 271 271 +195 1030 1030 +73 1460 1460 +53 1083 1083 +63 1661 1661 +64 509 509 +105 278 278 +49 417179 19334025 +312 2 0 +1120 39 39 +56 36 36 +237 27 27 +659 42 42 +624 67 67 +1290 1 0 +180 16 16 +279 0 7 +341 29 29 +120 59 59 +243 69 69 +1984 0 1 +557 37 37 +398 49 48 +983 10 10 +106 30 30 +1151 32 32 +51 32 28 +2867 103 96 +138 38 40 +472 1 0 +953 0 1 +707 29 29 +3833 12 12 +541 1 0 +1139 37 37 +607 0 4 +220 32 32 +711 56 48 +1579 43 43 +467 39 35 +365 51 51 +563 57 57 +2027 56 56 +471 20 20 +1464 6 6 +1642 0 1 +1921 43 43 +138 17 17 +1071 43 43 +934 45 45 +117 23 22 +80 7 0 +113 24 24 +764 311 312 +101 8 8 +179 9 9 +101 19 21 +171 41 41 +151 52 52 +388 1 0 +1225 26 22 +79 72 72 +53 1 0 +801 97 101 +355 18 18 +1441 53 53 +324 0 11 +510 4 0 +90 85 85 +437 45 45 +168 7 7 +68 43 43 +206 27 27 +495 241 244 +1129 0 12 +1647 48 48 +145 19 19 +74 12 12 +244 55 59 +111 39 39 +61 13 29 +605 4 0 +453 39 39 +89 51 47 +213 51 51 +95 11 11 +149 87 87 +151 5 0 +533 10 10 +547 51 51 +87 45 45 +730 1 3 +462 12 12 +315 1 0 +510 3 0 +3186 74 75 +148 18 18 +428 75 71 +119 43 43 +298 75 90 +77 128 122 +92 53 53 +60 21 21 +95 91 95 +212 128 128 +258 36 36 +333 67 67 +484 105 104 +75 32 31 +82 29 29 +187 51 51 +633 37 37 +806 2 0 +563 0 4 +425 24 24 +491 53 53 +105 52 49 +90 7 7 +45 0 1 +195 74 62 +143 193 87 +1100 64 65 +284 17 17 +93 0 2 +94 31 31 +128 0 14 +144 1 12 +89 28 28 +709 11 11 +522 117 117 +461 32 32 +300 36 36 +838 21 21 +441 1 0 +253 69 69 +433 32 32 +403 0 13 +163 131 141 +214 8 8 +560 1 0 +380 25 25 +790 0 2 +168 18 18 +135 0 2 +305 1 0 +1242 33 33 +79 32 32 +587 20 17 +552 45 45 +574 74 74 +80 70 70 +306 5 5 +670 123 123 +151 30 30 +55 13 20 +220 12 12 +162 86 82 +269 8 23 +321 22 22 +286 77 77 +65 62 62 +98 31 31 +92 33 33 +159 37 37 +52 68 66 +256 51 51 +100 22 22 +65 128 128 +53 51 51 +174 120 120 +73 77 77 +107 0 2 +52 138 138 +110 48 48 +68 84 84 +327 58 55 +189 13 11 +65 34 34 +65 337 337 +54 115 115 +62 0 398 +77 1 5 +51 123 123 +54 28 28 +64 251 247 +54 177 167 +101 122 124 +58 517 503 +52 77 77 +53 74 69 +191 21 21 +222 137 137 +55 12 10 +91 69 68 +82 82 82 +855 78 78 +124 21 21 +63 8 8 +348 12 12 +57 2189 179 +203 59 59 +353 15 15 +330 24 23 +427 0 17 +403 2 0 +293 22 22 +328 348 339 +131 78 78 +331 4 0 +52 19 19 +106 5 0 +146 47 49 +116 20 20 +168 0 1 +85 92 88 +66 20 20 +1165 105 107 +146 42 43 +284 94 78 +120 14 14 +336 43 39 +349 9 12 +85 254 254 +156 31 35 +84 240 240 +54 49 49 +80 31 31 +87 101 101 +40 6 9 +72 56 57 +124 0 3 +316 71 71 +130 9 7 +64 141 143 +158 42 43 +65 5 0 +229 51 51 +53 44 44 +70 68 68 +95 164 164 +119 371 372 +167 2 0 +51 0 1 +73 32 32 +125 20 20 +206 82 82 +232 13 14 +505 43 36 +631 22 18 +138 2 7 +152 51 80 +647 4 0 +190 158 158 +88 14 7 +432 70 69 +56 0 1 +755 1 0 +497 49 49 +119 17 17 +179 13 13 +556 46 46 +530 0 1 +246 26 26 +255 1510 0 +91 70 68 +376 13 14 +189 48 48 +1007 0 1 +408 57 63 +176 21 17 +188 1 0 +291 74 74 +225 0 6 +174 20 19 +259 20 20 +247 43 37 +162 47 47 +65 50 50 +190 35 35 +925 94 94 +108 65 65 +61 49 49 +400 19 19 +841 17 0 +95 15 15 +245 3 3 +159 0 2 +738 47 47 +285 42 42 +516 30 29 +208 39 37 +336 128 128 +122 31 22 +123 111 115 +256 12 12 +457 43 43 +731 10 10 +519 30 30 +617 38 38 +154 90 90 +477 15 14 +137 88 89 +266 118 114 +73 12 12 +354 19 19 +160 30 30 +186 37 37 +131 23 17 +118 34 34 +140 29 29 +208 60 53 +135 25 25 +269 8 8 +409 0 1 +206 61 61 +201 90 87 +54 13 13 +363 25 24 +264 0 2 +538 49 49 +131 14 14 +490 47 47 +167 52 52 +315 32 32 +885 60 56 +91 22 22 +177 21 21 +252 21 21 +412 30 30 +139 38 38 +335 36 36 +309 101 101 +657 2 1 +493 34 36 +1316 34 34 +169 29 30 +437 23 21 +107 11 11 +74 19 19 +219 40 40 +526 1 0 +1735 2 0 +346 57 57 +63 53 54 +98 33 33 +103 12 12 +497 586604 2136944 +52 104942 104884 +87 1 1 +25 7583 7586 +74 53 53 +69 2221 2270 +56 366 364 +83 159 157 +86 353 354 +129 356 357 +50 1650 1646 +74 2457 2460 +45 1833 1837 +54 499 499 +52 1 1 +54 1 1 +16 1513 1508 +44 369 369 +4548 1 1 +131 0 1 +669 72239 863 +43 90484 163149 +45 4311 4310 +44 3238 3238 +78 25664 25945 +69 714 714 +49 3323 3321 +44 590 590 +113 4659 4647 +86 + +chain 2561624 9 141213431 + 65474200 66404656 chr9 138394717 - 77169272 95480817 343 +55 1037 1037 +47 11793 11793 +48 162 162 +50 97470 97470 +74 657279 18038360 +102334 0 15 +122 1 1 +614 1 1 +29 1 1 +124 4 0 +4870 3 0 +12141 0 1 +29679 93 93 +9536 1 0 +2888 + +chain 1359337 9 141213431 + 45350203 67918383 chr9 138394717 + 41267180 42844187 136 +1660 50 50 +27666 418 418 +36 2748 2748 +99 3096 3096 +51 242 242 +39 145 145 +31 1489 1489 +47 2227 2227 +47 1474 1474 +34 359 359 +48 3098 3098 +40 1161 1161 +53 577 577 +42 797 797 +51 83 83 +63 297 297 +39 381 381 +35 274 274 +116 1923 1923 +31 250 250 +47 792 792 +84 29483 29483 +1323 2041 2041 +638 19109 19109 +31 29959 29959 +78794 386246 0 +266363 943703 7552 +1945 1 1 +39 1 1 +169 3 3 +18 1 1 +632 94 0 +582 4 0 +93 8 0 +49 1 1 +178 1 1 +43 1 1 +1772 78 78 +351 83 83 +706 28 29 +1249 26 26 +388 10 0 +142 4 0 +299 45 45 +144 14 13 +116 64 64 +87 46 46 +211 295 293 +470 50 50 +281 47 47 +370 33 31 +156 24 28 +306 45 45 +97 36 35 +274 6 6 +66 146 146 +370 19 19 +348 17 17 +122 88 88 +87 80 80 +253 38 38 +69 28 28 +143599 20581616 912927 +181 4 8 +170 21 20 +98 25 25 +56 33 33 +53 48 55 +52 49 49 +191 12 15 +164 16 16 +94 13 13 +58 48 48 +176 0 2 +65 102 101 +149 30 30 +137 51 51 +159 166 156 +92 50 49 +176 41 40 +214 10 10 +88 67 67 +213 51 55 +393 152 156 +143 65 65 +213 108 113 +113 28 28 +95 0 3 +53 35 35 +51 220 220 +61 59 62 +184 116 117 +83 11 11 +98 85 88 +132 180 192 +76 8 8 +75 271 271 +72 74 74 +71 27 27 +66 51 51 +512 60 55 +427 30 30 +391 67 67 +99 1 0 +74 97 97 +402 21 21 +96 89 84 +76 84 98 +138 34 34 +50 13 13 +228 24 24 +62 166 166 +188 4100 4098 +73 6 6 +69 11 11 +147 73 78 +537 56 78 +113 34 35 +63 0 1 +107 60 60 +86 32 32 +81 18 18 +328 59 61 +320 35 35 +126 44 42 +55 9 11 +195 5 2 +50 91 91 +50 70 70 +121 14 13 +103 62 53 +53 33 33 +92 43 43 +93 20 20 +83 15 14 +562 21 0 +349 + +chain 853197 9 141213431 + 46277278 46417801 chr9 138394717 - 96636980 96777472 360 +27 966 966 +46 1398 1398 +109 24296 24353 +47 13684 13657 +29 295 296 +74 67 67 +55 509 509 +5 3 0 +59 839 839 +39 961 961 +31 1230 1230 +27 430 430 +31 752 752 +38 1113 1113 +92 159 159 +52 82 82 +37 14472 14472 +46 757 757 +33 1920 1920 +56 263 263 +35 2591 2591 +88 116 116 +46 346 346 +121 96 96 +50 4769 4769 +80 1645 1645 +40 315 316 +31 482 482 +38 5255 5241 +47 184 183 +22 1145 1138 +37 2272 2270 +26 4058 4068 +91 2898 2885 +25 1729 1729 +27 59 59 +39 70 70 +116 496 496 +48 116 116 +38 710 710 +29 996 996 +31 1092 1092 +110 471 471 +646 5 0 +1962 93 93 +45 182 182 +64 890 881 +90 237 237 +28 12 0 +43 512 512 +114 432 432 +44 276 276 +47 83 83 +34 1145 1141 +32 152 152 +27 1 1 +40 1 1 +60 633 633 +44 123 123 +29 98 98 +65 66 66 +41 345 345 +93 380 380 +25 53 53 +18 1 1 +38 163 163 +61 97 97 +77 596 596 +69 230 230 +31 3 0 +2 871 871 +83 93 93 +38 403 403 +100 77 77 +92 177 177 +85 143 143 +42 97 97 +108 72 72 +70 153 153 +58 296 296 +200 278 278 +32 68 68 +49 61 61 +39 77 77 +36 126 126 +70 281 281 +167 106 106 +175 83 83 +94 98 98 +40 552 552 +56 455 455 +26 439 439 +56 307 307 +45 160 160 +29 298 298 +29 842 842 +25 346 346 +58 530 526 +75 1507 1510 +81 1231 1231 +78 50 51 +32 173 173 +27 471 471 +48 1304 1304 +159 155 155 +40 74 74 +82 251 251 +62 91 91 +176 387 387 +44 1887 1887 +47 3126 3126 +25 121 121 +149 502 502 +35 73 73 +81 1462 1462 +32 2896 2896 +85 2977 2977 +35 299 299 +36 1679 1679 +54 + +chain 637444 9 141213431 + 40057248 40425834 chr9 138394717 - 96529222 99409401 479 +52 68 66 +256 30 30 +121 22 22 +65 128 128 +278 120 120 +73 116 116 +68 0 2 +52 138 138 +110 48 48 +68 84 84 +327 58 55 +189 13 11 +65 34 34 +65 337 337 +54 115 115 +62 0 398 +77 1 5 +51 37 37 +140 28 28 +64 14371 12327 +18 61 61 +40 15670 14157 +77 3785 3770 +48 19168 19134 +31 15518 15961 +14 1 1 +69 154776 2669110 +38 1016 1016 +41 2949 2955 +58 2853 2748 +37 2727 2711 +31 14670 14704 +13 2 1 +24 10889 10838 +33 2040 2039 +40 2849 2839 +48 3903 3898 +27 495 492 +106 2911 2890 +47 509 511 +41 1414 1443 +31 4 0 +16 213 213 +51 255 255 +27 6 6 +54 6649 6659 +74 597 589 +72 119 119 +43 298 298 +75 77 77 +61 15 11 +52 92 92 +53 176 180 +91 212 212 +128 258 258 +36 333 333 +67 484 484 +60 1 1 +43 76 76 +32 82 82 +29 187 187 +51 633 633 +37 2311 2312 +53 105 105 +41 348 344 +71 1439 1304 +64 488 490 +31 362 373 +28 1243 1254 +116 461 473 +28 1894 1894 +49 1127 1127 +55 3847 3844 +33 1270 1275 +42 577 577 +74 80 80 +70 981 978 +123 151 151 +30 470 466 +78 906 905 +77 65 65 +62 98 98 +31 92 92 +33 159 159 +37 52 52 +68 494 494 +128 53 53 +51 174 174 +120 73 73 +77 159 158 +138 110 110 +48 68 68 +84 327 326 +58 267 267 +34 65 65 +75 39 39 +108 68 68 +47 54 54 +78 228 228 +72 105 105 +28 64 64 +251 54 54 +177 101 101 +122 58 58 +33 147 137 +97 38 38 +202 52 52 +77 53 53 +12 0 2 +52 3 0 +7 459 462 +112 158 158 +69 82 82 +82 855 855 +78 634 628 +18 1 1 +81 1 1 +40 4 4 +437 1 0 +740 24 24 +730 32 32 +79 203 203 +59 3853 3838 +50 1293 1290 +1 2 0 +102 146 146 +42 848 842 +43 443 445 +165 18 18 +71 156 160 +31 85 85 +22 1 1 +216 54 54 +49 81 81 +29 88 88 +76 1 1 +24 118 121 +56 440 443 +71 203 201 +141 158 158 +42 300 295 +49 54 54 +44 70 70 +68 95 95 +164 119 115 +102 1 1 +41 5 5 +222 293 292 +32 351 357 +8 1 1 +20 0 2 +33 1 1 +19 750 754 +14 1 1 +27 5945 5973 +25 99 101 +314 59 59 +154 66 66 +111 335 334 +73 37 37 +237 2936 2939 +67 2 281 +5 945 951 +31 186 186 +35 83 83 +32 1150 1152 +73 264 264 +40 5275 5268 +42 1261 1260 +30 617 617 +38 154 154 +90 629 630 +70 1 1 +17 266 266 +80 1 1 +20 1 1 +16 618 618 +30 187 187 +35 273 270 +34 140 140 +29 208 208 +41 3582 3576 +40 1 4 +7 315 318 +32 885 885 +60 996 996 +30 512 512 +36 309 309 +101 1152 1153 +34 1316 1316 +34 169 169 +29 890 889 +40 2610 2609 +57 63 63 +53 98 98 +33 612 612 +29 + +chain 576079 9 141213431 + 40053014 40098105 chr9 138394717 - 99345032 99390394 1609 +42 315 315 +30 232 232 +74 103 103 +76 0 1 +26 925 922 +89 185 185 +30 503 499 +45 542 541 +56 1 1 +21 286 286 +23 0 1 +53 65 65 +62 98 98 +31 92 92 +33 119 119 +77 52 52 +68 256 256 +2 1 1 +26 209 209 +128 278 278 +120 73 73 +115 121 120 +138 110 110 +48 68 68 +38 15 15 +31 327 326 +58 267 267 +34 65 65 +75 1 1 +37 1 1 +108 1 1 +66 1 1 +47 54 54 +115 191 191 +37 140 140 +28 64 64 +251 54 54 +177 101 101 +122 58 58 +16 12 0 +58 1 1 +192 1 1 +36 1 1 +331 53 53 +12 0 2 +52 3 0 +7 459 462 +112 158 158 +69 1019 1019 +78 324 319 +51 278 277 +81 45 45 +437 1 0 +229 9 9 +73 40 56 +373 24 24 +730 1 1 +30 1 1 +79 203 203 +59 1113 1113 +32 1097 1099 +26 0 4 +122 54 54 +42 4 0 +6 18 6 +29 135 134 +76 613 604 +90 0 3 +6 1 1 +1 389 390 +50 1 1 +37 1254 1252 +1 2 0 +102 146 146 +42 284 284 +34 1 1 +57 470 466 +43 349 349 +1 0 1 +348 156 160 +31 108 108 +216 54 54 +49 198 198 +53 167 169 +56 440 443 +71 203 201 +37 7 7 +97 158 158 +42 403 398 +44 70 70 +68 95 95 +211 72 68 +102 47 47 +222 293 292 +32 9517 9543 +40 7515 7799 +54 89 89 +27 169 165 +42 754 750 +39 336 336 +128 276 280 +111 725 725 +42 + +chain 559194 9 141213431 + 46439665 46445702 chr4 190214555 + 87347116 87353144 7202 +378 33 33 +1315 10 2 +2105 1 0 +2025 35 35 +135 + +chain 515476 9 141213431 + 45865521 45944233 chr9 138394717 + 66307394 66386789 898 +629 33 49 +423 39 39 +577 25 25 +832 35 35 +673 4 0 +1499 11 11 +352 144 147 +145 30 30 +300 9100 9459 +28 2175 2158 +42 2596 2596 +87 4053 4042 +105 9937 9958 +42 26840 26805 +40 17878 18229 +38 + +chain 500106 9 141213431 + 45932956 45947839 chr9 138394717 + 62249750 62264934 700 +47 0 5 +386 48 48 +76 59 59 +131 194 194 +32 6 6 +6 74 74 +28 141 141 +20 6 6 +35 52 52 +32 123 123 +40 65 65 +69 437 437 +71 54 54 +109 195 195 +46 0 1 +112 94 96 +88 1263 1263 +79 644 967 +36 318 318 +6 49 49 +32 151 151 +25 147 147 +26 449 448 +47 95 95 +29 269 269 +131 469 469 +168 51 51 +47 252 252 +30 550 550 +85 58 58 +36 8 3 +32 77 77 +119 116 116 +40 542 541 +27 74 74 +50 107 102 +54 256 256 +39 120 120 +43 25 25 +108 64 64 +52 814 816 +54 71 71 +461 30 30 +372 23 23 +170 1 0 +125 20 0 +1110 2 0 +53 0 1 +173 1 0 +448 91 91 +51 350 353 +92 + +chain 330269 9 141213431 + 45889297 45950067 chr21 46709983 - 36651269 36713106 618 +56 268 267 +58 773 769 +53 842 913 +28 1700 1699 +263 64 64 +77 715 714 +48 372 372 +49 167 167 +38 934 875 +34 254 248 +40 548 548 +38 109 111 +27 250 254 +28 406 406 +78 22 22 +68 11627 11921 +48 24 24 +4 7695 7686 +44 8201 8171 +29 941 941 +32 7354 7531 +194 44 44 +74 28 28 +51 10 9 +80 61 61 +52 32 31 +123 40 39 +65 69 69 +237 18 18 +182 71 71 +54 109 104 +135 0 1 +60 158 159 +87 95 96 +226 17 17 +429 20 20 +89 22 22 +460 79 78 +131 1 2 +57 2 332 +453 36 36 +318 87 87 +78 98 94 +147 26 26 +210 4 4 +64 11 11 +61 29 28 +70 47 47 +95 29 29 +115 0 1 +154 131 131 +469 168 168 +51 47 47 +120 1 0 +131 30 31 +291 14 14 +245 85 85 +58 76 76 +76 120 119 +116 40 40 +126 14 14 +80 23 23 +236 1 0 +62 27 27 +74 51 46 +106 54 54 +256 39 33 +120 176 181 +64 52 53 +378 0 1 +241 12 9 +183 3114 3121 +91 51 51 +188 11 11 +94 149 145 +302 1 1 +88 1 1 +113 1 1 +46 5 5 +111 1 1 +74 2 0 +39 1 1 +505 1 1 +23 1 1 +89 1 1 +28 1 1 +172 1 1 +25 1 1 +50 1 1 +66 1 1 +87 12 12 +71 0 319 +108 2 0 +72 1 1 +27 1 1 +96 + +chain 179323 9 141213431 + 41193214 41195128 chr9 138394717 + 66802464 66804376 717770 +113 0 2 +1461 4 0 +336 + +chain 134392 9 141213431 + 46266430 47167014 chr9 138394717 - 76413978 76841349 211 +689 708 708 +42 200 200 +72 289 289 +92 97 97 +45 891 895 +79 358 358 +17 1 1 +40 338 338 +43 79 79 +80 787 787 +45 1064 1062 +50 203 203 +50 397 397 +51 376 376 +45 155 155 +35 461 461 +104 466 466 +33 362 362 +49 2116 2120 +48 4549 4638 +66 343 343 +65 224 224 +63 303 303 +67 226 226 +77 525 525 +99 137 137 +35 654 670 +70 205 205 +17 2 0 +19 1034 1034 +34 374 373 +37 372 372 +48 63 63 +37 1961 1955 +32 1 1 +31 264 265 +29 90 90 +27 1196 1198 +48 2823 2821 +36 747 756 +84 52 52 +89 165 165 +46 331 331 +57 169 169 +31 267 267 +88 1 1 +26 0 1 +23 206 205 +28 221 221 +32 105 105 +150 336 336 +39 6 35 +62 73 73 +249 86 85 +96 50 50 +139 627 626 +42 494 494 +33 388 388 +38 1535 1537 +27 1276 1276 +37 104 104 +54 3738 3726 +40 5239 5243 +41 5050 5038 +34 73 73 +36 124 124 +112 4144 4157 +30 2904 2908 +45 1275 1280 +34 80 80 +23 1 1 +16 895 916 +36 305 305 +64 148 148 +60 553 556 +42 154 154 +35 63 63 +80 0 1 +212 1 1 +40 1 1 +1095 1 0 +700 16 16 +608 1 0 +2236 2 6 +205 9 9 +833 0 1 +128 24 14 +586 15 15 +396 1 1 +48 1 1 +155 290 290 +50 8169 8175 +26 2554 2875 +28 5736 5731 +47 14007 14354 +25 1405 1405 +27 23122 24282 +106 175 175 +31 5392 5382 +34 941 942 +47 1791 1791 +57 3074 3074 +33 5410 5396 +38 702 702 +37 9729 9731 +30 4618 4619 +40 271 271 +44 750 750 +50 355 355 +25 173 173 +47 2936 2936 +39 3 0 +17 7164 7164 +45 11138 4984 +33 3409 3416 +46 4153 4153 +42 709164 240147 +94 3161 3145 +76 713 713 +28 + +chain 120040 9 141213431 + 44647969 44676393 chr9 138394717 + 66798500 66826910 420 +64 53 53 +41 202 202 +39 212 212 +88 190 190 +39 2246 2246 +43 788 774 +86 0 2 +4 959 959 +48 1479 1475 +187 58 58 +54 1984 1984 +44 526 528 +52 584 587 +35 186 186 +31 750 751 +52 0 2 +11 75 75 +59 1419 1419 +25 5270 5268 +56 1514 1514 +35 337 337 +40 240 240 +11 133 135 +53 1367 1367 +38 399 399 +28 1854 1854 +63 249 249 +59 101 101 +41 3500 3504 +2 10 0 +311 + +chain 115373 9 141213431 + 45625620 47174080 chr9 138394717 - 70569035 70786798 338 +35 486 486 +27 2917 2924 +39 20692 17911 +35 2067 2064 +25 8370 8679 +35 3008 3010 +30 9279 9272 +43 11783 11788 +42 13190 13184 +27 4041 4042 +34 3565 3561 +33 39 39 +46 1128 1133 +29 1736 1736 +64 427 426 +61 980 979 +40 77 77 +34 471 491 +28 3072 3056 +26 136 136 +39 682 680 +48 1343 1343 +44 140 140 +48 95 95 +27 77 77 +329 293 293 +40 74 74 +40 155 155 +159 600 600 +25 698 698 +29 753 751 +41 497 497 +28 785 785 +42 685 685 +42 818 819 +51 537 533 +28 1214 1214 +51 466 466 +45 801 807 +26 420 420 +94 244 246 +42 231 231 +52 146 146 +104 15 15 +205 106 106 +46 187 193 +1617 0 1383 +57 1 9 +75 91 91 +135 51 51 +132 12 12 +253 254 248 +45 239 239 +39 61 61 +49 68 68 +35 241 241 +101 107 110 +30 265 265 +32 350 350 +43 119 119 +90 140 140 +94 191 191 +69 60 60 +123 427 409 +31 246 246 +38 1691 1693 +77 51 51 +47 222 222 +28 0 4 +30 504 504 +47 452 452 +65 102 102 +25 797 797 +32 56 56 +41 113 117 +36 325 313 +52 169 169 +28 303 301 +63 188 188 +60 77 91 +47 758 757 +52 572 572 +83 54 0 +53 237 236 +36 919 924 +65 182 182 +45 559 559 +47 97 97 +66 262 262 +28 639 639 +50 977 977 +29 864 864 +96 447 447 +93 376 382 +30 1859 1860 +55 5554 5557 +17 6 7 +23 650 650 +47 2301 2303 +31 3716 4037 +58 888 883 +33 3197 3217 +39 223 223 +38 335 334 +31 1012 1027 +75 1714 1714 +48 6465 6465 +43 1897 1897 +91 244 244 +33 757 757 +46 1110 1111 +26 10383 3042 +36 153 153 +46 439 439 +51 15 18 +109 143 143 +67 302 302 +38 230 230 +36 441 441 +39 946 946 +52 159 159 +136 1864 1868 +31 3563 3562 +53 182 183 +157 335 335 +51 1480 1486 +27 1366979 44368 +25 843 832 +45 274 274 +14 1 1 +48 88 88 +46 211 211 +58 1 1 +26 1 1 +208 471 471 +50 281 281 +47 371 370 +28 490 514 +45 97 97 +36 346 346 +69 1 1 +27 1 1 +48 876 876 +88 87 87 +80 253 253 +38 69 69 +28 + +chain 98331 9 141213431 + 40025645 40041983 chr9 138394717 - 99317720 99333962 2598 +47 223 223 +41 255 255 +27 6 6 +8 197 197 +30 2283 2295 +38 110 111 +40 4687 4689 +40 105 105 +57 298 298 +43 11 16 +16 149 156 +45 370 370 +46 113 113 +26 25 25 +86 66 66 +24 2370 2372 +37 240 240 +50 2179 2180 +41 1 1 +8 337 335 +62 93 96 +68 141 11 +15 1 0 +6 1 5 +11 1101 1101 +64 + +chain 84885 9 141213431 + 45563858 67844277 chr9 138394717 - 74813765 76590621 154 +225 71 71 +67 43 43 +116 82 82 +68 71 71 +297 249 252 +241 54 54 +90 6 6 +99 95 95 +328 24 25 +105 37 32 +120 9 9 +79 14 14 +113 106 105 +55 33 33 +55 23 24 +273 1 1 +46 1 1 +52 17 17 +125 1 1 +34 0 1 +107 10 10 +112 1 1 +114 1 1 +61 1 1 +22 1 1 +95 1 1 +75 1 1 +97 0 1 +145 0 8 +28 2 1 +125 1 1 +116 38 38 +542 1 0 +176 16 16 +238 23 23 +187 10 10 +289 15 15 +63 30 30 +427 9 9 +103 11 11 +64 10 10 +103 6 6 +133 30 30 +187 52 52 +53 58 58 +101 8 40 +156 51 51 +639 32 32 +200 133 133 +84 78 76 +60 30 30 +170 92 92 +237 50 50 +168 58 59 +366 34 34 +1048 79 103 +771 1 3 +74 1 0 +218 1 1 +45 1 1 +740 1 1 +20 1 1 +1765 1 1 +34 2 2 +288 0 1 +91 1 1 +87 8 0 +26 14 56 +31 2 0 +44 0 2 +6 2 0 +5 15 1 +312 12 12 +576 2 0 +349 1 1 +31 1 1 +126 0 2 +354 1 1 +80 3 3 +111 1 1 +121 1 1 +700 9 9 +51 5 5 +650 0 3 +104 1 1 +791 1 1 +43 1 1 +324 4 4 +215 1 1 +26 0 6 +16 1 1 +51 1 1 +80 1 1 +128 24 24 +129 1 1 +30 1 1 +259 50 50 +84 8 8 +172 66 66 +585 123 122 +136 51 51 +86 25 27 +91 43 43 +65 66 65 +52 49 49 +58 26 26 +62 32 32 +77 126 121 +313 27 27 +476 1 0 +87 81 81 +59 33 33 +157 91 91 +46 0 4 +62 171 174 +76 26 26 +77 11 10 +168 21926928 1415500 +1030 29 29 +681 17950 17940 +45 791 789 +43 2276 2276 +39 5023 5027 +40 3325 3325 +49 13457 13457 +39 6821 6821 +91 1903 1903 +36 728 728 +129 2545 2545 +49 25970 25970 +46 357 357 +51 1962 1962 +56 68 68 +38 72 72 +44 6541 6538 +71 5171 5177 +73 1064 1064 +55 26164 26159 +470 1 0 +5 16173 16173 +334 3969 3969 +71 573 573 +56 1938 2839 +78 6193 6566 +60 4614 3440 +80 1676 1675 +44 1349 1332 +59 4270 4262 +58 903 903 +48 2124 2165 +97 783 783 +46 1397 1392 +109 4363 4410 +34 933 945 +39 1031 1031 +34 892 893 +37 1038 1039 +45 1291 1290 +56 5789 5788 +64 31 31 +43 504 521 +47 28 28 +8 156 156 +57 2305 2312 +39 211 211 +51 176 176 +51 797 798 +51 757 758 +53 1417 1413 +38 1795 1791 +47 2000 2007 +37 0 1 +38 5234 5244 +41 3820 3819 +33 1441 1454 +97 1229 1229 +73 313 313 +108 166 166 +49 0 1 +70 4345 4343 +38 720 720 +42 5 1 +1 349 349 +97 159 159 +52 737 737 +41 648 648 +36 230 230 +38 302 302 +67 762 762 +44 153 153 +36 62 62 +51 290 7627 +50 3726 3726 +46 757 757 +33 244 244 +91 1897 1897 +43 2594 2595 +51 153 153 +47 346 667 +121 96 96 +50 4769 4768 +57 1 1 +21 1381 1373 +45 223 223 +39 828 828 +54 2335 2340 +33 3593 3592 +298 0 17 +18 6676 6678 +42 360 360 +91 4832 4830 +123 495 493 +48 116 116 +38 1716 1716 +50 1092 1092 +42 564 564 +45 182 182 +65 924 938 +88 184 187 +136 572 572 +53 432 432 +48 276 276 +47 81 79 +8 1 3 +35 1293 1295 +41 1012 1012 +65 66 66 +41 345 345 +60 18 18 +15 458 468 +54 328 328 +77 596 596 +69 230 230 +36 762 762 +38 70 70 +83 93 93 +38 402 402 +99 84 84 +92 177 177 +85 143 143 +42 97 97 +108 72 72 +70 153 153 +58 296 296 +204 278 278 +35 68 68 +49 61 61 +39 77 77 +36 126 126 +75 218 218 +1405 71 51 +2420 4 0 +49 59 59 +46 106 106 +206 52 52 +90 102 102 +40 551 551 +59 919 919 +41 2 0 +19 307 307 +45 466 466 +51 1214 1214 +58 516 516 +38 818 814 +34 694 693 +42 208 208 +45 1057 1057 +41 694 694 +105 1304 1304 +159 155 155 +40 74 74 +82 251 251 +62 91 91 +176 387 387 +44 201 201 +33 1661 1661 +39 3253 3258 +169 490 482 +35 73 73 +81 338 338 +37 4016 4016 +118 3279 3279 +36 1656 1656 +77 549 549 +67 19613 19526 +40 3081 3077 +44 + +chain 82118 9 141213431 + 41195143 41196057 chr9 138394717 + 66804391 66805305 1800753 +477 27 27 +410 + +chain 78483 9 141213431 + 39866462 39974769 chr9 138394717 - 71383958 71475008 528 +26 2557 2570 +46 2157 2156 +49 12174 11856 +39 3657 3674 +47 7466 7464 +73 1787 1784 +115 7338 7455 +32 2362 2362 +29 394 391 +48 262 262 +21 13 13 +16 164 166 +45 223 223 +30 285 285 +34 29352 29393 +46 37027 19907 +48 47 47 +298 + +chain 52126 9 141213431 + 40107857 40170033 chr9 138394717 - 99400139 99461976 634 +60 1538 1538 +36 1562 1563 +34 1316 1316 +65 138 138 +29 3557 3556 +39 4320 4319 +40 2803 2776 +40 14106 13761 +39 15211 15216 +28 1 0 +46 1456 1456 +40 747 747 +38 14850 14880 +37 + +chain 49404 9 141213431 + 70318740 70319322 chr9 138394717 - 75298967 75299548 130103 +157 1 0 +123 36 36 +123 49 49 +93 + +chain 43105 9 141213431 + 68782156 68782932 chr2 242193529 - 207617024 207617800 3714579 +379 302 302 +95 + +chain 33874 9 141213431 + 41590159 41590518 chr9 138394717 + 39445141 39445500 5515 +359 + +chain 33163 9 141213431 + 41196116 41205120 chr9 138394717 - 96078406 96089071 3904 +56 70 73 +103 1 21 +89 5616 5652 +30 2501 4105 +40 455 455 +4 2 0 +37 + +chain 32657 9 141213431 + 70729909 70734011 chr9 138394717 + 40189684 40193786 88891 +39 551 551 +47 147 147 +30 179 179 +35 852 852 +39 1017 1016 +73 262 263 +60 732 732 +39 + +chain 31552 9 141213431 + 68769734 68831149 chr9 138394717 - 69998059 70059128 469 +44 613 613 +40 8459 8456 +42 1937 1937 +57 2630 1847 +41 8391 8338 +38 834 835 +37 1 1 +27 618 618 +42 3601 3592 +36 2118 2485 +44 822 820 +36 3105 3106 +52 4747 4750 +39 2064 2078 +28 165 143 +28 131 131 +1 0 13 +65 75 74 +24 1 1 +13 2277 2272 +108 3706 3702 +38 4186 4185 +27 3858 3826 +99 3078 3249 +40 1359 1358 +27 1539 1539 +27 + +chain 30327 9 141213431 + 45892225 45895763 chr9 138394717 + 41422949 41426499 71461 +34 1816 1816 +61 1334 1334 +58 60 60 +58 63 75 +54 + +chain 27647 9 141213431 + 41127267 41143214 chr9 138394717 + 66807920 66823851 2844 +52 584 587 +35 187 186 +40 741 742 +52 0 1 +12 75 75 +59 1419 1419 +25 12617 12597 +49 + +chain 26981 9 141213431 + 45896054 45898802 chr9 138394717 + 41426790 41429538 70598 +36 295 295 +79 1600 1600 +27 62 62 +94 499 499 +56 + +chain 25798 9 141213431 + 45771185 45811756 chr9 138394717 + 61899954 61940860 525 +29 16633 16958 +58 443 443 +88 974 969 +46 4357 4358 +40 17874 17888 +29 + +chain 21257 9 141213431 + 70731624 70733746 chr9 138394717 + 42820689 42822812 2489 +80 124 124 +31 154 154 +30 1064 1066 +73 540 539 +26 + +chain 21144 9 141213431 + 40099366 40102046 chr9 138394717 - 99391654 99394333 209877 +30 622 622 +33 219 219 +25 983 984 +80 27 25 +13 618 618 +30 + +chain 20677 9 141213431 + 70734505 70734887 chr9 138394717 + 40194282 40194664 1197359 +132 163 163 +87 + +chain 12979 9 141213431 + 43406484 43406619 chr3 198295559 - 21471166 21471301 14256286 +135 + +chain 12327 9 141213431 + 40936629 40940011 chr9 138394717 - 71638414 71641783 545 +58 191 191 +65 175 175 +44 69 69 +36 163 163 +34 677 677 +43 387 387 +8 0 1 +34 157 157 +9 28 14 +99 266 266 +134 159 159 +62 109 109 +118 85 85 +172 + +chain 11381 9 141213431 + 68748832 68751661 chr2 242193529 - 128779357 128782133 93371 +48 1150 1149 +62 1543 1491 +26 + +chain 11312 9 141213431 + 68782655 68782775 chr11 135086622 + 134089812 134089932 13760268 +120 + +chain 10887 9 141213431 + 45870653 45870770 chr9 138394717 + 41401385 41401502 107633 +117 + +chain 10316 9 141213431 + 39884790 39908578 chr9 138394717 + 42183474 42207359 758 +33 1639 1644 +26 2579 2567 +48 3199 3199 +30 16198 16302 +31 1 1 +4 + +chain 10002 9 141213431 + 45933389 45933572 chr9 138394717 + 41464114 41464297 64627 +48 76 76 +59 + +chain 9859 9 141213431 + 45938178 45938987 chr9 138394717 + 41468904 41469713 62138 +49 125 125 +27 579 579 +29 + +chain 9744 9 141213431 + 39886849 39887993 chr9 138394717 + 39357601 39358745 66780 +50 1042 1042 +52 + +chain 9012 9 141213431 + 45604750 46362650 chr9 138394717 + 62308900 65573429 414 +67 23388 23317 +50 98540 3050543 +30 2529 3917 +91 4898 4904 +67 626055 179355 +58 318 318 +66 252 251 +31 928 932 +35 414 414 +83 + +chain 8286 9 141213431 + 45943078 45944757 chr9 138394717 + 41473804 41475483 92934 +25 1130 1130 +33 461 461 +30 + +chain 8225 9 141213431 + 45881119 45881207 chr9 138394717 + 41411844 41411932 63771 +88 + +chain 8068 9 141213431 + 40106481 40106625 chr9 138394717 - 99398756 99398904 10393460 +31 107 111 +6 + +chain 7877 9 141213431 + 68790244 68838929 chr2 242193529 - 128631662 128680847 1366 +23 172 180 +3 368 372 +54 16221 16654 +48 604 603 +181 24121 24182 +31 5889 5882 +25 663 665 +49 182 182 +51 + +chain 7729 9 141213431 + 70319563 70319990 chr9 138394717 + 65175216 65175643 60144 +40 345 345 +42 + +chain 7655 9 141213431 + 39871832 39872071 chr9 138394717 + 39342581 39342820 3084 +46 158 158 +35 + +chain 6881 9 141213431 + 68666836 68666977 chr10 133797422 - 71208690 71208831 9920788 +41 69 69 +31 + +chain 6779 9 141213431 + 40051665 40051744 chr9 138394717 - 99343678 99343757 1503893 +79 + +chain 6716 9 141213431 + 46457985 46458061 chr9 138394717 - 76026911 76026987 5953 +76 + +chain 6428 9 141213431 + 68737501 68738428 chr11 135086622 - 74646166 74647093 814219 +51 803 803 +73 + +chain 6416 9 141213431 + 41111164 41111231 chr14 107043718 + 78362173 78362240 5316665 +67 + +chain 6291 9 141213431 + 45908909 45938410 chr9 138394717 - 74772543 74802086 1761 +27 29401 29447 +15 27 23 +31 + +chain 5542 9 141213431 + 40921078 40923141 chr9 138394717 + 39605101 39607179 130882 +14 1 17 +15 2004 2003 +29 + +chain 5433 9 141213431 + 41196172 41196242 chr9 138394717 - 98835112 98835182 5716333 +70 + +chain 5431 9 141213431 + 45866150 45867247 chr9 138394717 + 41396882 41397979 174698 +33 1039 1039 +25 + +chain 5383 9 141213431 + 41011973 41012033 chr5 181538259 - 129040250 129040310 15127060 +6 1 1 +53 + +chain 5360 9 141213431 + 45947690 45947747 chr9 138394717 + 41478421 41478478 79857 +57 + +chain 5290 9 141213431 + 68699372 68735915 chr9 138394717 - 74507854 74544525 1583 +49 36445 36573 +49 + +chain 5139 9 141213431 + 41196062 41196116 chr9 138394717 + 66805310 66805364 27968540 +54 + +chain 5059 9 141213431 + 43925970 43926039 chr9 138394717 - 99326433 99326503 636141 +7 11 12 +51 + +chain 4647 9 141213431 + 45706194 45706294 chr3 198295559 + 82914679 82914779 18160666 +100 + +chain 4609 9 141213431 + 44641302 44641350 chr3 198295559 - 112398262 112398310 5690176 +48 + +chain 4578 9 141213431 + 39624369 39624420 chr9 138394717 - 71642140 71642191 972 +51 + +chain 4397 9 141213431 + 45908251 45908298 chr9 138394717 + 41438996 41439043 67499 +47 + +chain 4123 9 141213431 + 41254748 41317599 chr9 138394717 - 77404476 77470548 602 +31 60916 64139 +138 1 0 +18 1721 1720 +26 + +chain 4087 9 141213431 + 39896494 39896540 chr9 138394717 + 61201555 61201601 2708 +46 + +chain 3963 9 141213431 + 45926235 45926277 chr9 138394717 + 41456965 41457007 59497 +42 + +chain 3920 9 141213431 + 68782535 68782595 chr4 190214555 - 64284822 64284882 8478587 +60 + +chain 3864 9 141213431 + 70729061 70729102 chr9 138394717 + 40188839 40188880 102598 +41 + +chain 3851 9 141213431 + 45729580 45729620 chr20 64444167 - 38584219 38584259 39516201 +40 + +chain 3802 9 141213431 + 41053897 41053937 chr9 138394717 + 12107332 12107372 10365350 +40 + +chain 3699 9 141213431 + 68737339 68737443 chr8 145138636 - 84377951 84378055 2143662 +5 4 4 +19 50 50 +26 + +chain 3676 9 141213431 + 41202287 41202336 chr9 138394717 - 98841263 98841312 3535 +49 + +chain 3372 9 141213431 + 70319021 70319057 chr9 138394717 + 64669480 64669516 522831 +36 + +chain 3342 9 141213431 + 42743592 42743629 chr9 138394717 - 73619375 73619412 3900 +37 + +chain 3283 9 141213431 + 39896939 39896974 chr9 138394717 + 39367659 39367694 87787 +35 + +chain 3071 9 141213431 + 45922298 45922331 chr9 138394717 + 41453028 41453061 66548 +33 + +chain 3049 9 141213431 + 46445533 46445566 chr11 135086622 - 39650236 39650269 7384 +33 + +chain 2992 9 141213431 + 68837716 68837759 chr9 138394717 + 102389 102432 1404 +43 + +chain 2983 9 141213431 + 40215097 40215344 chr3 198295559 + 131274641 131274888 3447822 +160 13 13 +74 + +chain 2975 9 141213431 + 68782775 68782837 chr19 58617616 + 54971445 54971507 4712100 +62 + +chain 2974 9 141213431 + 70319180 70320044 chr9 138394717 + 43160565 43161430 3654 +49 93 93 +241 40 40 +112 0 1 +233 42 42 +54 + +chain 2955 9 141213431 + 46440043 46440075 chr7 159345973 + 111243886 111243918 7576 +7 1 1 +24 + +chain 2945 9 141213431 + 40122405 40122450 chr22 50818468 + 39211770 39211815 14664335 +45 + +chain 2904 9 141213431 + 40104327 40104380 chr9 138394717 - 99396604 99396657 6507653 +53 + +chain 2853 9 141213431 + 40923470 40923501 chr9 138394717 + 39607508 39607539 74050 +31 + +chain 2853 9 141213431 + 40052371 40052413 chr9 138394717 - 99344389 99344431 5350243 +42 + +chain 2786 9 141213431 + 40106940 40106972 chr9 138394717 - 99399222 99399254 5570617 +32 + +chain 2724 9 141213431 + 45701826 45702923 chr21 46709983 - 36847093 36848184 740 +33 1034 1028 +30 + +chain 2637 9 141213431 + 45890004 45897102 chr9 138394717 - 74753648 74760711 4578 +65 70 70 +68 533 575 +83 7 7 +32 513 513 +38 764 764 +48 1113 1112 +64 438 438 +73 545 545 +76 129 129 +46 440 442 +181 77 77 +63 58 58 +60 175 101 +39 981 977 +42 229 229 +48 + +chain 2559 9 141213431 + 68736902 68736954 chr14 107043718 - 5771875 5771927 940409 +52 + +chain 2519 9 141213431 + 41195620 41195647 chr9 138394717 - 98834560 98834587 10265798 +27 + +chain 2420 9 141213431 + 68782595 68782636 chr18 80373285 + 45531143 45531184 13957496 +41 + +chain 2373 9 141213431 + 43904867 43904907 chr9 138394717 - 99305338 99305378 25743130 +40 + +chain 2367 9 141213431 + 43903359 43903389 chr9 138394717 - 99303830 99303860 2801974 +30 + +chain 2361 9 141213431 + 40920941 40920968 chr9 138394717 - 75657276 75657303 58052 +27 + +chain 2358 9 141213431 + 43929491 43929517 chr9 138394717 - 99329957 99329983 276710 +26 + +chain 2321 9 141213431 + 39651271 39651297 chr9 138394717 + 42407907 42407933 1145980 +26 + +chain 2287 9 141213431 + 40122584 40122613 chr2 242193529 - 34099088 34099117 8043299 +29 + +chain 2174 9 141213431 + 45743281 45743304 chr8 145138636 + 118292512 118292535 33222540 +23 + +chain 2100 9 141213431 + 45745469 45781614 chr9 138394717 - 72811449 72847410 983 +60 19502 19401 +38 66 66 +41 1 1 +2 772 772 +17 2 2 +42 264 264 +47 13662 13581 +42 426 425 +62 459 459 +39 182 182 +44 319 318 +56 + +chain 2060 9 141213431 + 45648071 45648099 chr9 138394717 - 74077261 74077289 2085 +28 + +chain 1950 9 141213431 + 45705675 45705718 chr9 138394717 + 65311563 65311606 3596076 +43 + +chain 1920 9 141213431 + 43914469 43914493 chr9 138394717 - 99314909 99314933 1162346 +24 + +chain 1657 9 141213431 + 45705423 45705462 chr4 190214555 - 70327606 70327641 3181584 +10 4 0 +25 + +chain 1429 9 141213431 + 43454331 43455453 chr2 242193529 + 88017635 88018748 2807288 +26 1069 1060 +27 + +chain 1209 9 141213431 + 45705819 45705862 chrX 156040895 + 51290449 51290492 13147833 +43 + +chain 1157 9 141213431 + 45870942 45870972 chr9_KI270719v1_random 176845 - 129630 129660 6110 +30 + +chain 1110 9 141213431 + 45866606 45866645 chr21 46709983 - 36628860 36628899 41223 +39 + +chain 1066 9 141213431 + 68737030 68737059 chr16 90338345 - 27212879 27212908 2334288 +29 + +chain 879 9 141213431 + 40306793 40306840 chr9 138394717 + 67262850 67262897 1056 +47 + +chain 840 9 141213431 + 43444852 43462488 chr9 138394717 + 62729226 62747202 719 +58 17551 17891 +27 + +chain 760 9 141213431 + 39957480 39957522 chr20 64444167 - 52018253 52018295 29628032 +42 + +chain 667 9 141213431 + 40215344 40215407 chr18 80373285 + 837353 837416 3981026 +63 + +chain 603 9 141213431 + 66392143 66392231 chr9 138394717 - 98088644 98088732 2056903 +88 + +chain 587 9 141213431 + 40369087 40369118 chr17 83257441 + 15506084 15506115 18139865 +31 + +chain 349 9 141213431 + 40368840 40368876 chr15 101991189 - 23744819 23744855 31636601 +36 + +chain 8504653 GL000198.1 90085 + 0 90085 chr20 64444167 + 28958246 29048331 810 +90085 + +chain 16038197 GL000199.1 169874 + 0 169874 chr9 138394717 + 60518558 60688432 417 +169874 + +chain 17668251 GL000200.1 187035 + 0 187035 chr9 138394717 - 95875427 96062649 357 +38949 0 176 +45847 1 0 +46124 1 0 +3889 0 1 +44544 13 13 +76 1 1 +31 0 1 +321 1 1 +105 1 1 +44 0 12 +382 1 1 +20 1 1 +618 1 0 +1377 1 1 +20 1 1 +2267 1 1 +37 1 1 +82 1 0 +87 1 1 +211 1 3 +991 1 1 +46 1 1 +189 1 1 +25 1 1 +634 1 0 +86 + +chain 3444150 GL000201.1 36148 + 21 36015 chr9 138394717 + 133551813 133588624 1455 +10885 0 46 +10 2 0 +18 9 0 +37 1 0 +6 8 9 +1035 65 846 +10343 0 1 +4062 8 8 +8838 7 7 +169 1 1 +23 1 1 +117 10 10 +339 + +chain 15737781 GL000211.1 166566 + 0 166566 chr9 138394717 + 63968447 64135013 432 +166566 + +chain 17750502 GL000212.1 186858 + 0 186858 chr13 114364328 + 18171248 18358106 355 +186858 + +chain 15550342 GL000213.1 164239 + 0 164239 chrUn_GL000213v1 164239 + 0 164239 441 +164239 + +chain 13046976 GL000214.1 137718 + 0 137718 chrUn_GL000214v1 137718 + 0 137718 550 +137718 + +chain 16253498 GL000215.1 172545 + 0 172526 chr21 46709983 + 13655780 13828234 401 +3283 0 4 +29034 1 0 +5104 4 0 +10299 0 8 +14263 11 11 +94 6 0 +113 107 1 +75 1 1 +91 1 1 +24 1 1 +6681 0 33 +8622 2 0 +2262 1 0 +586 0 1 +8540 1 0 +12525 1 1 +36 1 1 +25408 0 12 +3782 0 2 +694 85 67 +996 1 3 +1425 12 12 +1827 1 1 +21 1 1 +941 13 13 +2073 0 8 +28 1 1 +506 0 2 +1227 1 0 +1108 2 2 +28 1 1 +396 1 0 +253 14 14 +184 1 1 +49 1 1 +2962 1 1 +45 4 0 +1510 19 19 +3802 0 4 +836 1 0 +1871 0 1 +579 4 0 +60 14 14 +2466 27 27 +1450 1 0 +19 1 1 +618 6 6 +2880 1 0 +450 0 2 +27 0 4 +4576 1 1 +20 1 1 +789 0 1 +721 14 14 +1432 4 0 +1418 1 1 +18 1 1 +73 12 12 +195 1 1 +35 1 1 +708 + +chain 7980 GL000215.1 172545 + 131654 131739 chr21 46709983 + 6922311 6922370 541 +32 26 0 +27 + +chain 16329625 GL000216.1 172294 + 0 172294 chrUn_GL000216v2 176608 + 4314 176608 399 +172294 + +chain 16247940 GL000217.1 172149 + 0 172149 chr22 50818468 - 40136319 40308468 402 +172149 + +chain 15268007 GL000218.1 161147 + 0 161147 chrUn_GL000218v1 161147 + 0 161147 466 +161147 + +chain 16951499 GL000219.1 179198 + 0 179198 chrUn_GL000219v1 179198 + 0 179198 381 +179198 + +chain 15429735 GL000220.1 161802 + 0 161802 chrUn_GL000220v1 161802 + 0 161802 451 +161802 + +chain 14681469 GL000221.1 155397 + 0 155397 chr3_GL000221v1_random 155397 + 0 155397 489 +155397 + +chain 17482521 GL000222.1 186861 + 0 186861 chr3 198295559 - 122541993 122728768 364 +1250 0 4 +3271 1 1 +48 1 1 +748 1 1 +29 1 1 +336 0 1 +397 14 15 +315 1 1 +47 1 1 +76 1 1 +49 1 1 +1417 5 0 +399 2 1 +112 1 1 +20 1 1 +667 0 3 +1357 1 1 +24 1 1 +409 1 0 +9 1 1 +173 0 1 +36 1 1 +1372 1 0 +369 9 10 +484 0 4 +411 21 25 +242 1 0 +833 14 14 +895 0 9 +1067 0 3 +87 1 1 +33 1 1 +52 1 1 +35 1 1 +564 3 2 +80 9 9 +77 3 0 +126 120 0 +626 1 1 +84 0 5 +30 1 1 +337 0 8 +384 1 1 +30 0 1 +153 0 1 +16 1 1 +52 6 0 +185 1 2 +111 4 4 +54 1 1 +29 1 1 +479 1 0 +23 1 1 +1089 1 1 +21 1 1 +194 1 1 +20 1 0 +1217 0 1 +728 1 0 +497 120 0 +130 1 1 +45 1 1 +364 0 3 +2459 4 4 +883 5 4 +785 14 14 +1180 5 0 +420 1 1 +39 0 4 +13 1 1 +60 16 16 +592 11 14 +246 0 1 +520 1 1 +19 1 1 +843 1 1 +33 1 1 +462 0 9 +24 1 1 +661 3 0 +22 1 1 +3124 1 0 +106 1 1 +40 0 1 +2177 1 1 +39 1 1 +806 0 4 +412 1 0 +317 0 2 +775 0 4 +289 1 1 +22 1 1 +920 1 1 +72 0 5 +58 1 1 +345 1 1 +22 1 1 +302 2 2 +84 1 1 +210 8 8 +98 3 1 +673 1 1 +33 1 1 +299 4 0 +1477 4 4 +475 1 1 +46 1 1 +369 13 13 +60 1 1 +37 1 1 +260 1 0 +274 6 0 +1598 1 1 +28 1 1 +2138 16 16 +793 1 0 +142 1 1 +18 1 0 +1920 0 1 +159 6 0 +864 1 1 +49 1 0 +333 2 0 +1437 1 1 +32 1 1 +243 4 5 +719 0 1 +39 1 1 +861 1 1 +41 1 1 +812 1 1 +46 9 8 +145 1 1 +50 1 1 +552 2 2 +27 0 3 +477 1 1 +41 1 1 +307 1 1 +67 1 1 +283 1 1 +27 1 1 +151 0 1 +21 1 1 +128 1 0 +42 1 1 +415 0 110 +781 2 2 +44 1 1 +176 2 2 +21 1 1 +181 4 0 +813 1 1 +27 1 1 +228 1 1 +36 1 1 +138 12 12 +3038 11 11 +3781 0 1 +1856 0 58 +1813 1 0 +3776 21 0 +1096 8 0 +9578 0 4 +924 0 1 +662 1 0 +942 1 0 +1709 8 8 +167 1 0 +6850 0 6 +58 1 1 +5315 1 1 +22 1 1 +2377 1 0 +3702 1 1 +17 1 1 +1402 1 0 +41 3 0 +10654 0 1 +35 1 1 +3464 0 1 +424 12 12 +6848 13 13 +444 0 5 +1121 0 10 +3015 11 10 +5936 1 1 +45 1 1 +134 1 1 +33 1 1 +913 1 1 +33 1 1 +7377 1 1 +26 1 1 +2213 3 0 +1310 19 16 +1028 1 1 +30 1 1 +1346 0 1 +5987 0 2 +2170 1 0 +5310 0 1 +1031 0 1 +5779 30 0 +4540 + +chain 4695 GL000222.1 186861 + 24563 24635 chr3 198295559 - 122566462 122566534 18113330 +72 + +chain 1361 GL000222.1 186861 + 182291 182321 chr3 198295559 - 122724143 122724173 24772216 +30 + +chain 17090000 GL000223.1 180455 + 8 180455 chr12 133275309 - 169241 349590 375 +1699 1 0 +921 0 1 +476 0 3 +2781 5 0 +2337 0 4 +2044 1 1 +52 1 1 +99 4 0 +3342 10 10 +76207 0 1 +61652 112 0 +5333 2 15 +2060 0 1 +6964 2 2 +29 1 1 +4046 1 1 +74 0 2 +1140 1 1 +45 1 0 +610 2 0 +5062 1 0 +917 0 3 +2412 + +chain 17052128 GL000224.1 179693 + 0 179693 chrUn_GL000224v1 179693 + 0 179693 376 +179693 + +chain 20122422 GL000225.1 211173 + 0 211173 chr14_GL000225v1_random 211173 + 0 211173 297 +211173 + +chain 1418441 GL000226.1 15008 + 0 15008 chrUn_GL000226v1 15008 + 0 15008 2768 +15008 + +chain 11965559 GL000227.1 128374 + 0 128374 chr6 170805979 + 74668 202274 605 +1643 0 1 +255 1 1 +40 1 0 +61 4 4 +343 1 1 +168 1 1 +211 1 1 +18 1 1 +525 0 4 +549 1 1 +22 1 1 +440 16 16 +122 14 17 +167 4 4 +205 4 0 +98 1 1 +164 8 9 +585 0 1 +1278 1 1 +26 1 1 +2038 1 1 +17 1 1 +1741 15 15 +917 1 1 +26 1 1 +1021 0 1 +1314 77 0 +306 0 1 +109 0 153 +152 79 2 +199 153 0 +146 1 1 +49 1 1 +144 385 0 +4558 1 0 +5544 4 3 +2373 1 1 +40 1 0 +14638 6 0 +5386 0 1 +1491 2 0 +1835 20 20 +1481 0 4 +5348 0 1 +135 0 2 +6870 0 1 +1696 0 1 +893 1 1 +47 1 1 +766 1 1 +49 1 1 +542 1 1 +28 2 0 +334 1 1 +31 1 1 +1092 0 1 +803 1 0 +1815 6 0 +25 134 0 +37 79 0 +7668 1 0 +603 1 1 +28 1 1 +1020 0 1 +3033 0 2 +619 7 7 +1434 1 0 +1954 1 0 +9909 1 0 +1155 1 1 +36 1 1 +327 7 7 +133 4 0 +1499 0 2 +96 1 0 +3257 11 0 +46 1 1 +207 1 1 +20 1 1 +2919 18 18 +765 4 4 +1829 0 1 +1864 5 5 +123 15 15 +13751 + +chain 43596 GL000227.1 128374 + 14106 15875 chr5 181538259 - 152812 154201 1011 +45 567 723 +39 7 7 +33 254 178 +32 407 255 +24 308 0 +53 + +chain 26987 GL000227.1 128374 + 15083 15822 chr1 248956422 + 434189 434853 1048 +45 386 311 +143 22 22 +143 + +chain 12711 GL000227.1 128374 + 14996 15149 chr19 58617616 + 140181 140257 989 +55 77 0 +21 + +chain 5337 GL000227.1 128374 + 73853 73996 chr1 248956422 + 10231 10416 24220348 +27 66 108 +50 + +chain 2341 GL000227.1 128374 + 14074 14106 chr1 248956422 + 668466 668498 1089 +32 + +chain 2271 GL000227.1 128374 + 73917 73946 chr15 101991189 - 10029 10058 29787362 +29 + +chain 10535979 GL000228.1 129120 + 0 129120 chr4 190214555 + 189994687 190190858 675 +1288 1 1 +65 1 1 +695 1 1 +24 1 0 +6 1 1 +50 0 312 +260 1 1 +46 1 1 +993 1 0 +2168 1 1 +31 1 1 +3958 0 4 +257 0 18 +9 1 1 +267 3 3 +16 1 1 +1441 0 4 +68 0 1 +1387 0 2 +3469 11 11 +3245 1 0 +777 1 1 +25 1 1 +597 2 0 +30 1 1 +1792 1 1 +34 1 1 +543 0 1 +98 1 1 +25 1 1 +1024 8 0 +4002 0 12 +71 10 11 +1335 0 2 +7908 172 0 +4213 0 1 +4925 0 1 +381 3 3 +46 1 1 +1201 1 1 +25 0 2 +1296 0 1 +526 4 0 +459 1 1 +56 1 1 +2023 2 2 +35 1 1 +1479 0 142 +2019 0 1 +370 8 8 +1586 1 0 +337 0 1 +921 2 0 +84 1 1 +22 1 0 +8 1 2 +206 0 4 +799 1 1 +18 0 1 +223 0 1 +295 1 70 +43 0 1 +72 68 0 +41 1 1 +90 4 4 +1051 1 1 +32 1 1 +182 7 7 +225 3 3 +22 1 1 +1660 0 1 +357 8 8 +101 13 13 +198 7 7 +412 1 0 +4 0 1 +19 1 0 +137 6 7 +361 0 2 +1716 1 0 +511 0 1 +91 0 1 +960 3306 0 +148 0 2 +265 0 1 +205 1 0 +208 5 4 +198 7 8 +122 2 5 +23 1 0 +26 1 1 +54 1 0 +79 1 1 +74 1 1 +563 0 1 +419 25 14 +139 4 0 +811 13 13 +1256 76 76 +256 70 70 +671 5 0 +144 4 0 +2140 49 45 +223 25 25 +716 5 0 +144 4 0 +2080 109 105 +223 70 70 +671 5 0 +144 4 0 +2140 16 16 +982 16 14 +148 4 0 +1095 66 60 +945 50 50 +996 2 0 +148 4 0 +2080 109 105 +964 5 0 +144 4 0 +2106 50 50 +996 2 0 +148 4 0 +2106 50 50 +242 10313 79858 +2096 1 1 +15 1 1 +4772 1 1 +59 1 1 +175 0 1165 +227 5 6 +61 1227 0 +565 0 634 +1439 1 0 +1396 1 0 +1961 2 0 +3162 + +chain 1241626 GL000228.1 129120 + 70311 120593 chr10 133797422 + 133664525 133764907 813 +334 6 0 +395 27 27 +162 36 36 +296 145 149 +426 19 19 +480 1 11 +131 23 19 +121 37 37 +577 4984 4975 +70 3236 3229 +25 3281 3285 +70 5225 5224 +63 11158 64209 +253 19 19 +480 1 11 +131 23 19 +121 37 37 +1001 6 0 +395 27 27 +162 36 36 +296 145 149 +426 19 19 +474 10 9 +128 23 19 +121 37 37 +1001 6 0 +395 27 27 +494 145 149 +426 19 19 +480 1 11 +131 23 19 +121 37 37 +1001 6 0 +395 27 27 +494 145 149 +426 19 19 +123 7602 4795 +105 1 1 +46 136 0 +751 + +chain 26851 GL000228.1 129120 + 71046 94818 chr4 190214555 + 190066061 190089754 1701 +2 5 4 +20 7106 7085 +60 6552 6526 +60 16 16 +33 9809 9778 +26 50 50 +33 + +chain 24823 GL000228.1 129120 + 70221 72949 chr10 133797422 + 133667745 133673765 1627 +77 937 4230 +36 297 297 +26 0 8 +78 4 0 +35 1203 1198 +35 + +chain 18084 GL000228.1 129120 + 91429 111384 chr4 190214555 + 190079784 190089790 2294 +34 11204 4574 +37 1402 1402 +27 603 599 +36 1201 1192 +37 1402 1402 +27 494 494 +26 3356 50 +69 + +chain 11874 GL000228.1 129120 + 94735 111265 chr4 190214555 + 190079784 190089671 2305 +34 9934 3310 +33 3306 3296 +36 1201 1192 +37 1402 1402 +27 494 494 +26 + +chain 9746 GL000228.1 129120 + 119409 119842 chr18 80373285 - 80265954 80266387 94805 +145 152 152 +57 7 7 +72 + +chain 6977 GL000228.1 129120 + 107959 108038 chr10 133797422 + 133758518 133758605 2322 +1 0 8 +78 + +chain 6229 GL000228.1 129120 + 38164 38230 chr4 190214555 + 190033066 190033132 19395263 +66 + +chain 3690 GL000228.1 129120 + 98041 104653 chr4 190214555 + 190079784 190083078 3287 +34 6552 3234 +26 + +chain 3075 GL000228.1 129120 + 81561 81594 chr4 190214555 + 190079834 190079867 1922 +33 + +chain 2920 GL000228.1 129120 + 104295 104331 chr10 133797422 + 133748242 133748278 1495 +36 + +chain 2490 GL000228.1 129120 + 119366 119409 chr10 133797422 + 133690423 133690466 3635 +43 + +chain 1858 GL000228.1 129120 + 104653 104687 chr4 190214555 + 190079784 190079818 4345 +34 + +chain 1551 GL000228.1 129120 + 101347 101381 chr4 190214555 + 190079784 190079818 2666 +34 + +chain 1246 GL000228.1 129120 + 111265 111299 chr4 190214555 + 190079784 190079818 3858 +34 + +chain 1901957 GL000229.1 19913 + 0 19913 chr22 50818468 + 11611375 11631288 2214 +19913 + +chain 4139042 GL000230.1 43691 + 0 43691 chr22 50818468 - 39321131 39364918 1275 +42291 0 96 +1400 + +chain 2602009 GL000231.1 27386 + 0 27386 chr22 50818468 + 11585989 11613375 1741 +27386 + +chain 3852350 GL000232.1 40652 + 0 40652 chr22 50818468 + 11547337 11587989 1347 +40652 + +chain 4356032 GL000233.1 45941 + 0 45941 chr22 50818468 + 11428056 11473997 1243 +45941 + +chain 3801731 GL000234.1 40531 + 0 40531 chr22 50818468 - 39496283 39536819 1360 +3579 0 2 +574 1 1 +33 1 1 +3003 1 0 +2382 15 15 +1365 0 3 +1492 0 1 +823 2 0 +4801 14 14 +2393 0 1 +1262 3 0 +43 1 1 +2324 1 1 +47 1 1 +1428 1 1 +44 1 1 +631 1 1 +66 1 1 +1768 0 1 +3030 0 1 +932 1 1 +182 1 1 +145 6 6 +1850 0 1 +2661 0 1 +1854 1 1 +75 1 1 +198 18 18 +358 1 1 +29 1 1 +1085 + +chain 3255025 GL000235.1 34474 + 0 34474 chr22 50818468 + 12691730 12726204 1526 +34474 + +chain 3973116 GL000236.1 41934 + 0 41934 chr22 50818468 + 11118987 11160921 1311 +41934 + +chain 4366018 GL000237.1 45867 + 0 45867 chr22 50818468 - 39749481 39795354 1238 +28150 0 6 +17717 + +chain 3720276 GL000238.1 39939 + 0 39939 chr22 50818468 - 34102993 34142789 1383 +2039 8 12 +1016 5 5 +4821 1 0 +921 2 1 +890 0 1 +423 0 2 +3925 1 1 +72 1 1 +67 1 1 +148 1 1 +74 167 5 +60 1 1 +50 13 13 +3576 1 1 +54 1 1 +575 1 1 +26 1 1 +165 1 1 +46 1 1 +1550 1 1 +35 1 1 +3673 0 14 +2364 11 11 +568 0 3 +2927 4 0 +4923 1 0 +11 1 1 +988 0 1 +81 4 0 +545 1 1 +20 0 1 +1072 0 2 +750 7 7 +640 0 2 +606 + +chain 3216197 GL000239.1 33824 + 0 33824 chr22 50818468 - 39767920 39801744 1536 +33824 + +chain 3976481 GL000240.1 41933 + 0 41933 chr22 50818468 + 12776204 12818137 1309 +41933 + +chain 3977285 GL000241.1 42152 + 0 42152 chr22 50818468 + 10924572 10966724 1308 +42152 + +chain 4122233 GL000242.1 43523 + 0 43523 chr22 50818468 + 25015190 25058670 1279 +37 0 1 +501 0 1 +108 3 0 +187 0 1 +1121 1 1 +20 1 1 +1027 1 1 +34 1 1 +52 0 1 +765 0 4 +610 1 1 +19 0 1 +4259 1 0 +1146 31 0 +6060 1 1 +22 1 1 +2400 5 0 +8889 3 0 +179 0 1 +1992 0 1 +1767 16 0 +568 0 2 +178 0 2 +2610 4 0 +1173 1 0 +3097 0 2 +1764 0 6 +1838 2 0 +1027 + +chain 4123491 GL000243.1 43341 + 0 43341 chr22 50818468 + 11681288 11724629 1278 +43341 + +chain 3790328 GL000244.1 39929 + 0 39929 chr22 50818468 + 10834643 10874572 1363 +39929 + +chain 3455022 GL000245.1 36651 + 0 36651 chr22 50818468 + 12868137 12904788 1452 +36651 + +chain 3563345 GL000246.1 38154 + 0 38154 chr22 50818468 - 34021026 34059199 1426 +1862 1 1 +45 1 1 +3608 0 3 +107 1 15 +848 1 1 +43 1 0 +337 1 1 +35 1 1 +176 0 2 +91 3 4 +2683 0 1 +1321 18 2 +519 1 1 +27 1 1 +472 1 1 +44 1 1 +2452 0 8 +253 1 1 +21 1 1 +48 8 0 +6372 1 1 +38 1 0 +33 1 1 +777 0 1 +139 0 3 +2402 0 2 +3053 1 1 +46 1 1 +198 4 4 +27 1 1 +1883 0 9 +1592 0 4 +320 0 1 +1542 11 11 +412 12 12 +1421 4 0 +2828 + +chain 3430032 GL000247.1 36422 + 0 36422 chr14_GL000009v2_random 201709 + 82765 119185 1461 +151 8 8 +412 1 0 +642 0 1 +3260 12 12 +7577 0 1 +311 3 0 +2665 4 0 +3223 0 1 +437 0 1 +726 0 2 +340 1 0 +1345 1 0 +1511 0 2 +890 1 1 +29 1 1 +2699 1 1 +41 0 2 +1893 1 1 +49 1 1 +5180 1 0 +296 0 4 +573 1 0 +35 1 1 +1170 4 0 +925 + +chain 3757643 GL000248.1 39786 + 0 39786 chr22 50818468 + 32654714 32694487 1373 +9870 4 0 +430 0 3 +13 1 1 +275 3 3 +48 0 1 +149 0 4 +854 1 0 +15 1 0 +1499 1 0 +3772 2 0 +3785 10 10 +813 1 0 +269 0 1 +2137 0 3 +379 0 1 +286 1 0 +504 7 0 +2925 1 0 +41 1 1 +2493 0 1 +1290 0 1 +93 5 4 +521 1 0 +239 1 0 +304 1 0 +202 1 0 +774 1 0 +3448 1 1 +29 1 1 +565 1 0 +303 2 0 +1412 + +chain 3662710 GL000249.1 38502 + 0 38502 chr22 50818468 + 27821120 27859625 1401 +1207 1 0 +15053 0 12 +44 8 0 +22189 + +chain 14211031338 X 155270560 + 60000 155260560 chrX 156040895 + 10000 156030895 8 +34821 50007 183340 +86556 50000 5932 +766136 139418 0 +77296 50880 32919 +110 7 4 +1098 708 0 +152 32 0 +370 6 0 +1194 22 6 +143 2 0 +37 2 0 +12 1 1 +191 3 5 +84 1 0 +23 2 0 +104 0 107 +59 1 1 +40 1 1 +58 51 0 +42 0 2 +162 1 1 +88 1 1 +120 1 1 +24 1 1 +35 10 0 +64 4 0 +42 1 1 +100 0 4 +40 34 0 +124 4 0 +146 0 4 +845 0 1 +447 0 3 +975 34 23 +55 16 0 +745194 50000 250919 +1032 2 0 +123 1 1 +21 1 1 +537 32 0 +23 0 8 +477 1 1 +93 2 0 +455 7 4 +250 1 1 +31 1 1 +348 1 1 +49 1 1 +599 1 1 +22 1 1 +603 0 136 +68 145 10 +86 8 8 +251 1 1 +58 1 1 +150 1 1 +42 1 1 +61 3 0 +79 1 1 +154 1 1 +28 1 1 +519 86 80 +559 1 3 +50 2 0 +9 10 0 +267 1 0 +18 1 1 +602 1 0 +352 0 1 +409 9 9 +190 7 9 +59 7 9 +127 0 1 +641 1 0 +869 2 0 +380 12 0 +38 8 0 +27 1 1 +691 0 1 +125 1 1 +5493707 50000 0 +1507688 0 1 +1557102 50079 0 +86387 1 0 +868688 0 1 +2421690 3 0 +1268848 1 0 +2119757 0 1 +11889 0 1 +50200 0 1 +1078574 0 1 +41119 0 1 +3405782 0 1 +131353 8 8 +13988713 0 2 +166268 0 2 +24306 0 30 +39048 0 4 +52607 1 0 +35007 0 4 +3163 0 2 +30629 0 1 +485463 50000 208821 +8777 1 0 +1366000 1 0 +96117 0 1 +154297 1 0 +33498 1 0 +50965 0 1 +3898 0 1 +260331 1 0 +738187 0 1 +369518 0 1 +368592 1 0 +1537245 0 1 +390521 0 1 +156186 0 1 +28309 0 1 +663762 0 1 +176962 0 1 +134056 0 1 +1078897 0 1 +783956 1 1 +12 0 1 +143 1979 1979 +143 1 0 +12 1 1 +19308 1 1 +41 1 5 +209 7 0 +41 0 8 +2220 0 2 +3721 0 1 +4266 0 56 +478 1 0 +1131 0 1 +1000 24 0 +2328 1 1 +36 1 1 +567 1 0 +1552 307 0 +1444 4 1 +19 9 0 +33 0 35 +510 0 1 +6054 2 0 +186 0 65 +207 1 0 +2159 2 0 +5895 0 1 +379 15 15 +1514 16 38 +688 1 1 +37 1 1 +2855 0 1 +2288 6 0 +1181 0 6 +1437 0 2 +33108 1 1 +19 1 1 +8388 1 0 +3068 1 0 +1126 0 1 +125 8 1 +1311 4 0 +3000 0 4 +751 1 0 +2605 2 0 +2600 1 0 +772 1 0 +5987 1 0 +3380 12 0 +1636 1 0 +1989 0 5 +270 1 1 +41 1 1 +1489 3 0 +7966 0 1 +1361 0 2 +48 1 1 +242 0 11 +760 12 0 +1681 1 1 +50 1 1 +2375 1 0 +1033 1 0 +2571 0 4 +1311 8 0 +1189 1 1 +44 1 1 +150 4 0 +44 0 1 +733 0 1 +272 2 2 +1117 0 2 +132 1 3 +44 1 1 +5401 6 0 +825 0 1 +1094785 20493 20537 +818 1 0 +136 0 1 +2301 0 1 +662 1 0 +8803 10 0 +5566 1 0 +988 1 0 +1298 0 1 +67144 0 1 +34 0 1 +7 0 1 +17 0 1 +677 1 0 +921646 1 0 +7527 1 0 +9428 0 1 +507 0 1 +4789 0 1 +4394 0 1 +1642 0 1 +248 0 1 +496 6 6 +175 0 1 +1029 2 0 +768 6 0 +120 0 4 +1241 0 2 +2783 0 1 +1723 0 1 +9414 0 1 +1935 2 0 +4425 1 1 +23 1 0 +2599 0 3 +4926 0 1 +5042 0 1 +2372 8 8 +2185 3 0 +445 36 40 +2020 0 2 +809 1 1 +29 1 1 +383 15 16 +361 1 0 +91 1 0 +4310 0 10 +2712 2 0 +2473 1 1 +10 5 1 +38 4 0 +847 0 1 +1870 0 4 +60 0 4 +859 1 1 +37 1 1 +692 4 1 +755 0 2 +208 0 14 +3298 2 0 +3560 2 0 +2272 1 0 +999 5 0 +113 9 17 +9302 1 1 +23 1 0 +370 12 0 +870 0 2 +39 0 1 +9 1 1 +2862 1 0 +295 1 0 +1174 3 0 +581 13 12 +825 13 14 +1705 0 1 +17 1 1 +278 1 0 +263 0 1 +2941 1 1 +84 1 1 +1096 1 0 +1176 1 1 +24 1 1 +47 1 0 +733 1 1 +20 1 1 +1908 1 1 +27 1 1 +441 0 1 +354 1 0 +365 0 1 +4005 0 1 +1922 8 8 +567 0 1 +13804 2 2 +4 1 0 +46 9 10 +5938 0 4 +1091 0 1 +1929 0 2 +96 1 1 +41 4 0 +47 6 0 +50 6 0 +85 1 1 +286 1 1 +100 2 2 +165 1 1 +47 77 0 +145 2 0 +7 6 48 +11 2 2 +37823 8 0 +28574 0 1 +163412 0 2 +3486 0 1 +8363 4 0 +319 5 0 +3123 1 0 +22181 1 0 +2371 1 0 +757 0 1 +1016 0 1 +637 3 0 +2433 25 0 +38 0 10 +287 16 0 +218 4 4 +1446 0 1121 +626 3 0 +634 1 0 +636 1 0 +1668 24 0 +1745 0 1 +314 2 0 +3482 2 0 +1229 1 1 +14 1 1 +4191 0 4 +32 0 4 +12922 1 0 +2812 0 8 +3595 4 0 +735 0 1 +858 1 0 +5 1 0 +2508 4 0 +1188 2 0 +2381 3 0 +3970 0 1 +2681 2 0 +3515 1 0 +192003 7 7 +2959 1 0 +25907 1 1 +15 1 0 +860 1 0 +22995 2 0 +694 12 0 +17256 0 1 +4999 3 0 +3826 0 1 +2317 3 5 +26 1 1 +406 9 9 +3986 0 1 +12711 1 0 +5766 1 0 +1408 12 0 +2988 0 1 +5581 0 1 +5655 50 57 +9752 0 1 +27 1 1 +29472 3 0 +6143 1 0 +543 0 1 +7603 1 9 +830 1 2 +6930 1 3 +1010 0 1 +541 1 0 +458 1 0 +191 0 1 +1565 1 0 +9608 1 0 +910 0 1 +5526 1 0 +2569 1 0 +911 0 2 +369 3 0 +1571 0 4 +16629 0 1116 +713 1 0 +2062 0 1 +10441 0 6 +26487 0 1 +1072 0 1 +2474 1 0 +3335 0 3 +1252 0 1 +903 1 0 +1618 0 2 +5492 0 14 +798 4 0 +3022 0 1 +568 10 10 +10467 2 0 +2328 0 1 +6275 0 854 +7278 4 0 +848 1 0 +5579 34 30 +280 9 8 +432 0 4 +654 0 1 +3857 1 0 +1502 1 0 +1711 0 2 +12408 0 1 +2319 0 1 +3827 0 1 +968 1 0 +1775 0 1 +1374 13 13 +1662 8 0 +12 1 1 +1208 1 0 +2059 0 2 +380 0 6 +550 1 1 +51 0 8 +658 2 0 +972 1107 0 +286 2081 2082 +148 1 0 +349 0 12 +936 1 1 +45 1 1 +103 1 1 +24 1 1 +1047 0 2 +94 1 1 +20 1 1 +238 8 1 +31 1 1 +2268 6 0 +1606 1 0 +3574 4 0 +1215 1 1 +23 2 2 +294 1 1 +39 1 1 +1629 0 1 +661 1 0 +184 1 1 +39 1 1 +145 12 0 +97 0 3 +771 11 11 +218 1 0 +58 17 17 +3835 2 0 +314 8 8 +1361 0 1 +4924 2 0 +385 1 0 +2555 1 1 +45 0 1 +1043 1 0 +4459 1 1 +39 1 1 +1153 2 0 +6517 1 1 +28 1 1 +3643 5 0 +2396 116 0 +817 1 1 +18 1 1 +535 5 0 +1024 2 0 +35 1 1 +9165 0 1 +79 0 1 +1094 1 0 +257 0 5 +1440 0 742 +211 1 0 +1158 23 0 +1518 5 5 +2467 1 0 +2333 3 0 +240 0 1 +3399 1 0 +1348 0 1 +222 2 0 +1175 1 3 +1283 7 7 +3059 0 4 +932 0 1 +1828 1 3 +1848 1 0 +3 3 0 +1317 2 0 +455 1 0 +2005 1 1 +33 1 1 +3317 60 59 +273 0 585 +3432 0 1 +3317 0 3 +3006 0 14 +374 0 1 +1344 1 1 +56 1 1 +1028 0 10 +301 12 0 +414 0 1 +2952 0 2 +228 4 4 +232 1 0 +211 8 0 +3686 0 5 +309 8 0 +182 11 11 +850 0 1 +356 0 8 +512 0 1 +301 0 1 +14489 6 5 +1382 1 0 +2234 1 0 +466 5732 5732 +423 4 4 +2524 36 35 +2495 0 2 +305 0 1 +306 15 0 +2370 0 3 +368 0 1 +2606 2 0 +5606 1 0 +1535 104 0 +66 2 0 +1189 0 1 +834 0 2 +6835 5 0 +23 0 1 +4183 2 0 +8187 1 0 +3501 1 0 +1805 0 1 +9402 0 1 +5994 4 0 +139 0 1 +10158 0 3 +648 1 0 +1310 8 0 +349 0 1 +4049 1 0 +1233 0 2 +3518 0 1 +965 0 4 +10244 0 4 +6949 2 0 +1334 3 0 +2051 1 0 +4909 0 1 +1463 1 0 +9512 0 2 +2767 1 0 +6076 6 0 +5898 8 0 +642 2 0 +2649 1 0 +4319 1 1 +15 13 13 +64 18 18 +18381 9543 0 +244 9 9 +389 1 17 +1902 8 11 +2232 388 408 +563 0 1 +437 0 1 +2343 15 15 +904 1 4 +1459 0 2 +925 0 4 +3476 9496 0 +2195 0 1 +3122 0 1 +718 9536 0 +2941 8373 305 +417 51593 180060 +353950 1 0 +9334 0 3 +1644 0 1 +2003 8 0 +528 0 1 +16547 3 1 +5434 1 0 +4984 0 1 +1320 1 0 +9026 5 5 +7103 4 4 +1661 7 6 +195 38 38 +3258 0 1 +192 8 8 +6857 1 0 +8021 0 1 +6090 11 9 +1627 1 0 +3865 0 2 +27167 1 1 +89 1 1 +3309 0 6 +203 1 0 +335 4 4 +4168 2 0 +10418 1 0 +38204 0 4 +1354 52 0 +8786 0 1 +90 0 1 +11366 2 0 +36562 0 1 +5850 0 1 +8992 0 4 +13146 0 2 +2734 0 1 +24315 0 4 +11472 0 2 +6877 1 0 +4076 2 0 +10 6 0 +17777 50075 71726 +40882 0 1 +56091 0 1 +85226 1 0 +7936 1 0 +565977 0 154 +71457 1 0 +829 0 9 +126 1 1 +22 1 1 +902 1 5 +2792 5 4 +1193 20 20 +422 791 791 +1105 1 1 +150 1 1 +1299 9 9 +531 9 9 +9914 1 1 +14 1 1 +5362 0 1 +4349 1 1 +23 0 1 +2404 0 1 +11582 0 1 +3945 1 0 +21423 1 1 +39 0 4 +405 2 0 +59320 2 0 +608 13 11 +2714 0 1 +12479 20 0 +26 10 0 +20733 0 6 +20729 0 4 +1947 0 1 +333404 86 0 +9605 0 4 +17657 0 1 +665 0 1 +11641 1 0 +15643 0 2 +6067 211 104 +998 7399 7400 +221 6 0 +769 1 45 +63 0 7 +42 3 0 +5 4 0 +10 102 0 +1355 0 19 +196 4 0 +1889 10 0 +488552 26 0 +2272 1 0 +9617 4 0 +70534 0 6 +9243 23 0 +47859 0 2 +20385 1 0 +136991 0 1 +11771 8454 8454 +10033 285867 0 +4806 1 0 +17520 2 0 +37799 38 0 +131473 0 1 +12992 0 62 +3787 380 278 +31 2 2 +12379 0 8 +5602 1 2 +6 0 1 +40 0 1 +12 0 1 +13835 4 0 +2288 0 4 +972 0 8 +1488 0 3 +1776 5 0 +2553 2 1 +1007 4 0 +1777 0 4 +380 9 9 +4023 1 0 +2527 0 6 +1047 59 77 +745 0 1 +1545 0 4 +3700 1 0 +916 13 13 +1447 1 1 +44 1 1 +2688 0 5 +44 1 1 +6339 1 1 +45 1 1 +181 0 1 +1054 0 1 +261 1 0 +497 3 18 +10059 1 1 +12 1 1 +10190 2 0 +1711 23 0 +4120 0 1 +1674 2 0 +12989 29 41 +8638 0 1 +2957 0 8 +13301 2 0 +1996 1 1 +16 1 1 +8397 0 1 +7054 1 1 +35 1 1 +8222 0 1 +2172 0 1 +2371 0 2 +5224 1 0 +8157 0 1 +3503 0 1 +60 172 0 +571 0 4 +3541 1 0 +2253 0 4 +895 1 0 +3648 0 3 +7420 2 0 +178 0 1 +490 20 0 +3526 1 0 +1626 1 0 +3502 0 2 +665 0 1 +7201 1 0 +2207 0 10 +2222 0 1 +4602 0 1 +622 0 6 +647 1 0 +2157 0 4 +1749 0 1 +3788 2 0 +5914 1 0 +1821 0 10 +122 1 1 +34 1 1 +1886 2 0 +3677 0 12 +2589 0 1 +204 0 1 +1924 0 1 +62 1 0 +2669 1 0 +141 0 1 +2413 12 0 +2608 0 1 +9840 2 0 +7238 9 3 +762 0 1 +3982 0 2 +2264 0 4 +59 2 0 +289731 0 1 +867 0 1 +2247 2 1 +709 17 0 +10435 0 1 +2376 8 0 +11515 2 1 +8336 0 2315 +566 1 1 +39 15 0 +2615 1 0 +1101 1 0 +1306 1 0 +1050 0 1 +700 18 0 +2365 0 3 +3405 1 0 +2166 0 4 +9825 1 0 +14009 0 1 +2682 1 0 +3034 0 1 +7209 2 0 +4685 11 0 +303 0 1 +1636 1 1 +25 1 1 +4005 0 1 +2085 19 0 +3149 0 1 +1755 1 0 +2490 1 1 +235 1 1 +3828 0 1 +3128 0 1 +7392 0 1 +11756 1 0 +6836 1 0 +1017 0 1 +991 0 1 +6609 0 1 +1342 4 4 +382 9 14 +1700 4 0 +2150 1 0 +3385 1 0 +3320 5 0 +13658 1 0 +542 55 21 +2722 1 0 +1282 0 5 +330 1 0 +1037 1 0 +2162 0 1 +1247 1 0 +5005 1 0 +1249 0 2 +227 0 1 +5425 0 1 +509 0 16 +6356 0 1 +12414 0 1 +3255 1 0 +1362 0 4 +36129 0 1 +34951 1 0 +23548 9 15 +319 0 4 +4453 1 0 +15064 0 9 +2906 1 0 +9397 10 0 +13742 1 0 +4495 0 2 +4636 3 11 +5701 0 11 +50 11 0 +1608 0 1 +660 0 4 +3861 6 0 +692 0 1 +2101 0 2 +12182 1 0 +4197 0 1 +9109 0 6 +783 18 18 +2235 15 15 +3664 10 0 +937 0 4 +321 0 1 +20275 0 444 +87188 1 0 +1682 7 0 +7507 0 80 +25059 1 0 +8418 0 1 +319 0 5 +3282 0 2 +2723 1 0 +1093 0 1 +1109 0 1 +2707 21 21 +513 1 1 +44 1 1 +1467 2 0 +2335 0 1 +1712 1 1 +19 1 0 +8917 0 2 +2229 10 10 +370 1 1 +41 1 14 +19 10 17 +235 74 38 +466 0 4 +3505 1 1 +27 1 1 +1857 0 1 +723 0 1 +1981 0 1 +211 0 1 +1559 14 15 +1007 0 1 +5447 2 0 +459 6 0 +29 1 1 +1033 0 1 +498 2 0 +3903079 1 1 +21 1 1 +32798 1 0 +415957 0 1 +275887 3100000 3906963 +676307 0 2 +9730 0 1 +4122 1 0 +3299 0 1 +3291 4 0 +2277 18 18 +10963 1 0 +13020 8206 7798 +5923 0 1 +31062 0 1 +5640 2 0 +4074 0 1 +1656 0 1 +4596 0 1 +51587 2 0 +78859 1 0 +2235781 0 1 +28995 0 16 +568 1 0 +9427 3 0 +19335 0 6 +28846 1 0 +42908 0 8 +88 0 12 +3019852 1 0 +817190 1 0 +256163 0 1 +1427 0 1 +6172 0 1 +182 0 1 +5326 0 8 +1020 0 2 +1048 4 0 +5096 0 2 +455 0 1 +5292 0 1 +1661 4 0 +12610 2 0 +6432 1 0 +6270 0 6 +6411 0 4 +708 24 0 +291 0 2 +3126 2 0 +2662 0 1 +1905 13 13 +1323 0 1 +4941 0 4 +2358 0 1 +34 0 1 +3649 0 1 +131 1 1 +638 1 1 +39 1 1 +918 0 2 +1737 0 3 +949 1 1 +18 1 1 +88 0 4 +3435 1 1 +23 18 0 +1372 0 1 +2777453 0 1 +7576 0 7 +2850 6 0 +4042 1 0 +585 0 4 +4409 8 0 +3776 0 28 +2991 0 1 +11515 0 1 +5797 1 0 +550 4 0 +5244 0 2 +508 2 0 +114 1 0 +251 1 0 +4795 0 1 +1744 1 1 +43 1 1 +5430 1 1 +20 0 1 +6329 0 1 +791 0 2 +222 1 0 +711 0 2 +14073 6 0 +9058 1 1 +57 1 1 +871 4 0 +57052 4 0 +66 25 0 +5427 417 417 +5428 0 25 +50 0 4 +13033 0 4 +209 5 0 +374 4 0 +99 4 0 +754 0 20 +88 0 1 +706 1 0 +1134 2 0 +4479 0 1 +6539 11 1 +6748 9 0 +2605 0 4 +5479 21 22 +4781 1 1 +39 0 1 +290 3 0 +690 2 1 +2180 16 16 +3759 0 2 +246 1 0 +994 0 1 +1242 0 1 +1390 1 1 +20 1 1 +2185 1 1 +45 1 1 +6862 3 1 +33 1 1 +8892 0 1 +1682 6 0 +43 0 3 +3419 0 3 +698 1 0 +223 0 2 +791 0 2 +852 0 1 +1132 1 0 +3419 0 5 +927 0 3 +4777 0 1 +686 1 1 +43 1 1 +1619 1 0 +657 0 1 +1816 3 0 +1091 3 0 +1346 1 0 +249 1 0 +94 4 0 +518 0 2 +2116 1 1 +41 1 1 +605 0 2 +2481 1 0 +553 0 1 +4556 12 12 +1242 1 0 +16 1 1 +3199 4 0 +558 1 1 +52 1 1 +5119 1 2 +3072 1 1 +26 1 1 +383 1 1 +38 1 1 +142626 0 3 +475823 0 1 +2578716 2 0 +744 1 0 +4647 0 2 +338 12 12 +4175 2 0 +4360 0 1 +249 4 0 +749 1 1 +30 1 1 +1162 9 8 +2179 0 4 +101 6 6 +1167 0 38 +43 1 1 +1180 1 2 +7132 0 1 +75 1 1 +291 603 2 +189708 4 0 +803 0 1 +96 2 0 +875 1 0 +4964 0 12 +17050 0 1 +51 1 1 +5023 2 0 +12605 1 0 +1288 15 8 +6152 0 2 +1888 1 0 +3482 2 0 +2337 0 1 +1665 1 0 +1562 1 1 +28 1 1 +872 1 0 +1633 1 0 +1069 1 0 +3140 1 0 +396 0 2 +1410 1 1 +30 1 1 +550 1 0 +34 1 1 +462 22 22 +2272 0 1 +510 2 0 +844 0 1 +3352 1 1 +21 1 0 +691 1 1 +65 1 1 +164 1 1 +84 1 1 +4306 1 1 +30 1 1 +163 0 1 +176 18 19 +6233 1 0 +2160 3 0 +1738 3 1 +4461 1 0 +4174 1 0 +9977 0 1 +1821 17 17 +4974 0 1 +4098 0 5 +6266 3 3 +46 5 5 +827 1 1 +44 1 0 +109 0 1 +63 1 1 +1292 0 10 +5149 0 8 +2860 4 0 +1289 0 1 +1258 1 1 +32 1 1 +604 2 0 +1797 15 1 +4 1 0 +17 1 3 +204 2 0 +309 1 0 +4434 15 15 +86 1 1 +22 1 1 +822 0 1 +2047 0 2 +565 1 1 +42 4 4 +1584 16 16 +353 1 1 +34 1 1 +4070 0 1 +913 0 15 +1101 9 9 +682 1 1 +20 1 1 +156 0 1 +2965 13 13 +1773 1 1 +32 1 1 +633 4 0 +1261 0 1 +733 1 1 +82 1 1 +1318 1 1 +42 1 0 +364 1 1 +83 0 1 +271 15 15 +717 1 1 +42 1 1 +579 1 1 +33 1 1 +2046 11 11 +2049 1 0 +3542 2 0 +1033 1 0 +1881 3 0 +1148 14 14 +5410 5 0 +1362 1 1 +38 1 1 +962 5 5 +548 5 0 +4308 0 4 +1741 1 0 +2578 1 1 +64 2 1 +49 1 1 +271 0 3 +6593 0 1 +2156 1 0 +1977 1 0 +638 7 3 +717 1 1 +23 1 1 +9299 0 4 +5314 0 1 +8156 1 1 +40 1 1 +3127 1 1 +24 1 1 +419 0 2 +1105 12 12 +1710 0 2 +155 1 0 +371 1 1 +49 1 1 +149 1 1 +40 1 1 +1180 1 1 +32 1 1 +1007 1 1 +23 1 1 +8496 1 1 +41 1 1 +1165 1 1 +19 1 1 +2313 3 2 +1920 1 1 +32 1 1 +928 0 3 +933 0 2 +32 1 1 +642 0 3 +145 0 1 +636 1 0 +4719 1 1 +23 1 1 +3242 1 1 +22 1 1 +3777 12 12 +1067 2 0 +1686 13 13 +265 1 0 +537 0 1 +795 1 0 +1351 6 5 +3466 14 14 +635 1 0 +2710 1 1 +37 1 1 +3749 0 1 +3631 5 0 +1440 1 0 +2361 0 1 +508 2 0 +360 11 11 +815 4 0 +236 1 1 +38 1 1 +3600 1 1 +32 0 2 +2051 20 20 +5177 1 0 +961 0 1 +35 1 1 +709 9 9 +736 1 1 +22 1 0 +50 1 1 +1173 10 10 +286 1 0 +49 1 1 +672 1 1 +24 1 1 +579 1 1 +19 1 1 +569 1 1 +41 1 1 +128 1 2 +728 30 16 +2149 19 19 +1072 1 1 +32 0 1 +757 3 0 +451 8 7 +3843 1 0 +1830 10 10 +1709 0 1 +2664 2 0 +138 1 1 +17 1 1 +68 1 0 +1125 0 1 +549 1 1 +49 1 1 +1265 1 1 +18 1 1 +3647 1 0 +1592 1 1 +47 1 1 +245 11 11 +1695 1 1 +40 1 1 +893 1 0 +910 0 2 +2474 1 0 +580 1 1 +40 1 1 +151 1 1 +19 1 1 +1444 1 1 +19 1 1 +1739 1 1 +47 1 1 +653 1 1 +41 1 1 +196 6 6 +925 16 16 +1738 1 0 +443 1 1 +44 1 1 +1657 6 6 +926 1 1 +17 1 1 +3580 0 1 +540 0 3 +1430 1 0 +2327 0 1 +305 0 2 +4460 1 1 +39 1 1 +234 2 0 +254727 0 1 +2179 0 1 +727 1 0 +60 5 5 +3094 9 9 +208 1 1 +68 1 1 +377 1 1 +120 1 1 +1439 22 22 +2836 1 0 +3565 1 0 +3021 1 1 +50 1 1 +5772 1 1 +34 2 0 +3893 0 1 +1415 5 0 +2780 0 11 +2966 0 1 +1815 1 1 +31 1 1 +1941 2 0 +717 1 1 +34 1 1 +1032 1 1 +42 1 1 +4615 0 1 +1838 16 16 +765 19 19 +2941 0 3 +152 1 1 +46 1 1 +77 6 7 +912 1 1 +38 1 1 +10031 4 4 +1916 16 20 +3361 16 16 +6391 0 2 +76 1 1 +6381 8 0 +6384 14 0 +50 0 2 +565 0 2 +1422 2 0 +25 0 2 +57 7 17 +5207 1 1 +29 1 1 +3287 31 0 +120 4 0 +41 1 1 +1388 1 1 +18 1 1 +2790 1 0 +929 1 1 +70 1 1 +137 1 1 +27 1 1 +4173 1 0 +791 1 1 +66 1 1 +3223 7 9 +8719 14 14 +888 1 0 +1457 8 0 +3634 0 1 +2670 3 0 +10625 0 1 +7949 0 1 +247880 0 2 +5013 50000 14970 +11953 8 0 +23295 9 28 +3424 0 1 +3394 0 1 +19614 0 1 +3404 1 0 +15264 0 4 +2052 5 0 +7594 2 0 +5743 12 14 +12224 0 8 +3230 0 2 +4251 0 4 +21877 5 0 +10861 0 1 +7087 1 0 +3225 1 0 +8241 0 3 +11027 18 0 +6213 2 0 +1991 3 0 +3707 0 1 +23527 0 1 +4558 4 0 +1269 0 6 +3866 8 0 +6498 1 0 +571 0 4 +8912 1 0 +5694 0 4 +2211 0 1 +15649 1 0 +222 2 0 +5194 0 19 +177 5 0 +12441 1 0 +4942 0 1 +501 0 4 +1386 8 0 +1881 0 4 +1334 1 1 +33 1 1 +1225 2 0 +960 2 0 +32055 1 0 +2624 4 0 +11189 0 8 +423 1 0 +2716 0 1 +876 3 17 +45 34 0 +976 1 0 +4964 0 2 +178040 0 1 +20199 1 0 +4787 1 1 +22 1 1 +31349 1 0 +12517 0 1 +1794314 1 0 +482 2 0 +38812 8 8 +758 1 1 +24 1 1 +175 1 1 +24 1 1 +172 1 1 +37 5 5 +1700 4 0 +1733 1 1 +30 1 1 +1747 0 1 +290 0 1 +318 2 0 +62 1 0 +1263 17 17 +1472 1 1 +51 1 1 +155 1 1 +70 1 1 +246 1 1 +48 1 1 +114 10 10 +1100 16 16 +206 1 1 +45 1 1 +309 1 1 +48 1 1 +158 8 8 +1105 0 1 +4347 1 0 +7569 3 0 +294 1 1 +35 1 1 +888 1 1 +75 1 1 +497 1 1 +30 1 1 +314 0 1 +37 1 1 +90 1 1 +33 1 1 +10343 0 10 +15021 0 1 +12588 0 1 +5349 4 0 +1996882 0 50 +794934 0 441 +2028000 0 1 +94294 0 1 +490783 0 1 +615194 0 1 +223956 0 1 +1426790 0 3 +409549 1 0 +1098064 0 1 +38383 0 1 +8589427 0 1 +2736681 0 1 +206272 4 4 +62 1 1 +35 5 5 +596 0 1 +14673 1 0 +639 0 1 +1681 0 1 +504 0 16 +2346 2 1 +3433 1 0 +2622 7 0 +4019 1 1 +41 3 3 +2697 0 1 +2904 2 0 +533012 0 1 +214060 0 1 +65905 0 2 +1626 0 1 +1150 0 1 +12430 1 1 +39 1 1 +1435 0 1 +1217 0 1 +779 0 4 +757 0 1 +69 0 1 +4718 1 0 +1537 1 0 +5294 15 15 +13894 1 0 +1015 1 1 +44 1 1 +2999 1 1 +33 1 1 +5402 6 0 +597 0 4 +9179 10 0 +19044 0 1 +1773 0 1 +8216 0 1 +10753 0 1 +8160 0 1 +726 1 1 +43 1 1 +9425 1 1 +43 1 1 +606 8 0 +778 2 0 +10359 1 0 +25 1 1 +393 3 0 +3279 1 0 +5427 0 27 +1085 0 1 +20673 1 0 +123840 0 1 +55389 1 0 +139573 0 1 +142130 0 1 +216 1 0 +4174 1 0 +21877 4 4 +4505 1 1 +23 2 0 +1229 1 0 +1454 0 1 +133 3 0 +6597 1 0 +6935 15 1 +5100 1 0 +8492 15 15 +2653 0 1 +9763 1 0 +571 0 1 +4045 0 1 +6258 0 1 +34 0 1 +1175 0 2 +3756 9 0 +2248 1 0 +4490 1 0 +5181 53 94 +7398 0 1 +7020 0 1 +1066 1 1 +119 1 1 +1369 1 0 +1971 4 0 +63 1 1 +3878 7 7 +6810 1 0 +5647 0 2 +136 1 1 +43 1 1 +2068 0 2 +1912 0 1 +4260 4 4 +50 0 40 +1026 0 2 +581 0 1 +7972 2 0 +96 1 0 +1583 2 0 +1492 4 0 +24704 0 2 +110485 0 1 +28680 4 0 +488 4 0 +1277956 1 0 +881 0 1 +7649 1 0 +8170 0 1 +1377 1 0 +10822 1 0 +3605 1 0 +2907 0 1 +36627 0 1 +11558 0 1 +18 1 0 +6907 0 1 +1156 9 18 +605 1 0 +722 1 1 +44 1 5 +945 1 0 +205 1 18 +9639 4 0 +4615 1 1 +48 1 1 +434 17 0 +4565 1 1 +21 1 1 +9954 1 1 +59 1 1 +11791 0 1 +1221 10 10 +1507 0 325 +3958 0 1 +1517 1 0 +207 0 12 +4052 0 1 +24 0 1 +5928 0 1 +3062 0 6 +11997 0 1 +1547 1 0 +8652 0 1 +144 1 0 +487 0 1 +13861 12 0 +3533 4 4 +2170 0 1 +1258 3 5 +199 0 1 +462 0 3 +1461 0 2 +921 2 0 +9928 0 4 +213 2 0 +1356 0 2 +3020 0 6 +6480 4 0 +5044 0 2 +247 2 0 +3268 1 1 +49 1 1 +10561 0 4 +3944 0 4 +20 1 1 +1885 0 1 +15781 4 0 +4504 1 0 +6134 0 2 +1893 0 1 +9610 0 1 +2391 0 3 +664 0 6 +31 1 1 +1226 0 1 +2157 4 0 +1732 1 1 +41 1 1 +78 3130 13003 +4982 0 1 +15985 0 1 +4678 0 1 +1587 9 0 +9977 1 1 +92 1 1 +1825 2 8 +3336 0 2 +4638 0 2 +656957 0 1 +1339 1 0 +15565 0 1 +53405 1 0 +145912 1 0 +33195 1 0 +1559 0 1 +92662 1 0 +41515 0 1 +47620 1 0 +3 1 0 +17084 0 1 +32196 1 0 +39993 1 0 +21976 1 0 +1520 1 0 +2040 0 3 +1307 1 1 +36 1 1 +3576 0 4 +8220 0 3 +2989 1 1 +63 1 1 +5470 1 0 +2192 1 1 +45 1 1 +38 0 1 +336 0 3 +32 1 1 +187 0 1 +254 1 0 +603 0 3 +87323 0 680 +2249 1 0 +61224 1 0 +90786 0 1 +7207 1 0 +141658 1 0 +12778 0 1 +143137 0 1 +62156 0 1 +134846 1 0 +17725 1 0 +110705 0 777 +75598 32 0 +581 0 1 +331 0 32 +6224 53 41 +14187 2 0 +30500 1 0 +2775541 0 1 +778273 0 1 +3234939 0 1 +277827 1 1 +33 1 0 +376 30 38 +5907 1 0 +32 1 1 +4827 34 0 +5981 1 0 +244 4 0 +3922 1 0 +19645 1 0 +5761 0 4 +351 9 0 +2087 1 0 +72 1 0 +4354 1 1 +31 1 1 +3546 4 4 +247 1 1 +222 1 1 +2451 1 1 +57 1 1 +429 11 11 +244 1 0 +2902 1 1 +32 1 1 +221 1 0 +353 0 1 +28 0 1 +1238 7 7 +2628 1 1 +32 1 1 +887 18 18 +517 0 1 +17 1 0 +71 1 1 +1115 2 0 +72 1 1 +2371 1 1 +85 4 4 +880 0 5 +717 1 0 +1316 0 1 +92 7 7 +666 16 16 +1525 6 0 +1861 1 0 +4665 1 1 +33 1 1 +2069 0 2 +3343 1 1 +52 1 1 +7041 13 0 +3256 2 0 +1980 1 0 +191739 0 1 +1822 0 8 +747 2 0 +7300 0 1 +1683 4 4 +7312 0 2 +7580 0 1 +11823 0 1 +731 0 1 +1302 1 1 +39 0 7 +3257 1 1 +21 0 1 +1472 2 0 +6114 18 18 +4268 0 1 +1346 3 0 +214 11 11 +259 1 1 +43 1 1 +232 1 0 +172 1 0 +114 1 1 +84 1 1 +1818 5 0 +2745 0 2 +2289 1 1 +25 1 1 +2522 1 0 +4656 0 1 +3826 1 0 +580 1 1 +25 1 1 +4106 6 0 +20851 1 0 +65110 2 0 +2765 0 31 +50 2 0 +14 5 0 +53 5 1 +2709 1 0 +4332 0 1 +252 12 0 +2067 1 0 +1224 0 1 +6059 0 2 +9208 1 1 +44 1 1 +5434 3 0 +4619 1 0 +796 0 1 +2343 0 2 +754 8 0 +62 1 1 +45 1 1 +80 32 0 +76 0 6 +70 0 18 +158 0 4 +6616 4 0 +6564 1 0 +1900 0 8 +14467 11 1 +21 0 35 +7163 2 2 +48 1 1 +3326 0 1 +161 1 1 +24 2 0 +1352 0 1 +44 1 1 +3878 0 36 +947 0 1 +670 0 3 +572 21 0 +9423 3 11 +1513 2 0 +3604 0 1 +9784 0 2 +574 0 1 +9592 1 1 +41 1 1 +1537 0 3 +2058 1 1 +19 1 1 +169 1 1 +27 1 1 +804 1 1 +28 1 1 +1580 1 1 +21 1 1 +2904 1 1 +21 0 2 +866 1 1 +33 1 1 +2522 1 34 +292 0 5 +2223 0 7 +625 1 0 +2402 1 0 +280 0 5 +85 1 1 +39 1 1 +429 1 0 +2423 1 0 +287 1 3 +228 1 1 +48 1 1 +211 1 1 +48 1 1 +1022 1 1 +18 1 1 +440 17 16 +589 0 2 +853 0 4 +132 0 2 +1713 2 1 +1436 1 1 +86 3 2 +137 8 7 +140 1 1 +57 3 0 +3046 1 0 +873 1 0 +386 9 0 +33 0 1 +37 1 1 +51 1 0 +1876 4 0 +3173 0 1 +1567 1 1 +25 1 1 +140 10 10 +3307 0 2 +13080 1 0 +6182 1 1 +34 1 1 +57 0 1 +168 3 0 +414 1 1 +47 1 1 +195 1 0 +564 1 0 +576 4 0 +1181 26 14 +2958 1 1 +47 1 1 +570 1 0 +2690 1 1 +34 1 1 +3245 1 0 +8201 0 1 +5104 0 3 +1692 1 0 +136 1 1 +29 1 1 +341 1 1 +45 1 1 +3384 0 5 +786 10 0 +146672 0 4 +2470 6 0 +134 4 0 +1779 0 1 +861 32 0 +264 0 60 +62 34 0 +12752 50000 58765 +3475 18 0 +11550 2 0 +638 1 1 +37 1 1 +484 12 34 +639 0 1 +2597 0 4 +61414 1 0 +497 0 1 +127865 0 2 +8877 2 0 +2745 0 1 +2214 5 0 +3738 0 1 +2297 1 1 +32 1 1 +1066 0 8 +1911 1 0 +1886 9 0 +2159 1 0 +755 3 0 +1826 4 0 +6951 9 9 +1989 14 13 +2823 6 0 +4892 0 5 +5043 3 5 +747 6 6 +931 0 3 +427 0 1 +1407 0 1 +1738 0 2 +235 2 0 +2139 1 1 +27 1 1 +486 1 1 +34 1 1 +306 4 4 +13 1 1 +94 0 5 +276 1 1 +31 2 1 +68 1 1 +42 9 9 +915 0 1 +137 1 1 +3106 12 12 +1543 2 0 +47 1 1 +1676 1 1 +46 1 1 +1467 10 10 +194 1 1 +47 1 1 +11957 6 5 +2496 1 0 +3 4 0 +1824 0 4 +173 2 0 +2865 1 1 +35 0 1 +2640 12 0 +1190 0 2 +3361 12 0 +1857 4 0 +581 0 3 +90 0 4 +1783 0 1 +1546 5 9 +8614 3 0 +5071 0 1 +1313 2 0 +2043 2 0 +5038 0 2 +3938 0 3 +4837 1 1 +41 1 1 +2993 0 4 +5101 0 1 +4944 0 1 +888 8 0 +5238 9 55 +2119 0 1 +161 0 1 +1674 17 31 +641 0 1 +841 11 10 +929 1 1 +48 1 1 +422 1 1 +19 1 1 +939 1 1 +18 2 2 +583 1 1 +74 1 1 +785 1 1 +43 1 1 +1830 10 10 +339 1 1 +117 1 1 +306 0 1 +213 1 1 +75 1 1 +2056 1 0 +1637 1 0 +5087 0 4 +973 1 1 +35 1 1 +1393 0 1 +307 1 0 +747 2 7 +1501 19 18 +246 1 1 +32 1 1 +1887 1 1 +23 1 1 +513 10 10 +810 1 1 +45 1 1 +84 1 1 +32 11 11 +134 15 15 +176 1 1 +39 3 3 +175 1 1 +20 1 1 +82 31 31 +1015 9 9 +518 14 14 +2796 1 1 +76 1 1 +5240 0 7 +1110 4 0 +674 1 0 +862 16 16 +4291 30 0 +89 0 1 +1111 5 2 +461 10 10 +2903 1 1 +26 1 1 +2997 1 0 +327 0 1 +1792 1 0 +1866 1 0 +1088 0 1 +21 1 1 +1515 3 2 +384 0 1 +968 4 4 +4281 6 6 +606 140 20 +2784 1 1 +32 1 1 +98 3 11 +196 7 7 +3895 1 0 +1768 3 0 +771 2 0 +913 1 0 +6074 1 0 +20 1 1 +834 2 0 +485 0 2 +1911 2 0 +313 1 0 +474123 10 10 +3764 5 0 +1927 0 1 +384 3 0 +1615 1 0 +5132 1 0 +14253 0 1 +5069 0 1 +510 0 4 +5945 0 1 +614 1 0 +5313 0 1 +10287 2 0 +13730 4 0 +414 8 0 +28 2 0 +1877 2 0 +15 1 1 +671 2 0 +8230 0 1 +10435 20 20 +567 2 132 +66 194 0 +164 51 2 +66 1 0 +44 1 1 +72 1 1 +22 0 50 +1059 1 1 +21 1 1 +4184 0 1 +320 3 4 +1333 1 1 +16 1 1 +875 1 1 +44 1 1 +1975 1 1 +20 1 1 +839 1 1 +35 1 1 +3437 0 1 +1552 1 0 +1815 0 1 +139 0 2 +4684 5 0 +3459 5 7 +3705 5 5 +8504 1 1 +28 1 1 +525 4 0 +667 1 0 +497 11 12 +69 1 0 +1076 0 1 +1362 4 0 +874 1 0 +305 1 1 +34 1 1 +1182 1 0 +5299 2 0 +2997 4 0 +60 2 0 +79 1 0 +1016 17 16 +1130 1 93 +398 108 0 +51 2 0 +91 41 1 +198 1 53 +129 1 1 +217 1 1 +48 0 2 +20 1 1 +98 0 1 +38 0 160 +122 0 2 +237 2 40 +8979 1 0 +117 1 2 +6501 2 0 +551 0 3 +2933 3 0 +1132 0 1 +2695 4 4 +3252 0 2 +2345 0 2 +565 0 1 +893 1 1 +50 1 1 +165 0 3 +859 295 0 +3516 4 0 +7207 0 1 +516 2 0 +6627 0 1 +1833 0 17 +2892 19 47 +15701 0 346 +3850 1 0 +270 0 4 +37 4 0 +690 4 4 +2415 0 2 +230 2 0 +3573 1 1 +17 1 1 +98 9 9 +1174 0 1 +4598 0 2 +3458 0 1 +377 11 0 +2756 0 1 +331 3 0 +1560 0 1 +694 0 1 +4590 1 0 +2233 12 12 +1905 0 66 +3214 1 0 +3063 2 0 +1509 0 8 +2393 26 0 +783 4 0 +584 2 0 +480 1 0 +2071 2 0 +50 0 6 +623 6 6 +5443 0 12 +387 8 8 +57 2 0 +4157 4 0 +214 1 0 +86 3 0 +2188 1 0 +6724 0 1 +1240 1 1 +42 0 3 +2148 0 1 +963 7 0 +4625 7 10 +2508 6 14 +7518 0 1 +3523 0 3 +84 0 1 +2575 12 18 +1249 1 1 +31 1 1 +1191 0 1 +5966 0 1 +9195 0 2 +57922 8 0 +76361 0 117987 +181094 1 0 +1621 14946 27 +2254 5 5 +9078 0 1 +490 1 0 +43 1 1 +3457 1 1 +44 1 1 +8051 1 1 +19 1 1 +147692 1 0 +1939 0 1 +1316 1 1 +46 1 1 +5540 1 0 +5201 1 0 +30523 2 0 +2437 1 1 +46 1 1 +20670 0 1 +16523 0 1 +6574 0 2 +321 0 2 +69 2 0 +30 0 86 +2354 0 1 +7531 0 29 +2062 1 1 +41 1 1 +485 1 1 +35 1 1 +6370 0 1 +2204 1 0 +33 1 1 +7148 6 6 +112 1 1 +37 1 1 +1325 1 0 +5389 2 0 +482 4 0 +1955 1 0 +1005 0 10 +11217 11 11 +1529 4 4 +967 1 1 +27 1 1 +2302 5 0 +3782 1 1 +39 1 1 +93 0 1 +633 0 1 +2273 1 0 +2921 1 1 +36 1 1 +1819 1 7 +53 14 14 +113 1 1 +24 1 1 +875 1 1 +29 1 1 +5561 1 1 +46 1 1 +76 4 4 +679 5 0 +169 6 6 +272 7 7 +6359 1 0 +3262 7 0 +3664 1 1 +31 1 1 +82 1 1 +38 1 1 +2880 1 0 +52 2 0 +6575 0 16 +224 0 1 +2651 4 0 +45 4 0 +7285 1 0 +423 3 0 +853 4 0 +589 10 0 +1020 3 0 +5670 0 1 +12993 0 1 +4750 1 0 +788 0 1 +1374 1 1 +32 1 1 +5840 1 1 +38 1 0 +849 2 0 +854 1 1 +38 2 2 +183 0 2 +5748 8 0 +8852 1 1 +47 1 1 +2278 1 1 +32 1 1 +636 0 2 +2132 0 1 +5831 1 0 +7134 3 2 +1509 0 2 +372 0 4 +12282 1 0 +2094 1 1 +10 1 1 +3546 0 1 +6957 3 0 +4952 0 2 +1170 0 1 +821 2 0 +344 12 10 +254 1 1 +46 1 1 +840 0 12 +144 10 9 +2781 1 1 +21 1 1 +54 8 4 +2777 1 0 +22 1 1 +3490 0 1 +1962 0 2 +283 7 7 +2150 1 0 +480 1 1 +41 1 1 +2461 8 8 +148 0 1 +1530 19 17 +415 0 1 +107 1 1 +48 1 0 +342 1 1 +69 1 1 +460 6 6 +287 15 15 +74 1 1 +20 2 2 +908 1 1 +54 1 1 +188 1 1 +22 1 1 +333 1 0 +70 18 18 +327 1 1 +26 1 1 +1403 1 1 +41 1 1 +819 1 1 +19 1 1 +279 1 1 +34 1 1 +6167 4 0 +38 6 0 +3773 0 3 +2853 1 1 +45 1 1 +323 6 0 +386 10 0 +304 1 1 +20 1 1 +1466 0 1 +1084 11 11 +189 0 1 +2312 1 1 +24 1 1 +877 1 1 +22 0 1 +1009 7 26 +9595 50000 47192 +531424 0 1 +1782 1 0 +18 1 1 +6900 1 0 +16739 0 1 +5023 0 1 +1051 7 11 +15413 1 1 +34 1 1 +2823091 0 2 +426 0 4 +20442 8 0 +57542 0 7 +34153 0 29 +17 4 0 +6 3 0 +18 0 26 +22 1 1 +26079 0 3 +3925 0 1 +29887 0 51 +10003 1 0 +459 0 3 +3686 1 1 +48 1 1 +4059 13 13 +2603 4 4 +2259 12 15 +2822 0 1 +10930 0 1 +291 1 1 +15 1 1 +11719 4 0 +5381 0 2 +4197 0 4 +548 6 0 +2026 1 0 +7855 2 0 +475128 0 1 +135227 5 5 +27617 50000 50000 +715405 0 1 +1539746 0 1 +18214 0 1 +475826 0 1 +1144749 0 1 +784530 18 0 +213 0 2 +65 12 0 +16 120 0 +2159 1 1 +46 1 1 +1029 15 15 +3142 0 1 +2543 1 0 +4527 1 0 +5430 44 43 +19694 0 1 +30 0 1 +1316 1 0 +217 14 13 +1023 0 1 +2060 1 0 +1649 0 1 +6693 24 26 +977 0 1 +3043 0 1 +5001 0 1 +2319 0 1 +7698 26 26 +75 0 1 +58 1 0 +1091 1 0 +662 8 7 +6717 0 1 +2877 0 1 +14768 5 7 +7399 0 1 +3665 0 1 +2053 0 1 +3235 0 1 +6 0 1 +4 0 1 +17 0 1 +32 0 1 +3734 0 1 +25 0 2 +31 0 1 +7042 4 0 +287863 1 0 +1009231 1 1 +16 1 1 +344271 0 1 +37376 0 1 +392869 0 1 +4679 0 1 +31692 4 4 +273296 0 1 +41728 0 1 +127704 1 0 +652693 0 1 +802037 0 1 +282230 0 1 +58997 0 1 +5841 1 0 +71030 0 1 +1438008 1 1 +42 1 1 +11021 24 0 +6309 4 0 +1613 0 1 +5689 1 0 +17074 1 0 +9818 6 0 +1594 1 1 +35 1 1 +1058 1 0 +123 1 0 +875 5 10 +483 0 1 +617 6 0 +2112 1 0 +2579 0 1 +1292 2 0 +10591 1 1 +24 1 1 +1764 1 1 +47 1 1 +1263 0 1 +1338 1 0 +7260 48 47 +75 1 1 +17 1 1 +303 7 7 +1166 1 1 +75 1 1 +1099 1 1 +35 1 1 +152 1 0 +1286 18 0 +1373 16 16 +1591 0 4 +182 0 1 +2057210 0 1 +321822 1 0 +1418 1 0 +30792 1 0 +1017723 384 0 +26 38 0 +74 0 42 +70 0 484 +3657 2 0 +21839 0 1 +12357 0 2 +12460 0 1 +17105 4 0 +4757 3 0 +31051 0 1 +4880 10 0 +1196 4 0 +1590 2 0 +4052 1 0 +19725 1 0 +7568 0 1 +5369 0 1 +7019 0 14 +18365 15 15 +881 0 6 +44720 0 1 +311540 0 210 +60835 1 1 +34 1 1 +5204 3 0 +817 14 0 +423 1 1 +46 9 8 +1888 28 0 +3923 1 0 +1089 34531 0 +3321 5 9 +230 73 0 +26 14 2 +28 58 0 +498 1 0 +10201 0 2 +771 0 4 +64 4 0 +17597 1 1 +35 1 1 +6142 87 0 +53 2 3 +28 12 15 +17 2 10 +20 26 0 +224 6 0 +795 9 9 +666 1 1 +24 1 1 +567 0 34549 +1941 1 1 +22 1 0 +500 78 78 +1116 49 49 +438 4 2 +863 1 3 +356 0 4 +1202 24 24 +89 0 4 +186 1 3 +729 8 0 +1503 17 18 +642 1 1 +43 1 1 +3663 38 41 +825 10 10 +129 43 43 +42 0 1 +2130 0 17270 +567 0 3 +278 216 216 +188 55 55 +145 25 25 +1437 3 0 +57 5 5 +33 1 1 +1662 45 43 +863 0 1 +2580 8 0 +3497 16 17299 +2239 10 11 +107 0 3 +1709 2 0 +1556 1 3 +513 0 1 +400 1 1 +43 1 1 +1901 1 0 +1102 3 0 +209 49 49 +423 0 2 +1435 0 4 +768 1 17275 +23 1 1 +290 1 1 +33 4 4 +155 0 4 +349 0 4 +2184 1 0 +2969 8 0 +638 1 1 +36 1 1 +2513083 0 1 +77105 1 0 +10956 2 0 +192273 1 0 +547490 0 1 +33883 0 1 +45135 0 1 +838757 3 0 +13938 1 0 +51 1 1 +1258 0 1 +4627 0 4 +81 2 0 +134 0 2 +5361 10 8 +9065 4 0 +5047 4 0 +4104 0 12 +4513 0 1 +1084 0 1 +1732 0 4 +3756 4 4 +3847 2 0 +4310 14 13 +1597 1 1 +49 1 1 +56 12 12 +814 1 1 +22 0 1 +187 4 0 +1690 1 1 +26 1 1 +5546 3 3 +37 1 1 +176 15 15 +5745 8 0 +2713 2 0 +7312 0 1 +758623 12012 7 +3148 0 1 +3216 0 4 +574 1 0 +1023 2 0 +38 8 0 +19295 8 0 +1651 4 0 +5169 0 2 +14224 2 1 +43 0 1 +4147 23 22 +455 1 0 +4530 0 1 +1044 1 1 +33 1 1 +3418 0 1 +362 1 1 +32 2 0 +865 1 1 +43 1 1 +183 1 1 +21 1 1 +62 7 6 +55 2 0 +128 1 1 +3019 3 0 +5553 1 1 +35 0 1 +2418 1 0 +387 0 5 +529 6 0 +1660 0 4 +4106 0 6 +4082 0 9 +2007 2 0 +6981 9 0 +3 4 0 +1231 1 1 +25 1 1 +306 44 50 +1351 0 6 +77 1 2 +3092 0 1 +230 0 2 +26 1 1 +182 24 25 +2877 15 14 +3242 4 0 +3117 5 0 +457 1 0 +4391 1 0 +179 0 1 +412 1 1 +45 1 1 +5535 4 0 +4958 0 1 +2636 0 1 +5750 0 2 +2057 0 1 +1365 16 0 +7741 1 0 +4690 0 3 +7672 1 1 +44 1 1 +386 6 7 +1343 1 0 +89 0 12 +4129 1 1 +45 1 1 +2602 0 1 +8771 0 8 +14302 0 2 +7026 1 1 +45 1 0 +367 1 0 +1414 1 0 +24 1 1 +2049 2 0 +6504 1 1 +34 0 1 +7977 1 0 +1387 0 1 +750 11 11 +4654 1 1 +23 1 1 +2188 4 4 +6298 1 1 +41 1 1 +2978 1 1 +24 1 1 +311 1 1 +68 9 38 +61 4 1 +442 10 30 +84 1 1 +33 5 5 +4691 114 114 +391 1 1 +38 1 1 +171 44 44 +10 1 1 +521 1 1 +28 1 1 +124 12 16 +282 0 1 +170 1 1 +10 0 1 +4 1 0 +109 1 1 +3153 1 0 +2123 1 1 +81 1 1 +2056 1 1 +30 1 1 +5195 1 1 +28 1 1 +1348 8 6 +2373 5 0 +4846 6 0 +6055 0 2 +11238 2 0 +507 1 1 +20 1 1 +7135 2 0 +9 1 1 +54548 1 1 +24 1 1 +2989 1 0 +2933 4 0 +464 1 1 +48 1 1 +2753 1 0 +1361 8 0 +44 0 1 +420 1 1 +44 1 1 +557 1 1 +35 1 1 +2631 1 1 +45 1 1 +459 1 1 +51 1 1 +280 1 1 +30 1 1 +18721 3 0 +1540 4 0 +3139 0 1 +2271 0 4 +1558 1 1 +29 1 1 +9617 0 1 +1865 0 4 +1819 0 1 +1667 19 47 +51 0 2 +34 0 2 +42 1 45 +1794 0 2 +2883 0 2 +18 1 1 +646 0 1 +3148 0 3 +3197 17 17 +71 1 1 +20 0 1 +580 1 1 +39 1 1 +1256 0 3 +1929 1 1 +25 1 1 +279 1 1 +90 1 1 +114 2 1 +602 0 1 +116 9 9 +2253 0 6055 +841 6 6 +1157 5 1 +178 8 8 +2183 12 12 +8515 0 26 +616 6 0 +45 0 6 +396 0 1 +2036 16 16 +817 8 0 +292 0 1 +71 1 1 +46 1 1 +4257 1 0 +42 1 1 +1650 1 1 +105 1 1 +6310 11 11 +3344 0 1 +24489 1 0 +15100 0 1 +3254 14 0 +9 1 0 +805 0 6 +4099 3 0 +33 61 0 +75 3 1 +1583 0 14 +6362 4 0 +1147 1 1 +35 1 1 +76 1 1 +53 1 1 +316 0 2 +917 1 0 +13778 1 1 +32 0 2 +1065 0 4 +422 1 0 +14 0 1 +1640 1 1 +57 2 1 +549 0 4 +346 24 31 +108 10 10 +208 19 19 +155 0 1 +36 1 0 +25 1 1 +106 1 1 +30 1 1 +161 1 1 +89 1 1 +729 9 9 +1531 1 1 +47 1 1 +837 1 1 +20 1 1 +177 3 0 +34 1 1 +68 0 2 +455 8 8 +463 7 7 +1989 1 1 +20 1 1 +190 20 0 +130 1 1 +52 1 1 +9953 5 0 +2219 1 0 +17687 50 0 +3244 2 0 +3365 1 1 +68 1 1 +57 1 1 +32 2 2 +332 1 1 +25 1 1 +1420 1 0 +2824 5 0 +6201 1 0 +2849 1 1 +41 1 1 +178 1 1 +68 1 1 +1063 1 0 +2154 0 1 +18670 1 0 +436 0 1 +8081 2 0 +17054 1 0 +6442 0 1 +6163 3 0 +84 0 1 +1233 5 5 +551 1 1 +35 1 1 +494 16 0 +57 1 3 +338 0 4 +862 2 0 +217 5 5 +21 1 1 +1177 1 1 +21 1 1 +423 3 0 +343 1 0 +3837 1 0 +2117 2 0 +310 1 0 +4558 6 0 +9272 1 1 +75 2 2 +4575 3 0 +4702 15 15 +898 0 4 +8137 2 3 +3447 1 1 +36 1 1 +20218 30 0 +26 4 0 +99 0 8 +1103 2 0 +2375 0 1 +5192 1 0 +2681 0 1 +2803 10 0 +1177 1 0 +229 3 0 +3484 0 2 +243 2 0 +86 4 0 +2862 1 1 +66 1 1 +3926 1 0 +477 0 1 +126 24 24 +2192 0 3 +1711 0 4 +2347 0 1 +1501 12 0 +75 0 418 +429 36 0 +48 0 12 +997 4 4 +66 0 8 +5286 0 14 +738 0 3 +2469 1 1 +34 1 1 +1491690 0 3 +4802 5 5 +3338 1 0 +1402 4 0 +2780 1 1 +40 4 4 +889 0 2 +1949 0 2 +1138 0 4 +1251 0 3 +7827 4 3 +19 1 1 +4494 1 1 +36 1 1 +5836 0 1 +7043 15 0 +2489 1 0 +6 2 0 +800 12 12 +561 0 1 +1301 1 1 +68 1 1 +6913 1 0 +1131 1 1 +46 1 1 +4603 0 1 +3233 1 1 +50 1 1 +1727 1 0 +506 0 1 +845 1 1 +28 1 1 +3113 1 1 +30 1 1 +6857 0 1 +48576 1 0 +20324 1 0 +1139 1 0 +20877 1 1 +46 1 1 +534 0 1 +849 0 1 +41 1 1 +466 1 1 +29 1 1 +9170 16 25 +10345 0 3 +14008 1 0 +16204 0 2 +361 1 1 +67 1 1 +1129 1 1 +19 1 1 +292 1 1 +24 1 1 +273 1 1 +33 1 1 +3133 0 1 +2591 1 0 +2550 0 1 +23 1 1 +514 1 1 +25 1 1 +177 7 8 +1764 1 1 +123 1 1 +81 1 1 +57 0 4 +420 1 1 +27 1 2 +603 1 0 +528 1 1 +42 16 1 +330 1 1 +44 1 1 +1036 1 1 +39 1 1 +396 1 1 +17 1 1 +751 1 1 +30 28 0 +390 1 1 +37 1 1 +343 0 2 +581 1 1 +49 1 1 +201 1 1 +27 1 0 +35 1 1 +557 1 1 +36 1 1 +38 0 2 +2243 3 3 +71 1 1 +1030 1 1 +37 1 1 +3461 2 0 +23 6 0 +489 14 13 +1533 5 0 +1694 9 9 +4683 1 1 +47 1 1 +881 0 1 +114 11 11 +1487 1 1 +190 5 5 +56 1 1 +23 1 0 +294 1 1 +34 1 1 +127 1 1 +33 1 1 +1191 1 1 +8 5 0 +44 1 1 +288 1 1 +33 1 1 +2223 1 1 +71 1 1 +993 0 1 +5878 4 0 +8587 3 0 +2002 18 19 +2711 15 15 +1065 6 0 +1510 1 1 +66 1 1 +2067 0 1 +2453 1 1 +34 1 1 +122 0 1 +9036 1 1 +19 1 1 +318 4 0 +1819 0 3 +73 0 6 +3078 0 7 +320 1 0 +6708 4 0 +2097 6 0 +3206 0 16 +4086 0 1 +17 1 1 +4801 0 2 +1390 7 7 +1846 8 8 +1630 0 2 +119 0 8 +4129 14 14 +173 0 2 +1208 0 1 +2154 0 1 +6544 17 17 +3443 1 0 +15 1 1 +462 3 0 +54 10 10 +8049 0 4 +1424 0 1 +967 0 3 +5475 1 0 +2027 0 1 +1517 11 0 +3668 1 1 +19 4 4 +2758 3 0 +233 16 20 +687 4 0 +616 36 27 +879 1 0 +2944 0 10 +629 9 9 +171 1 9 +55 4 0 +2844 18 18 +9966 0 52 +61 0 1544 +120 45 2030 +35 0 27 +29 0 1126 +4074 1 1 +31 1 1 +188 0 3 +4439 0 2 +2719 0 1 +1772 5 0 +718 0 2 +4009 1 1 +18 1 0 +4639 1 0 +222 13 13 +8673 12 0 +987 0 1 +834 1 0 +997 6 0 +17040 2 0 +3825 0 10 +1355 1 1 +55 4 0 +967 1 1 +45 1 1 +4880 14 15 +94 16 16 +1180 1 0 +1067 1 0 +701 6 6 +1928 1 1 +18 1 1 +226 1 1 +40 1 1 +3823 1 1 +34 1 1 +123273 2 3 +11549 0 2 +5911 0 2 +30 1 0 +379 0 1 +169 1 0 +279 0 1 +1897 1 0 +518 1 1 +48 22 0 +3061 1 0 +952 0 13 +1008 3 0 +1692 1 0 +462 0 3 +1998 1 1 +141 3 3 +1147 5 0 +1240 0 4 +2889 2 0 +4842 1 0 +8175 1 0 +2323 0 1 +2999 0 1 +383 8 8 +1656 0 1 +249 0 1 +7710 0 1 +447 16 12 +1141 0 4 +681 0 8 +898 14 0 +4197 0 1 +2950 2 0 +2428 0 1 +2916 0 2 +351555 1 0 +1652 20 0 +218 11 15 +694 1 0 +142 1 1 +48 1 1 +2352 3 0 +20 1 1 +6999 0 2 +186 1 1 +43 1 1 +547 1 1 +26 1 1 +14450 1 2 +1128 0 8 +3085 0 1 +2385 0 6 +4858 27 23 +3338 1 1 +15 1 1 +433 1 0 +1555 0 2 +442 12 0 +5737 0 1 +6133 4 0 +43 5 0 +340 0 35 +589 4 0 +868 2 0 +387 1 0 +2509 0 3 +235 0 1 +635 1 1 +34 1 1 +3791 15 16 +5105 1 0 +1016 0 5 +1844 1 1 +24 1 1 +249 1 1 +41 2 7 +621 3 1 +8235 1 0 +5973 1 0 +25731 1 1 +29 1 0 +22493 71 0 +2108 50000 51649 +47 23 0 +307 25 0 +289 0 1 +16486 0 1 +165 0 13 +3173 1 1 +19 1 1 +454 17 17 +623 1 0 +4621 0 5 +792 17 17 +698 0 4 +421 1 1 +30 1 1 +304 1 1 +63 1 1 +1014 0 2 +355 0 1 +9805 1 1 +14 1 1 +632 1 0 +8 1 1 +1819 0 2 +1772 0 1 +2528 3 4 +1825 0 4 +83 1 1 +2771 0 2 +18 1 1 +401 0 8 +1842 0 1 +2387 9 9 +358233 0 1 +408638 0 1 +22149 0 1 +2608962 1 0 +13051 1 0 +465901 0 1 +46017 1 0 +57869 1 0 +171566 3 0 +165300 5 0 +8377 13 12 +537672 1 0 +105741 0 1 +11146 1 0 +3446 10 2 +318 2 0 +1087 0 1 +966 0 2 +28 1 1 +441 1 0 +1369 1 1 +65 1 1 +4305 1 1 +33 1 1 +4067 0 2 +1871 0 1 +398 0 1 +2219 1 1 +53 1 1 +756 1 1 +66 1 1 +69 1 1 +48 1 1 +63 1 1 +28 0 3 +1057 0 3 +63 13 10 +281 3 0 +181 0 3 +1210 9 9 +54 1 1 +27 1 1 +1375 1 0 +1203 1 1 +45 27 0 +499 2 17 +764 14 14 +331 16 16 +2291 4 3 +1687 1 1 +26 1 1 +2469 0 1 +6880 1 1 +24 1 1 +615 0 1 +2566 1 0 +275 0 5 +690 0 7 +13139 1 0 +1452 0 2 +214 13 13 +61 124 0 +1381 9 9 +11541 1 0 +4006 0 1 +950 8 0 +504 0 4 +6753 2 0 +715 12 10 +1966 2 0 +2808 16 0 +611 1 0 +424 4 0 +715 1 1 +31 1 1 +4372 0 4 +10789 0 1 +2399 0 1 +6750 2 0 +1363 0 27 +2516 0 1 +4220 0 2 +4457 16 0 +7855 0 1 +11080 1 0 +2652 0 1 +18878 0 1 +1502 0 1 +3722 0 6 +52721 1 0 +30768 0 3 +5675 4 0 +979 1 0 +4019 0 1 +40641 13 13 +1285 50000 2858 +47 5 0 +358 1 0 +1755 27 27 +924 2 0 +20654 0 12 +30194 0 26 +6740 0 1 +14931 50001 10556 +45879 1 0 +12404 2 0 +2768 0 1 +9413 14 15 +5412 12 0 +145082 0 1 +87592 1 0 +104 3 1 +63 2 0 +7304 1 0 +764 1 1 +43 1 1 +100 0 16 +5028 2 0 +282 2 0 +2924 1 1 +48 1 1 +94 1 1 +23 1 1 +8756 0 3 +4221 0 10 +7254 5 2 +7523 0 1 +7425 1 1 +139 5 5 +432 5 0 +4583 10 0 +4927 10 8 +976 3 0 +173 4 5 +2913 5 4 +6172 2 0 +2910 1 2 +12312 2 0 +16275 0 4 +1217 0 1 +74 1 1 +88 2 0 +530 15 0 +898 8 8 +2604 1 0 +6235 6 0 +3780 19 19 +262 1 1 +41 1 1 +192 6 7 +376 8 8 +12076 13 13 +2402 0 1 +3638 1 1 +38 14 0 +5537 1 1 +38 1 1 +3519 2 1 +3610 1 3 +4349 2 0 +5065 17 17 +11228 1 0 +8617 14726 14721 +5984 2 0 +2218 1 1 +37 1 1 +1859 0 13 +13 1 1 +2425 1 0 +1379 0 3 +330 1 1 +18 1 0 +6228 0 1 +5412 5 0 +1572 1 1 +132 1 1 +6389 14 14 +11081 1 1 +20 1 1 +6375 6 0 +8213 1 1 +28 2 0 +10 1 1 +4733 0 8 +13234 4 0 +2396 9 8 +3171 1 1 +18 0 1 +13601 1 1 +41 1 1 +2306 0 1 +2959 1 0 +1085 0 64 +10 0 1 +29 35 0 +37 130 0 +15 22 0 +10 21 0 +10 27 0 +62 19 0 +1983 2 5 +5542 0 2 +4693 0 6 +195 1 0 +13043 4 0 +41 1 1 +12765 0 1 +1600 5 6 +2388 0 1 +14434 6 0 +1278 4 0 +7895 2 0 +9116 2 0 +12800 3 0 +1570 6 0 +99732 0 1 +6176 12 12 +45711 1 0 +263084 0 1 +734253 0 1 +1439 1 0 +824638 20 20 +11409 1 0 +7687 2 0 +4453 1 0 +3714 0 22 +26627 6 0 +791 1 0 +8200 2 0 +6279 2 0 +5143 6 0 +9815 2 0 +2664 1 0 +1272 0 14 +11465 4 0 +237 2 0 +50 0 4 +1839 8 0 +2087 1 0 +4749 2 0 +795 1 0 +94 1 0 +2112 2 0 +505 1 1 +7 1 0 +17 1 1 +3620 1 1 +33 1 1 +91 1 1 +30 2 2 +127 1 1 +36 1 1 +84 1 1 +27 1 1 +58 1 1 +30 1 1 +57 1 1 +29 1 1 +62 1 1 +24 1 1 +252 5 5 +3469 4 0 +3782 1 0 +249 39 33 +12508 4 4 +855 22041 22000 +1276 0 4 +2984 0 2 +8358 7 1 +1181 4 0 +57 0 18 +2603 5 5 +45 1 1 +3790 4 4 +1053 5 5 +252 1 1 +24 1 1 +62 1 1 +29 1 1 +57 1 1 +30 1 1 +58 1 1 +27 1 1 +84 1 1 +36 1 1 +127 2 2 +30 1 1 +91 1 1 +33 1 1 +489 9 9 +1465 0 7 +1450 14 0 +704 0 2 +120 1 0 +1988 1 0 +1153 0 1 +4674 1 0 +3434 1 0 +326 0 2 +37 0 2 +24 20 0 +33 1 1 +146 4 0 +5554 1 1 +48 1 1 +7948 0 1 +495 0 3 +905 0 1 +2649 3 3 +113 0 1 +69 0 1 +51 0 1 +4646 0 2 +3361 0 2 +9852 14 2 +188903 1 1 +37 1 1 +12733 0 3 +564 1 1 +20 1 1 +814 0 8 +1407 2 0 +13 1 1 +2054 1 1 +35 4 0 +381 16 16 +349 1 1 +63 24 0 +101 0 122 +44 0 96 +2577 1 1 +42 1 1 +325 20 20 +1768 1 0 +46 1 1 +907 1 1 +41 1 1 +699 1 1 +47 1 1 +307 20 19 +3171 1 1 +33 1 1 +1714 4 0 +60 1 1 +105 7 0 +122 1 1 +18 1 1 +3601 0 2 +5631 0 1 +1379 3 0 +1384 1 0 +3086 0 2 +2810 1 1 +28 1 1 +2376 3 0 +938 1 1 +24 1 1 +1046 6 0 +7256 15 0 +1622 2 0 +9805 97464 0 +380 1 3 +3445 8 4 +38 4 0 +6786 1 1 +22 1 0 +988 0 33 +2002 7 0 +5174 1 1 +42 1 1 +863 0 2 +7690 0 1 +1119 0 26 +2931 1 1 +35 1 1 +5314 0 4 +34 1 1 +9493 0 378 +4011 0 2 +4007 0 4 +2362 0 4 +446 6 9 +6102 4 2 +3369 1 0 +1765 2 0 +311 16 16 +349 101011 100995 +2431 2 0 +797 0 1 +2582 2 4 +1432 33 0 +48 4 0 +3219 1 1 +31 1 1 +518 0 5 +2254 1 1 +17 1 1 +690 8 8 +1805 2 0 +8 2 0 +223 2 0 +2585 2 0 +1030 0 2 +54 0 2 +1280 1 1 +15 1 1 +4592 2 5 +6991 1 0 +315903 0 1 +33 0 1 +96 0 1 +37426 0 1 +12167 1 0 +84830 0 1 +27272 1 0 +123402 0 1 +36776 0 1 +4794 1 0 +2860 0 1 +14058 0 1 +4360 0 1 +130760 1 0 +4900 1 0 +1421 1 0 +713 0 1 +4083 6 2 +162 1 0 +4485 1 0 +1332 0 1 +2333 0 1 +584 1 0 +2492 2 0 +974 4 12 +3298 16 0 +381 1 0 +2180 1 0 +3776 1 0 +3250 20 21 +1695 4 0 +2981 0 1 +577 0 2 +2834 0 1 +3761 0 1 +2993 9 1 +1513 0 1 +1907 0 1 +5932 0 1 +6297 0 1 +4660 0 1 +2473 59 58 +1022 13 13 +1114 1 1 +59 2 0 +11494 13 15 +5124 28 28 +409 37 38 +392 2 0 +42 8 0 +1262 6 0 +1136 23 23 +6749 1 0 +10398 6 4 +7006 1 0 +4488 9 27 +5126 28 28 +409 40 37 +392 0 2 +1308 0 5 +6290 0 1 +24195 4 0 +12578 0 1 +151 45 42 +68 6 8 +1043 0 1 +148 0 1 +126 36 36 +83 1 0 +51 0 1 +239 15 15 +117 1 0 +92 0 37118 +1934 0 1 +1955 0 1 +2742 0 1 +4479 1 0 +6702 0 1 +3323 0 1 +1918 0 2 +2182 0 1 +784 0 1 +908 1 0 +2235 0 1 +6857 4 0 +13041 18 0 +34285 0 8 +14608 0 18 +4951 0 1 +6456 1 1 +37 1 1 +4416 1 0 +296 0 1 +553 0 5 +4501 1 0 +2983 1 0 +10 1 1 +628 0 1 +533 2 0 +92 9 9 +7362 1 1 +118 3 0 +812 1 0 +1653 2 0 +1719 1 0 +12030 1 0 +4715 1 0 +9337 0 1 +3172 0 7 +5461 3 0 +11943 0 1 +463 0 2 +320 0 1 +1358 1 0 +1243 0 1 +2651 1 0 +929 1 0 +629 0 2 +9714 0 1 +2322 8 0 +1226 4 0 +124 1 1 +28 1 1 +919 1 0 +227 5 22 +1407 1 1 +44 1 1 +374 4 0 +37 1 1 +327 0 9 +52 3 0 +2006 1 0 +462 1 0 +1265 1 0 +1725 0 3 +458 0 1 +5860 2 0 +1714 13 22 +6437 0 1 +376 0 3 +639 0 98 +113 0 8 +1845 10 10 +37 1 1 +610 2 0 +74 3 0 +1831 0 2 +534 1 0 +1874 17 21 +1420 0 1 +959 2 0 +8830 0 1 +2647 1 0 +6489 18 18 +17683 1 1 +33 1 1 +523 2 0 +1654 14 0 +3731 3 0 +453 0 3 +1020 77 42 +54 0 8 +168 4 0 +1815 1 0 +7749 1 0 +3395 0 5 +2007 1 0 +37 1 1 +3200 17 14 +3727 0 2 +6216 0 12 +2441 4 0 +10522 3 0 +5254 0 5 +9474 0 4 +1690 1 0 +1820 4 0 +166 0 16 +94 30 0 +994 0 3 +473 3 0 +3708 14 0 +1682 1 6 +522 1 1 +33 1 1 +1800 0 1 +30839 86 83 +9104 0 1 +6197 0 1 +505008 1 0 +1140 1 0 +12456 1 0 +3100 1 1 +11 1 1 +5395 0 1 +8451 4 0 +5165 1 0 +5746 0 1 +10499 2 0 +4485 2 0 +71 0 15 +576 1 1 +61 1 1 +7826 900 11 +18 125 0 +69 1 0 +7149 1 1 +22 1 1 +433 1 0 +1033 0 1 +2155 2 0 +842 1 1 +34 4 0 +883 0 1 +784 1 1 +46 1 1 +3644 8 9 +5645 1 1 +18 1 1 +3805 2 0 +8285 2 2 +229 8 0 +2684 0 1 +1344 0 1 +1055 45 29 +3166 4 4 +3318 12 12 +377 1 1 +76 1 1 +5828 0 1 +13640 4 0 +1453 0 4 +6878 0 3 +8667 1 1 +17 1 1 +5260 5 1 +1919 1 0 +1038 1 3 +1349 1 0 +292 2 1 +19636 251 4 +19 135 9 +39 4 42 +25796 25 13 +5980 1 1 +80 1 1 +13911 0 1 +1966 1 0 +301464 1 0 +78579 1 0 +63496 1 0 +3157 0 1 +30382 1 0 +54148 1 0 +80975 + +chain 12216889 X 155270560 + 52245359 52395914 chrX 156040895 - 103530224 103680779 372 +8454 10033 10033 +12180 69 69 +119819 + +chain 9374275 X 155270560 + 152414898 152523188 chrX 156040895 - 2790411 2898683 354 +992 1 0 +589 14 14 +659 1 0 +7427 0 1 +2011 9 9 +7485 1 0 +561 1 0 +2977 1 1 +17 1 1 +3721 1 0 +13270 0 1 +13239 12 0 +7168 2 0 +13431 3 1 +8274 0 4 +5337 2 0 +356 4 0 +9676 0 5 +3768 7246 7244 +33 + +chain 4747746 X 155270560 + 52487412 52549713 chrX 156040895 - 103499903 103548711 970 +115 154 154 +120 47 47 +67 892 810 +82 649 165 +144 0 1 +13763 1 0 +3082 0 1 +1904 12 0 +8799 1 0 +235 0 1 +1237 0 8 +8197 12892 0 +910 1 2 +5850 1 0 +2919 32 0 +195 + +chain 3916095 X 155270560 + 152248402 152345763 chrX 156040895 - 2810284 2970783 1284 +28697 54743 117873 +284 4 12 +3445 1 3 +379 2 0 +3404 14 14 +846 1236 1236 +4306 + +chain 3463593 X 155270560 + 52446083 52489538 chrX 156040895 + 52430000 52473455 1115 +22316 60 60 +71 313 313 +45 56 56 +58 114 114 +385 185 185 +129 74 74 +91 127 127 +632 151 151 +54 138 138 +27 88 88 +87 161 161 +82 91 91 +935 4964 4964 +9895 115 115 +154 120 120 +47 67 67 +892 82 82 +649 + +chain 2111522 X 155270560 + 1110464 1134113 chrX 156040895 + 1086555 1110210 2036 +1594 90 89 +123 314 0 +134 1 0 +2227 35 35 +439 12 12 +148 45 45 +43 0 4 +322 24 24 +175 8 8 +444 0 135 +303 135 0 +83 6 6 +137 0 3 +365 23 23 +542 0 1 +525 2 0 +1746 29 29 +1760 2 0 +3594 0 120 +1856 7 7 +696 40 40 +424 0 4 +1180 57 60 +120 255 434 +65 25 25 +69 0 4 +138 28 32 +945 30 30 +1551 0 4 +733 + +chain 2084698 X 155270560 + 151891489 151913530 chrX 156040895 - 3295424 3317424 676 +6546 1 0 +4784 1 0 +164 1 1 +37 1 1 +507 1 1 +29 1 1 +1663 1 0 +1187 1 1 +35 1 1 +60 16 16 +426 39 1 +969 4 4 +25 1 1 +1290 1 1 +23 1 1 +2304 1 1 +64 1 1 +1855 + +chain 1882073 X 155270560 + 46810804 46830728 chrX 156040895 - 109069589 109089510 2240 +174 0 2 +8275 0 1 +2601 1 0 +3668 1 1 +17 1 1 +4966 5 0 +215 + +chain 1839825 X 155270560 + 49180463 49241476 chrX 156040895 + 49324000 49566637 859 +1849 8 11 +2231 22 2 +970 0 1 +437 0 1 +2343 1 1 +13 1 1 +972 4846 4906 +327 10198 191678 +365 16 15 +583 130 130 +1045 2111 2114 +1620 31 52 +312 1 2 +649 148 148 +242 1292 1327 +714 29 29 +133 6035 6031 +16 0 2 +906 45 45 +94 17 17 +551 20 20 +62 66 66 +601 234 269 +714 29 29 +172 37 37 +365 7 5 +723 328 328 +49 1 0 +1354 37 36 +63 34 34 +257 51 51 +204 73 73 +73 25 28 +284 9 9 +374 32 16 +170 149 149 +1309 2942 2973 +387 29 29 +565 1 0 +742 1764 1763 +63 12 12 +279 13 13 +242 171 174 +284 9 9 +387 13 5 +106 40 40 +83 34 34 +65 1374 1374 +855 45 45 +94 17 17 +551 565 565 +72 + +chain 1708052 X 155270560 + 134854136 134892296 chrX 156040895 - 20243339 20281498 978 +2530 9 9 +769 0 4 +1500 0 1 +2221 48 48 +335 21 21 +1962 1 0 +1529 0 4 +738 22 18 +254 24 24 +994 4 0 +547 0 2 +893 24 25 +629 3 0 +1033 39 39 +43 3 0 +1131 169 168 +1050 0 2 +577 19 19 +290 118 118 +114 37 41 +889 8 0 +1572 50 50 +128 3 0 +107 10 10 +1857 1 1 +46 1 1 +3835 20 31 +894 0 12 +1129 0 4 +1441 2 0 +23 1 1 +1744 0 1 +1090 3580 3550 +26 2 10 +17 0 4 +4 + +chain 1166211 X 155270560 + 149571015 149583370 chrX 156040895 - 5623548 5635895 3201 +3299 8 0 +9048 + +chain 1152009 X 155270560 + 52527577 52539802 chrX 156040895 - 103539501 103551695 3389 +244 1 2 +5849 1 0 +2920 32 0 +1913 0 1 +1265 + +chain 769672 X 155270560 + 62405045 62413251 chrX 156040895 - 92847524 92855322 630 +3745 230 0 +152 1 0 +62 0 1 +25 179 0 +2389 0 1 +1423 + +chain 716939 X 155270560 + 51434835 51444626 chrX 156040895 - 104339373 104349084 1081 +13 1 0 +20 0 2 +23 81 73 +30 998 998 +4273 0 1 +3126 1186 1112 +40 + +chain 539755 X 155270560 + 49013592 49019324 chrX 156040895 - 106877909 106883641 5625 +2447 1 0 +653 7 6 +1710 0 2 +914 + +chain 442732 X 155270560 + 1098672 1103459 chrX 156040895 + 1075573 1080344 90483 +690 18 17 +398 0 1 +1452 12 0 +126 1 0 +1207 10 10 +96 39 39 +242 3 0 +493 + +chain 374429 X 155270560 + 140084104 140094766 chrX 156040895 - 14341740 14352359 285 +124 13 9 +530 194 176 +642 244 244 +333 24 24 +81 209 207 +158 46 46 +202 49 51 +122 1 0 +75 77 77 +116 64 64 +127 87 87 +363 0 1 +305 105 105 +295 95 95 +209 44 44 +275 30 30 +350 12 12 +68 26 26 +158 129 128 +182 62 62 +109 66 46 +224 64 63 +136 62 65 +60 45 64 +180 28 28 +205 38 36 +160 35 35 +84 17 17 +140 9 9 +144 338 313 +269 157 157 +69 90 90 +329 83 89 +58 13 13 +406 29 29 +388 7 7 +290 48 48 +56 + +chain 372112 X 155270560 + 1103476 1107583 chrX 156040895 + 1080361 1085000 149601 +3099 19 17 +179 48 48 +72 48 49 +53 0 59 +60 6 6 +20 0 474 +503 + +chain 312581 X 155270560 + 52468399 52810307 chrX 156040895 - 103232730 103363685 600 +60 71 71 +102 13 13 +70 22 23 +106 45 45 +56 58 58 +114 385 381 +185 129 128 +74 91 91 +127 632 636 +151 54 54 +138 27 27 +88 87 87 +161 82 82 +91 935 946 +524 0 13 +102 11 11 +707 8 0 +1797 3 18 +496 0 1 +63 1 1 +195 0 1 +1057 280614 69631 +380 51771 51768 +25 + +chain 306037 X 155270560 + 152327099 152330329 chrX 156040895 + 153061270 153064500 171323 +3230 + +chain 267340 X 155270560 + 49204606 49241588 chrX 156040895 + 49338635 49547634 916 +75 964 965 +128 1047 1049 +686 37 36 +63 12 13 +279 51 51 +204 73 73 +73 25 28 +145 38 39 +100 55 55 +270 2613 2636 +148 242 242 +1292 11570 183551 +304 3114 3099 +55 43 43 +51 5975 6008 +104 3239 3227 +40 182 182 +1334 2239 2239 +112 + +chain 187124 X 155270560 + 45548492 45550471 chrX 156040895 - 110349668 110351647 79172 +1979 + +chain 161265 X 155270560 + 1107583 1109766 chrX 156040895 + 1085000 1086742 611587 +116 0 1 +590 17 17 +80 147 0 +161 295 0 +369 82 82 +326 + +chain 159059 X 155270560 + 1184113 1185924 chrX 156040895 + 1084844 1086656 846327 +282 3 4 +690 9 9 +263 84 84 +480 + +chain 144965 X 155270560 + 152330329 152331842 chrX 156040895 + 153064500 153066013 139964 +1513 + +chain 134903 X 155270560 + 140085607 140095769 chrX 156040895 - 14456948 14797344 2317 +90 145 145 +9 805 808 +46 833 830 +87 668 668 +105 295 295 +59 16 16 +20 209 209 +44 275 275 +30 614 614 +129 182 182 +62 109 109 +66 224 224 +64 136 136 +62 60 60 +45 180 180 +28 205 205 +38 160 160 +35 394 384 +338 269 269 +157 69 69 +90 329 329 +83 477 477 +29 685 685 +48 56 330296 +58 856 860 +89 + +chain 131830 X 155270560 + 49236711 49242997 chrX 156040895 + 49590531 49596808 2343 +171 4706 4670 +147 14 41 +53 41 41 +693 29 29 +432 + +chain 119010 X 155270560 + 152340221 152341457 chrX 156040895 + 153074376 153075612 50751 +1236 + +chain 100455 X 155270560 + 1097574 1098624 chrX 156040895 + 1074475 1075525 1449219 +1050 + +chain 88605 X 155270560 + 49221059 49236059 chrX 156040895 + 49345595 49532561 935 +45 744 744 +66 601 601 +168 11759 183725 +1617 + +chain 69805 X 155270560 + 103324800 103326534 chrX 156040895 + 132156607 132158343 2143809 +50 277 277 +102 266 266 +164 110 110 +77 50 50 +157 192 194 +256 5 5 +28 + +chain 47671 X 155270560 + 1185924 1186487 chrY 57227415 + 1086066 1086629 2720143 +268 54 54 +241 + +chain 46905 X 155270560 + 52527085 52527577 chrX 156040895 + 52511000 52511492 3348952 +492 + +chain 45170 X 155270560 + 48874623 48875099 chrX 156040895 + 49018220 49018696 3507041 +476 + +chain 44523 X 155270560 + 75437949 75438552 chr13 114364328 - 94584418 94584825 620584 +64 1 1 +74 56 56 +35 147 0 +111 49 0 +29 1 1 +36 + +chain 43844 X 155270560 + 140084771 140087408 chrX 156040895 + 141002606 141005244 2644 +194 732 732 +145 447 447 +209 406 406 +49 222 222 +53 116 117 +64 + +chain 41766 X 155270560 + 72074601 72080470 chrX 156040895 - 83174836 83180705 270 +25 5427 5427 +417 + +chain 35737 X 155270560 + 49179935 49180463 chrX 156040895 + 49333000 49333544 4524 +487 1 17 +40 + +chain 34711 X 155270560 + 1109872 1110435 chrX 156040895 + 1085963 1086526 3550751 +171 126 126 +74 77 77 +115 + +chain 33994 X 155270560 + 134861165 134876335 chrX 156040895 - 20215834 20230995 1362 +48 10229 10224 +169 1936 1939 +118 114 114 +37 2469 2462 +50 + +chain 29482 X 155270560 + 50858059 50858700 chrX 156040895 - 104610793 104611434 1332496 +167 90 90 +81 33 33 +270 + +chain 27861 X 155270560 + 1108694 1108989 chrY 57227415 + 1086260 1086555 3491543 +295 + +chain 27580 X 155270560 + 1316336 1316734 chrY 57227415 + 1198155 1198489 7314435 +60 4 0 +136 26 26 +47 60 0 +65 + +chain 27543 X 155270560 + 62408790 62409439 chr16 90338345 - 61639983 61640381 826044 +7 1 1 +108 50 0 +12 292 141 +47 55 6 +35 1 0 +33 4 4 +4 + +chain 26790 X 155270560 + 134947818 134948447 chrX 156040895 + 135882919 135883548 2029 +216 188 188 +55 145 145 +25 + +chain 24474 X 155270560 + 45587595 45587866 chr12 133275309 + 95519462 95519731 9287574 +123 1 1 +21 2 0 +124 + +chain 23035 X 155270560 + 114670506 114670787 chr17 83257441 + 58762631 58762912 10104613 +107 30 30 +144 + +chain 21271 X 155270560 + 154600145 154600550 chrX 156040895 - 570453 570858 751 +251 19 19 +84 1 1 +22 4 4 +24 + +chain 18863 X 155270560 + 115146850 115148008 chrX 156040895 + 50219283 50220422 14236346 +100 732 713 +92 182 182 +52 + +chain 15927 X 155270560 + 52445914 52446083 chrX 156040895 + 52429831 52430000 2395598 +169 + +chain 15797 X 155270560 + 52942796 52942960 chrX 156040895 + 139870917 139871081 17908567 +164 + +chain 14427 X 155270560 + 49179767 49179935 chrX 156040895 + 49571649 49571817 612068 +168 + +chain 13733 X 155270560 + 115150011 115150467 chr3 198295559 - 189921675 189922131 20916485 +58 293 293 +105 + +chain 12485 X 155270560 + 49207506 49240987 chrX 156040895 + 49331972 49336900 3147 +37 354 354 +51 204 204 +73 20044 1025 +43 10933 1399 +32 855 855 +45 662 662 +34 78 78 +36 + +chain 12428 X 155270560 + 115150892 115151087 chr8 145138636 - 6984232 6984426 23329775 +76 51 50 +68 + +chain 12290 X 155270560 + 1316789 1317005 chrY 57227415 + 1198180 1198396 6947046 +216 + +chain 11867 X 155270560 + 1186219 1186782 chrY 57227415 + 1086066 1086334 5258397 +27 323 28 +213 + +chain 11731 X 155270560 + 115145859 115146398 chr18 80373285 + 45530711 45531259 24808613 +81 394 403 +64 + +chain 11286 X 155270560 + 115148939 115149102 chr3 198295559 + 60565847 60566010 17204216 +40 49 49 +74 + +chain 11002 X 155270560 + 115148284 115148939 chr14 107043718 - 68329683 68330336 16611398 +54 294 294 +8 226 224 +73 + +chain 10861 X 155270560 + 149585530 149585741 chr14 107043718 + 91431110 91431321 791042 +78 13 13 +120 + +chain 10861 X 155270560 + 1109358 1110169 chrX 156040895 + 1086039 1086555 3410516 +82 603 308 +126 + +chain 10369 X 155270560 + 114581723 114581867 chr3 198295559 - 19174214 19174761 1040768 +42 51 454 +51 + +chain 10204 X 155270560 + 49226919 49227247 chrX 156040895 + 49590276 49590604 91393 +51 204 204 +73 + +chain 9289 X 155270560 + 75438088 75438247 chr5 181538259 - 13678161 13678323 758591 +40 0 1 +16 35 37 +41 2 2 +25 + +chain 8755 X 155270560 + 152248302 152248402 chrX 156040895 - 2970782 2970882 3184 +100 + +chain 8658 X 155270560 + 103325677 103325769 chr11 135086622 - 43403293 43403385 8682873 +92 + +chain 8538 X 155270560 + 113996478 113996570 chrX 156040895 + 114761888 114761980 30174865 +92 + +chain 8146 X 155270560 + 1109766 1109872 chrX 156040895 + 1086152 1086258 6806757 +106 + +chain 7939 X 155270560 + 103324469 103324800 chr13 114364328 - 84148523 84148854 3016180 +70 40 40 +53 103 103 +65 + +chain 7741 X 155270560 + 115147369 115147451 chr12 133275309 - 7544878 7544960 34798120 +82 + +chain 7459 X 155270560 + 115146398 115146511 chrX 156040895 + 36377183 36377296 26652660 +10 38 38 +65 + +chain 7374 X 155270560 + 49240873 49240951 chrX 156040895 + 49346336 49346414 452447 +78 + +chain 7306 X 155270560 + 153800478 153800555 chrX 156040895 + 154572157 154572234 28331223 +77 + +chain 7282 X 155270560 + 103324907 103325010 chr1 248956422 + 176002926 176003029 5916744 +103 + +chain 7086 X 155270560 + 115147239 115147314 chrX 156040895 + 116048293 116048368 36367909 +75 + +chain 6994 X 155270560 + 75438277 75438486 chr1 248956422 - 162739912 162740121 651640 +49 111 111 +49 + +chain 6905 X 155270560 + 47998616 47998693 chrX 156040895 + 48016960 48017037 329372 +77 + +chain 6722 X 155270560 + 115147058 115147129 chrX 156040895 + 84605500 84605571 37351929 +71 + +chain 6443 X 155270560 + 153473404 153473881 chrX 156040895 + 154282860 154283335 1573 +28 409 409 +30 2 0 +8 + +chain 6173 X 155270560 + 153436275 153436749 chrX 156040895 + 154207930 154208404 1242 +28 409 409 +37 + +chain 6082 X 155270560 + 50858724 50858849 chr2 242193529 + 33174181 33174306 1661572 +125 + +chain 5878 X 155270560 + 140094824 140335883 chrX 156040895 - 14340450 14450421 1825 +470 30 29 +85 6 13 +265 89 87 +170 2 3 +175 239653 108560 +114 + +chain 5717 X 155270560 + 115146748 115146829 chrX 156040895 + 66887703 66887784 19558193 +81 + +chain 5503 X 155270560 + 115147465 115148269 chr4 190214555 + 116080130 116080932 17305051 +77 85 85 +55 532 530 +55 + +chain 5384 X 155270560 + 153417374 153417432 chrX 156040895 + 154189016 154189074 6063 +58 + +chain 5348 X 155270560 + 115150183 115150239 chr1 248956422 + 213807114 213807170 42192438 +56 + +chain 5331 X 155270560 + 103325394 103325471 chr5 181538259 + 44137195 44137272 4714996 +77 + +chain 5185 X 155270560 + 115146157 115146212 chr4 190214555 + 63738609 63738664 42856800 +55 + +chain 5130 X 155270560 + 115147876 115147930 chr17 83257441 - 47859510 47859564 26741146 +54 + +chain 5125 X 155270560 + 103325276 103326208 chr7 159345973 + 96553132 96554066 2462425 +63 791 793 +78 + +chain 5051 X 155270560 + 115148338 115148391 chr6 170805979 + 124345317 124345370 37824381 +53 + +chain 5005 X 155270560 + 103326053 103326130 chr13 114364328 + 97157108 97157185 2921511 +77 + +chain 4817 X 155270560 + 101529482 101529535 chrX 156040895 - 53628269 53628322 234 +53 + +chain 4771 X 155270560 + 62408917 62409020 chr12 133275309 + 121993776 121993877 965755 +36 1 0 +2 33 33 +1 1 0 +27 1 1 +1 + +chain 4533 X 155270560 + 140662229 140662279 chrX 156040895 - 14440576 14440626 3402 +50 + +chain 4519 X 155270560 + 49194095 49194143 chrX 156040895 + 49347199 49347253 1532583 +20 0 6 +28 + +chain 4465 X 155270560 + 115146950 115146998 chr2 242193529 - 174124745 174124793 20136525 +48 + +chain 4370 X 155270560 + 149585298 149585375 chr2 242193529 + 59161922 59161999 14859068 +77 + +chain 4186 X 155270560 + 115150848 115150892 chrX 156040895 + 80598709 80598753 44714789 +44 + +chain 4173 X 155270560 + 103326609 103326655 chr7 159345973 + 37300540 37300586 4436354 +46 + +chain 4014 X 155270560 + 1185360 1185402 chrY 57227415 + 1086387 1086429 39029500 +42 + +chain 3875 X 155270560 + 115147129 115147170 chrX 156040895 - 57681375 57681416 37980355 +41 + +chain 3811 X 155270560 + 115149102 115149158 chr22 50818468 - 40233425 40233481 18760643 +56 + +chain 3581 X 155270560 + 103325230 103325394 chr1 248956422 - 53403297 53403461 3561987 +46 63 63 +55 + +chain 3373 X 155270560 + 134932742 134943794 chrX 156040895 + 135781488 135792534 1355 +52 10962 10956 +38 + +chain 3278 X 155270560 + 115146998 115147036 chr2 242193529 + 123256984 123257022 43623401 +38 + +chain 3273 X 155270560 + 103326656 103326698 chr9 138394717 + 41004616 41004658 4363063 +42 + +chain 3238 X 155270560 + 49226528 49226565 chrX 156040895 + 49322427 49322464 474043 +37 + +chain 3222 X 155270560 + 115150741 115150814 chr3 198295559 + 51255763 51255836 27746353 +73 + +chain 3212 X 155270560 + 103325010 103325046 chrX 156040895 + 104027545 104027581 8265252 +36 + +chain 3208 X 155270560 + 115149746 115149829 chr18 80373285 + 8149545 8149628 22362428 +83 + +chain 3140 X 155270560 + 134933936 134951689 chrX 156040895 + 135765397 135783168 1398 +49 17667 17689 +17 4 0 +16 + +chain 3111 X 155270560 + 142741654 142741699 chrX 156040895 + 143653864 143653911 5035848 +22 0 2 +11 0 1 +4 1 0 +7 + +chain 2982 X 155270560 + 62409307 62409350 chr1 248956422 + 46241816 46241859 872881 +43 + +chain 2937 X 155270560 + 49237804 49237838 chrX 156040895 + 49324172 49324206 602323 +34 + +chain 2831 X 155270560 + 134870227 134870260 chrX 156040895 - 20173098 20173131 1402 +33 + +chain 2829 X 155270560 + 140095294 140095324 chrX 156040895 + 141001124 141001154 1115605 +30 + +chain 2806 X 155270560 + 130812636 130812684 chrX 156040895 - 24200047 24200095 750550 +48 + +chain 2786 X 155270560 + 113996448 113996478 chrX 156040895 + 114761888 114761918 31074544 +30 + +chain 2770 X 155270560 + 1110435 1110464 chrX 156040895 + 1085936 1085965 34191048 +29 + +chain 2730 X 155270560 + 49233001 49233030 chrX 156040895 + 49328906 49328935 544924 +29 + +chain 2702 X 155270560 + 103326698 103326748 chr15 101991189 + 36684435 36684485 3559404 +50 + +chain 2696 X 155270560 + 103325062 103325127 chr9 138394717 + 12477580 12477645 16408508 +65 + +chain 2691 X 155270560 + 115146511 115146598 chr8 145138636 + 82611869 82611956 23818694 +87 + +chain 2680 X 155270560 + 1316641 1316669 chrX 156040895 + 1198212 1198240 20528801 +28 + +chain 2665 X 155270560 + 49822006 49822034 chrX 156040895 + 50057375 50057403 5760091 +28 + +chain 2663 X 155270560 + 52549486 52549514 chrX 156040895 + 52520509 52520537 3033423 +28 + +chain 2662 X 155270560 + 115150574 115150634 chr7 159345973 + 86546981 86547041 24056693 +60 + +chain 2653 X 155270560 + 115146418 115146446 chr5 181538259 + 51785726 51785754 28652940 +28 + +chain 2620 X 155270560 + 105551850 105551882 chrX 156040895 + 106308666 106308698 3071396 +32 + +chain 2586 X 155270560 + 1316609 1316641 chrX 156040895 + 1198240 1198272 16811053 +32 + +chain 2524 X 155270560 + 50858236 50858429 chr5 181538259 + 106695793 106695986 1395161 +50 29 29 +1 81 81 +32 + +chain 2519 X 155270560 + 49242536 49242565 chrX 156040895 + 49319364 49319393 826653 +29 + +chain 2354 X 155270560 + 113504524 113504556 chrX 156040895 + 114261337 114261369 9974922 +32 + +chain 2280 X 155270560 + 1316536 1316562 chrX 156040895 + 1198411 1198437 7521935 +26 + +chain 2109 X 155270560 + 1316734 1316761 chrX 156040895 + 1198245 1198272 20768715 +27 + +chain 2107 X 155270560 + 134849095 134849123 chrX 156040895 + 135715390 135715418 12096865 +28 + +chain 2103 X 155270560 + 103326581 103326609 chr9 138394717 + 82771611 82771639 2998738 +28 + +chain 2044 X 155270560 + 49208615 49208661 chrX 156040895 + 49552791 49552837 1109 +46 + +chain 2032 X 155270560 + 1186192 1186219 chrX 156040895 + 1086629 1086656 4047158 +27 + +chain 1914 X 155270560 + 49208298 49208323 chrX 156040895 + 49590677 49590702 332638 +25 + +chain 1771 X 155270560 + 103326534 103326565 chr11 135086622 + 129341115 129341146 2633827 +31 + +chain 1737 X 155270560 + 75438247 75438277 chr2 242193529 - 19376761 19376791 1009861 +30 + +chain 1719 X 155270560 + 115146648 115146698 chr4 190214555 - 47467332 47467382 31438131 +50 + +chain 1713 X 155270560 + 49223664 49223701 chrX 156040895 + 49539262 49539299 1000 +37 + +chain 1485 X 155270560 + 103324359 103324437 chr17 83257441 + 27099174 27099252 3850783 +78 + +chain 1472 X 155270560 + 115151341 115151397 chr1 248956422 + 196193074 196193130 29658304 +56 + +chain 1362 X 155270560 + 114581793 114581816 chr17 83257441 - 22705213 22705236 1315104 +23 + +chain 1358 X 155270560 + 149585431 149585496 chr15_KI270849v1_alt 244917 - 177219 177284 1858380 +65 + +chain 1354 X 155270560 + 113959272 113959303 chrX 156040895 - 77490433 77490464 23201727 +31 + +chain 1314 X 155270560 + 115150544 115150574 chrX 156040895 - 54515079 54515109 24503186 +30 + +chain 1208 X 155270560 + 103324850 103324907 chr5 181538259 - 140205666 140205723 4425690 +57 + +chain 1194 X 155270560 + 49213940 49236102 chrX 156040895 + 49328906 49332009 132619 +29 22090 3031 +43 + +chain 1176 X 155270560 + 103324648 103324735 chr20 64444167 + 5418011 5418098 10712164 +87 + +chain 1057 X 155270560 + 153520235 153520271 chrX 156040895 + 154179823 154179859 2466 +36 + +chain 1044 X 155270560 + 134968452 134968501 chrX 156040895 + 135765397 135765446 41056 +49 + +chain 1002 X 155270560 + 115148470 115148521 chr6 170805979 - 4013579 4013630 22756408 +51 + +chain 945 X 155270560 + 1185403 1186809 chrY 57227415 + 1085840 1086066 13540877 +41 1338 158 +27 + +chain 755 X 155270560 + 115148640 115148718 chr15 101991189 + 57902032 57902110 15208098 +78 + +chain 729 X 155270560 + 115148082 115148144 chrY 57227415 - 42270737 42270799 23485375 +62 + +chain 573 X 155270560 + 149585496 149585530 chr5 181538259 - 88052197 88052231 3573577 +28 4 4 +2 + +chain 572 X 155270560 + 103324437 103324469 chr16 90338345 - 4099135 4099167 4029778 +32 + +chain 236 X 155270560 + 49223463 49223492 chrX 156040895 + 49319364 49319393 717937 +29 + +chain 213 X 155270560 + 115149307 115149364 chr3 198295559 + 159691039 159691096 31496084 +57 + +chain 2369875210 Y 59373566 + 10000 28819361 chrY 57227415 + 10000 26673214 24 +34821 50007 183340 +86556 50000 5932 +766136 139418 0 +77296 50880 32919 +110 7 4 +1098 708 0 +152 32 0 +370 6 0 +1194 22 6 +143 2 0 +37 2 0 +12 1 1 +191 3 5 +84 1 0 +23 2 0 +104 0 107 +59 1 1 +40 1 1 +58 51 0 +42 0 2 +162 1 1 +88 1 1 +120 1 1 +24 1 1 +35 10 0 +64 4 0 +42 1 1 +100 0 4 +40 34 0 +124 4 0 +146 0 4 +845 0 1 +447 0 3 +975 34 23 +55 16 0 +745194 50000 250919 +1032 2 0 +123 1 1 +21 1 1 +537 32 0 +23 0 8 +545 2 2 +24 2 0 +455 7 4 +250 1 1 +31 1 1 +348 1 1 +49 1 1 +599 1 1 +22 1 1 +722 1 1 +20 0 1 +72 1 1 +86 8 8 +251 1 1 +58 1 1 +150 1 1 +42 1 1 +61 3 0 +79 1 1 +154 1 1 +28 1 1 +519 86 80 +559 1 3 +50 2 0 +9 10 0 +267 1 0 +18 1 1 +602 1 0 +352 0 1 +409 9 9 +190 7 9 +59 7 9 +127 0 1 +641 1 0 +869 2 0 +380 12 0 +38 8 0 +27 1 1 +691 0 1 +125 1 1 +6834780 50000 80432 +276367 50000 50000 +813231 3000000 327095 +39401 50000 404838 +554624 50000 84970 +535761 0 1 +32919 11 12 +31710 1 1 +121 4 5 +7257 0 1 +2641 1 0 +9147 22 0 +11232 2 0 +6374 1 1 +35 1 1 +31176 4 0 +24217 106 9034 +4976 0 8 +19015 4 0 +47005 1 0 +38500 0 2 +10058 0 4 +1576 8 0 +11789 41 43 +939 0 68 +543 1 1 +67 3 4 +54 201 0 +41 6 6 +40 1 1 +3393 0 1 +750 1 1 +22 1 1 +14340 1 1 +43 1 1 +648 5 0 +1442 0 1 +17416 0 1 +3428 1 0 +135 0 1 +41458 5 6 +7151 0 1 +26982 0 1 +35041 0 1 +9374 0 1 +31215 4 0 +23359 1 0 +23733 0 4 +15567 2 0 +595 2 0 +16129 0 1 +20836 2 0 +18550 0 10 +807 1 0 +15773 0 1 +23305 0 1 +4124 8 0 +4877 2 0 +2498 0 19 +22083 0 3 +3954 0 1 +7569 1 0 +14929 0 2 +9545 0 1 +7838 0 1 +11068 1 0 +6389 1 0 +16012 1 0 +4147 1 0 +14026 1 0 +51076 1 0 +97908 2 0 +7585 0 6 +1373 1 0 +14090 1 11 +27022 0 3 +2983 0 2 +913 0 1 +5722 0 1 +5203 0 12 +19719 0 1 +18378 0 1 +4785121 50006 0 +2175791 50000 50000 +1481749 50000 65739 +4867933 + +chain 37476688 Y 59373566 + 58967656 59363566 chrY 57227415 + 56821509 57217415 184 +85168 1 0 +78579 1 0 +63496 1 0 +3157 0 1 +30382 1 0 +54148 1 0 +80975 + +chain 9289131 Y 59373566 + 58819361 58917656 chrY 57227415 - 455906 554201 750 +98295 + +chain 2109140 Y 59373566 + 1060464 1084113 chrY 57227415 + 1086555 1110210 2039 +1594 90 89 +123 314 0 +134 1 0 +2227 35 35 +439 12 12 +148 45 45 +43 0 4 +322 24 24 +175 8 8 +444 0 135 +355 172 37 +137 0 3 +365 23 23 +542 0 1 +525 2 0 +1746 29 29 +1760 2 0 +3594 0 120 +1856 7 7 +696 40 40 +424 0 4 +1180 57 60 +120 255 434 +65 25 25 +69 0 4 +138 28 32 +945 30 30 +1551 0 4 +733 + +chain 442732 Y 59373566 + 1048672 1053459 chrY 57227415 + 1075573 1080344 90485 +690 18 17 +398 0 1 +1452 12 0 +126 1 0 +1207 10 10 +96 39 39 +242 3 0 +493 + +chain 372112 Y 59373566 + 1053476 1057583 chrX 156040895 + 1080361 1085000 149599 +3099 19 17 +179 48 48 +72 48 49 +53 0 59 +60 6 6 +20 0 474 +503 + +chain 161265 Y 59373566 + 1057583 1059766 chrY 57227415 + 1085000 1086742 611585 +116 0 1 +590 17 17 +80 147 0 +161 295 0 +369 82 82 +326 + +chain 159059 Y 59373566 + 1134113 1135924 chrX 156040895 + 1084844 1086656 846332 +282 3 4 +690 9 9 +263 84 84 +480 + +chain 100455 Y 59373566 + 1047574 1048624 chrY 57227415 + 1074475 1075525 1449213 +1050 + +chain 47671 Y 59373566 + 1135924 1136487 chrX 156040895 + 1086066 1086629 2720153 +268 54 54 +241 + +chain 34711 Y 59373566 + 1059872 1060435 chrY 57227415 + 1085963 1086526 3550768 +171 126 126 +74 77 77 +115 + +chain 27861 Y 59373566 + 1058694 1058989 chrX 156040895 + 1086260 1086555 3491506 +295 + +chain 27580 Y 59373566 + 1266336 1266734 chrX 156040895 + 1198155 1198489 7314863 +60 4 0 +136 26 26 +47 60 0 +65 + +chain 12290 Y 59373566 + 1266789 1267005 chrY 57227415 + 1198180 1198396 6947246 +216 + +chain 11867 Y 59373566 + 1136219 1136782 chrY 57227415 + 1086066 1086334 5258530 +27 323 28 +213 + +chain 10861 Y 59373566 + 1059358 1060169 chrX 156040895 + 1086039 1086555 3410550 +82 603 308 +126 + +chain 8146 Y 59373566 + 1059766 1059872 chrX 156040895 + 1086152 1086258 6807043 +106 + +chain 4014 Y 59373566 + 1135360 1135402 chrX 156040895 + 1086387 1086429 39031741 +42 + +chain 2770 Y 59373566 + 1060435 1060464 chrY 57227415 + 1085936 1085965 34191701 +29 + +chain 2680 Y 59373566 + 1266641 1266669 chrX 156040895 + 1198212 1198240 20531230 +28 + +chain 2586 Y 59373566 + 1266609 1266641 chrX 156040895 + 1198240 1198272 16811715 +32 + +chain 2280 Y 59373566 + 1266536 1266562 chrY 57227415 + 1198411 1198437 7522714 +26 + +chain 2109 Y 59373566 + 1266734 1266761 chrX 156040895 + 1198245 1198272 20769290 +27 + +chain 2032 Y 59373566 + 1136192 1136219 chrX 156040895 + 1086629 1086656 4047064 +27 + +chain 945 Y 59373566 + 1135403 1136809 chrX 156040895 + 1085840 1086066 13541154 +41 1338 158 +27 + +chain 1 MT 16569 + 0 16569 chrM 16569 + 0 16569 25 +16569 diff --git a/tests/data_samples/gwas_summary_stats_sample.tsv.gz b/tests/data_samples/gwas_summary_stats_sample.tsv.gz new file mode 100644 index 0000000000000000000000000000000000000000..9a9c5f735f53bef21f711f55e8d492aae2bcb165 GIT binary patch literal 53190 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 z zQ{_&<5_2Eviitvn0nKf1mD>{?kC0XXMA@lp1PfMX7$-NB)cq2awg!|=&oDUVu9*|} z0q-dHm1S?DS6kJ>s$(_vR&YniD!2L z#gBpdkaQ@ta8s$(`^>aI9u>sOFN?xEuu^hJgxU-C-OCh zSs4eAigoN8G2=zz4S~B;*VnDGb3dsoOqa^%X*j7R*#6VN^jRW70-ng@Sz2!O;4K$0 z%Ly7-d>R@eIh&<5l1LFaxT>XJF_mUio3K87B;XF7ipNU`d?b!~EX~{ET!DAt5@QV` z8b~4F;-6J#egELE zF&6XDKoZ^nR&2G=phQDnCGDrE+wuj?nYJ?sOD(V-HWBRc{OxmEQAa0^gJ@9}lIn>v zUc#)6YZyvp3#7SOu6W|s$f#UXbeD=X)Y4zytRYSd5K%!NoP0rK!kXI*WsCPp`Lk;Z z)=+O?R%XChdOuN6SjlNeF|`14sy2>SI*)L>A{7r1+8UjHLVQb;@hV*^zpKrrX?ia0 zd=0b6sRN4_fwaJ?&8NBSBsV^8Ehe?vzo2R6Zs`e z8Na2C7t2E7hM{JckXZ$YfmDz#u~~#Ri6UIEv7n;tL!&Y^zR{nF z7bWr;9+gMYZKsUjRvxfpgkm9$6vRzJD)S&ARQDQZ&F^BYhnR-B>a5=9%B9akZn5hw z6l)xO7OYJ2E}elNpI;xJKR!Q5CjRmD@#Ev`oEde6P&qrrfCrn);#_DYH57I6k13XmFtv< zCWWEg^5ZEggvgbgkJ6@j<~`ROz5-b-aRbUMac&gq8ewKkJy4Cwq)kgJD*gM6%M9_{ zBFwI*MC(+(N=5m9vkoE!f7_kKi$m*ublP&;pfd1E6;>W!zU;C_M z(h+E0#SDdkDe5Gyb$pQ4!n%f*ZcrAY!cZy*cTyLMroAG2EpsDRr;+Pg@pJxqS^{x9 z>jhFAr4e$VxdLn7NMj53r)F6Hqnx@&kB;~ZQuoXng ziZvO}trU(!KJ@V>M>km$RNYIA8DGOds`=L5tRYZD?c4O8N#c)cLUhKO+!<>^eX^e) zVv8-Fmfl7kU>X1c$vsJ$^AM%z&tb}dS-b)aX1ma<<`W=x9c!om$^s43Nmb#ctD*6xuZ+n9{f7}G`ZCqkQq_LNXmNy%%-w}5{OJA z=#K8*xX!P1+My{@v5S~VgRUdlo(E=iDBp8!`!1Aa1?>jq(Ch_R%AwKp+PZh(Iwu&5 zl9ZKw$rgm(!K(D36-sVmiQ=ZhsyqhT+PD?}Tm)@8@i!oANe6~fb+ET=LPqG^a}8}L zng({Mc-l?{RWxCrx!%F!8uIKspyBu+syjVew4LJW4aRg2Fp{w?gkQ`1lR%hBsX;64 z{JO4F+)76fH$Q?Q`1zDB5@|br%c${vQX_8rbcM1i?+hi}3Vk~*$`@`0w7o;+Nh=J} z^Y-g`38)yL%3@3?(^1CkFfdq-K-3Pe1GgyK`gZp ztb0+L%Sq@V4v2yln=B7ZYaF5Gz85`Q*N|^e4lPuAmb&d&Lrv!9YupOB(!KiyZGqC%fd9dC0NXFpF_|K&hZgd@XCbZX=bMtpR9fWrFHmc3FYO zh?YhlpOQt7NP6iW!h>%-Xzl{U3v3ay=;OF7CS2k*!&~ceFs7`E)ashlr{7ve^&*m_ za?-9V$u3Aby&$PsyMG z&w^W!qv_Vf6~1!F=oaY<2*)y z3oehfCk&*ufm3_%a#ek12aWc9fJ;I7h3SG%k>BWzA6p~^H_zL81TP|YrN3|mF;l-8 z$IMBsn4}as+w+Kq<)pOJ+4*;8=O0<=nsv+Jwx#Nad0^VMBVDh$*Fh-D2}KIAmc1D& zxSFigSXA=9Xf@4ZZ5z%y<`qAUNg2(Jf*YyzJfISHL>S{9biM4tv?ZNj*f|B95+{$K%x6ZcvtUG_d3x6*M*O zwgotT=(I8_w!UV=D0EiqoIR%C^#F8^lOEbL{E|6c8c?c{ z(cSh|+qXB?G7A#mO^`67QaY(G#dBz79+azV!|yxhw(35#_ZbzHmNg_)`^dJ0Ymn8? z!$_jL(Z#7vMblbGKaFVBiIL(JwqMUHK>ru1ubnz6uOrx-pHJ^GaT%A6wLxQ8m;!O5 zYm~J@5kr~!3Fa+Jh&X>J-Q8oD-kr4ldR_u*9tuTI(4)do0C+&ljMJQf%igY+!KY;j z@D^R7%M;b1G_934fJST4Xy5zliI_sSADLK08)MYDi*;Ai*Pis^kO27)5@SiBkHK2le*fBv-N|@C;gx>iP_ZAwS%sv*V(6K zo|KR9-2KC^Yq&vKY^noG^xy(V(bB}0TNM$Th_81zq)AX%QYd*!T!K`mZ((5xi8dp& zy?mpsg7o)WoV7s9KvR~GlDCW^l+{JNQtOg_hPYsLfBN>l=eeMGzt-A9h{{OD;>Sz9 zu7*UEW9ho+^RkF`39^Rr3@9;Zbyr7}_$b)rN16TRy>>B)mL5{tiSdqDsuj=xJIYe- zmj~vR;F1knVq;kR|J{chm{mq%EIlJcy{u@_EY(shf4tb0D5qB<&JviBt{YkjjoD%T z(M5Q=if!*@vgpnob#*UM4w=iqGS=+tEWE@mD2TDdU$Ab+SheUJk(5BESS)WCus}_c z{)vDbIh$X+=RNuxlB$GXu%{qjZ{y7Vr^{dO$vDC~b6Z`}Mql;xsXlu2LzjiX9yT%G!`e zv>7hY7+g48&*=tYO(XJF4v_dww?Ns5Hd7gv3@_mque1e66pdL8iK!;ky_LDk?BhT~ z8HUiKWU(Be;%-pZE5KMH-J$R8G@r%{XJLaXH2%U%S~Dv0%+$V`Q0aQiP6IP`KXJ?S ztv%YZhMI0r7S1-H>~^*pSx6hyMy!alO3cL>DLOqy-8u*7fc_kkBh3Sv;)t~SxK+`_ zwXh|0e*3^EQvDvgT9)edvII*pg2z9< z#{aj*ABBXY5r4sd>+SfrhW*u}O6zWaUG^uYm(b~RJfSbeU5j?#=Y&{80I1xI1h0Vku+l_oB-2rVFf)}bX@b> zujkjVR)z#ke2A^dS*Sj*(r(=t49fP*9Vq!4WR-P+q`{M|)ZR4qK9cGSm4i5InumY$-D%dVUrl^!b6iZxV- z&W=@^E+^Hd(VnfTgCx>r}mPmr+q;He8A%Zwe*Bz)WyMpxYkfH!TSsok6crR%-}jsoK<1wR*eNbN9H^ zqU&~z?=1_rMkR65RGpul%edTkL*!@> z<-1szemO}YK!mSTQy3|ktv0!X^xOhxz?_?Zt|^rD?b|iR5_B?&R475{K}=SNYfMjEpq#sDDy)=weatNs#@E9nCqzV24s!?W+*u(2w3r^ zesI-fRQm4e7{GCr*i`89Ws6@RxqNs}_^|~6p)cBA|GrII4q|#QG0ammaP&U(+?$g5kt*Mnty-j*XRh_$d2;1K0FLIZeU8fYW;*gU%qVWuLSfGk=pLz#&Nb!9Yi zy7b0wJXopg>o)-@E$Sjc)MuCaM?7F^Qbb+FUBy^91Ehj$lvPq?EIA>Gh^sTVqZ{-p z(X-bRn=pyW$w(^nC~2*;PjNdS%x+7B*w%1^vIf*Jmad^BwGbkpriNj4(;T|j)<9y5 z^(IDhHff2-1Ju2T=-<3Xv7$o*Nwl{_x~*5G2koiBpJQ~QTvvPVda;7) z+KhXKv>+BG3|KNppwkg|NiWX@pg!m&$SSNdmU0C&;!>X%>?-WQCZ(s1GS4rC^_9`- zd+?jf}D>s!q`g}NP1AqFhxm`I58=Q>Xe`37VSj$N|R z<8|$`W^RP~!_Ke7!QiEix6>Ul(sNyynS?`uetzInJ< zLt{(gmwiC-Ipg`PD;z77!DIaZdSF+%`D>767Y34j+SV;^AR=liA^W>p*DRm&_Um~C zogFG%4>f0y$TC!349wIM65Gmtkk-rG`VGpm3j^yh43aQTT3}hLC2_G;U!!(tf8{cF z>zkFc^QgY5v)3h#Bc%vkaARpx#zRZ;YnVmt99W|N2ik`)eee-|BuEes#j=v`qabSU zNnIQ47?9XVJYRDB8mAB(D-16=ezb^q4YSCp14<|jova!x$B!h;X(;ToXLe z5&?h#wF(nKYJQJ$U2Z}O{RU)8cZ~EH-qEW4v`6|tC`>z%?)P{(Ot($W%m+A2o^4wg zGpdnqO?6#d^vyIG^Y<9jIl@57m#d%75sxUyim-e)`Eu1TOa1ly`m+fnv96kO6VbkD z3rD;wf`i>&%w+lgvkT-2h<*QoByZIms%DyY;1MY25wonaX)v~Y{{6GH9YgR%DsEK2 z;DK3xv2)Jgb_1q{lZgCXqpTVZW2t3`JKD%4wxT%bHTHNp7ZGJBwHZo{752YD$uXdt zK&Ju`kJ}Qa6*B~=(fRRK+tDZK&*#a8MZ4+D9JocAz5gW-;OKUI9$l&Lzt2Wfy z_ukUe&q<2aHOi{vFqG;zRjj^4$8nsyQBlJ}#fjdwU(ZYER{kQOlV+9^jLH#eyelz< zaxCiOrGE2RKo6G~<|`jKqGQsTsg|uy&!M4J`d5-tp<(4)e?7fD3F{V(7hB-&k~}vC zR4nq)2F_FAJoJZakX6NDEP1bnF3f7j&Pa+T)xY$fe<2wTRbSM4i$uJZ#c;^wU__!o z75KJ0bPh{sHy~?nI%DY)QXeJ=Rx}%zMvhfvj8~UXI1`VrV9(|Tz+*i_9;xY@qdd;A zN)O}v6~wHO#yEOK;lMTh#&x~`t=E|{b02WuM>`{)84XFrV95Ds7SETr1g{t%a>k5wG>7?_R_C?WZr z6AjDve1Q`$`&cw7JD|`>>HFBy}(GKt#O)w@`vQPjw#CGi1DJq_wx`x)=BgNY1v6n zwMV9-URoYl)Mhl)I?CB8Eaxh=8`%^iDsq*#|tNbwS7RW}())XkEl1kMO(%}_TZon5g7B;pl= zEX`lfD`?hs0Ie%>EJIA@0V_Fy1n0EtI+H<^T5dpACe2t6340`QJE|?-^*Evvi1|nx zRSme0%dh7(5Kp&5jCy4?$swiz^X&}d+upul%Bmz1-JmR{i-9Gd8Bvs$zCoHEnj?|; z7n-G(naXhH=d6APUSv{G&~$)Jxjdku7l}L6@8b4!?35XKaRM@9FBnN~0&QQlU@(N| zf*u95=Fx4sjZUp71~FrrD{RVs%FyGlSAkB<4T@!;3?z|Pk?3b?e?ux$ zc~9tzsXmcz$LP!ui7C2ySV_mCYw2|EzEsWcE$>}z7CuKSxItO&!oZSUfVw1aLfmd2`Eo!mFk*CcAmUEvx*FD~Ef|y>ak2e@=Sz;h5os7LM)f*FMNt5gn za`=UdK%2H?v!yOy4?JKg_?DATTZC<2HX-;+khR_$Bbm}hLaPQLg&HzfmMPi^_LX{X z6)a>n=|d{Z2-xHS5xI$A^u2uMYCNj5&D9Bp$=m};xh^8s^aydb4zim9JOD5EDXczc zwfvxa7b+X@)bw~3!$ow;p5i?vB%&^t5Np*&Ml#!$_jz$kHTH?1b;ILTw^Su6s5wYu z?}dOsah&1Jqz|H({VL&wJ~YcKHlvLSL)X}n>b@@& zKtv!;(^VxZ9!DA*4@|F48a;Lod(i5#gnEOrhC(uySYHs-WC>G_OU`*g-ceH!A&t>%0H}hyV^5N7q!J3jKeu1D3d-5oV&6D`Vt)7oTOs$YwZdv z3btC7Hj#o!JZl?Q@8Zo^3B%t6ZC|jD9xp zrEq^@g2`))awFZ5j`lbR7mng^X+M)*kIHoa&si zfFDCd%gGVt?(5t?w2lU9rEQntX$6-sYatDQsjHRF-++kIATId)nzLk%c*Y&;?6E=^$E?9Zl~GO6)|HX zrVTk$z8yWDvL49|aq|?mxY*~3CtZT9ofij`9ix_m$$AJ13W)iSP35HMw9HjGaq-YB z=mPTdW8@m3s)AIF;1MLPNZm>JkdLe_E@9@a`&*cqnaWrXHPegJiWvj80cLRIm8hcQ z%}jsNpQ=W>I_m32*ltm4Cu)-mdfFvPJE)YnV0jp0Q*n=x%4L58X-OL}X8` zRXWhW;_#rwO(>DDBc;-z}n=2@7Hus(s7sb>3;xvFaX&B=s3}5jQZl2r#dzaY(qS zMad0%XmAuQison~oY@#Qor$Y4bCYeUz}sm%tA0UlkS#e2h}hj7pBB*8bG*SgNY zEd~jA*C@+X7+7+^eI@FwTXb$yo-S)Yp6N2s?NhYE^y7|bq9Kdzh2WB9s2qTA%V+(+LL_n{n)K;36v)_>=I(N zCJi8!Fz~U}MO6?zN-ILTg(gKtr;ftv&Mrc$;Sj;noXlRsQnL<9%rOpT^|GNy_9e(d zjRun31G>tgslt;wr#TbdP}hR`*4AIoE1>d%;+25boxT{-tNv=l7qq8+?OjsZdVkZI?RbWGtzcUJVKS=y?p7SvGvw3K^Ea? zAjuZc-qmVGZPZgMBvFUpEfUH1?bmk;(D>>xchb3+7;SXV>nUvuF#Ahy{SsrXdBZ^V z{?VDD;9G>egao{1A=-Zb_4NKEikUGqa9hT41@YX%V9;J@3#wh(HTvH3HO9;qVIUQC zkh`Y_uu$1Mh~5TH3)DGl0PD^K>@>^D6Fm!{X~A! zhh~cu?=+Mupe+TwYcc&oCm&4GEMKdm-{r_i;{jDQN#J~LKRYeLSi%j6g)0msk(tqH zv#5TM3KvF?skowDOJA@DCoUIaEk_&5p$;a5k+&~d0F)A}{>#ygPG+)-Np&*tkJZF}~cGT+j-12DkxQWK( zYls;f$v9?pai!`>;^M~dTrSc4%)yKs_-w^_hjnO_ zw&jtf$S;Z_*RnZt{iIjem^+|Dkz9t8g%HDbQKcuOT_G#HkwQt`I4`1k4lANWg*%moKf$_zA>F zsB!c$yvXA!em@%^UjG?iyxIdt)dyb1<3+?p`JHQ&wRjR^J%(?Q z7NqqikjXl_BOvkY^)eZlL_1fJ4ouw2i)hC^KQ$qm1coOmeMaPR=*2aNiMRtv&Iw6k z)r!xe>r8{?tVgxgs4Fg=JLPh-)P+YO3UiWxwU5vdW9^<`ml z%C-%ZP|$<(g1HZcz_k`0!g)n8z~hyg#+cfcbS2s}uOJWsxx?vyP>ov99^s>~ zDg|0(w?kCz5S@6}N$%9PPciotB$J$<&#-#Lrfs~ftqTbL8f4yK26~7~G_)8@Xd(*A zjc1|@8sDcfp4Pc)pSo^mBgPdoO{Lw&=Tqm%HqZvSPu)c z^+nBnbaodTN51v;D$3DoM?y9>qd(kRVPB*j)}e^tA7SU*5mnfUI_7h7xj`E6kS4k4G(a z=h4gVb!!Jr;!!qSI&VcfamnfQ9u>naL?9(x>Z1nH)4Gmxq$o)1r5Jc7A0dEOcLULv z5TFo|V#<(O+NwK|@ye)E`okPi5|LU)l~Hv=faPy_OF3Kt!Y*HwaXt=@WW3}?Rt`s4YM{gWHQF?M-r-tp-DHOwL~ z4JhMwaXN<@i62Ni36K|G=XP~)i%}U56^xWh)w`yBkOk zwT$;()EI@T&|Isb)cy+rOm&HfObt=OP7XnoP&~&a@Sv5QpQadZK#a@|Bv}BmbEAf< zH^f)dF(Y{?T4UE2PEkslJ5{lJOip=j8ZgBNndNC0`4$rgNzOMY3!xoYj}aJ3(ost) zw;~{P7|c>EMv|1!o(6lP8JO843kj%I;_$djm~H}!Q$H1HJS^b`WQijSnl;wYi7Z%f zE(u%QeFj#m_PXWr*1~5OAv9$M~ zK-K7{32fnG7A3+yX;XOAAkV{66>1G^!447Mqu1|UDygqfl zGbX-$7xC-1QO8h%s$Z+^J&+3njwTW_EUl;@z~s9 z=*Stiz=FJ(q1ECzYt$jc`P|0)#L$feU_veL8JT4m+ardi0M_cN}f)={&UA1~Fe zQQhg-@;m05me+5WAZu6wfb>eD*1Z|VTjylIQXrbCMarB?`s;ZCkgGMU1i9x~KOPO3 zl0n=c?A=# z2P`y#ROl3U2{12vP;NkG@G&E)e3TLNq9!LltV{?EdA(2(!l7mx4jL}@h~-TWBvG@`<}c0Qlq?N8gV6t17f{V&ji#hYLRB%K!qW>2xB>Z3TtF?+ zoHxWXHK~e260HdcioPC;IJmZw(dw>2CJ$pEwbZ!Ss+#;FYLubeSoSm5GO4Mio-(m& zHRhRnifICm-^>+{oXND6iR$a?hf56ezzrOcM{{?>!!XjB8lI5=l$sTXGRubkdVc$6 z%{K@86w1-U%s|2S*bEy!mF4uzDAR8-rvAw|^7d$N={2w{A|53n*en;dWu(%#U*Eia z&p%1XB|%p_vpHpy)K2mSJ-^AYax;Wpl|4*rp`|TeA|h{mA}+jb;L5#-$jZ^0peWim ziWrv~9xq3McSn>}>LU+((IAR=J~JZd(q(thidytq$1$KW@Fm7-b7G_^Z-V-&bO&cE zs$-G1p;oi#b$7~1yDrSq58>MqbBO0N2s|`86QMmVL3f1KaE)>d9_U_bfQ~4Lrrurt zOb8x8am8O)16t$C?6D)pLVU{@PzFs~-?zAqwV(hkq1=F2In9A28V+&d?w6+VkT7!3 zC2By?3-ts#s#J?pmP9VsgX95VK%{I>-^M?+Gntn{A}B5}rdN)U_rCU%vb7*wlc)d>) zO=5+8xrm`2-XH~e@ve<{{?;!5c~o-;;w8kFwlHBB`=+UPuhm#n^dq$cYQMa^w`BZN z9kUNl3eGNy9NWyp1u{Z+(b)Z|c$%rldALzd5tdIsfQ;v6RTj8k;7}%;mVtlCqf4TE zmAO$*$Y)wDd<|jtp@Ad9e?iqiYc_#$*b&{Odp~Ax#O2pF zuivxQa&G8^k|iPp19EogoBH(BdSz;ubYE{UjCc+t{rn_~Sgj)O%0U`e+J(G@n+9x37-fl2#0R!ow`Ff=atKw8LG%cwi_+MxR)!@%C z^_+NL9~o5qe1-(HL`>5i1w6M1c*WIglqHpHK#7cpLbFaip`LV8H2o!>R%SDYzWsV$ z0!leAB~*ungdfi`tSDIRk1b0l`z;|}BA9eNP*l1`J3y6BNiIa)371mNvs{kbem%c? zvJOym_j0W<$d^mA0~EbebYYhsrt!DLbOSPraWj${uIQ*+P}Ruhg?*xCW6!t6-DrxU z?ICH`Qy)SBKVJG|=8nDvM+t7GF9q72OORE78&D>|*?w?JD`&K}Ji{4+MYh%NBiouo zV|WetN7eq`<>R5NyWW6|IKZbOvdb2rH~b~anm)r=Vq?jquGuB7v4kNO%|a9R{Ff$a zPNSR?5rr(>xp_bXSV@NKr23sPu~Nbf##*S6q4Z)R>R6q%Gz+`TQ3v<+s!*s(sNEID z4Gd%MD!mo>4x?vB-igq1ib}u4uvqftmVA~ zcmtBmO#{RoPoyPL2O(H3q{7AbUKiENXCD^V?_5vd6%_J%52!in#z$28heby9d= zNe+~x3m%yMa;^iuDFS_6L%Ts)?g2xYh|r0RtE~T`(7tZ&}W*8t0=%^n(2 zl98^!1G8i)k^8+c*K(EVa^8TfwUhv*VcI>W=2V;MF^=0?a?rf!7p^iIT56d~*g{Gf zmO>uT05=r;d}0W7`f7=(-hfPdDI-0kuu9J<>p8-8f>$~AA_7G<7jr#zHaB0q7BnaE z3cAp!Q^fH>6!P<=05bqMCX*KD zJt-Oi_f=X_jyVl`5`SKL(orRNss@{ED`Y{0TZ}_sj*-kJf&{4AL?xjZ426tY$@NAJ z>j-LHn5BV^7&-(0{`vRs-`~IdfByX7)9A@VUykT#^S?^#`P08T=*B|zCypqIO~^F! z|H6}2N-}<)oXC;;iDWsVxB-_6t7yyH4yN}TF5(09*kaX3bkg8u1o=K?a+3Af(eZsW z(QTIG$!#!}YF9>ba_gZiuB(k6WAiM4)k8fl$GZSiBabksgX}AcDdV^fFfjQ-XrQ-K zYiwA&B)Y>lFpGUMu+)3-sL*_AwJ7r>faykBvx0Teh0A_AR4!`^57{-%iG7VfFBC=& zg~f+7O7v}+f-koqhX$=MBJ|7)m&*`?VcQPen73#U)-6NrJ#Q{`JBV=qVX zk}*QdS^|BvRMNE~AD56`!NA%6bBy&3G+iqVU7Q+l%1CB`9ymP@^)=9p8lOAb<$IRh zNdwcw0*OaC)x+gwKg7I2S*9?sWPLQByYXRV$4zDEpcRsqY$Ol)lJ0>XGM%*uvdcVp z#(7{aCQr+$pJgAGkY%F_`W|L|4~!+(e1=O77$WRrea054EKGJ->ruBz9_Px8O56E676ieQ(#7@nUOqeEFLE? zOVe7d8<3Su98h{OkwMt3xUN973rt*O-)d%j&)Gl^;mr6ydHvqWA<#IhEo=uhJ2Vz8 zGe~PiHYWroPoF+~`))ZGbZ@58WcjvU)lu+{ z!;7aw#PT*w&UlNlRJH)SG?A4FsHx4^-e0}8V-l!U8?w}3x z^Af_o{J@d5?_fu$QPvQ%tDuQhhSEog19A!N=qNQHkQwFKsi|2R=p=j(J1+NVZyS)6 zhK{k+;>xvpOZ#=sJweyQ65bEo9P)`&0S|2F6$iLHy+y4oa)rjqo9_HPf@qy=P-bxp zBk^Kr4l7IEl%4WK#wme9CT~-tGM!!j_dUf3Xzc?;eWho=X ztG{%=Pzq|Oy4H9NU2`GlEN?l48T1Kg6^m!i1ZB_)2(;aU%tRyuY0%0CZyfB6%i>CG zu3F5*_{;0%i-;UM)_4bEz_N*GVBzyeSpKvV=ULwA{zVyFJ z!bCL1icVAya2&-e!@vw&fs`|x>!p{_VMkZ&EzFUXQwazm6`cEIpemy(4k2A53bXk0 zwNX%JD!S35gOpM7fS3gyb;CDQY~WM7$C!2jBiWr9REU-kOUR?}DuVMH6$Ov%dMFpG zTN&V;r%`Xt1L~cEUa-D}KbK3jv<=9Cf(lr2>Z8Iko8%Yt)|gofm6AM%M}~duMXyW` zX=rjT7WXi~K;BptirhWTm;5?raUF%J!E-1x_M{p^1 zhrVb?>1R^SwV!R&JZBO84N?^(vy&K1x2fkoRJ)&`&M z#*#?jdMe+~5V_0XxQ0e(y?KqNkA#pbg4F zT}T?!IA-MQ6x&LOFR&opB%FT`Kh0?|?dZoVA;{~e0n39WTC4dS0gi2%L*Ae)a~N1J zDO)QgM4bb9G=ab{G-SKexyS2yCb)3%~%3)bXIoxB+ z90CJL)W9LeZ5fclHzXo#UYWzIT_u;cA&Ny+2^FH!Dgk%Z*|%If&U=!DkpeO+{E9AKgEt_5i*J2*v@-=2bn3d88fj=+&gy`Zp<ouxrEI=|fp;}Ar18ec*X4T`-MM9a{rLRigcj~*E6B}U~e23adyxN);$ zU}h!A9y0HSnTY8&TagfeX9x%Sq z!KiUIFs7LoW>NPA%FH1$lHAYqLQ>IKETXt9wn%XeK&)4w(m1+Do^h~&VuH@|A0a&L)seLzaa0U_ z(U6%+u0)7{EfYzxFWb5LYbfy1{2Vxtp>PX4vqH14c1yRB=W-T#M$<(-eR`iv^Ln5} z?gQ#Uo)2~jQ`|yN&6&|%_MNn-w`QjNKDPl`nkG5*=n zX(Ou{_4XQv3Xq>Wa&~5)mpxI-Eygffkt-cQ@(OT7RUQn&!*B`N@%3JM_D7XjP;T%7Wr$&DA!Qs0D^Py7|6fy zz<)$@haCaZ&Frf=CV}cqMo>mp0T1%RhYn zU#ZWCk*{D09N~J3as@-m`Rf=cg2G=OoWH{$ZKZ1HyQPfK3b+NtwV~Z$iX{5!{YQ>2 znsWNs^K z?J8bOM^_XJhK*sVV8x%UE`yeN_s8n{)Rg0dzJ0w#n4Lt7^0ErSAtJ(6CD4f=@1E>G zQ;2NhCC^VEzPt4W){5e#K3HOSKy%SC)#A?v+&m|xvf~D07T7V8E?+eLYoK-NnkjAN zHtq9#eaAEj-pEi$PQD-A{KsRkg1n*SNe54+Z=9<;V^_A4oVGP;9AbWY|Ali}lqU-~ zg5~YffExJ`)!A<;&gm~kx*+dCj3aO$sp-;^3WhrJ#nK=mkM%b-7idk=iVv7sWNr-e z76VIf2CBnP8?-MoC~ANv#^sB%_MHTcg(IuH- z4{zGN8yqTij|NSyZJohA#ynyeNKWyZX+7By<7k6&e1W{)SS2H(itO{#`vmCT`tL^s z0YGA2rHB;+Uq2=R2_f%#jGjd44jq%I?Gh&qoYh%jFtux1tWGCV69}lm*p+Iq_fSut z-lx$`pxbwD;nr0^18UbqhcNlMWMR2a>8sv@EK6x%nM+F-rEUiVN7=J#NGv>$0D-V( zjeSS}4S$}^qc!wi4pt4C7nUiMTZ|dbWgI*3Yt44xgRUTONTXRHc#Ee`AHKa+#EvIN zdGb;Zi;5_;RUNXxqat)`t&@CQZgk_D$u zb+|`7NjhGBn;mMp*jq$|C^m~3c_Bwr8If==76qD$PwR>-yg&F>GoMtS#ev4doE znQPH{Y6?2g4iiXiD#J(SYrF%QCNl$>Z=PDv2y}r#2R<2BgBi-ToIZW{{!v3^qhqak zd32odwh#l?d9N=ZEP0qjC;2VNYv`GaCkF1w^ja3Haof3AB5Z#f%tGG6mey)@j>4r?w$l(X=Bvd3XBsVG22G>;HJT z9N`U`f3k$gzv{l9;^tv}1^pgmrsf&wCFRu!iP|eb#{hCP=#Z6ft!>)=x?vjxf?9Nm zDpFMftUHdy~nU!z&QG&24p(a8Q|(d@|ImqwTmUut>m#^ zl{|Jb1OBr(cZ?D<szL_sTw*tGVOj*Y0F$#FFwTB`GJ-VW61cXkL9{Zxw4`}_-<#G%dV)8y zZ(8DHwG@4{*R@j;%kUgcxUhct4aORFQw36-Cm|c5Dj6zVMnK0Y8jnZC^`6p}p26kH zW7~zmtYPEXTxl$%)wQr|c-Xs3L;_6zw;(eO&p@(wBN88K1ksX$wSzvKre1(XA=-63 zqF2`F97Ax1zjV#EBfx~?+Zahb|^tS+CXvH0}#!_-dIvGD)EZ23tc%krF zKfO<(dy||(UPGE^@aM&u50S}7&aUvBLB0h!Xbv;f^o4!Y5=$~B5KJL6Ppd|s_`;oj zUkfZpmdzRILmtrRIqf}vCK_2>G4LYYW6V2@k>pE}v6Q=>qU1t$j!lE)_OUBQkFW~Y zVZCH|vJ|JH_5t#tH~G0T3tT@!tZo1!iFp%BO2#kYV(Y`b0ma_qOPEfK7^WLrGr56n zJe~$jb*t6nPp;Tn;fku;-MhTcOsiiI-2P;|5~SVL&zeK}SE24=-TrVGWNx>oYM z&#DU>l=VVjEU`!FXv%r20D6Sb3#Thzqv}EHqw{5@bSE3!%_5}OIK;|Nr-843_8!P+ zK5MZpeIM1w4a)i+7|VPzx(?MRD=fbEjgkX7w4M}{bwAYDMr^iKAuQxSFY(=i+Pi~k z+8`8}bq4Jg;}D=`B)ij6@tPn&*AdJ1##-i`X4TT}vta@4iKRE1%r!j@F)%lDFQ7&` zZHDC~gs?$bHuS)f%}`)P=&@RGP@{sfhpI8ieTbAUnpq7%=Si-EXqW%K6nwXs`l-@b z>IP&E?H*+>2 zHKq-QWjF?s9`!kTr#uzhSdm#$r69&TN>Uyec0P5JQ=|Qaq7XU9A+jLe4MLvz9Gr8@ z`cH8KV*ceo()B~GS=Xx83}+hcCAD=uh4$_FbZu}=C_5&&&ZTdP|GpHpMjyhNqIa1< zkM|(6rj>zY`=Wel_K*gSP@`%$7(;J!r%!L+pN>CM{2_xYKy`zkje&Ut(eL_R8$Bn` zeA}Qb;h_QblA3dn`PmUfdlxO$^xmv{U+anIr}sI~kD{s@WGbdE+VMPKml>TxwZ5@I zHr>Vaqi;ag@@|HDY2gHJJUxc!)fH%w2NSk=u!?9~P4c@^Xk8A^g$Im5uORmE0HQ!$ zzs@>uFCp{|h?VaRB()|`ou#?TgzX={S!q?3Q6E^>A=PZBNC7KrD&yHSpvf|_b?ezK zUCJfEA#jgjxk?7o%c=C{yMF&suJhf|0b!In+ggbpMrpT{K0=l#j8ia-s_ehQQBgoY z`*xP<5*nr5Hy|rT1w+XcvM@3Ds8;Mz~t}O&)w+ z1`7$}1&DD~4#qdB_@i6sDkauT9|!XiUoM#{dggz*I?S z#AizDOB&GD@=kfIYh8rB{ImRDdKPPX1Ol zVSX9;DI1K%sToi&Ej())Rl#c*(h(@Gi_gzedWbUh_?F0?@#BQy0gbu)hRDL@K?L2G zdyJL6D@#0gC^^MEi*@Ngs9Ztw*7M2_JcL$&Y(ki0a){vXUw?koC~~k7+OhjEmdTNg zSzO?ddGzN%olieAW64(|U*CBvR|m6s2e*Ee9&fnQTFqE4Sh73FcV?WYfOc~jWz6uS zLEp%N3RgBor?q>JF@wI0q%KQEXiV2pq@S&QXVeI4zTkmP5v$ieW?ZLaB#T*(0W(d( z22rkqj^qq(Ko-lCp{CEgS3F%vz z)^)Gx9%YG}4k+<4>41&KOX)q=NzhA7=2r_>QoDjKa5&Xo@Z)LKBHF+)d+#^DTzgry|nJS^23K?5p zzJI&Nu&+OGUQ#{L>3@{fU??Vd*pO8m+U{%_emES;H-c z1-S-}ya4FnWHU-peG|Ad!Y<9!or(w4AVS{~Qn05tpx%8# z1m+&((47Y;S=i*n1*?SRR7v^n6}*mOBZA=INPUi7nwf|k9z z1zGm+KzeBrNDIkm_fWW;=)@>q*li$m(oUb=CQ!V2$1yk7VCIM8@6(b<5I#5x6Gl+Z z>kNW-_b5xIU_j{ad33%}y0$%Q#&Lw$MY!pcgeSrtg&K0{;GGo{dMFcs$X< zSQ{u!q1}TVTC*fHG~NQFJ@hSP)CkkLky2FIoYMN~(}x*UEr-S)YG}!qr`K#HU0~p* zO?Wy@%X|y;8tzfnydPun51+sX6Pn&>iR?REy>u*9r9CWmo?dnRlUHS>962K9CenF;WJGk(@qi0LLL8Zf~>b;fe_{0Sp(YE_MlmaTNMf(t3Uh?p69Y83* zkItVfr){t1cn>jiV+>=Ke{5E`nEYrg=j7UR(;qpAN%&Kem!vNbOxhry(5QU)`l&2; z7FvLAQ6?)vl9p$tfhbE8VuB7>L^YsNs3erR%a$$|`iZ?%E?Hu`J%yO1^@9JdtO^cn z*zJ^;X?6Nup@w^q8PH`Qc?0O4OGd3oP7fc7u2|h)?NyYosVhYa<8a$##Z5T-7?jgkowkb!azPzCKvwC|uA` z_3BN^G{uZ!s_}F$8ePK*jc~?JU7^-fNwcW87;DYVKzeD-4V_pf@Qp(_jtY0}gm_R# zN-J3-QDFQ5>CbpNNIx``0x5-4Dern~f!gmDV{QiqdPyTqT2zk6^lp5%2dB*tkM1lK z;Tb(a2-sk<0HDHP)yRRK?9cSoGp?Ih;^Y=)r9EOSjZ)<_QW`_lm5n0iD%F|UH((UGb3v77uDQb4?@HS3i#jfr(O$ zF0vfSS;+Ei8c@^Chk#`9X##zjK-qvC`pJOx8u3Cj)0n=BABh3_!*4p`I$Bta$u83Y zP=_=M4~SV29T_|2Jz1}(Q0yBBs~Q?WFU>DOrNo?hKlDq{+1eiy8_=_ihbN($Eyw{< z+~P<=z%A5M>EaTOpq+RNvNF96C^=l{3T|DyQs{(g-1|!ZMGcB-2M#I|KC9f**6~)V zQJaHVGGZYZusQUaA&UO?4r~e~Z%`K7bYRIwh)71+#aufpVnCzlxoL_-p&G_1lJ`V6 z|9E(FCX<9fIo$Vif@!&wYudmp3HyO1c0C$}qSj3G#PsKQ9g>`X6k4y%E8~?1l>}K+@JTUu=$&^WN47F*_fK2aul;tQI zSYn-KdVk)!oFWU)Wx65E*W3s}^BmBp`d6C)=pgozCBgtN0lv~$N8}vSvQ!fW??EhH zF@RpuZGz0WRkPEQVvVPgq7~WM1TGs>TH-#{KT`NZw{IJ_DF&nf&C@^lH`~-KJM83p zh-q6hkgV|lt_Iu3Ahk`P_J}R~;vh<0t4$D%OcIjCpDkQe$Z7fbSyLEbqTMi;wAqrKNWrN1iNYK0p-M~gfvvn5c7zgwD;u0}fBj^%T#KBvEa z?)M;TWSx=ZBCEmIIwR|u-5q{`GJ|RglKSa=26a*sbAP9F5c7cEWRMfRAw2`r^#)|Q ziwBl$(B{z5uD(GD92Y_=v&84VLF=oSOO6_@#ownnQN1H8?MNHHtf7|fF&2|_0O=Nn ze1bBE1(Xfaxs(@PH*XHIe)=$h#hRqOTA~XNu$A^HLH9f2 zmrn5)b;#%fQvyhOF!t3rL%4f<_yk~5FK_y0^97)8_#VS9;(;XJKgLk9)=|4wSqh%a zcbdWTEdc9Kc1+>E^w~SP7XKO4kR7*6kWVn=3NOIeXm# z4?@1+ay%IGBizhn0uO7|^tMmo z^y$O*ubSb7d*q@vMq*%+X3)MnaZViSJ#zIMlo=>xB#BRu7Z$8&4jdq?mK}pJvOK8w z=-o0m6-HQUVgz77uVOmtT|D;$Ew&sj+YN{ntPCXa+jGr6SzA^vTq+K?^RXf4Q4fcf z!oPfxf`hG<(UCNU=;?no)=PU5JVVPY(v)OEBhVgbO%*emyb8z8^h?`Z8&*vu)6UYY zv7JACnu-b22lPc3ua9qSsha?~@lgSGEk#ZxhkKM|Lk}o5EMnU9cj+0~Vf&3hE{cLvf+a?8-5Qf~nwDyUmVL_?XCnz5p_ zi@HpDhL7_|aa@2RCnH9zYq7e3rpT+efQH)*iY=r8C2zskqIZJhs%1nq99{OmdJVp) zp_#J_IO^=_MU7Pu_~X&1In3Y}njJPMmJS(E^5c41XqL?>xOTpK4qkYApTxdAQx}?m zD_vc5lgO`&5uHNFXj4CDWtSP09mwq4VkF(JwC|fyg5dN9tG2m3$#!wN+0U%qC@Enw zUV8INSAvmA(&$jQcX|zr#RPWD4a{=O4KNAefgjOI>zJRof1@p1DyE(oP4pBxLl%Ln z&Yd;m`7|=QO`xok&vgnjIaujr+Q1x&6aXfBqNG%(lqDox$lyp`CDzd8XhjMaH6wUR z(y}tpNg!jVk55KcL{4FPYoe>mmLMzi9%P1*05q$$=ybe$r%1Bc0!nZWye_(#Y@%x+C5Stz;qwPU{ zTKwI*R|>e@PKkvz)!gRs_8DY0PcV>d1rRwE%@1PdW66`9Ww8uXe7R~!_E31!>c8S! zqJvGo76z7@qY8c9V?b&0{3OJA?@`wL8biIL2#@YV6P3`$_U5dyy<7js75ge!z7|bZ za!2%T#ow(~md+!t>Rx8h;%q@n^xp45X1*U8HW$2JTeu5LuqnhL#_7_`_XlfYuAk)q z@R(xCzTgbbAtwC-C91twEB*bPWD7GY1KrIH%CwajO0G8_=nLz;;L5lF$R+X`R`Pbe zT~&_LGoTf&9JWaO>N18bmc0jZ9_i>fN&>hgQ;Qh)+TpGlJ7^mKR5M#JO~lnH)@#VZhMlj z<)?HFQl}JpF#8Q78Y!lm3=Dr~dgA3|?S2Qd%G@xRy@%RuHRaO5AeG33^{P&?r>4YH zxV05O;!sV{u0;$8X~oc5DJN@h7S%$H>>k7Xw}B&mbOLFOakCcYr%x!+9WScOX&RPK zpC(`(rnFuV)(Lu|^x0zSd?kzR6bo>9*$+MLVAh~LgNY?wP;hAqyHHOcla__UWjX0C z$T#}|6@&Kt#Jm&oe2mPdmL5S+dAj4~a-w@}2eWjw3^2LnP?a6jn+{k`Ae$0v#6Rj5 z$5Xno5Cu9X>C6uL{62kAGMSjAqySB z1-Hn#&qZ%AjF|s`&<6RKr&G4BuOsbnme2;E#HP;V(>9w01YR@ukV!9CwO3H@UWT8% zvl0A~LA9wcvXDGh@_|ow(^N61Nwgiz8p3BV-5O;5Rh>q_!p-3LDq?h0+Yt3`Ye2g| z<3k-@j0Q_FGRyQLM2gRaCCfC(pkxlTFKX69DxuK{9sg;#7|$3X=oyKnl{hxhXgSBG zAtI(((lLW0ehVUwF4z&Ucm;5xW#OK879$x+|*P#iZEqXzNz5m5_K>w{BDH#Tw=A$rT z;p0$1K6`mf(D@Q~Fw12(z~uN$`1=lcDk|4 zjQnLX`*t|1atMQoH9`KJ%hs;P-NR@d6|tpaF~4#X{ewQXbyug-A=fC6kEZ+JP_y@5 z#}SuF^c~9NXJ#nb6=;}FQxG?^S`;pP%|SeI?+^sFrxSRnS$rFsm*%7(zK-MyQ zU^(%n6FO`3kab)bLVgiV!awGL8P%Fvl*B|>NzNRu2es<549)VBN6~Vf)97IXv&Nnn zOAU{Xnr<~bptYNzj2Ojo0!^M89{JMnz|k-zp?q^)%U3b7gbYy4cIp>c582*#Fl)$w z!SvSdkiybU5%|WVqpxS>Q+aaCBCu$dPeTQ{d^ZkWiuvT}*YPL5R6pY$P{i4QEaY-P zl0AV=N;6?oEklCId5y7UlSj-K@`!lEB2mf9AnUV*_nLokhbrg8p73qP3TOsxgEE^b z8A$>KWH&}zN|}``Xgj&Cg>qWXF+Y8p0VkU!XP)W1_^J;tU3(r99D+A~Hg)MTy`mk6 zmHG`Nb%vO(Tvriua(yE<{R@dTJfmt^*odOquUDPD13E|GDIR7J`m&0=zXzGz(+ni{ zmaEBiV+BCc0QIC%vyj1*-ovHlJBTv-WKR#7LmA`YFcPK=L?G|vm~sz&%0<(1j~kf9 z))-hXt;_(cKHf{*k>KGH?m!SNxO?@6cxJlbV!7j?BOL(jxflv=2QPhuJe9_bkse} zT4>2w>fBU_w7sm*atO=z67@vQ_5A6>EYj?sN`($=t5(H`S$q-f=w}zAER#q(l$mp9 zsMm~+ABSyXpjo!=B2bx0Jfy^l|l+AbdAp^)Ls@wJ2bSyy+BdoD z$pjY#u?<+U?Kk@&F9A#FGe&!ST^b_D)o-8`J({e`YRY~CvoawwmYS?3JLAqvxX~j^ zb%^)Sz^SSx>tz)O0@ivkvV^8OkrW;RR`wMbIm1pH&z4^nf44SiGH%$@TxWnXGTjb=oP%4CS-?RXfT6_9$mmNm zHet{CL^8}Krk@~0gb9}Vy|-^WRY%gR*Eskl4SxB zl3@LRs3amA9QChx9$%+VALfBJ>YqQ#=TXRZ(Xa}JzJ8>x2974GK@ZbdUI#j4n5 zhcXM=Q`5?<{7qJGx0Fhue;bu2kdZJgKwD8)q;(#F5-qXfsuIwJkEdfq>$HMz2x^_) zgmP=-7}E~KrZAB7n2oNQMi`phQR3c3aP+BDN0$36UFE=!J-ko*4`*X_$EzZyc~!&| zHz*b>8%T0?(kmH`HrF9TrW6`mt~srxPDL%iblDlvX3tgygI`i|@V2yU(Sc8X)~P5c z&KlmFX3y3Iiro|g$`>N*WyX>dH=%gW*+vOPAohT{Wq4Wm+BDbk6qs6O)SE79*Q)J+%V#+TityVRO>VvY42^yzW7bJ5|_+o^7U zc@uQf-a^=(9x%Ekvgo&QcpSVjsG0*+;^8fX<OQt|KgLPcLawRyL5xpP6Zv zBNx3B_b>}*tDPe4Xe3TO2!?*)DdEj8ZR?PB7XJVvGq&8be>2YeGK;!H znSoh`l6_rTtkqUh=HoS>l32?yyIE4#9&0BL*h(3E2c-PK7+Dxn95f=%Rk1SyLKpB3 zXD!@kFxe5IL5EwfKDw2Vafx2rWveyG)|+#^a2C6CD2Mt2IyfHW!8&> zS!RPW8KQJ1&P$@#7sp-DN@Yfi&7B8^j z9#5&I-7&+Gx(93%@NfeH^`$fsA!Uu%##|6Tgz8nX;>PSwpFT{jn%{(q?SRa(e2Lm- zX0?+u9?$(=>-(u;2eTYn15ED&khIyMRlvm);Rwgyyr9-hs)XFh0=6G{JdJ#*;tAcV zJ)|>bb6BR)!VYK201U8~v?OFG$f*|#d36-6kbND*Zrn3mdbAv?!gfs{eiNsN2iEX2 zxi2S0NAHy(FC%n$kFtad2b7$sg}nBplc+p-2)DSV*Z7o__E#Zvv~MW0mq&gsH0iS8 z5p9|xtD7#iOL{H3xzi41*%$*%EI-ht%5?$FEqWCN)TT8)C)mPM+DwinkVlJo%_Ebo zbEw~5-h(BE9n4xl&R}vA`Vd>!C{-xjWz@Lar~M_HR|2bS#c?0PCjRTTp&1nEX8L5b)4B=YnZ6iJW)bxS%Ti9Nx8 z*VrdlS-)}n&)cK)c8{@&jWCq%-r|QF$UTvWs?d8XQ8P)8vN9m#Hok5PyrA|9|3 zM_S1KEwwa_+`4c#dEz0ND`;&T%DkCDzq9w2*#JFH+PB_r@At%K>cI7P~@wj zkl5+do7I3ISV4y9aSmZ|!RtJru3)T7XF$oBlhCSWovFR!j)UT0*ODj~G(+aDQr;d_ z?CNrIK~|RSh=J+2(vKe8u^K0WfkrMoGE_GxE0-ZdsSQOQs#g;?HV-S^x9FR>-$vr5 zpFT_ioCDgANw;R`dR1XWP25r;Q+nFfOT8@WoHi&HG8|Cy>$WO6<5Be6hXgPkguY1C zujZ8Ub#}@78cby%I@n)&GGassVO*#PmR*vmz-HQ^n6ELQ)C#O6o7@7Zg$jtFRU`O8 z!w zLVkKmDgXVkJ||iPzUkSH9*RGDx1IFJl4$B z<5ja_kLsf6DMc*>kMfP?)n>zp)=&iGug~46v%xvDcECN#OeryxoJ_Q9hP}aIHDq{@ zv`ocmXYhjtXFS8tZuja-k{g&u^mK*3Pe|uLb6w}KL$SMhK*=I0i2ho4b4h%P)?S3~ zBiNA|ZVuPrt&4#6V?s2t=+pZoRe`qMTe0K%9^wvVZ3|{F+0-GE(QQt4WDO6d#QDvh z4pwV9&PKVO@b_td(@Em%v1_gNsSr#aw!24JRfPtY+TYkuR?830#{k1G7>u8M=uOdDJh!R2=_ASCln4uPpEu{0?Ptu^G$4-wtJ_8jxa0-pwMVgLIP<|Gh{4%6R3IAAYf%tP&i+$swZCh8H>44!pYHYhV|-%Qn`!v;@9YaUDBOdcfAEFYPYc|%tXA`qy{ z7OAHTt!K5KF{0JvEz-$-K48l-gSrD*I%;d5WJ7c_XLCv+Tgrh=w4?mODUIIB$x(@z zrMH9szNog*0?)_WIxTUU?&>|rYWFdctfYe0e=T9oD4`0pr%RD?@+677_0xwb&<>O8 zlks#tQRwfB!bc0JXz-X%1B_ zwn#Tmohz9J>`+2Q;+YR{Q5L2-_zj9R4i2Q36!e2}Nq0j5LkO9($?JQ1A}vhM$d=IN zph6ZE3b zM#@X`5lCOvV~i<+G+*~~4jYu!&R{6L-OxmC%=$wLlir)}n%K&%oj!e-M456iEq0be zmFJhK7vmb3%Fco%OSMhUeFtOHXx{@&!WU#BwrEw@Fu};bBl|pCTE$F_%l3E(TvX|? zsq`xb;oacBPnuF+OD)H0(`Ixw8TEX(80*P8knCjb!N_3hpfx1_y;)DTHlgEWy}BLf zp0cL7Mo-l^BoCJf8)+Yn}Z7dNH&E*MP`Wfk&6*H9RxDQ!rjg zE}yPV{Cys=e0Czwkv#q18D*TJIG8_+oL+W zF|KNeAkLj1K zO2)nla(0yUMSXg)9fAl`BU9*9$(5E>mD~=;G7|&pHLApsO|nKd+;|8Skc$yDrjwdG zefls9^4cZ(I5JdCA5H_BnegbqeyfVtwn&;m+F-2Q5e)Sj{U8}C%TvnTM{W}a|400V zLjkfeT?dGPMsYcLz&fY``8lWEon2X0Q>q)3aci)L%~0x5M4yW$SI|%i6NL==s+^fl zN>xx96|Z)6wt9B5cgWOlUe|I?&U^}5=JW%fc|7ub6K#jGq~QnFOIxVw$V`OcL8306 z%c#_Z)$*-)UC8C7w32^AM95Oq)^+3|2DTsz3XRgsA zO_v7!4qY$rY8Bh{GT#U;JPWjh3bS5Ub5Ao|lTf*F=F7IPL*60RW+C>A5$ z;>IgjHZG|R^(0(FzsmFmI@!vSf8&A4Syhn`Ia0ZW=@%7pWi}{l9Rx#(6@?CDyCYnS znQKrg2>gX*ym?KZwyU0PI?|)1Y>~6YiXLA8BTKt;qTB083&T=5a~^evvsODXm`o%< zE!5~RKqOkwGZMYl;KZIzpFYl`iC;i=8QoDi%;&e^UexaZW+1%eQ*eKtvc2wL);84% z2O?tRSzp=+);Vm0et>j1TjTQS(=@X2*hcaZ>C8*|{H%Aj4+smL6Q}E%>N^mN7Yr!< zc|F+4^vZ^z9FPwyNdpQ`ik;}ZU--*dQ?=>Si?N`E5D@u3%wf)eJeM7Y?d$<0MhB}f z8&M{lT4cXyK^_&-!}96V3~UkP;w!ClZ@*t{Lek@N4ezdna);3j{0_t3!9bcZ8|4Xu zKkpH<@ztx|$+PrIcI@AYiXM54RlPHeXd@m3e%dvsM*$<|24%512AKZLUbLcl7Oh7n zEUhZ{_N+)NLtk6gF&(23dJXpcW))5#$-i-rP#m{GSp(t>X0EhUX^r%C47{4iVAP!B z6B8CfVd|cNKCMR0cw)pZ3Nqu`S*B>c?EEA{xPm#PiJHn3;kt7rnpU?j=s#~R%=qP# z>n_hS_y}&1QoR0*TE5QKWd-%c>1Cv47Hx-OcKCpLX^CjAS^aHv1aS8hNHbs0Lz%+9 zHJ%P(JTGUC7ve18BJRPx8RE-=8uVLtD3gnrp~N1dThW{Khn*eKa?!>3d$^i{Gj@~$ z1$vYLjfc|+$6aueBK&xYKjB;I;RK%VdysiJF_OFm$hug2ZDh@K7@983ZLg>6Rks(K z_v@Op7493#d@O{v$jiz@~g-H+! z@Amq`)Ruu(%)5-kvYmt5q0EvLhLS~uK&(xHjwIG8iZS-`o6U@#0c9fW)+>YA?OS`-{hV6h8k$0<+HX=5=vlW*wglRWS-4KeIcR$&mvl9QF@(onn4kJ0_+WhCorfuruKRvco$-bDsSyO+YZEh z(t-5SZt`5GgmGsHhY)IVzuMPz)*{nFCdbT{LCw}P*bu<1mmPOdeA}TINz8z<4UtOM zs+tsdL)4UiB~FQBUyTHCnt;Mp9!>+(Cq?x|I&oLIC0gcd-M}n~-+?771P+lE@g>adh)5p+EiMFNA!*hTpo1hNS_9HZ99-z%fUzzqoMz1HVKMJ z{S=M7_eu3-p|5wSN!OZ53|Q6_*&h5x7fw(w8;mtM!AP%BD+j%$poT_9(@H=TF#6+u zxc7pJv);{2Ml;%ot3E$kKXZtf#bxfgpoDmXvaF>6reBgAYOkJ<3k{wL%EsxZc&@+9 zAxGuU;u^88k7rxq->89&{@l4q_l2&c-tG|&)G%IK8ey|mjdtVYK=_1bRpXezGm8)L zM&mk4Fyl1sj1gr_s@;{d_pn$Sz3ni}WMv>H7aTcH#VSXc0J4MeM*9LEb;jdRob6Y+ zqpwgNP6M3mP=HOkclTNhkJX!060?c)xI z)!{D-^GmeqEIJFim0;lSllHcun)5_^o0mC+dJi%Q#282}E#FWksEz}fmR!D+gAq(- zYmc~O1Vjh%Vjy52>FtJ!4X zopq|X%g8Y~jI(~2ewL^e3>dI9MDC^gQ`b}P%OrB%pqTMJkR)*DOAD4;B%_;|lR(%y zc6t9+x{~?n!xZN2>cJl!vi*cKVmU3yJLPjz<79;)Kg{o7Y&8ui*$;FA%?qxgWgWqr zUX7cv*adf84GyYJwbk$oBHJfVr;(*gHkNwU0118B5iRX-7Q1zT>3X6q;%z;lDg_Bf z+7!l~Y`fx8?G)O=#w~#UR^zzj5sQB#53m&Y22}a(VV28!fQdzfquZ%NSN-UR zYB?FFb+IG%`gO1txB4)Ul53i2#)#f?D0CLWIkDy8 zMf@geS?L(G#{3+}xeEGxXlu*H=+H4e3))Sqi7cfZi1BtXl9TrU&R=h$tr2opcvBu4 zcaK$D$#O2nH_D+2*^~IY9kSk`O82mu`qWq|WNO}Htd%tbO02m6noZLkYZdIKMmO%3q%oBnO4hrtx zjc@r$wOMToYX`Uutkex7wy(*Q?&WP?FRQ7x9n4Ba$6#VQ1tcx3P%Aa~)$o9eUfPeA zQ=h@(93vfXn&QNWwF80%=#7eQnMKPxlvzu|P_IG7k;tbov8ag1abg~~ru+U$u~`FI zCm1NictZnz$&v%*QRb)6+BqKs6931|QKmd0(a$aZVs9~GM<0vKmY#y{Qdj)=kL!y`v3X+prfW}Bnkf}_yyknO!HUFlbr^Srs(a{kQ}Js1ZhsGO&(~0L7uMt_p=bvA=e1nC;3vi5Pp=A zjv4#N6?G@Em(|9EcF`>$og+U7io4+k4_FPTWEivNy|D8VrOo)Mxk<;AX>pW$2_E6YUE4#nbh14@=vhkc`SNFbnq-$-jyi8G$q&GZb- zB$1g!vuc*gBnB!frM(Hkr zBZIyO{deP4ze#}FhBY10+*6R#hesv}0^L<9U9w=6lKKv2SxEy-R#HNdkR_X2U=}P0 zjB8!kgTxdlX{%`*wc4b-h5v3Hx}HqHdYD6R%Sz&a%^k+!oCTEryaB53>I1M0HtUTy z;YOx~=d|RoU%m+xWvL7yLRB^(8k%$%?O;~IBF1`2%XiL`R=d~4 zP79e}T`v@8cF5(nrl(l*Jspd&k}s6?`Lp@nxr*S)sX8pjw#*~$aF)#Z0OPOJ=ps+e zgsUQLDr}YNUD8VE*fe?{uPV|5`X99@Dx=&k+wTZ+T8X35i+`gKm?lUKb%$a7Z~&5k zLq$N|+pZ{smb2xe8Rti7k$^13azgq+}cQ`i)8+<>fYiHxNIFKF~= zYbE**xCYe65`%x9odV}YR#Fe-;Y-$K09{+7w@a*pdgXo9oHigUyB%Z6EMjk^XxNT3 zs_+&&_>g!KkG!uyrewErBCZ85x)5l@`pG(oF5YQ5<$$Wy??4vTM~0d?%s4bYnUEs5 z&P@PhmHmSDF_77;5)dNCA*VbB79|PtTUtF9uF}(|0Y&HI24|VZz>*)hq9(WVCC}rDo_>#VXtD&9oSe`F z2$~?le-)N%Pbz5*XRw_3i?&tH%ur@5n&~H$d9_oRmW;xOkwl4}=m_o04_LA*; zcS9hrS5wIJiA9^gK@_zu zm9)?em!A+L8p5Gl)W2oZ7h|@&wnLe9dkiJp7P)luQWLnEBj^&c|3#ZCf(t4vm&u$f zMO|nfvE!*AZ1-je&YewX{|;u!Rt+$X2h)@8L3*jrdJD484(W?4J}pj`22Ts zQ+;TlR$8Y3alAQ&T<$>*5d+4uh(UH%-W@{#g?Wc0>Wmnu@qVclNRQzX^&tb>bC6;$ z{yTS_ON1Hj%Jm$Iy9YT&mw`2-9?i-RBX0MEO6e-JWKZYNJm*^e4OOsi1>!pmixi5`oSy`0iaM<+^>k>U|(bKgF3& zhBMK1X(J$EdeKOqoJ^@DE7MEcq1Xl)PMZrmBY$|iqQCr!_ol+6u_OhsZd zJTj{TXkYd>b8yrxXI-ZXa z?G^IT)q9m?9F#aQwtQtLTb@&aA?iBqsavrJFy+B~Zd=msU5MfPQ0YY*rrjiH>g zNOL*)S$gmp9s0T@PmRrvH@DMm?Vnrqp*1Mh*^MS?}s;Sp?Sh0d$&QcJ9|LseTN!S zb&*P_LvJsuw%)@zWcvki96$wA*D`EyEjH%&@ZLPCuYqid4alKZ3RoKOi&1;@kpT<5 zr|G5_1N`BhF0%m_=SXOJq(C9TV$5`2x^hh9!2_CaBBu?^O612_;)2qRpd`o$pB7e* zj?v*|jXOJ9si=PXFpb75fq%wO;i!oPiUHjb;AL_-pVIU-HG3JgY*1#e90Q4k-SAmC z6-Rv%mQ(H)^=$6+>BAIyHp1c#y67rIz&tX0Yw)Og4y7$`qV*lj?1x~e*X)Nd!A9sC zU=l5bpbVo=ydpHO+7*Rcxyo1L5iR(D6ln=(i6^6$ssW4__b4`pfuwWD&_%R4jAGF4 zO4q#0lW-t8wI;X$PINFE$kRhK*$%S)(D;4Y*OogXW3TQ|%oZO|vO;=5o28yjXexwD z6lxn`gGZbpp+shu8s%gO3q;g_ctnFAK7|G@w+qLvhR}8>YncIq>EQ%zc$2(n4*ZGC1)0}xJV1w8>`>NOFqqB4r|4}KWF==1X7}=|S&Y(V z6v2urFGO6j{*o{$M~UoU1d8Y&J2xdSv!O%(A=(T8!Q3H!_>w9i)nyCD!aw zy2&HaZ#YH$(63axeSwgz&%M(|KS#`?U#3!aD3eo>p=1g)-8Sn5Q^a0K=&~_E65Hn2 z*Ecy~?!TXZR`pOVy^E2rAFIVl+OnW$+QLPl49UMOt`VxcHTva)(l z9=e92svEg(aD-sL2X} zV`>OD(|gQabpanVctBxV>rWExtFCd?I@rck93IsuC-*2W+k23fU4yJz9s^5VyqtX2 z7>+L)N_5S&*0hxMbq6V6owY0jFFx7=#@w;b4tD2g%RpoB<(}$^KW~Us*yF-#moHUGB0dT5ls5+Mb z&wUY5-*pdT2kn4*jrxxaRY5BjOaTs2W|>M^bdUDMjHhMx*S(&PbqT1E+XA_-H$Tbd zFr#T#D9bHAz+~aW0|U`e6KXfP>gr&+%4IfGK46>bzTLbsv|0VIhM+4P{& zIB#w1Ri-KA9mpD-jV5L75$10*ZxNY?tz?|Qzp!oTjEje5(Df&TQpj9Q!ve=+Z~!N$V{^1=3MNDNm;nV>t(j z=$T4*u>lhVQ14MD9kMejVOsquHIu=my`1?*NU>;>!V@E~F=^D#&yO@2fRuqeXZ;3f zo#s(11A(aM>3vK~DwTMT)(mZ}1_7pS-cAeGs1?X9hdoX^$eSR@lbSmSk7{Bu^@=2~ zu8X?JqXp30otrL~`!7|$gIVs40j4h}(&=nMph$gW7`a81LZ4lKtq0AI)#ijz23P+S7YPdnG>gT8T8FcWtTD?GSpobby z$A~c&X7VJ@?Nl>kU+K5sq1YS-l-wEx%x6}BZxxuD^M3zKB37i5Ycw)cE4X`dYtU1oT)e2|>p9CA#3L5! zq@5UJI#+O(bs9UESs}$xyqx+s_q>`AC?f6!EbTSr*UC)2c@=b3=|Ug}hkgV#NHL< z$ryBgMse~WgS~@U8J!sHrTs;I?rgGdhq8T%MTv#0T@%;U6ZDimeP-yJ=~ac1xttOz zRW4iAF^wIJEvEq`fhh7(vNs+D=sqC)A7eCQ{6YA?2X6QL`T6(f&);E`BBD_>8-#Iu z0~sG)xIrIph8W>K7tC!k&7&a7HY4bK1_lZrn)_yC9CAw^!G_2 z;NZ07YPM$_b@Y3mA?m;TnuOoZ)UW2Pz)knmWoxk7%4)#k~$4sTdLwn;42Gu z57Wpjvdu^fU%rT;NOK1=ZxBWjx5CBVjl?Y@=pIm@8-_Ex5xy$4x1M;JHp=fspv)qIOOwLfcLt4{(845vRkb@KL7x}UXt#Iwp2Gftzv=EPI z4mm=g;4Ls>brp~z-hj;XYhEePQVd!M{a|CT3Yc+3dMJwrT?~*K)4L); z+<$ucG1z*>nJ4}?ot*W( z407611+t;{D6_qXq4+D32LVDY>&GBhiVMN89-lj}5W=-(fU_j&8sQOJP7MqZ*IdeU zCgvT?vYH0iOS+WsU$&Nv&X&5P+q?a0bE63Bq)jQ~oYc3Mqoc@eGbP^<)DK)psy zZ3Ek_Zt6rX3#but3QjB6v^YCmmub^8nzMYhqy1KrE(03T*Fe^F$!|Mic@I78P-euF zp)9Bd)m*(N(A)?%WtycXV;)32@z%-=-#bVH$tu8zRW}DTew<%Kwp>i)3j!lA^yS!jL<={re?6wcA@9u5z`#={oU%Amqblz z2V$4RfKvMo1+>~zOuGZ?h7PVCv=r&deeFxsVp89rY}uuzmq)A&68X^P-VH!mPGk=4 zP^PdCBguJ_JYCglb9Bv5hLANG^Thh2=j%0FJ2=aoKAZ*?lLNU4cP>bso*k47?qQZY zVqlp^(Nv=uW@Z{jY$+%Z(SlUV+?R{YJtUM(X|;g|$4T=ekIZ?{aZ}^@d|K`a`tm!R zC3`WzWWz!^!Fr=RROr(;&grgsfhRWw%!UC39f9ZdD+hypX9l$wE#qe-@!|2|o|9a0YI)Y8+#TvaW_ zdziIva$xBZ)%vKv;Ug;35mJyxPEn7j9?VC&DhG)nTa2(mL@qS_5wn{l-OvLiL$4h7 zMy|^&(gtSP8v{%C2AST@+umUR_8Wy_!Mts28PiXnrjhOWnO1QV-D@7O8l!+H{fQN> zuaoE-ka^HDk}mr0i`gEmhXf6ltYU-yyBmXCzbca=vpJ|12Hj4rccrrB5j|)js+{6k z*F;X)*2)fIx)Y3}4o~q~M2@_D<+A1;TR5syUaFcb|M2;Ly?(=CBnl-Zf{c12(gM^`$wkW^+GGklxDzoHxcx1Aig6Qx#jivSpZ8sZ` zNpcD#O~i)?CXko*9PzL2Q_SM@JgR((iOgDB&woeQy>OwmJRU=|pa=gkfZJOJ*rFL^ z(WE`jT2an$uaVJ$fVq_vxSsv!6``d$>H;6-ydsE$mn3uotB`(!Hj_nYDW~J`cmU1K z(H!mM4b1GHVkrBO=|nP-U-XMbI%RPW>d7;6d{>$i5%QgKzR=I;a|re`c9s;ReEPeyDqxLkBvr%z218XmKO-)VMSdrFq%X5jr9L^l2LA34^@`c2?6b z(9NZe;Cu=1(i3wQafh-pTrrs1KrEysm!Cs|pQ9UedFnKt+xVuLYT@)$^MH@fG8S|9;^4|I!wwn52PG|Ahq)4dS^a~02PbVA3j!6A&O z0-s}9ypubf=LFgg!vaiOR$1R^k|~5 z1cKz#N=kDjg}y_veD#1*V;l688YCkVmK*PCDCrmSrl@&VQn?wyem}OTFFpc$P5i}XWnZ{zXC3jjV?2h5yXw;N1+?X;vTt*` zFZw!>9g0;B4Jf%SKs8@_z*mXgEyX)t) z@8NCq9n6}KV6gcnyouvPXpkkSFgoe^diW|v%Mc%t9ppPs*LCkkL`3Eth(}J7D031$ zZa^$CG>|NYl)c3*6Mm)$=9nCQ!9#>zf}~6-IOLO){6CLa?-bM>+M7V-d=W^*ZD7_C zE(Uvz{1#0)n1XSxUGC>{s^_?W5j9wTtJ3o9S)U%3>=p`Z$g?b`IQUfMYp_UfVGe~g zjHN-QN>`x8!8_{|RgkS&pIg^5P4BLvGZo2NsR8Ha#HQ9XMkYsS;$G~dYcY2=xz{_C z14Fr=JjS#VeVHYAhQF8p(J8ZQk{a|v;@oO0id&O*oV)yJ)M-3r;#={tpZu< z7_pTW9o&I)h-aNe+rcb$?f{c*-@2P|DrCb^R}M;`^o!FAR^4PFsR-5SuL!v_z`DS)3Z(mEA(B$GKszivTJ>S$+shWH_x&<@(nY$Rs^t(4F|9{ T^<(wZVJ80%GH@u2to#B1+A`rt literal 0 HcmV?d00001 diff --git a/tests/data_samples/javierre_sample.parquet b/tests/data_samples/javierre_sample.parquet new file mode 100644 index 0000000000000000000000000000000000000000..9b939e43ca89581a3619671fb605f6c4a3edc8fe GIT binary patch literal 3066 zcmbVOU1%KF6}~gtl}7fis+D!eGq3`6<7_vu9`4WFpE0Vyjv7LVOIjQdZBsE`jVzJf z9c6Z<)L1U17!z9i!C*>C+n17-6iRTQv>-%dObCU(r7vyilbVM#&_GGjhd!8|nf*&UfaV@0^|I&wh>K9G=5A-oN(l+Y?LJ#5shf7xM_A#%4k}MtBy_Qs4J_)KdR2pTX|Td42( z%$I=%jL)P`MO}H6Q>nEkng|_GZxt=q(USChN`&A_OUGbjg%C?+u4@pss5C|v$F&s|ddnSJW z)~o+GKBkU;8Y?|@fRGU-L`twM7Kq~7BU5k|K*mZZXDQW87N1DhfEAx8q~$Ihw>0&O zl>%ddU-B$StntJEI+c^ecneMCf1YEc zbkl;Wl)m*W(@+MYweIHS)=p;{4$jBzxN*4~b!Lnr2^&egy%}DLI&0@ye$I(5 zg)fE4<>^!NDfB{YoGm=Pq6-Vfd4KKvGbfO{@Q%NBw$a_%4ZG304VW*r*W>PH)Z7A+ z?IddKB%L_Ph`thT?M7>04)ND;9bf;$y&L1>Wd6BcL2^^*^X%yhFKleQ@+v}Z$#k83 zHiiZ(HeF!KF08?jah>6I{CY4&;CiqfyRKz!kD3af?I7hk1L*(j8b0RU8pz6ZrUDL% zfufE=H$2xdys-oO=+wE+^o2MrS(>??dD&jU=h9@mW&5r%+#Z<2?R^s;SbfC)ar}wd z-yhBlA%`XW_4E{c-gvgq*$$JJ);f*Ns1@QFgbPoaS=Qs$ljyl}3d^M@oo<+Pd;5u~ zz23v++F>giz%s*5BThbZax84O;UT(PaeEwi{Nh%;wh@Khogv(=xn*~+x>CjkSL7zG zUeV(gHtm|dYk#M@Qnku`LG%|J)p`Qye@AW|nkR?N^rt6XkbP+5dHY}vGgQ56lyPq0 zI(weXb=Tg5tLk;5JW|qV2NXknjZTjs`j?Gu`=dF$jH(Cbh$v0gkmkUwe$ND&fg(q{ zl;*+HBWP}%1e#x+NNMf^4Ww$)LavilBIEhVjD29i-I7GLht}>;g%5?Lzttc zbN)wT9>MiN%5~kw-$eFrT)S4a>|f8#Lz~teCr&PT;dTfO=4HL+?M6ul+QG?lk9!0; zPd$L>yxjDlEnnV=x?U2$;rWPUXxu zu2j-?gew?saSLun$gTDz_}<=WHp7cefPigOuMFH)&Rn^AwLUb@T4QA1j331qv( zS@e$|bvk)Q)R3M>dg#%ZdVC*aGwo5Gym%EkU+$OubSqixYh;mnlzD8ic5!E`xxT1W w#7RRFcv;gjY6#Zgjg3$?xPMVa8=N!B8EXXoQ|=y2?gu~UV|cTF9^U%@1AU^Xng9R* literal 0 HcmV?d00001 diff --git a/tests/data_samples/javierre_sample.parquet/part-00182-eacf2e93-7623-4646-8ed8-733106e3eac6-c000.snappy.parquet b/tests/data_samples/javierre_sample.parquet/part-00182-eacf2e93-7623-4646-8ed8-733106e3eac6-c000.snappy.parquet deleted file mode 100644 index bbb875da0368f54b523c637061c68ec0e46e27bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816650 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

    )795e${0+yp$zzntelrEkhvSe5`|4c3( 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�9Zjyh}n=3Qp9vCr5)5((MWJ{1tR+z4O1RhTJ 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

    d375FQ~7VU93c4~wyxr=?T;sbu#=b9 zV#t&7=@_U`4P}a9f`ZWVms5P$v+D25o^W^k|n{%D6Sfs{xPOiD)NzP)FijHTe{BKsf04zrB$tq(la*cK#?8TGE^fI zRzediu>;2?UWbLCXM^0}o6j@6i^k}oRCS09)Se`Mwz`n_m+9M85uxBjI%OL8Xk^Qy zh@$VbMDDq|mcH~QN%GSyz8m{U_fzfaQilFF#7yW@GU}G86yK+*nZ9CG?rdAkfh=a` zsev`C*j^m2R)_;NfR3m=lHN#KQf~!=OVYyrq>cKU*SNWR*Ew6DN_U;PoMpoXN@-o2 zBzuJXauwF!xXH$2O^2R@u35RMREFo9!ScXYTz~9ta+zvm=RelU?dGPd68^S3W#b&< zfd)0B&J`+fPRdqk3K>ON>b5&vbi2a2BPJfUN6%Dak@?mX2|W!g1fIlA@hmsYr>zLC zLv6$Lc=G4x^BH1hU0!bEo$;k0qT680^UIHQ;#h1~3^6|aKMmL_s3^#HedLr!UIZ9{ zE*G?lo$_6N+Ca&}45$S}+U=wBdEyfLroKJl$zDO<| zEJ;C&qjfsmBih~1bbcnkXY0i($1E?3G|Wcs0DRYHbAv{VeDq?&j^*9a>%sn+OQ!*HJPXwiO&_7{zNu( zT$IQ#73r@;ZE9=YE@Bp*>fW6k=(9Qc&KaRy1nPiVrp-apo@OMNGW?0`8tF8R1KE*H z`xxP|87xNr|8ECrZ0*iei6p4yH|G+H+Xby;3>?PVe^}GGq(`O&|Gbt3)&4}sV~_!p z&bV>I5x>I<=38g5~xD=CT*KNDv+9RJN-D^F7+iEnm z?ibIo+AkiZ9@fcfNJi*yb;#%Q{&z6E8nrvGwse_-{x%jYfe8<>&KcTOkF@oJA z);t8_Ce@>vT-}zMC}+UK&XncrL`iJ-9VaiQq^6S+!+5&m{enIdU7bh(jbKCY*>bXvT`Kya? zG8H$ykKs_j+}@+gkFA7k)6^c`VyW6un;9A@f8GhKbXPNGP2WvFi?8E$n^{G(K<*$5r5i1AGA4A?Qc$npS4+lHqL({2;ooXcgC_CI^&$Cjf64h|=q7-}^O3u6 z#=^WedifM~lFs!!hl@3al55@hKqw|!t5S~Isa?EYeaWHgtPGktMcqINxK2ZELLkmq zm=`e`rf11S@Sp(v6k8`Z(!9qyJkT zywc298}i@cm%WF}Etg|P%P;g(eqr!Q8M{oDWn-`5V8ZI&Lf%#WL_iXxBs8LYWbYJ3 zrT>~Dlb+Le`PAACEqo$p3>9B;w63;-3^_JghTbXb9>SlS_9{d-(tjNvskSv0K&*hW zu;gFGplVOl|GZH#@q49zzU1G7v*mW=9aUA?mauHOUiQ;1x59s15o51g!vs3BQC@hH zW#f;~cQ1a(BDH4JZ&0aEg6*97-2*_WQ|{6e=%qF6n?jY=POfo2BY5z7i>bFH*D8nx zTSok=GG-f@>#I*QdU%x`BudxGHCO4Qua+&nY#0>P_YdKS)Y9O&L8k1KMNjKrDRhPO z>Myt5D*wBmHmA0)0D+P(8T!0r*yY#s>Z;m6L~gl^r})K2TKY{rH3Ffb>CH?(TBVt9Q%eYsvr8p!7u&uSxiz_?6^O_E+1H%NLh|W_Js=vQ_WQ@3oaUh{J1y8APn#=NN&qY3seXJf&5*}a1gBEwy z7BhDp&A-2y7H7@33Z7C0Xnqxb;0;66^8LxdXk59?;v~r#BFvimj+C~`{XKC9%5O*v zM@MOc?F#NX4%v0DF((nu2#crloCG(*)&^+x?Ipo|(KJfyM(leQXS-2;w+^QVcI1+G z;kdx-vZE?D4k=~oolDYc9zSzE^h#X^ZSWPVJLGoSu8f=yk>!xDZHh67 zs+o->6E@55)vRO7?kPE+7>Q(KXkC=xl1j@Kvw(RA#+lTAxViaM#9*_-h z(R8`h;-|d$bpmk*PFZYlAyS3dhRI`x(!L ztrkNcWDA{qS(<0a+I-2|PZhn+2%b_$eF;2~SGH3BGtK)Kt4PGmyu4PQkWa;wn#o>n^*V{f(ZXGOV$7Do)F$;B{HF{QtAfF1B=bp1HoPF zt|KIg#&e`}3XM^UHD5`CB_*n`ut%x6zCe4P_650Nh?HFitf@i@T@32w$a}&Kat^Tq zc)K>z$xY9u)<4Hn5$1)tDi|M7E(?a~r>52&v(lKtPUmtr=|<{XVqU5JenPD8DH8Yt zH5_bjfxMd|w+@<8Rl6oyOI@c;R$X!T+p~9Lc;&0vDoi|vQXIPFloK#!ULEEmoKvU5 zd;QW=PTr@oV8fkFA4{Z^wliSgO=F5zv*hH)rjrVr@RJ)EnbiVZzA zP*(Mk><3f_-+fmu8Iz+1{Fw@g8zudH2CS65Ggaq;58n;$I=OO;`ADz8q$qj5OoonD z6-<{Dv>L0T%(by=m5kHW0aO~FIJC9{XI011@#A}p&y`3M_q)m(;+r9zC0j9>EhZzy zoEpRG>l)bZ&?*vYx=DI2Kc+Ui4|6C(2fn;mbhLH}sZNv6|MFroUc-*nb`6q&o9hR@ zCp#Nav3+W?9G}8SJhjH+2`9Z?`{rngZmfOxDoP+{;_y>F@>e_8wJM+8A2M;3tbE{2 z^oEop(|J-`JeoE;iX#*!K_ZmclT(P0s+#YiaNqE;jpmKQ?(6zJIXtGY%DYX zpKn2`(v{EwSlT0R-l#V3Uj0e`hu1|b`0E{EJDu2mw?0UkrWwH8e@U0IE40WvfhP;- zI;5Y29)j#Nwgj*23W0eD+%-b61^U&E^}dxlcUAAe{#bc(y1e>!c<={s)2iympVwqz z6(AgT8^zDV)lUv?+=0G?#Nv*xZA93)46F3<9%bO%M$p&kh!T&Y?lg>Fn zC%Nn1H>g@|pgp5KJdGNvygW>9d{6EwHBPQzj|Q$SPdwNZC2`O%5Y%_RtC%o|1K4T$ zUxWrIMADzdNsZ9J1QUUbaZ=*6E(<*!C*Qooxxa$331{5RqX_W1vNpxVG2u4FBWXn5 z3C$&;Cf9;TL#sTJ3|vBe=-&D2L%A1Y^xtl#PdLzhU1nbx*IjbiM%(ldUD^|BmlZ{`ctj7+zyP}RaAI7zxI<@ z`87j+xkT@LKU^6tx7n$c!`mkt3gKP9A&G%bhs;kkEn(ExzQju%k3+5JaPK$`juhIh zxpIWwSy_Hs^6dVP!;_-r8k{Yj*5^a;K7HG#a0vN1gIt96=Xkm)9pyh~bexvaHT?K7 zPrgoN5!?!yD974xqIq>n$$w4<77d)SpPwq(ii$w^{L7qr^UWc{(4CUe*nILPjH!0FUjR!LoOpC#q?m zxhYY~e9BY108@`vdYU(^Y;+xui=Lj4Eao{ignONeH)90S}}aw@sQmbW5Iksp=x67+8&m66M0RgfzT#rzV>~Ci&#kH>#`Z z;>fG{rP!lA4=0NG?;ez!<>Q6i^K(12+9z8tNs(Dea_u6xR)Cxzy&dl+E}Falu$LU# zEYE(0^V@kg7^IKf=hu4g(>_nYXyIiav8z4ArDZ6CJF-8eo|L3OTr?u6DwOfaf+`uX zT;C8MIHKCxWLqs2H>sM)1fiD#;o{Vxa{t-z`=>K!4dZrhA12q0mutp>N8cmIy@5Aw zti2t4H+qsoNH6-O@8i|rWP=yhvw<)KJ!UB*`;T4Kdw4Emcks&d>vufgv4QJO4a-y2 zlKNKp>|~n#<;C61hroInMu)h5PrB;=2ikdjGP8ewK7+945&s@#yVz;7YB2-&biZlL z8tq4%SahEq+}*a}T;W|G%DgS|F={uu?^^A^7&%ry^l3S?4mgl2smo=om>8RHouIu= zV>WFC|9x6cenwvZ)V*N#y)iu%htr~znY>b_sCwTZBUnaMWah2aA=pj_H^dlUE0n=^4u)B{vB@K*3(E% zszukzCy#zgvVtsA-m%QqY|Qajsf1Om(S1~vEX_w8X}yZB4Ttl27{CAdK>sFTD-P z-z}I)*&QT2u=w<{PoVI^So#5fk{|bI;}$VQ-y!9y9sQ*I8Cw{{f@7d+*WYued?yqi zxT#I5DfR491)|kgoXweD`lVYjEa+2|NT^eO+a{A2>-RnxcE@L~DUiNTpd>X^tTFTc(5~JR^{GmgpQ8WTYaaeKBuT2U znxI-G`d=kK)*8M<5EP8l(o+C@Y5d5!zHL`;t>#~HXsYTI`f=;_eId}NKYR@T3f;}B z@!D5Du{U>rHV&T)_D0X6av+C2)qFQQ#62GTPC1(7v&{|v;Lz%Hj~*sI^T@+3#`KuL zRXsr#EzND;fNedP5c&j(n;!b!PZzIathcy35;I5jZ23bu%2{*e`bLS(59e$R-DFe8 z>20vbX&Eg><(;)>sfV7DZ5yO!xW&lZtup6Jv$Ui^O!>xv7Pp=h54=Zi9kyeg?0?z# z;Av)z);3Dvc>iRFmtKwjD(G6|-y;=kP300liaII3vV3qQ z;}xgK&dE<4yHhH&S&1`a!z*&sZQY`>HD3(DpgZ-FY!vpuUN(MClIsy=F@Jud_x1Nm z>^<6b!H(_A&*01QVt7MmAOS8RnV9G~5#Ah!7_qFsEDNqg1VVfz|4>@kvOt*>oV`z` zT0A9LTBjL2sMf*DJmh^eNqV=P3FAO)szF@dsl5Rz^ofj}Vb}ucSd@Dov=~F9jTasX zO^%X(&1G>GFIEK1qmEDCTe~?CQ3()&3QE*ti9TP#bD%xa<*M<(EIdbSzbWTV?s3Y0 zhjOjQ=NJgN&~ExK1zr8aFAFkhEW065#^#XF>N+c1N-Qq_WNW>711=qHMZau=am%Tl z?g_z3V6II{eM$_#z`n~(|Mah}-5b?-;C#pxn^_+yDZGW9pJL-v1Bth!aK4hVecywd zi+qV9a-FSO{TF;Mc{^2oVZc`s^|>OVx@#vQsnyMO39-3wEYUVh9MV+SN{azW>mmhc zB<~tLsOle=sS+Z&rwN4Y<%8|GX-u(u&<^@sWp|uQE*h%D)DISOZ%&$Bq-Wxi8&(UGX{y$t#8;f&pNd}MAav~{xU zL6TqOMc!AWZU5XM$(QRdO3lsk-CSvzFVTO>*%w&xTasn_TO-lp`gUq{D-Mh z*WcnQ$w*NN>LcGv-zO}d%>3HyiDXYy>e(@8Ez^XDwF_r%4`ds}lumj7DZaSo_iAf8 z-Swc(z8~za!lNK`ak?sLHls>Tv6tp?B~$bNNc+Hf`~Me~ff`oPVUQ}|u~r~}0A&|F zXpq5B_HsI6D_}2Bbt(1|dIXX8S@!?d2U5?vlC*{55eKJEF4ypoZ!EVUw1emdARyKD z$NV(1D^UGWayZ?pKm6}ExKO8}`h@%o0#*357#Ku;$Oof?K(dfotk}0Q_~!pgy z4*x0=a6AaKil}YF{sUz#tCWNymq4!xI79Mn#NLiPC5-GalqL(DFfhwNg?o$~zgy|M zpnAj5VBx&e*Qjb8t*OP2q=O`aG6L6@MMAAgDZ_B>N_)d^E;V}|#D^&_=Qyhw+;PF5c*4>?hhKCv)#RCqz3Cw?r53X%> zw|qo5H=ttZgG;9s0(2$~?nI4Z_+%K##&K*qh8aMp!{8P1QyW*0o;n^W2yTvnX+0HH zO74>zQF;xIg6lYc7P}5fI6pij`s^jat2!L=d| z!BG|G8!2}lr?GUhl^Y^;#u*eRwaJOqG;ukPP`++*QYS59L^(JtwBGjTq1BC?QX@eD zod}#}TsWvaOHlox{hUSvrC|W2qIu{Xl)rF%C|Rm*isr7AQYyr-05jQrMq78X)o7~B z1@F|Y3qhrl8|H{ST}2lOqnPfF1!Jf>wf^QLWbt`DG~=PL3U?HbPI2w=X;-V4G%wSy zn?H~e3Bglk6bL0Xs7O_@Lof|8yl+E}$R)umtYmEuj zhQOT{(mF=k5W`z_#cbDZ1s$g55=>Bv1CFGe z)2XkDqP*)?9Og9qFb5P(lu;Emv`(H${F}F03nUdW3UCSGrn!wk60;p34y3J+ugRPw zkWvIU_HLoCnmzoFX|&c?Dr!H$-e zaXQBOE?5r3-?2$4I8|ABxQfGzhvt!1@+fMEsIaq#dE|-2ENlrx<7R7x<Xcx znn15FtatP>(&g(eWobcKrI>kL`t%r(yZ8k+CMkywN_dsnEd>|F)64xkiRpE< zCaPSy$K7-iB$Be%=#R19+1fCYUbz+iLjxLzZq!NpO)79Pq%&nHc_p`d?OG`4@q8Q# zssg71Qa}CJ=D$mZUx~^SRii0U@>McKmQ?&)@{*|ZEcG6@*Loc4Xpg7H)<%^JqVeQh zo)Fdp3IQet&$F8upAClO78a~qOb*Hbq^+=0u;L!~8&Dv8TTNeu4RmHi5R}yK? zb|^F4dbOQN$K@%>2u6(k#57w{(J>{*g9FP_IHtk=K)8P;LDfSUmU0U1QZ0d8mR*-=KBl!}sy6crVPjEstk%+%6E z#kGCktY}ZoEh}5B=w!>O)2Y+RB{ie6?R2VB=U1oBv7YzE`Td{g|LT>>Fmum+f0yff zEuZW2u^%IDEO4?eR9zCXUeaPDRm^#5O>SE`Mj7XWia^lXlF+y!zM7Lp(M2-u=8M~wIAm0VyQ_yt)_In&h z>n>%@FxoKYVb{eD&M#|q(ti&XjyQHJ{B8K2J~b}P69*ERVa_tB)FAq}z)%zRUlKOf z61&VF=t)k|gOGP|7STV%9j#MSV&7U$iCxJPaks5C4u%k{A^u(77a1%}%la^p!Lt7c zGgLgxzQVmBHFn6J#li@A`nM==hqb5!c0Cxw@X)zDo^7~ikH)M1RLYo0wmV1$Q&VIO zOwX=_UjijM{P!?tQYCv{DO34szd4x3I##v~x_VdAh8UT%gBJ)jlrEVYQK7p~#n8JX zFJFFv%OPOhlHKS=%LD(8!xuk>5p_FK)zf1<@KN!sR5;9=plV~B1s<|tRu;Ca-%*W& z!G>qHlu8YKC>ge2v7~Dp(a&%Ti9O>N)dHV22heQsti9LBf$DB zL%AX>c{tzZ-MgOT0WB0^ue_E|B8a?YY2K0}yvV?E6Y?_rM_4e{Qxa%zPBT>NsW}7o zw9I3v(n5I@iaoUoGA9!OX4bAJ1$#+)YDpo7J@d$_#rI}WGL773lUnwGQ3TX08o+0Kn5v{7j}@v_?~4aQ3bZ65wMFSf9TDhRI3QRZX{k;w#yQizYgu9pPzc8P zu!93;a1W=Uc`T7TXCr!oeaR5cdAy4V0{Jl{U*^a+P8gcZj5LOWJV^h_QdKhJFbMhU zR`M}23zeMtYaxqX z58d9a9CX>Rw^)%Ap8|8p;t5FXHWZM3Taaq*h|}BnF)uyLUXV-BR0*2Ts}>t%D$uw? z6zK^KF2J#NQuyK&CQQfL`g#rw$=&dHDxSxdf+x?xb8|#^2CQ@8&Jp(BMF!7G z7I)tfXi<46zxDPoUUA}jV`$rzToMjtZ+vv)5XbE!`n_0WxyRWJR}wNjlXHzXa(HHQ zNHq65?Lm0H&%>1mD*ru;k{-5j2FX<|G|19+kYb~yAtGrpAR zwS@*a*6|C&h&b7N?(Z`hSP<*=XWPQP9U< zC!620fb0w_VNl3;Ges`X=tlm7VfIQ-HeN+g-prtB3{stHW{bc@0Wv(eBawZhW@!Hi zr&4MXJEtehlOq|GAViXI8AZ(HMJyC>VcN7|Uum=2J9-l0Vc!NXjPL}ORy#-308#@u zt&nPuKd^|{mPyc_)b1?c_A)weSwaK!hX6B&GwH8Vg)qNLBU{8=F&KD7cqmrzUj@oP zl94LAN6Csp>*aLD8j}~2;3!z;ee!mmc?VsF+E_yLGWeN{%Ez*ICns{R06OKfRBG;o zeJSPaC!7Tm1q4U-9I0p@N{ ze#z`INIZf@N zH`q>1$XMcBdO=1Jr;oBu`T9S$1vkxxXpkf3{$a}hOzT@(IdnGE&*UTn(}1^nLnW(T zK6T`)xmWk}%T)KR=}ZUlvL=KAq4qW`5z~l&PjOoHlN_V?dRoB(-G}2bY(aUyC?6M^ zJsR!-q4simIrP9#JYaKu=0bxspYD9g9Ie2jC0Rq_p0XefS=}IMBsSHePR;t=ljUUV z|URkk9ovcvAl$+j6iz?JBSgO<-!zF@xGS0B$yoSi^I#snMJ6K?Cv}HM3zH} z!SZuXx#qEmwsGc`u8G&A?r#vFF>)}g&uNX#u$QYA2n?^#M#&1N`HS7FD`gRV!Hwk5rzdj(>=PyfYLiiHz3mGdMEU!5>j!SWl zbNhGY;Ayfw(Z$P9rBj}>6!Xmqt?pJ@GMNX3uKXiMwtyD&n!n{MEzCJ7Mi^tOvP|Zc zdF*3?MJ_`yG)Va=2ht-mZU}9S1W~r!Z*&)BtM#2(PRb%c8@35C-hMhWv&->=3GT_2 zcr-k1%wgv2%d;>wTsoNC2%MRT^T4_+tA?|zX%wojaN-M*fRvMK>g+gmEHV5OqZ+O* zfFtHN)pRZtu|4r3+1QT(>^EBx&&4`=A~o`J89nxX*;tX~A(iNpi?c8{);7{(@N;6g zA&qd52CAPSAG>W<{WcKp{y8&@x+17s>{T2zEe<;Y;9yuQf#0M8m9km;?yQ%@BBjg~m$(5a=`=3xk(-4vc)Cb)x0qX>Ri6z71HPkIWoJkQ2i=mb`L(rM#mv_9BwX9QwifK9yW2{nG!G!hR68I@z>3E9F1Re)4dN zTs@MiEpLGFV;FE=PO(ptVQ!(546>i?Y1B{t>CvL2f3%$GBY-e_3zfJ?OFyihzODIW z^@+gz)|-ab7Izx$N&Pod0mgR0+LT4~(=FyIdvpUjs;1m$sS%r9sAhS8K|^00deR{o zp90RBao&FS%yr`Ygup&g?$j|+hEji zHHMS5O{*9lbT;DJ;mf?SXVH%$Qy7p}#`4sNySi^zsZM=}$yPd*6FRMY-DIe+FZdN+ z*;x)pXDC=a4YR~lr;m2xNn(eQylA8kbbNI>H;c?df%&z1D7rra5!dD{L@F%JC^lV3 z1`i$aC%E66(>5hF;-ITsM4+C&z5tfN!KcvulnoW~ty{dsGgsm0yRM|$jI7eqTr*n( zNtnMI=al#!&6=OE2GTpxnke_d7<&}|<2*)r&RHkMQ10fgkFQo%VO zOZ@In9fX)pY^k@sX%IJ`$9U&0|ou#UhIuQGL{d_o>t3gkT}W~KkHiM=J~r6FmBDSJ7S zUYda49PcI%Y4ePlVcbRP7rG#yT#Epulp3ZdA*F1aG+4j3K~& zP;Se2ZL6kyfx#w4!Jb*x8oN1-<;-#73--p-(G?2M>Fb|OAeh)I_s|uPDrsd3kXciN zxvt%n7zAJZ3Wf*3!f>`@Vdmc1vGuB;LC7Ry3I_e`_SWKPTap|tp>7OcdX0lb2mApv zrkHS0UWj4pG_>m1JQ<9!mL<#;J3BU zE=zOC9=B3Dg^l~h9-S*IVE-}}K&&E1(owWj^#a-~Xg8EAMuJ~tBX{gh#N#G+5$r>E zHmAO|ZGD2Wa-L+RqsfUFU=19vpOvMQ^{#hPkt4g)yS_DppKSqb69QAAu6dcarr%kTm0Eqw9bF+5BwV8qKufY#vbme0IH^W3_*P=%Wkd(SPkA87q8pNmAo z=voF1fQR*mTOUUAh^#vK8tmiV9Gew;(>Qt!>}@kxl3@hEY>}29I8i{rcp`Rp@AZm| zYr8v3#z;C3L_!6e63t^7DNd552>qSV%>tTxsGOMtTD?Uu+<3mqUnx}BvI+HtaS#&@F={N-izyF3lmO>hw1UWy&3<-tob=+D>kCJRH# zb8PKgU$} zu67-i8T5)-rFp=KkQrsqWu(!6?ya4hJZN)mN!L`f0o?`rsvap8(uKh&;t2h-%3d=_ z45;4 z!61WZfwnGKoKuTnFDl;|S!_dKATrW?DFZqlO>2DbQ`>NskN5pDOy$(iPzr_}Wm(Dv zAF_7EH$db{eDp11?OMiAbFwhLChvyP{H#umw6w7WHu*_qQ&d$+8VxeZ6qdi_u$%U*Xp|s$4__f*`oxQ~|pMz{j>$?R} zUveeqHrYsKfOh&(!wPx_Qmil1B~Y${v~)=WMhXSTrPnUW@9k3+KUqWDU;lL!f#gqV z4_iAKcpQGew3gzk>7^K$2PBtp%AKv3|;nt_63DY#i`K2~7^(GA6nzUe2q; zivKB;MamFw*O8>J-7-cV8K({dr9|roGqyG{0nW9Re0LvAL`$^R7F;mLE3Kafp7@ONz zlp?LeIgSsEkL^y<)(+SyX4KWsHlImpOibw5mu)yQWPaMHpv~`^QU7e&KWf+_!Q_O_ z+uZgk*5~P+=a1=4uC)?621hpBMeGOb7EG3dp9P0iQA@m7qd_?`Qbk=D4_R4Ka6l1w ze+g4&@frQYNVNpaADs=n_ODuj&+3g#)2@;$tLj__jr`PsC)ox{Y?OU!@P>xQPg9Iq zx4gooMDYFR5y4NNMeRHCl$n0Y8Ylm3pT!pBou{gfII_QA$}$M+)+?z-K;5(YlaBcFSXG4;8*|hlT@qFY^)hk&K{xjgM}H9nd9p0jR!|$QL&?Wm1h{8 zT~I|VpgF+FIUF$4E+sHNQ#ElJe{AX z>qk$h?tJH)d1PhVKC9GM+DG%jPKI^pVXaY&bLW>j7@fbD=x@Gs>nlGE(?9pRbr5cx z)H2?!zq%|hc7((!EKrSw!1`FH&y6x2NewU*hFd>ZZgNE^SI%mv9iu~aj}G);pyjTi z8A%(hzrQT6WkZEtYuM0&FL^*J&;e$ptCWT z56a$2wn+15mHPXuLbhP@Wlk;;y(_ybnAEwmj9n(55ppyw8%`#aF1AS~FLk`9Qum!e z6j?cN9uNH;=!ogxo!?aR&i2{np9|_%McWdh-&A*xkj{68#V8ti zy=`yjaR<=_RbBgSwI$91#Ah4({Ypb&pCGTCWZFl>HrqPeMga^i=GINQq6E*Df`&Xe z)m`k=TbQPcw{tnOg1ztfZmj-v(pVjkr3L)k__9i}%3_OkE#u7pa9Z>Ix%?A{pzY}j zlKz|#UsaGQ@ykbT=Itg|j6N}9nu&mP@Va(&8x~H5dI^M`EIxhNs%U(Chiyc|G_5-j z){*x4B#?;e`f~vXy?sj4&${6ms0>{(wm?fpCFU4? z^2aR~9`= z;!?kP%h>-y6nyf`$SnhW8;7YAnagreKVp=yR`&HEbEG7-g7}HI|f5@ZP5A z*u?ggSks5XKz{J+d`qeuHrr*H%DC@TRoNHDR9FuD8145uqZV>t71}lbGBY-fjn@%! z$K0A|3dn5j?#=VSFzOyzNPS%Wup3U3iW%VD1B<%G61{h9ht#7sDY^4t8GFICQn{5Q zlN{uR%#D)(8V>Gceor&0Kad?XKXqe|6MOYdSDXQW-g2*Uv2Jy!?>Pe*E@iE`w!Y$_ z!X`kigszWGpwI+-$Seu4cDT~ND6+`uXJ%1>_XOR$N0T|zG}qM=r6=INE3ffv#sa;( z5ciE-xn=f_)R!ppO~HWyLP5>pGu?ApKq+zgVc;qEC+1o!zXjoyFjf(2Hrc(I< zo*aF&j~!1g#n*cY&F)mu%`2xhJ`vYhg_CmYt{jv60g675^Xj`+I7ywb}t-gx%-#t%w~KgL$tyso25;u|p~4*o=UR5GcYM{c8#1{ZG2vVrkpL(YQ+>H{~jXA zxW-_hjU?mI}o#sT`V|kk!XqYj9mPY(LE0A|m6YLXa=E-`oA0Ty%t|F8*+fF-6 z_x%q|c(|*|`q#DGaXJOt&WWeF4%KceYy13UUjMkFvtu%?{1PdW7fs{ju{JNg`|nR^ zd@{!1KRREotRF8)^n3X`;jqQs# z=LMR3JzD-h?dN`IJ((yS4XuAXt0679t-C2kxoiSy%Z8LmS^ip*X~xd85^BP7fo@1y zNZ2Jw$X5FOa{rlSzZN!O!YsKj4@YU#bo!_R{<5wtUd(5yv#}yF!^f{ioH=EczDOib zuEIkW+!m}Dm(HQiBpR9LIZ4og!K^qXIP_6)epLMB-ZP}Ru4Ip+jesAth&(ovxZhKD z#o5i^mN=Z*q+l$@oni}=%}@F7jchL?MNBm*XgnF663_b_P$C*x3$lO|_&sIelX)8z z$M!^-gTGH3z(rl0X*Xx&}#_gx(p^? zKuYS_TQj`V?e2yLFO%Dwfe%rL3pFWnVOs z?w4&a0jE={i^z%b@IAENc&d`09W8HJ*@__*o2zNKDmabvjanrarplslLO9TJ;gqIc zn{}|&1f}AIGotm$Hubv>v~r89h^Z+hdJ_~1h==JvSS z&r+j5o<%%F5BVlq(-+!;jo+U^&_OEODE4Oo`3xW_-j;hh3JlClxiao6SvGlEif-v&6^IT;pUniev zES*#TjjAu`qr`6J=VFi_W5~; z>3(bP{Jb>|1M0Gi95UG}U!K`iHy=|>O1-7?oEWK%Q0Mg>6nv$|)si-k-!S+yXAk{d z+uLeAnGl^F-}d_qTeu;V+_rcsPGi?I^P*<%0`d^_RotDe{@Ef##{Kg7 zsq%F=asYg!+(8ur$I&Z4lAJ7im1fgg`N$W11?eF{@`+#tYdwR^?Jw7GP14#Sd1yFL zK{j;Bh4jKVyFojUTEcMkI%se(Bd0Vn2^&W{F-z3{WJzA+Kyh>cC)t}y7^=VtLC5Oa?Wj~ztx(Uf}&sk3<`eu6m@{|XA&t0+M$?(Drh z>%7j!c#uULyf2D>Stv|AG2es;Bd|p$VFCWjcET>MB{3)P&SgUX6rGv%riTyGn6xTGEgp9!8I<&%B zG>D9(g`Gw(Sv{V6dTHQ{SD=l>GPq(E zy}$NtfT+%yubyl$MRu=Jn$Ry-s7nw@gKLJo;?%{m^3*Q2?#?nEb5Enqled0u566RF zo)~F=U+x^EHP;LW>0$X`4g-1c^4wmiz<3x(aXvi&WTJ!S zQ{}k2y!6;OX>ODQsG9iQX^z;@1S$6AllKQ;7nJ!OxhrsyoS@TakP>sL{LdMT|Mqy- zN@IhYA-QC2kE2|E&QtD-E1dG)bo1#^G2FR5)aw%euInd#03fyEon~8k?5QLQ9OVEnB9dL#Q> zciveISKIqd&1OpQJV{>sOLD_hwabo%Qu1dC#ng76xke` zsv#xDReL`AuC#f|%7-_#Yfm#!cZFdkwR2m6vR}q2R55X+%vZ^~-m;twx-kY> zNlwj=M#rWOZS-wb$Zn@&sJ!ODMfB*uRmcMp0Ne@cR?exi`OH^*gzIwNdYBG^?I%d= z&+2jy4UBP}wrpP4hvC{(g`-_cViHt6z$^Kxsyi+b!&5|!(C^7xnSFEzdkMv0mBi7o z{q`pFI*IMK*V~Olu^~>xYv$)3;39l$<4l?iEDC9X?t~f|Cv2R?ZZ_icjFM* z`RR;#kFyKgGw(wIee7XFuY#&u2Wby zy__&mDLRh{GqznN6W4S5?3M zAfDz@zq_V`M+KyX@$ATOQoX`PTc1LbQ5zB6ey@Ux@< z8!@+t9x3{7LjK~a7#a!}0f><*X#;wLlpRMI~3*HV02q!3%| zJwV4Gr2#t?G0st4_K45@Wla->*Rr{T0RY-wtA}v%sWCFqhdLu%d%=%VYH8MvX3LdV zVM3qDV0vTvFo50&)xN=C}R6=2M=W)dZH9GlHN-FMW)@snukx?G@)Bqw4DrxHPE)2>e=OD%5mG7O% zLQr>DSE)6s31fSo?%9>tKGV4CbSQr?;_gTqs|qxGSbmyC{oc5`!=2aM5U;UhK|l&` zX6!#+V8zF2D)EbplbMRwKDCTAB5=okuyH)B+!8bzggTxegj9Wb<9BGD_rM{Ug$b@*G zfu9}&#fnEY{6_g9JGV-w=f;aOMOAY3xu#Q6v6%@JfIuaGNhvVe68?-AI zuqiEvA@}5|O+*<OlZCU(8^)%fIUQ%%mXh5v?jc83>WCF`!lp%D-;{N=Zj8 zXnU!?n>Rf=U5N%(Z$c=N@|wsC*{l3AoEfOvAY%7|OI{-g}E+Fm;^dFUQazfIGMg#lYY z(Ygym#-@eZsbIO^P#RR~!jyAK9Fz8hEbEcB24w+|OK*~Q2pYhp_}#wqFt!rE31(=T zIj@I3GGZ3y$Hb_I_b!wrbLCum3mSn1*V2u+Kc<9B^7s{U zU>@}2>R+Spx=@nl;{o+_BoFQZ&48O)FpVTwsN$VkykYr=pIg1^F8a*;-c4&7`t)NQ zHA~ucX`bDRJ5W(_o28@j-3|HL0z^Nploufo%c|LQGf(~|k#$J!&8)bukhcxV6u-Vi zt_;(_2>`yRfNm;u5amB3kbCb=N|N@|rC^bKb3a6-$dbysQ*06A=1T|mYyusQYEGNLFP=4Zco5F$GA#E{@_XG@5|r@ zWoo?Ke!1?syIWl8%D_6dToN;jTR^*S&XGUW4m>3F*>Yi?k$AosURVNZ6sv9-f1U{0 zo-fe*WG+Oi9ZG<{khL^}#hr6Jev^HRkoN0ipQi>M}5% zQUVDJkSPd;2u^NF7kBS~O8fX$Z;v2&<^#UCY+i@6btn zXdIK@HhEbRP+qz4D#-R*9CQN7Kf`kFMXZkrmjR#ldCWP9;7+yn@)a?iJTQES4h}r9 z&2O&Nq&$VWPcGs&mxFt?til{<*f=E$G#_+575LR4F^(n6y?HXsFW27!l+K!;hC9Sa zESV?k84)X%?YacTc#cQLb|2IOAs2+CV6vRx@aZU|R&LBTZPjQ9%aYpwj8P4qcv%EY7}%v(K0rpY=g9rsH3Ob#l2^DYz zBfFI4HGx@+V-jhCh`ICJhK>}uah+UxyAJBglgj=XYMNb{ch^*#mDfDH_J%as9_W9H zshpfe0|&?#+WtkA-b3b^`>5(OaP1GuO_#_^8FIn z46L*T241ytH_Q8Tbv^blgtJ$d@W&=nV~wzIoIAIj=g+9gze%ii6wg}Jn7%EB9!*fVaEH5{hW zfSfn$_#OiJygO*YjIYg<#e{^{T;k zx!Z@tw)Xr0EX9&Mg{?FPtD05=+$J$mFY?@6D{vmfY}oktQA$B{!4|R{?&L`gU#7}? z;}vEN8DAAVtnS~7spuG2&gLbD1>PhDLu zeUs&(X<%0OW^j_1k_5n{tAOx}X-jrsw6*od7=2q7RY^st-&wFFHjt@7!_(E+pdB6k zNq5f1*L*UuquniYu7L8_xO$>e)jv_~nr`hcGjlU)5uhMp)eh5XK;lP|+3QiRG&pQo zQ_CTPw}KyOTy?MG;bbK@3nRwC>BN@0?K-)x#(j<=p7^qhw$Mx9Gk&}-LMNv;Z|i0D z7CD+J7i19W$e8np1ykGiArpj5J zc{!Kzt^d^M?uK>2f*j-d9Qy}g#c?>~hP2)bF+3}@vOMaR$bSC)lPaS=typQ&r-O=$ z{%eU7NG+`)R&N>YBDB>F9F+xy?2hJQ*}THI{RW6FL+%-f>Ovf8{Hws7UR}4pVN3}f zN{n#Vy}lmG*|&NpkWs zIkHC2+Ix(;>Bq0O5YYp@1cqEHW~My{MC>HVO%+#`mmXvN$4t|uhBnp0F;;XIQiNFx^`Cg+=7&?P?5N<_Zg#ree; zy<6D$T8^S?gZJxNK1TkI#GWnG=QWN!!gP+gjkF$ro0H_3i{z8ZwjgvC^1O+-10)%K zO(re9x&iQln-6(mQU9VPBAw=NUw~fKP2nc8rR-$^Ynl_vS~xiH@a5# zdFOmcI)po6_di!H!*hZU7s7!H1&v=`4#7q-*aei*pwHelQr47_nk38oRlhB4Ub>Jv8C%bix(gr-r%2JW z$6`Zof%3u2IclvsJt8s4mOlK3AL! zuV#+gy;>1Sx*wDJy@yHClRRWRdZv5~?|qO^;0=h$OtCF3q7NMazu!mCo|5Ou<1xt- z`Q&mru!o@E=&aH*_xIIvcF4cA`$I-JQAGi|E`Pbo3B!b{EWJ*7!Tgd_1;5spg2*}T zTJl((ynzr@NN%{$dbE%fEjcIp)1(SFT;`t&ijWnK4hOuo=i0o7+VegYrKrAoK4bZp ztCTIc=}so~_-O0V{6v@g8_}KmW%Ix>!(NCyy+~$amE2Ki-%sJmBVTel_+ywM{By=rsi2B6FcDat9gWlN`8acQb>r9hx z1Er7!fcB(&%$kPNShtl+{Cz8AIX>y(a_+aEbZtS3m5sW0qGt2E$y`;$J^(iZOX_0g z_#Xj2Q9NxK#6EFGEL%oFMr$WAWev-&f5)1}8kPqNjPty7%UOT5Malbm$m09i<*AvkC1sXw`2&c;L=7q`f|W!8<= zF}LQ^>n{_j9@O>Y{z785_))*1mxMVUc-EY1ul+p^@!2dI{+RbaWtiXi#djxUyn%B+ zum$?xk*8DCTbfxY3r@n^Wm}z3~$D7F@kE zhq>?0CBGYNE|T7JIH8{Gl1V$w$vYeDn#H0IZ>#j=^e4~Rs?D?mc`~|4-OR^Uh&fWG z_wm?8i)>+YMq=!zeC5}R$nUG=yX)&eifp4c{!_l3qX~wb7;n7I>%Qac-U)!9$eL!# z2X13Y;o$p4*f$!J0RF#mi!CykCli~Q#OEPkUL;q6hnC1X_v^W~Knj=}LL&L7X>hiT zXH}4y{^1I9QGP5bxqTboanojf=DJGdb=r}XAExCP{u()B0t+K=17Z$+>Y9btqRgeE>#Vz-`yQ?DE4(z<_*LKYd9`Fe zYPOC{DeLQ#D|4l}NR!=BQ+~{qflBLeQgl-;9Y3&g8E^QsEEt4|CSdMR&b}L+I zxJMsqC@UPYMz`&P3?Ao(-igEI^$(l25ys)pLDD4sq@H&sM0cmiV>)`bk~;I5{kLOs z<=y2nrB&YEO}D%8%az*t?OQ}D4-s#1OqAc;^{eDxE)@t~SjWJeww?3D?~Y~?on04A zq^HJbWNgs%_Rm)`HpPhZx)WU5YvVH$;^pogI8@SedvMAupw(*ZzN>(nSe8_{n~MoX zX`TX8p^e(@W90|E!qh#?m~;3vSmr5}WKl`2tc-9=Xchf2{pI;}WO56_vf$ z4;9Afu8JOZQN_g7S>VMWdd;$@@%ettF(Ts&n1{DUyR(kJI#P{|6VV&5(;nLi$b{Qbe{-04qh~pr5YByssR`+Zm)E zc0p{yF=5|mR@oZVT@1^W#ca62F7vXyrew(MT*{WQt(wNUgLI1cf@x4Gah{By@@tY&Kys zwG!#uqi4e_uG_G?mOrWXGl!G>h{~lN?AJqJM%~`F=s6C#LCMS8$6(wo^SsC8t9BWg zBIUz*_Ph>1r=XpXi6|%Xn{ji*RmsSTL-rrm|y>Gxcp~`K49oBm^ z3)zEUxc(&hC2(|i?7DOg*D-DKKReWWyX(?|{V^!w5h1{rx?;Qh`zZ!5`cXOOku?BO zg-70t*bw-+h7>YcWlNU4zyjK|L&;Ur9KA>6xAgvXdE|-%nnMW7h&w5@Irr5aXjqe= z0V5~w>@vyC23J%2IhtcCQTW(&)n2^)MKVW0hwNG)ZPhY;vOHQFsg8{uN<3UniPDlg zT?}&T$Y{VJM+PvZ_DV2=ly;GYrWkR@%~IeQ*d^W@>+HsKIu9K(e<+!qF-k^wm}Z%i zW^|^xu9N>13vqnd+utS=D$%pTZ6X_IynQ!M@}%d``i7b~Ne9s(#uK>W#)gxJ-10%v;jAT;-j+K?1mTA=~^# z1|#wi1HVkxcQ69M@tNYvm*o?6lRb8&`XL?%l9rYqgjnS-f`uZKeJG#k64z-&sw}_)$|@hWx$zBz_$WmBeM^#>_Sd() zT-8V&0-Uc@mw`Ai{^njpy8gYT4V|eN(bl|bisc+RKe z(5+u6XBS|hSE@lf$ejpMc%`;c3Z5|kkrg|uP##_?bm^TxTK>n=r6u*Y1!>$X4T~iO zu{C8>6ncc@|^UD;Uz~-I@Ay7iRqLp9yiaV)1kxSq=uE`xKdCuft;l=~)C!7?KON$cEMCR~xYU^sYrztg2qt^4r z#3t2{lZ{TvDT~1%5PP<~t)ZEeVXG@g$LIAdWV0BDiW2)UynE~VQH?9@@u9dt zYt1fgTpcIDN7)Y-X-jYLuXjm$HMoVhywM+;>#C#KiR8R4Pj@gvbuZx) z=QPrwICVIXRN7JC7?x7H@FVVDoQ%TS1Xr9wvBl+;C-U!{O?=#Qx3HSz5z1V0j|tK{ zWX&I?OZ^h1w(I^bLj$5|#ZHjO^g7A+19v9HPUecH{5wd0b69@7n7rVGG_JlrabTl- zTgt3oCM>YpM~Bt!NtRcIE1!Rwd^!@|Vk85CrqNn1_unr+zFzTIzQ)nt0(EFAbLu)Q zQ%yYY#kI5acGTvZ&1(_g+khLXJ8StwQSy9euem$j`pcba^W6)Yl4 zzRu=t+MPsMyQL_LcVoypJ}ixH%IfIQ;#SAD5m+T~a(yKMJBYU~+wg|X1;(Kn4XBRb zL;RXY9)n|MW?j?LJl*Lq&i{!?KA*mL`B`SxG#!LvvL#u`=sMn15S_tkarPaBYs-WP4YTr&`p}6 zOHXrg$)=}9HO$Xw2aAUH`CV3UdL6eH9W3u!O`W%PmW$BY7*o_TwTN=-=1>~S+KeRZ z_1yNx)MiR!k0NRSpl}%3i?ea8YbRuN#mDVCQXv%#sk}c&GDXf{1l^yx!PC{pH8+JD zKCq4IZP{F`@T{=4F|CWu6zs0Q8r=nANq?{>ZVB z(m}$#<;Kh?%`o;6UEJtkl*sj?6jZ7u4*LG4+DaYtL-YUdKNp92 z;@^v!w#BvXtmheMbd};@?1oCFfi9XO^}N6LFo9&_&_8w6<2Ub34=x+0S6X*ob8?J- zbUZfn_#%$BUZ!Twt$SzZj#NWQVKCZf|v* z#OE>0XAZ|zYq-9FpNx+kO}>+`@N((d^81Ty#FMJc+YE@QI^1;(f|kxBP3}4_f=@8I zwQToEwlR6*$RN~u<1uK!ZG1)l&m-1ZW?5p10rS^;z>4 z-DR|fMmBlv{Hga5YTGwf|EAHYsvHjzNVyNfblFxgCP4z{OWkSQYQes)j>PDmk<`~a z5^bKgH=Q!;3k+ob7EIvcqf%7URz0)P7pH(qPecBxK#IvQQy9HttAfh>nS+^DnSa?+ z(e>nJrr<9(tRC0YP6g1A(VRx!K<%BUN3SpEG=jWNdhciFURP#49=1;iEUJq`v8!k(GrzPrCli4L!xwpy$DU?H-L|AXV0XBHzAcU2v^^ zv-QLW810VNPPbPF!7Cln>}K&9vfzd8Ym=h4o_gzH7Jt_tJ-SL>dRs~ZWU#E@Q}x`l zTz019{|&e%$;14u6e_E!eb10t56EcrU{OWWE<$k}63@M|3jZ4d&$}4mp;hn*VVh;VKh^w82y?~nt0r}9x9}%N^|hcB;)xT%|`0JVRkQo|FXXCI6EHNt{JGnV>$g-Jie|g!;0^Q1<@A5VcZ``W z+v=>?X+tN!oIQ??Y)6GBLOqo{J zLNN#ydb-Q}&mQQJhc;?}t_jI`Lq2-G>uTjP2HiSdVYemaDDQ1_FhVMR_m&UjGO=Yh z3)`x90#wu4N-67kHcjfQ<%hFW>Lt90JvV(BD`(q)TsX>X$ksLA=**&14}8h*(8TnF z)1>4wnewc>w@(gl?4mP}tu#!Pr=Ct%4kmY?LU%3!RkKUgKu+A+#o%N$NbXxw`nfD~ zc0piq$R&RpODc-G@=}W7?@g4P^>R;@d3Td4NM7zF)A9EW^7dQS4`)PI4sl7w#j;QY zXYm;ODp>ynPn4`>&pA+2u}GetSMjAfiNxTMLG3vD$3-@uxg@|UlDBfTx_|9tWz>P6 zBdXK+!pYiL1FDCGy}T`1F8NL-dt~0fm78cDJ$((!ND+tNr> z@huE;&}Xv*2o5%cjDAr>SS4OvaGk7KpowvrIq`ooll zl~6&BdXJ%gxW%;Q>D;XSRb9|s4~Wa(^JKE_=Fi`T)st-&lATxS?tQP&SUz62&`ala zA5^x*L9l1wqt3!;z2%GT$H;C~*+9SXKYy`VJuBm+akngdOA2VV`l)LR@h6o)nV7>` z{`%D(;CWj%F}|q{@_o0}Hyc>zz#49-`g!G~^7|I8M!zb=>MGZk;_ZfIgOjGHsz zVb=)Y=725OLl2Hujzsy`1B-y|d3xrhkjRpaC-X&(`^=Xz8FQBcv|@jj=4s|5&oJgP zE`x$7{0HEK;1dare#~aGowJ}PTuXYE1NZ*{0=?B_Ch&48Vo>W*CY{lpRkn$sm)Wgg zR+O(8BA^Oh9Iq{u#K4q6xvJ$G-R*`Z8c;ceCCd9tXA7o@6C4m-7$pW!P*#w=sRt@m zJ<^BZ6}*1l1DzKfh03bWXUL3q_bS^v1wZbML?YzGs+}=jxhBavQgl@&HIJ7GvR75B zssVr*-WdsFviz`xDBPREIx_Ep?yYw2QZ!I@hoI_a#FaqP)4gA*ni&!MR)}yRJN87nrlBnX)`k8=Y=iPcc2kgt84Z(#%f0vc?*Tln;3Cpv# zro;J5g{OFb5gws7wUQSs=PIGM8vVx&Q!LL0;h#)6}(0Tyo_D;R_cPr23LM~n2&a;nBmFx2m<2I{S}MOsD* zp~|%;kq#L&D!3@QVsJ*`ZiHxXyhveFo~H;0UEAI@%F{{f0pG}A;S3k=AJ4pK)xJg< zFgbpLy$RI_LV%=1T>&H`iFPM*$@+KM&t#_{prd5uz;Q@AQx*&aid)$A%nL&TaGN?B zj~6kCIoBp(KZCCFe8Bjs71T4E;(K6VP7x8e_Gbj^4$x9Wp~B<(x=8gbK;VT<&_7hh zeM*}{Q#pBWu;AhD590xcAXEeFb`X$S$WsTcq4(ifX$?yo#`TEbRb5TH9y^31k5TDv z<@YK*!GGvjU^I)j&0eJd9F}DkH3pTbw=2iJ(dy*aT=ayx!s#I*9;=Gr-)2 z5}t-U%T{ypR6;nXItbdM8$9NS?Vu1#Fr%W7pqZ7sXN9dXK2Fya#KM?N?48fowI;E5 zY&okByRKRwbz4CJ`0=|zezDG!nhGM}MCcv*6DzTCP?b{M2}GDLwi}Czm4kAJLcGus z+Cm!uhj#n#`ItDcab9bBT;u8lIhK+Sf(dy~e-D23I!7hyU#vaMVZ`6PDxU3*Ie_^P zYy#w0-MbuFT2l+PPouvZQU}XyiHj0RU})(OB4MOT0Ujz@v8|eFu~(E*uVtmNL%Mt8 zcx)Q{pvH#15o>`UB2*9_HX|iBP`WJs(DG~2DD%Q_9FDl|p|IDzGYJF3?jTR6bPIHH zabAySj+CdD%YqQWCxu(3Qd?Dck)SO!(0yWUbjW^j81(L-G&y+fqLub)$V4G}1?B{B zsHY9ONvMHYb%@t8i@}~iDl?7AXWYP@u&)B$yOQa#;+)`skR1F$pbhCv0ySX()-a_h zDQ|*GhVX23Z3AbeUq}g)pGgCLF_>1wd}4${Azt9(tQYJp{gdFQyxrH*H>&Mg>^%BM zBPjJ$V>K}&As-?@-u4G%zEpCcK}f4w2Z2R2P_O_nX0n@>ES`JO+GOd=09DNtvcrbd zVt6POzhqysws_q^$u1w%z3LeB?jkc5^q}ry2SP*PlXV1zrnmp2Y1_z!m2x(6R4Lu} z^XZ72hPvY8mHs}IXVIiC>m9k%R-Xj>2n)QUY)I{%l~Bnzb3$SbKqdZ~`pZ#V3k_Jk zlHvgQ%_(FaNrKp)Dx@i9in86J8rwZRo~BK+{!#cwI4rEdiJdVRC_<*4b}yPV23xyV z5%VKnz!Adn!ubM3BqgV^_T4&V+OdV}Kd9us zSweVB!Qidc4Oc69H}O%Ve+AP#3^9Yc_%mwK*p>7O#|>92{U6_CS0d z>{&gu(^*86-r0d{k!R!UCqgbaq&&g3!tyj~97Lu5bn3V)IbS5MVHLr2{Z{*l_UR-8 zx@Vx)fU45q3jXp&20n!r6}12y7Djat#V>Do<~A)bkw5-WBrRP_pcXxl*ciMs97WDb z{4GDgRw^t-%6ov96hy-T&-omQ9Z7~l1@Dq!Q>+aOx5`$E0bvl?u~Lx+cynhdjssg< zdteH(3l5MVGxiTW5}JE%XY-@`84^0#iB@$S@OG|P6KboN{55KCNS7fi89i@rj*khb_>O6 zzMnoVo_)jSrsj+mQsB75=GT^nBk_26%50r!P@)W`&-sw6OB$xTXhKldIq|8r+ILO+3Tv(#P)WtaWpI+YDtn*a`Rr;PSHQvBoFXN_n;_!x}ea{}<*yJ_oN(2}RFCLBnxp zLXm0~aw=K9eOc@^pRf0@)D0_w#2p`(?2D4-<9CPg2JxWbtWBt7xc|S#6~xJG5%5tF zdsRE^u$WP~HW$$+80Pq6O@{;;icGi`z1dA7(= zhl1B5;Q;srnihlh-pcRZH&LFIQFLm|CS4hq%r_Z%yr^s;*?5iN;M{t z%}q4Kse+4?4+k!bt7bAfv)(a?HGAt{B?f$nU6KZgW&~6}9&m4>_5rIxhrB3eUf%y< z=}h38DzpBdKnqQm)ATk?7rLb@P3diNliV!OKm!CQP!MHb%f4uV3MeQ-Sw%op1Vu%s zDk`!HE})=PWgK-lbd^==RD{9&hPww_4fdH zK?r*u_WP`j{I-Bi8<-P5Cwny5jqoP(^T9fO!TRy2;&Tb?Ag>Qv>gcXeL6pxaAx>FJQ=y;1Vb$jP8$rov$ap`%-eB2#vBIj$$!Z%R6Rwy z$NIDQT?ssVMYYi9Wz^qg@iZm!F1BeXT)wvHqV!7#TMS)%I%9cYIw|Q2T|I=tm66? zEkSE5dArL>7KesAnGOXgdAZL3YxA>96fJPi6ta{cg38#^aIgr5B}%nI3i6Ve0dDU+K&B~VW#PFbv_(f`cq+9kX#3_ZOC6! zFZsbEeNCSLjcrYh%(o*{7&1>AY^`TIo^)_Ll7Kg%rD=YiW-ZxsfvrGU=EA&)RTD6< zub@OWM)&IQ%M4fBg^s!H?^~1x)?JzPMIa%<$ z<|`q9u_aXF?T;t!fAwY=3@M6X)owOOX32!Lhl?eUF58uS z`;D%p34|xpcrO7c36D+JqxMb{Kt?Qkr&_+6fcPUKZuIdCZB4+L!6A`%^gtg65JQk#$|k zN?Yr&0pk0Zk|YvQnVY38Lp&ysd{2 zpftQ%ACV3kBhb(OrqK$lD9Bc`njTd%)ktzSKhD$YQF)uD?JuWoI4e#4JMHQWs~Z_% zlKH*moK>c;Z83oPzO;&misH_U9Ob4A;$i)}oGA(H<4*$qw)WOT@-18j>lse(PG{Ao zftQc2UuX2oV0kKixxH>SvPXKT;GrO&7@-Wz%n0Z&X^NrTVV7?*X1!KFmLN!wDRtS= zvG90y)q=VOS{KPzb{F<cjwBL=cjOx{; z7wngRK*J(ghw{j`NwcHrGFy#fvY2ff_JUa%PYpR;1$WC(O%u!@-soJm%yTd5M`ppe)K z|DQWYVG+p!sG^M@zD8~;}p zZsnYc4ba}H`P@(2;!B*eyg_KTUYr@=@qieL!B2`5Qn;tDo1934 z3yVk`SQJVCKV`L#hOQCxv@=ZLl3{tN6h*$KUQF`&Lv9M=YO!WmtJ~*lGg5kzAW~_v zFge=)l#N7FC~=IPlYm-jAhUlQ3i58XC0y?vzpjxX@>|oT7CRE^4;`VQf5ByeLP2Ig zJ#Vxr^@t-bwbD*!aY`{5d`9Gc8yP*LNa$2$&~jBuS~Zo*`P03X^x1WHVzqY4uB|G? zyMaq>pJxe&&&7u2biy2B!2R=Bzi@B!e#-o;-@5U!u>RTz=kxxQH^Xab`qrPi5Fz2G>AGpm6ZJ*Hv^J zGw%Qqr2T5g+AWA{9%1Wtbqs#o9iaF0&s<1T2M;HtYiTktx1A5}_(rh8BN1nIhs&qx z@Ayc4^dH3pwG}DEzhc{^6hH#NITqf=DyS64bf=vU&DJ1jaL!BDa*8A1o3OsF3tVuX z@t9(Y71v5dr#I)~IEu_g`8l~di4{&cERCqllD+x8?$JdM4`nyJG1q|(r~0=!xJF0@ zDRGwZ0qYtyn;A*k6$NTwBB`QNME^ue%+`$}9Z2S%1>`2CzvHvO8X1r)f3@kubL(sJ z!R-;v359lf8!HQ$+`|OiAy?)y87CeLSSVH+p(3xvdQ>kf-|a!n4KzEfr6 z-`Vn7IlufRB}RF*P39nVCx3D-ouH_^y|c(JR4z|^VwPcPff6?oH>`C1l`M3F$SAb| znRKxS71f`&9-zQhO322=r{tp^*yH-O2eLbJ&{n2;<#=8WU=KGbY+jRrCB*) zQKot@EWEJWBkCWt`6AbAWam&osPq(NNN)Gmtd2IBRTjfYsIsBYa(%kY(uAROjTYZ+DbfGxMY_eIuEq6PA$;JIMB$q@MW&qQMBG=`~ zVTbi`ME)(_4w83D{B;QGV6MJ=t#qWDU!`lb@=@_m>YQy0>kG4@U!^nur-QAkY&k!} zJY$VqlgXOJf1^{1Wmc^vyz)SNI@6QN1oEa*RUUq$xet~$PES^f$ZEM~vq#$Niblij~EI@zT*CvJM9#jb~;D|sWA*2n+xob zop$bM81G;X7*kN)47&f~Z2HaOGl%8Lk!-+vA4*@QtA{*eFF#N?RE-#I4@;(>#K!O2 z{VoSZNveEp*XFoe*U2_JN1;dC;$cEPz6O4WDLsogguyDR3YH(X4Y&9!o^&%@1ER>> z3i2jsA|Sc;wOx)OCGL}Ccl#E~6nR_Z&sol4IIBV#GJ4UIV}%g^8**cxQ56`V?xwWj ziO8^A))>NgSO)d_zxk`Po+PRyaj2E^N{(dHo=R!GhRfDV@;Z9i`4CT7-cOPBC6Gnk zQho6ge*p-vn`>?YZ>MmW-%&erIMM#DGvE&_-fU>#OXekaD^?|dcEnuQ7@l~K=eYw#HFyY zv`2JfQY!5*6WrF$4h{zN=cH*LS8~2g#jjiNDr!1FIu1sE11T-Xsykh*B`jeMIRF*E z45o5NG+T{w{4Gz-fFB^ow**`V?9|2-#rsQ{8*9rZdfrsXGcfB=L6xES3bLP3wvu-% z)Xu9#SX?s0=8NH|&&EkXGm(jT>)lYnH&x}0wlP1b^|8rbmvUbGfuT#Bk}ZC{TQ}!u zTfNRO0T&TYlZ`zI=XBi(qsCqMh=L(FEv2bAX8I)uHz&ET&_MoRLr)75gbe+ul=%DH0zeZ$W@Ltv^?epz;po#Q5PM~;M$(i3hWU=1w6!LH^C(V< z5CJK~t@y5$S35rdx76i?Q%ZWU%Dy!816`~o`k7Le9=Wn4x>ZFCo>SW`ex@|ZM-uRa zlgIK4Nu+ygni{w8=&z~=`wF%=Qc-ND6&DJgN1hlM5mMctzR)t|h9U`8n~Z)9FX$Yb znxC0N+ftEP3?0F_NX$VgM?=h~y_y5KX^iU&!;C1WKBQ_*cf)Cp1nO? zhPl)j+CECCz*b7@g6EXSFM}^I~PkE|-Zg-ilxnxPL%<$)PRGq6}vvZ!6g5CQFK<1^cxVS?=Do^0mgN+m(ij z4EFAtY#rlToVcG4Zhw*h6bw@qA51I3A2~0}9GInUNd+=Q48q8lsky7HpR@ek{j*rb zr~3@ab&W4r#S`e6u7BLCGg-JVTfF6nsQ6Y+VD=^_3mycGAdpu6mu9NFqNwR^74V;} zk*CWQ7#EhiLiSE&Sou2ID-isw4Z2(Z9eq$(cyIj7>2lz5I)Zm*RWNf!dX)~zeY zbqc0@R?0GPF^md+-l_6PksK{@f2r{d`#T4=w*4R<!5mSkgtqu1?Z_5_Luy-VS>xvB?QntBhn66dk19i`2+?t28A`d5ZRQGJ!;f z_Lq1*YQ7xCTT_;HQ3G@xlbxrM+b<}{QM&b%egfGAb;GVHwlR5kI<%cx@@g;Oc;Ce* zti$E83~Q@%hXbZnxV1Hh2ucUfYbM*QC2oAV?yHj!(`E8j)Lm92DLRMy7M)eC^-&>c zfdg!0_gX5~xI1xm-YG}h<<@_~#>NG+r?rFu=yr!(DlDdn1L8~rSYMiN9TQ9F$+Eq% zg3QhnXdA8`fDvnV^n@e8Ga)L29!{*%K6WIw%Bf`S8C~U|Ux&zul@akv*@-2#YGBlk zjY>r4V>@^&;EVgm+&Gu}P+=Lxv{Kz>)!bBu4+Bf?MT6E=D0G=Ivltp~tWedv%*67_ z=s3Ylu+pmwXz8gKfPx_&f_JV)0hw^aR^48S@L9>{2f_HH50LGopnrPYYOk93pyTr z&l5Vi&gwRQBMABR_CJvLq6uKjbw?zYr8am6ZFU}RNj>$i{w1b_4pNGMa$u1g@)a7^ zQ#ot6U(HXfHuja%)dU2lj{FxU-Svs#eKE6EvCjf+hsjOf1sl?#d>GLzRM2(IK;&>W z&B_D#UIL&6$DlXjX>T*eR>Uv3HNYqmmxVeCbrm+!8&-+Dn4w@eoIg4F^Y&b$0^%ZV zcdZ1oh%IKnESUa=tR4zr3@mi9d*dT6c|~PP8!M!$BygZ%S1^fuNZK`U;&(BFY;6dt zxHzhWgADD(TwO z_%RfHIwhZ*Ps@ww*dCN+nOMeETgtd4fTw6Mp!u4%qC+*hS_)9T*Q)LA*Zc9`9!f=_ zY%5PW=+m~PaSbP^E9E(_6le%XtAC&t?VX8CBR@}nAWvfv`^?mod^QBxASde9E8K4n zMxZ;Jqr4@HG`ztEZC=wOHL#Q>m^I_QH}Kk zwY{YZG;x0fQj$fnP2}jC3}nR209v!A6zA_sh))Gt0{36*q6YTL+kM@u%Eg~-URNyN zX3NM%m0#bK{Uf^^>fFuJoRWIeFxYq9hveI_jj~J6NtE7vubGL9nA&b7E;qd7m1a+65r!&1wVg zeQmPNHL%mb#2qs9ib%?pk?$F9kX{Wi>cX;im|V&w+O2=twUz@Wj48J&X@2QX?Hy`* z+I=jEj};6~gIZXSwO}RGrHf;*$(NyH*2uXfF*QzPxEIi3Ye-9G-)Y>HO1wgM!zi)% zjBT~@Ll)bYsZrJ9FtDAAXBqz~RLB;XOuGETL3p82ha}2kGE7CDm*$)$t#YVAk3vHu-F9KAb`X z{c&wtJ&^ZwYJ`q!LAO@fHvb8q7ahK6+o?g3#bWpZD)r^YVf%ps&j+Rgya z=qnpN3z-wPjgeRSGL{FrLAzXx9_s2nU1QJEqd*d-3w}t$Sgr6qb|}DhUE; zJ`2j-CspnZ=k-Z(@(=R_S`(dMiQ^=T25l_eBR7xK9_mY4XtY|jdyAa6GW{oA8n_Mz zUY${o%qt~9^e@~QYp)q)Dbo6C@|F^{2eic&HRZXohIC5S9M zFRhS?6h%ZHaT!xb#u&FCbxIaugE5SUukR_4`bju=iQ1zp6=o*HnzT|O!#mEFK2#Lhr!{v4Fz*@?C(h&BfAle zM-f{(^Y-wDtg zbmxTl1KC;*H6twmw#veZx%*=pYOT72mEriWX>y-KpF=2(Jdll-FFAB;3JpBE7SphC zrj4WB@6=XiYuD!~aPj9pQbC*NBC=1Vz#1bX2G33>IQ^8&J%W!-JTldj?={nFHKd?Qh?$ZbkC6Bx{DbPis5nk=hJ`_~} z89z{V(LCZ(zQ~j1f#qbL&KpXc>q-bfOjSDMl}X&-;tV9Q?nQ~1< zL2I-fBBQRQ4CjH?^OH(R0~cj$|8_{PY}Z=JQ8Mjz%ml(A{TiQ>e|aIr`hZLQ_JJ>>X@*6LV&S`Onb@Ka3L z+|T_vAVX^paimI7nw4>Rd1s*PXP~j|b~La%v--wtI3;vA+b_xLJd3$XnZW!M7NQpZVh0>_HkNOAtA*5;B*pj>DB&W$8q$AEdhN?Pm9soLwBg3 zh=Cx-L_4e(RDJa^*4X&C+@8jrls6+r-_+>ysj_Gyiyj4rABv2NgRRvy7U%OE+tO4m zZ_l*Tg941oMxWT!Qn9CgM z=CRGD%T>AZOF%Izd6D}N=*jPB)1-&j9Zi*#B(o_=t&i(bel_HKUB4qGw!aWoH$gu@ zS_40Gxu-R+TZOTja+KDb4N);!Gn79;-K4a5feb zxr$L`0(Hwo5+%PoLp3US^@nk)hRv)}aLSD0!1>nhQl2DEuk*tOe%Ze#F&;smc&Jb< zn%KfTSuXdXj|L4%UQSUAm?H`DXTC2-`lq+~pq53b(>6Mb_mvbHmC$ofM}5mL;qW4@b`tq@vuFI< zblF)e1O3LU& z_2H|1TGtZMs%5Kfd6(F+;iQN;0C8lmc;6*eOiSwUn^U{9aPd1wST!B2zdlCS3lNHnF=QTH8pk%v*y6#u(`c*ofFQuM?Y5x`B8pV09lDIj1!@X*X zdQ-E>o1TI*e!MB@zU(U@603RGn7`+%L*~w@_%(x zf$D(#)6LG+`)hnA@m90Ca5R81$Pby&mDlVfVL@+Oysgb*;@U{o93@aTz1Nh-Gpt0Hs(xEIB^DLBQ9w?xYG7T=n|vrXs)t4#A|dQKo%Vonb`Iy_s2+;i$5f1r zZc-h_C0=@UvFjq-#e0=O{Fy=tFH$jZI#se;!G#5CeiH7kjQo-f(bnfbavb z-J7liB>tNzeNyyoDRSOH8t5lo_Q}JO%9t*Mf=Lr1C_NUt7aAQ;n>%YkVM)BvGWpv8?bmGarOC81 z>m{)@%e%#7;M}ryS_^U<4!vA8i*(q%zBs-$NzOE>p0Hn9vXt4%at2eP-=r()M_$y9 zR~m!H%0oGpuzr33-?guvXkU%MwJhLK*rLahC=!)?``ifI?GD@VDe5CP&WE-K^H$rw zX!m4Rj5nW9SFU>627A1o~sW`CFA|nQ{<0C{z&i5X6<}pfOskSLYJGU{}@g z3n+kl<@6lxSmqMRUn0*b((+Ly-XpvEn(uazO_k=8gX9ED)-+lPeD2?S#80NkAR68> zxk##kBF%YABG>1Lw^(+Lltncb8q77ZU$TWl)2M%0ei+T-xIG#7F$2v*QwEKp)bY!Y z>7?@d&yLtP)lKi^&~GBY4@t+2@Y%*@g+Z@KW*vHB^40LsUE=*S6qs{j1Y$T=8#SV zq_Q^xVZqphVq#GF${$B15nc8@`oY<6^4X0&};E=ZTd15|;rB1f)Cxo9+27lErG z%;;y&@Fahq*3`_WoN3}NJsz<5J1xMr4TT>>y66ts;yV>tb=i2-s#%QJ@;rR3j(UFto&7d3~%nQGaF_!1XEJf^P zJf!6t++OAT>-3*Igm@0=XBzU!SSZlxqwGNb!PYoR5eKU>jg zDN@MHPY&5O-{RHZX=;m!x1^(v+?IzoKqkyn)JQDk{qEHAv=Vo$7ubV*hFz!pmro8G zR~AHe+2xTuij(hpn(tU5mLk+adDbVYsgXf=%=PtAlxwb4;Nbn5tn!aOXnj2TM4LD%*Fw^ zH%E|Chv_;?mY3wcP7AVrRF3LSg4-PLCjB$GvQ}jaD?)~RdUE5AUTCyQQ>Eng zl0E~;LHJ#pjQTaQFDkQ9-jQ9&YNvOF;cM<#3SzZspj-!aux%0vPe9&Q2JFMK468MA zcZQ5EmLY>=(I}%^*{AOt*JR+1#C)cdUkNwI{WFrDh7BovwkdcRv+MGY!izVmTKZ?42-qjabst&N^37j0>({8|JI1hDEV@V|@lr-}2BD8NA#m%a^~U)%T(* z`L`Ya9!n^(jK}pyzVZ18TZ!`T8Q{)aMw>T|VoTKQlRqW1^yDH3o`>A?)cD}imkgM0OcN^V( zHeVWaRFHa^3=WV>liNn;` z;W&=THZ(aUtx|=cT@w+}-?p-PsoMt0*84_Al-vIu?w3P0qb0q)b8F;t89 z6)Wzmwlyx7Zd6(5XTra}-7klAK@DTNLn-n1lnlV1NIW#C8a@s#9%AG+(H3T^BKstb zjDYb$CGy7d)gr_T<)>A^p!$rI*vdj#+sPPexlx`KgAt~?NpgD2@Dh1s9k(JZ_nC4< zlkBJpk3(okGScO0509)kZZTFKmfKRzM_~8qe$9CUcXE>wQgZLkQbMAOyd7)VRNhkE zkrA8NNxy$3-{S4K2nFBoe%>y7QX%>T-3zWIxOwE0#vEWtW`BJ;-1UwLJsEXiMj5(B z(AzOZcCBz#u}(i(KVC;WLHm~)aQktobQ#Hv3q#ZDK#X1|=i|~|upI4rDBcD5d8&>n zggl1Q4DF?xBx5*rp>Zq)Q9X``jTLIN?9VAUY(bmt8jUu}K9_uZz5H1XExNBLboDc- zW`c54A2r!DzX2Zkv#E_pzrNYKey>W?zZ+U{LSnPi09ciPf8GkQ#mA40XOrBW@wXf)JxVQeKJ**5uKiZLlMrkGjUu^}jQ%d{cU zFKQwgBB*iZF5?=$SY+|FFfjfXfQzXL#pnZryW*e4jdZ~V_|)77z{yGs!{Yl8=&NiW zgp;(fuB>rwS2;UL{wTFGKIsWm%(biQABw-Jsm&W(J0!^y8Phmcmisb@AA?38Fgd* zg9$M9C9K15M^5g=s0640ZR=6?944@EVhmSINkW1Uc2e#bDVxmhx-crRukj3?nEXmP zt6I{p=irF;4%)tR`7f2l3}w^TZlU?PC>!dJ8Vs&ejuUy=jr`tcN2=LRg1ftv+mAiv zP19v$Ke=fNRl55d2RdFV@@FgL@`Xm$WUutBvyJMQlCLslV-Co-={}`#XDD4~JKLtv za>nKo>r#f5<_?!Oil%jxB}fv6AWt%x4WwF^qHjoy9qL@y^G8Aj=b$3qAMAqi5Rn(Y zmPZb&zQQJ>^H0?ZePRLbYveEG$?hjA8f&}2i;})xCR()>J#xqJg{_Bayar|REcxEa z%yZo6X8Rp07ar}%i3R)R5S$qpN!qq65t)YWDpzlmpFzxQ@oot@%m8=J!9Kj)V(1yr zdR*gyFQu}uX^d>Gk<#V#)w?CgA-h_6a zOq~IBhhyvE8|UNA8ifTNkX6&cQ$p@gHKGoFr38g?ff}g8vDH1HJpQiI+E9(O*;RR;p+538Uh~?Kf^@FXU#TD%IJed;uN;s1c4p?k;^B-|eF8>3=JdK2YTY<~F1q z%=^cXvXf}$Gu|erNAOH`zmIZ{+~reXiyGIS>7+BnE0?EnTkx{PWVwg_yhLr?c*dU% zl{5X60mi|?lm7Z~#-CQGrRu!W4q4Ra)A|mjT1tJtmom_f%YB%dlba?*l;Ox}v? zDao+KW89n&$Jy2^o>H09!mWGws;n_;B?KhPqYcbtQ`}m?pS_E52rjXwb68Xx=UO~^ zL3S*qyX+hxrklw`YB}SrNvMZ%I~0AzH&6So*-Vt&PJaDmwi&NB>X03e0_lvzenZB)?xnzc${jYwOKi^*I+e@YUfJ={EjM z3s=cJjUh3HqE_TL@Hy8q9uNN}L{qikY?GnilBn+Ib!)&V6=WoAN zZePd%nlJQ}zmaczxXI$trqcd#=VYkpohi^H7{r1A>Cx{u8#i<%2mDSs6a@9hR-vX` ze~@e0>6hPgSKx>C6?1()d25WMM8ee#xSM+A%`oeA9kTU)cZ&mSO_^RLdsv^~IveW4 zXZaEy(4E6%Lw|njj3lFPx{Oe#COKuqa9*>7@xcr9rAPoP5GmmjK@GR_9jkCNB)EhN)ZmQejm#h4_9Xd7i~PPr0yDDC;v~ym8oOQwhxpHL#mGoO%vPpU z;P0ve=A{r#epI96{R;VNn4DQ7SN34n@R`%Ls-1Nt#-H7kU2(O&acvj5JyqrEFM^ur z?RIn_RlqwCljVwp6sf*siys6nlU?_5lbRu`y8CNN^_GgjKTS>!R>}O(Wm)fFGEZsB z6Fvvrj*~ShklJmgJb=dnw{gJr${*WT@|Mq!?*r)#$h0}C zQ$MaATV?eH?g28sAKUzfu@>L|J%ND%{_6%e^7KkW*T<$WiHEgyWmF%UKu)ejLA4vXpEjkgARG13^_W&hlPQ(Hr$xvi*S?|)n z9iilMxAlSn0O19myU(zvMv+1HfgQ;Ey--|G@sIqrmcB=;b3hw(eRg<^cSS&vlg{W2|qH@BB63 zUY4t}fz|3f-Fvr6NX|rCh;N2WoFhM>V1sPYOZSf2Z*ibvq+FE0+-aV(M*fqpetI0X zDh3_pL?|}IxiT43Pqq?LG^QCtF264$q1wveY^%*VY7Mj;xp=b#x9Fpobl_ayI#^B) zR6aj&JJGbo{JQNq3NDD*f4N>hx>bfx;fX$y>%N1jOHbs6eCUa&l=DO^SY^x7y)9+qqU~U^Svk}qQg|^IWtTC-YV968Hb_Z2^cj^>awq=-E8{m z52#)j^C!O-NsA*Nwj$Ansfyp%#QvI#_90OXw4og)xxR=!iy*0SVyKkliA$mTzV-V1 z1M9n*j~2=fkJ<>HLBu9AU|uea{V6O@?qG(OSTZ5z-fZJUDq{@+L2)Sg#nv>wYfQ0g z<((4pB$@|m9A4z<90(jf*f(#JMPAd4k-WWq#62 z{A)N4)#`=n5$+D)@99t?sJs@vP<$IwRc=X|88@hDCV-?E~ zrC}zkSB1xRJ`U#SRsHW=CTyLMj4%Uh;*=lxqhwEC{`ktic*-$#P*WfDttpwXp z?%zYt*W=TdhF#~(k#+Dyq)WMU^kk9ge=+Oz$oq-PcOx+_gKy>0lfYFQ?s$8c>a{$Xd#_mOQB8-H6U3~Mxr@cJ zh8X?O4b3HO7Eg4^mF+kSp&<~W(QC2`4*U6=!(}p^Ui1)ohEv0A0zbW?pf$0?{Tg-* zu5t3Gs~}53UeGX9(;hO_N$sDCuOzx;Vh@km0OcY8=G!M8IPvr;VzMl zU4_w1(qF&4Nc%&-s<3Gi(5hZNxtO#Y!AM4GB!izA`D+kkU4H7TL^aBvo{>%Q*iqU_ zS_MEpv9-0>;J5R6DT6V@;m2!l?lh7TWRHt|AY1O>N331P(ptEa)t}84&@+cgMp0}^ zMW!HEg;VSKmUap|(z>ZeDp@>Zeslna=^IEb! zr|Dwhk^M5JZ)=U}4Sl_haM{_1z{Lqk>Y!W!AHZ1ku=ZiL#k>AVsTm{TDxSrZ&25*6 zCz1A4Ysq?0gS<)8+MVPIlwroTd%Nv-Fr{WUk!$2shyCM=gQ#CS;Lks~B_Vq@>m3FEx5u zV^5GiO4c3nx@j?tyBE6V8QZtP{Q%}E=^@WBKM#t1SS@iTVN|I7S4z<60HH`)Cw4GaOgj2(a)>oja`hzdA!=Y6Wx7=VtI~| z3HX3?t!z3hry6DEW@ZPx#V-P3_gv^G^luC<8EIE3QNob%r z)M+;MAvNE|yZ)L<_zBC~uoAs`RxkQLNr{qun=A#&mxmrR<_(Q``pN&8$cIroM1~rA zRw_nD(nSemFS(0H{6+chqwxncLI8|L5=y81OwXZWYaEf8AShpETOa3Zey#EPROV!X z%_Ktk_?QFI_MM2*~`AvW9^RV|%aI`b0TjEd8fh%zC$R z!+n-;JOs|{E06NFp%IyZrY^E`>(X&?)THiFZLZSQlCwxZ6ODhB zCb#y~`al4SzrP=KM)#eHIaRe_6S8jD~5wis{f;Ok+<@^kQPuIhpE~V{>Si z`d6-vT}+hm56K6E%IZJiN)xVu1!3rgnZaAW^tCh zm+ZbZSyt9@x4*(3$tSzk8&9IEWb&;5j7&%|+oOgNJ;sOKxfCvSDM{`q_x?j@3qu_z5YPkR_7bxrmNU#*VGzE_Qsz< zi9wgI?@R?ugW_=8WGkoF^H2zoAPUNigB-eEeNFND#ikn>P`H4Xl|%Rcmg(7^hHgzX z+_;t?T8HDZ3WDAk8>eesSd^8`|&w>cCKR5 zBt(BAAEz{(XR8faCY3m|x#!o!e~)U+yNBeRn0!-PcebH(gaZ{r?&5^V%qJqxr_0)h zEk^y{MVo7mMSLRiQF3SV>T*mrY@p=!o6DTBW@hPS>Ah-2z(h8%>ZM^USqm&)>tX%s z+BlZd3u@$lec0H3dDgsqw0&U&(Hnk}zFLLR=SQp@A4^sC4^JPE9;3M4TV|TKxg)iS zT5vNrtkfx64!GBs0ysre|8JD&oha|xwNM`ule(K&{lopqnrHFtxmhkx=MHX7krB+L zwXc`?)hhA$l4hm#tZd$b5TVB#ZCOP60I8qG3zHy0rU(7aPO_6#m zSFJ?I2=#0Ed(`@noE|03Pr0}El4Hr{8`sJ6c2r@NW~PiSa5G+XEIImU59xQ8_H0eN z86MMkEV+#G2>~~Nxlr2&fi5y*ixdu)Ki|psUvocxmfX~;k~|po zHlFFJ1+B~n`{fk|i1eo`{=fRt_CZn>NP9a+5ra)>xM>N0%YBj>tkGnAud@+}B)BKo?wAU4_}vpteLQ~ExwcTr99zu5Fu z{pgX(9}gkO=n0DdI!k4V%_h53jD%MC`T11Z7JhkRgZx~}SsI(7MC7_}R;|0`V|b(l zzi?zqHwcGpq;pDsC=gB9!`o!k9xV|btfm;|r(HtBPlZYCp^f|zFdP_;b! z+ud{0_)(!04c?@0EaY4BqapF5*x7~K4$FdS`7Qu=a)uiz3O5GS3U#Hw6{@udw1)>NN99+jVOb(06AVxukuG)^cSXJ|R*3EIz1E#ZdYjdFFtbVUO@0 zs&`S(bkvQ|X(P|3@S4n_R~M9(E5$mU>6-`xM-MJl{QbGA{2YIyVnctNEUkSdP$AtP zL)p+9F4>(u>U^Kr7ta!2lEgT^~h}_Rky(ioSam@#+;cZTW^-DuV6Egip{I0 z!2&{cVW#vd;)pe@M?1~sWZOX=@gKPHA~`v0Wlbz0L00sZ)MUwSlm~aUP{93Fse3#( zf%`RcFs+T}&|uP0Xl87EKIAxKWN%lEY_U0aCQE%YmL}+0yl$dw31|IedL)z9>D6{+ zm*GX<+7fK}0s4_HHx7{7*8-TY84^$k>6&s$JHV-+_bNv7xHCLWXT01a!y~Ytl!H9= zoq9ms=c#i$*Uuq3ZH_|0ub;qFGJ#lntukg;E7r$zYS3{cL&epK_zMR3H&_*IQ)JTs zENW&|N!}v1UUoASM39!tw&ZxY1kFnmJ$IS3yY=@*By6C+dYwtG_#i#UImWB zN%A6Ke$co*RgpEmYv%D@)69o8?$UD?#r9dstulNP38KC|J%**r)D8U62Loi}%NCEG zR4z{iBYR%bk~0Wed-A}LmL>plD$3d3nas2jiasl!&*wrEL?hpjZman>-Pg_HZ79y; zTOLuS$m{oTn7tWNxbJVUUzci&bByCDp!3etjC|~aC$3Mo(ZiOEMuo#ZG)0lQ2YKgn zrz#3%bLi(zyjkE-6hspwbDiR+-_o?(TB*Rqa!xf=-?xE(bHbqK3rpWI} zvjBpA%2F<6cZz(|PZm=E+%ezZO z>KXrQbeXccz?Q`{eROVEDjlYrN8S>QC@x z!cRs;aR2;+s$JrjiF1{*!@`jkpMK0nqfp|072d3Chzqjhsb$1^lnZV0$qnQOP^8tP zhN5*#ISL1IIj03ciIIO4OGio>WC63XFmiw=b!DjI9JVVnG8 z@O2)fBKnhV%gc+D`YjYO)!eqHDusi@ht=-z&%irOyQ+`;B~xoOD{f7W+qy~b&C(xk zV(gOxQB2pqvKJ#C0p}Lk3-gnzC_cVj%g95G#)A)Wk16Z-tL$wS#2@$a-3p3*tH6Ew z&Sj&m`O1L+b~fIs2b!lsqFpOfh9)5hFMCc_Y)ffaZDsczC`BH@kO#-Q0 zDm6m1t(uOZ`F&<&tm?R_MLwim#zEj+X6uep=gMN9LDmRMsN%V_#>w4?Wguzt-i;Px z*?DSAT|QnYEfZi88T(4{|A>BisIE0i%ew2HG3)lkE!L*dh_ex})8aZLkWNgSitbbk zYWWb8{Ki-IIKAM2e13%tJBAXLrzL_srnYcv zhUBRX=R3c2f4zANQqjb(?|P`0Du=a9>aN1lpO356fB;|Ojq|%CsATNNJndh*P>wBd zNB3K0|8%~j&l9pD+TymdKJU0f5^U%+;G*H)UfcMAP2Mb*Z>}KdJhha8Z+?`xo`+)) zmLWZ$t%u#OhH!X_9)1*;OP=;sH)(lya(VO8nh$l8o~4~5@zQ-glc+)W@M6q9rWfpr zu2PmxPN!U$&C)5_8yQ+?1{5iDaY$~{L{o^{i%bqj|7n53Apd<;E>Y4O@d*v8k*HOc z$-jG8yvsULrO#sM&>neXii~(szd4z(%dh!Isw@plY?RcEkp7O7 z>uLLNd57RNn67sK9G6AXWmB~*8mnFUlf~Qe)(g^jDpk#yNWo45*)Asy5e0s5hP;Nt zmVA8J;%&~<>fe>Sc5($*F~_FA3hOm;<3p00E$7zCOPVolc=UH=DdyG2DD9Tb8(NY@ z6^OBH;uEU6RJF@=)hhWF9XjM?YdOYR*GA}ZOcRUW>DUR)(QG-JD2eD(;m9bGz0;`A zj{c!i#E1JS@ZhK8%9I|P#$)}4{iji;tvUX8@dS=XdxPb5iv0^;myntw&9aqT^7Rproe zo{zYbHu$dQeJXst_m(_;vsCTTvqs~>!G(=}jDF3Ym|UoCUW0{#Dwy9p>rhT8KGVG; zix?+mZr)csnI~1zw_rc+Dslqh4D7-} zmwR)Y-%HXeV)A{CR8?34`j7$=0)FoaU~ly&B>F#GS#UOrZE?*yX<4C&2oq)+*G6bW z!6q{et*DTvc0+zMM+M#qa;R3yUy@H|&|yM&oy7DVMI-3iE4uJm)gZik3=b*ZA|rPg zBVJUibp0FhoI{!x%cGMzJBFR-&BT0w3Y0@keVy{f5F0oM&5v@~@_Ng(B(>lFH(UGZ zB$!uZVs)f@f^1?r0EhZD>x0b+U79Y)-96;V1|FH7m&3OZGny3d>1?UE`;cR)PdKOg z`E|`w;H;~Oc7sqOm;0g>N9_MuCBRQ7seR{@Nyx&>gdr;B+4yk57&UK<{YgkWu~dc} z@5B)KS?cpHG|RzPxpQZa>l3>0e4!!8+;i%FUHc3?`~Pc)ZeAew%#(9f=8E0yK-Do~ z3*LW&+;_lY>Q$v`SxiJZFC>+-VBa>+MW_)2(7JJQ$2PgvS@3xDj76G|;y{iUc8~n` z-WKjoSd;KsmIp}RI|HJ$jR#TmX-R5;=;pV0F6v4)sw{f!tM#^Kl7bP)OMB#{s9^R>*;WOrDV1)iaD z`*8hWCBLOJiJaZaJw;_Wxa>QpINpP1FQmzbT3Z(9%EIk(T|ef&LUOVWS-to{E8Y&k zC0I?#wtf29*(^Mj*uNf;TDSa^YuuN^?a-cZ%d-2q_Snpp?HSAs!itwZCW~`Qb&D^N zrT52l>p^i)*&Ez;90K1!XO_BE23)DXRfvV8T(26*uM|)Vf2e;{%W_h>^EceD#_D$% za&5=530>q`1%S?OhMN>>R$}X)9793Wi6_w`p$ziW@O4R zF5`!#Eo@%;pFR1O??;lm-6>HcLB4rUg|p=$<_>L zZIFw{uQ#{o@egqPB0AiM_Ek{AgXgo8$%;++{dC(_()g7nN)d!fJXZ170iLKC^^|Wk80rB>Qf`ul^_J`8NqJ}xJx)K45C z&p=KAeTCy&<u07qXs<|cEErWAqpi>>#ZBuz(e=lyv z=(9iAggh}wUZ}PB=rqfp?&81SdnK6-z2Y4AcUn9FqQE=cu6jE?D&zk#^&a3+)!V!O zOvsQ)Tbb-kCOu?A5+G$Wvu9>c0R}QafKa7ZB`P4O2vJZ`kO2{oV#ThgQL#}J>{yPm zmviibfGwVbU61Y9%m1@-{?EPlKKJo=*qPb0_qVL?D(`yVZ%Pm>mTEjt`3g{SRF3@z zV%AP|un)IWJdvkz&5aqr_2jxz`Ee)|z+iI+w$hz3;#7`XQs`khbgL4igc?vT#Z(_0 zO7Vb$IH}?s6c5go$E&M$sEqYL=BLvP^FOY21RmdmB)8mulESH{XvH^ojJe;DoZ*zZ z8sntHYL#v~#=JO(g_pipO3V1f>kF+DB3jM=XOcKReV70=8tt5->40ZE>0PoC>tbG? zz(@A=G&}F&wI7d=jY(cGPDW^xg)`-$Nje@~jvx+ZWsDm5kyny$w>}OyX#q3;szsba zF1UxWsX2Z1ib6;vNb?f_)7?T@Vozprqf>tCma(5;(|*JySiO?w7qe@VTpjiR)((cw zG*jnhv>xge<$m~XMz8beEV_PRKOy`6^s&_c*F5FHAcUj?Ze?D5*sJ*Aa?DAx?gf5z znQiSl56w)u<8$M;PK_t)s~b-Cv>k*dOIcFma{IIF*x<|9ywAlbxx#4mwmtlsq>C7y z6Ccv-%pVXu{Yl6?hBEI76Lw<(3zdZv17|`8|1~gO5hgDQ6u{6d>Qj^1}+5l(27k+^7O@* z@#u3JjUOA=%&M2g?=qrYA$(A?!boA>;>NTN@qerm!B^%lJLrUho~gNi2mk3apmPh* zGFLMdImc+ZA*eE{{Z*TF;fbABra?T6A&e9aHWW4V2uEDM;omy(3agsyRv5@gd@9)8aAIFMyCCMi0RYmjLeN#YW4L`Pg>8rX$c$R<`@Bz<<&aHJMJBybNhT>SZ#=Bgs=28l-wmu*4xZ}>&28P9 zJeXlTZ-6hG^{FFdo>;)Y<@90l+1v8&?Kqk5xsriQEs8&}2Uat9$U5mYnA}PN3S4mC z+gXlg1(+zOaW-+eZH(~|t)fGSu54qCn$Y8SahRJsol|F0!4Av%TibRxBy)fqcvjBZCHpH^wE*Q{EdH}vek;SjJb6G_lXHC{gk-DS{INRI z+smxIF0kf{cW+AaQA--m(b(ljcnu+0=Xe1&_pI_`LS%I8#q7~-UhtWaScYYC2jlhS zsjSZ0Qs+C?Q04P5!p#yLOugyaD<}2IU|+x9BL|L^*B*$p3`8{%m~SNBLMmZoxiR*z zB9?Ct%3Z_kN3xmoWv8#jv&d7TYkA-sN5Gi4J$?`%VDhxHig&ifvgPsJGBm(FFS^6r zcUSvheF|j4r}KXIXs6AS7EVOE@6nZKBsr3<+RLzXT*xF|x8Lkv$|=Pnt3cjD0t0L# zkCy~BMB;f zKKh@BJM3oy_8>e|vRup$`{L$F=RT>tUw(bWT$qL1!|dk&!hR2bLT^fEn;|LYT1r>5 z-@n||nN_D-`ScA6H7^b|eqF$jcmZZG%d+@nbs}DSm_+K5JP2@{Waj}pcVxXcl5d+YBBKC-J?S=||fb)bWpeltTncgbBV9f6)> zXf=DWsC`eL?gx#{<4BVQtiy{^cyjxzNZz5UAEWHza}fLy!`VkSq(Klj=NCTg*X{wZE7P~a4MC?f zpojV^i1%;}9OAIpJYRY5!v%k4^T0&r}sPRMXb zD?=NWLM@U1c&Zwv168@`GHyS03*&y}R4?^|ln(Z{#ig_wyT7E0<{_f~@a0 zR%^QY$iQu`)Pxc}JiafMTZe0eP`9dhW+`2%5cb=zMOyTK(fAW?CLIMg1lc2WVPRFY z1~~qYhV=g=b5+u}S2NeuM7;nGig*tZj0C(N_-IU&S6!c zs5SfKoIwkRbB?odAT2TI&(c&5hWH!@j929NozrL2UV}nOGi7>|5LDxtf6+KpHsfr% zCAsbYqoo;CdS%#;s2nRiv+AvO0N)TqA>EA0RQX*(CUlWOZ$iwEmM&zL(MT2gT8Ty{ z;RAIW=XCV(P_Br;;o9El#2qo_(|4+kCAfpCzE2Uy5@^a2}I z{kC8XHQQ!q7?v%?L`NYqMBidLqPN5bWCi#x#G8l`E_bS`E0luN%;8p3Ra531+!77d zs~59R5Tnyq&p0uW~^ZwJiF}vuspJ^S&UPHl-2J_R*i1g1ZKQ~i z_2OxGFIC6J=|BW8j=b}FX6pawuBsp|vju-6Sv)v=;Nc8KamH~wAyrf%TEa;cUo4wB zX}_ZxaYM$8S3t1Q!rCLysMUE0d;uRaEWxUsq-T-%W^Q2xhSU=rbTF=M8NJfN$X}5! zB-IXaSJdp2!B%4cRhU%^N+fgRVHH1s!zoC&wJKvGQpU80JLhM5$Zmz=>B}L)VZrOx zPCJ@Wi$rw|LTD0JXu{$D=c$yab24OCVDGHWnRr9m2-tNe+H%SP6c3mgN^r*S0ytzl z0Ci;BTV)5@IHl+dZGEddi|z}&lY28TOJ3x^c-n3w9fm|t7Z06elpUcrg=Hg(Xpuhe zruXVtWC+B-m>ONa+sTwgcp}CDkq~$T<7>}jBE2jYR>bHu#gRaStSY@Z%0H7n=nXJw zXpFOyc=2f9NU?{88Y_gtc zUX~85Wu52uZPr$Iep}UuVm&u3o9}Y2AIL^x8F7h+e9y(*R96lXeU=7HsPFep?jYwD zVq3P};{_N(?gNvigT){y-!W5-L~6iZGs{^DBQGWEsB4ziST|(EING4FqQeNP5M&OA zWiUTA@bd95_UQJ+vJIp=(wk`s+(h#Wt&!F{88ih9WH420nr$6h_YR6v^c9o7&LgkR+E=k&f^&8Z`Yq9(OC1q< zC7tRKL}O{E*0sS-J??6Izb}g)tBG(R<7zY054uykoGchrA_M+1`OqDoMU3_A0xxq1 z0ZGq8!`{J12!nItA$fWbr&Q+W_DRlmlIaNx{F>Z_%@m9*=)*VFzfv(EoU9``40Cc$ z#y|@qR(gyv+A$gHc7$h`956I)!0Zm)3ibe###lO8l&l~`!ReO5Z-Vc=bAby2EGCjm zyg68q&dr&X>`s+r2^}HbX@;}tfFb;d$VG@C_q^|jnIGq-4yykI;W4fDSLKoO7|4B5 zMuc>mXmP81!6uS{Jb%zQE-!trBeFV{-4m{Zqzn#HemcS}a9BJR?o&jJ9K~e^*<0-y z&Qj%~ge1P>TvBJ|hgtZ7D0!op#fpF_ijJEA$Q#yQ9ffa|PDX!N5WNVRMZ#wT0Brdr z;>1b-+xbBjb;6F#m2u`oh2OXBC0En4um;lr`&SH-;eTbfJDttcjkT2&A_x{U)<(@{ z7+Mi1YzYCCqQNvX{%0Xn3bU7nhMtdjCz9tZS$dyX77#>)B6ym_{FPW7_C68i8IWc);~DzcU;xVvr|_=3Yd<5uExb%YVLIUW)mj(pNXDBHCONgwxEm8q`x@_z{ zAs{8?*wL0b8=5WbSugGQ6+%YA20F9u9Vd}ZG}O8o3C@uH_y^QYnlZjuIBXjv!<4MG zloIIpQw4HpjN*})?ow6_JfQR$LQoj&`~cPCpvj3C=PV%o80!2ucc2pL)2awKATB4k zG1#nqwl~CVIi+wuqKRwcesQseS|B8KY}<}`t2a7vD8g(gwkP{K(m5nY9?PvmI}>Ar zagACh3Z68!2R;?nFomUf&@}S!1?yNc2r|)VU|Ub*a~uXBT|o?zzC3Oew^|Drb-3Rl zB1Q7l6>tQWb1)Ny(m#OP!mZFRHMeA8h6XkF>H+a>j2jt2yv*USm&L5s`JK-es%LJ|BSa4xzb2wX4If*fUO7EpuOhae9F}fIJFs0 z7;RG3$@GFf#gH4P7B1>b$6zVjLphUsdgP=6mK&iGHjI&`Cl2%}%JjfP*hXH4Qkkdz z=Jv4KLZRgkg9U`5iw&p83wp;kuwBkUQXjaQ@)+8ss;Fx1%jR)Giiaec+i?ItJRVx( zcGa=9(G!T-qOYr0KYI6C#JB50A|V?qaFsyStN;6TKA;WDJGIiQ*0SiHMOMfgrB zY|C&qV^p~f9zQMeP};GkOI2Un+Y@F3WSM7<&T21Pesk!b2UG{{uPO>RJA zrqk7jVm-vUFm!0&kR4r4$mlOFg^vv}2D|%W^J&rV(H`f6CMOW>j;#KG22T}yn(y|o znPS1!Te9eXVdwCD#UwLGnzMFyoG1S&faEi3)h|A?jNsgPjywmpBW4xmrQXsy)@^{E zyE9dRHq;r*rkyl(rGV^aTbBXw0;1=wo8-cI@&llh@ z=h>26hK(dz3=~WyW<_N?EHleR25}%rcJ@8)3Aw#}6>HDcwP&%wvDGSPjmzG-Fe`l? z0|Z+Pt)u|B&6qAHNN(%YgTWQSjWrMU!MJM99sdW@M_3YA{UYg3I3rMB!?Q-%Z*?LU zQ-sOJcSaf3Ydw+!&Y=5!6rNODGANhjkl3MG)O%QaQJBI3!Si3esSoy$Ga(%5-rKRI zaZC|U*=(_iuu$~R<6UkqPwmR^;_VZ5kqXr`>rLKe`*D;x&N;te!KI}(Y>|#y?||V2 z%ZkVn3kJ-XiIy;xYM-|rOG(1*@&Xn*~eG`D`@;#K@^6|Wi=ek!hE5R>EV6CcE`Kxt}~$Oh94ep zj(Wq$!sI(n`BzT&W-k_5$7O@FeLp)Nn9F>X-i`-XKj5y!0VVfjM^(wjHeW7or%16S z8|`^kke0U0dozyBoJ-?qMgS!p&m{bPOJi3cCvleyo;DBRTZ21NaY77n&QOe3E+=Z>a2>da#yixt=X7)aG#H?Kcro`=K zJaKnOwI*xa5JpiI0xHG$H&gQ^ip3b=zgu|VbU$)jw-?iOL<;)uD(itPg5~bLWFX-| zvN}-&jK~`baqF+LHtmHbfzN)2`lqNcAtle_1|yx1<;hhAa&#_jTJeDY!(qGF=(4vz zGT_8ToHjA`=T!39JRVfO>6ilN4*O|=2H>y{0)o!%r2>l=ME6xjQ<=HF6dz6zwiIA$ zi`KAOf~JLTEz`ouxcU(lUffV!huaQjiP+L!=5_^$g9&XpC%6{uyw~4xZ=FinXkH?2 zo4fiEJu*2A$@NAlKv5<(W@h!ruWnW>0PBcXfwrO`x80>G+uwV=K!D)%=>BkdZ%#B= z3x^MMg&c&Ph$}_qlp;h@NC+Jd1k5_@Pi6KYq4ifqB}SY>Fc$B;yOMDtIY7#oBZ`%4 z&Gl2D#2D2u$=Vf-SFj|HNv&Z6!@r2~qbvc|90@jloJS!*K7zG`P-ZZ~1m=js)D9<6 zT`=0=gv?2Gw>z(bH^$z+S5aD%N*tlp_w{9mkxyoL(0~ftmBknp{8W?KCU%nAVrpQW zaOsCl%lU`b0wP7KWkFxyK}b7eo31FpYA@_(ZqRkx96}TdRy?d0PW}vhEYeMnLf(iG zc?}Z2#&}-)EN3$ZJo}tzmrc}pd>-$NZ>ULL-2Ir{`R`o$u9#HTZ557am&^JjUmImV zRg!5=#;EaG?t)pYOp>59VNa_9dlIG$-ETSiya5=f!B3Eh2*DkSzXEep*ZZZanaNc5 zMu(ay-Nj1aq~v=Xgv;*9>~nkJ$eTAdc< z0oMOpXF;A(0-TA}{@wQMk1`zb-NYXt}|D&2q!?CPmAT+mv4T z;v6kIMnj#Ft1$y^cgTN^D&3iv=R-0OmT|OOqJG7LHPzR! zO-N6X8(RKE0Us?u#tg^6c)YRkqukV8dddZjH~V?mtGH9|_2uN2h`xTY2XO%e8avlJ zwV9WrD-!8>fFcBA#2L@7h2xW)6q&i@@7BpMdMAbSUHO6HmjKqy2H z87(ph*&9b|rQ{uyZ|se=jJH-nE;qfz*yO9^6rW0&vH@=*Uu!%3UZP@xO!>t0pajcW zUR_>lq3=uFBcGerPvzQ3?P}so3dB)g)@k@wkSn! zqP&#cDZdbQ?I)+0$0GM=Zn9OBR&THwK$Ss~|oK14KX zb<9$3Dc1mGmBHD(x5riMpT(cZyjZ=w*zM)=b+OKP7*4C`p+mtm`=Ws}U4xL=q9!l>0(#5G3aq{GFm-+BpRQI|*>sLD z;sJ6CmOsi-*vT+5PTvIRzM9d?JvB@@gyZqf0I16*nD$6L1cI%fn64~FCmyap2beYS zng4D_*cjK(tKDsc4d-WbCItqq_dvHCMh2VJ`hY^#P6m)*wPbn;2=FodGvz=5bCa82 zNeIS)#wOb4v--GL4S1{QGjq~l%f2ty^^246B$PDPA$>FSkN66bgObBEkr89}Ss5A1 zi4k$7`8bI!SqMf5=N5C%Mj_tah>SW1NKm;jCCk@(U?2`R!8U6EhMZ=n@ofWHlZF;7 zfR!!9#l8F(1%s(=Vz`~PF0#kcm>OSnF*<_#jyVHy(-bB_$~$0h%5szHUKGGrL-Qrn@eW43 z6>{gGbe39Q6uD}hY4t4Y2FSk=EMXm8)&$gxG)sFWMQ)aJhpTIhB6|N*qQIVyEf0L} zc!4+>>@ELpFJx1g0m;kLH9tUE&7QTa-F2?o4(J3CRq&vsV1?6{5f@>XZ6z?!WSAuv z7pJqB{R^7?yV=Zl`FmG1NmXL5^t~{L)BS;xT3oCmLtjq%=A(=?5C#DTmiUi^WM?TQ zq1sktIjlu4N%!Y&)oLl_$5Jzg5n)Pcrh)ihfsJ1WsVoMa^A-$t)ppHi(yr_8h}XAx z5oP8;b0(~4u1Yq>0$F3QdrQ2Y30i8+jh9d=z3`QJIcd zkob{ub{ez7m6#w>gYi(u9-eo-F_Ed6(#5rNyrm9gIVqmdfj%z-Q`=%ScDBJmIPr8emT`oL(-kbhZBEV%){Z&vE_TmsfkdW1Hra&&P}#Wns*s5eqU2oxa9PC7bE3({w;HkiMurdSo6) zDH4{31I-Kn1~1DRv)Tbo6#PmdL|(`{SP!^)4r*)NxAF$JRxx3B`Q?l#4`!bn>e$wL zkgqXPYG-0nQzaP!81l|}a#QF^~H!5Ce(C9w+1tguCLuBi<`XS%IyqD11xz<;b z9S#SZLE^6OUuxrrk#jT)Jz!>70rFX?YsNql8u-WTQqGduRF|XHronQ0y`npwDM|mK zy`wUo6VbZNBlF|+J28&)tn?;E_!}hXHNn^)c1EY)$jv4H;NQ_qqKBj#X)5F#Y-^CS zcF>OU7ZLJlklT>R)RW%&)@Cj3XDv|`K^M0&q3E8k0e#Ru%2GKM-e9 zSXzh9D22&QT!Zn)gPCDb^4kmpzw=;|v$lSxY%WyEC`}a_sEM%H$3#q%vnqYBmtaM; z8lQyA81j9ogfR>^wh42v=ujS!OL);C7G8>pa(d~ zzN_;#W5GZz-v(dP=rP;g)spneMh61soXCHVWj51zUkT+2IS|}Bt25e*<~h>?LnTGb zMTf}Bbu5RHO1YQ5M2&>hem~j+@#I`hr7R^9k&*5T9oB+F@TQZhcg>u@#tJu6ieZaV zeI(^c=#DUE9=c#j8mZ8mF6HN`F|OKCr$#zNM;1~ z&228@&q7dJ93)}QQ$)?yFG@-LGh0FP>{_H8!h?3;)Gc)*zv*Qop*$u9o?x-zg50ShMwSHsLuEt;Lon0?+cJ5cAkNNT_TZYxb;yIFoo0yTrZ(-wKnCs!7 zpncF$cjlbz+QvFM!i^`3JeuZ)Y7gyZFQW~5Pn)t41QP!SW|;n|6Z7Sa0$KzOkBo|F zqAvohO>&1<&6F^-D)IoaJYi%UDVmUUlU?GdC4^=XX}amKH~lVuCx-}6ydU}xsqtv2 z2E?%K2vP^~Rc-ht21u@anh$p$NC2Z|h}I1b zWuz{luh+L|Fmy6OR4{<9bv^&=2gb>{kQoo;I3qYCdOTLZv-*_uIVRXz|oKNqf%#X4fHH+i$02}$`~SFHin+NfM4>H(sYYy3U} zJG5;NgIJ{XUY^xqbw5}``i%vEkJj}ew_;C5`3WukOs5|peKDL0EOZ^ei`_oH5|sKX zf=i-2#j0Bmy7UC=(X`1BWZN{Q+Ghkr5FzVSpG&1P7o#Q!7MyHCNc>fHkBc7HCAr4* z;m%UrBlDK>Ho!0yq|z!N-3k+NWXm4fZA{*sVr|&D-A!&V{V&+UyLVbk$O4j?56dvr z<|$KKl|`u~y$^e9RjI~anyDVaPE3$X;nYO6i;?@pgqa{PDtSV#ysH1+2eT{HusvD| z4vywkdp?Wv-9g(HSx?1v)bgDz zzKs3w@6^9U;Hhd1U{@=A~9VSaAyW$HRI&VHj( zZmeX<;89dk@?oD+tyCSkH5poECK8xgTe@z^hfzvq_ z?1`E)@W-;7{4dH^wDre~+EQ@&c2x<4qG4#Oz?+hOJgQ3W9I$B`he*UK$Y;sSkf)RK zYDFEn9k3~?YH7b*mORl@sn{V)24K$tQY4~Qg zEDjJgK;!BzCA6YkVjX!G7Ca9?1_JjzS#qF++|ZOt+HN>O;yqA%gR(N*10bpZEs_{i zO;Q%=fpKn%4)Rcyo#{%c2Ab9N6^&9+88EbQ0T2>neD$V-lBI4@zL|am07`2U93=40 zKbX@nh#pG+M{t$8sUE`Z$xY>~;cShTLXtIe%!N6V$_#vCx&h&VA@kp#q(o)W0J@gU2eOZxVyrGH|FcS-m@I`sMbckrKV8TNIfBy9Xmde$JidmNgoT6@A=fG5 zhFfGwq15;sQFDIZBwt2DsudAA3g+&r1M*XjjR@uA206Qs3~go*U-B7?4NB*}iH6+o z*5l{^YH8r_i%{H2{aFPh4pVYWvvFqywD^t~_kQJODo9y;m?>RULHx-MWPnho7>V1(@o zg47<}T4xyiC*CY2Q}ZYoL}XEm8O_FAWMI@An`M5jgnY6+2Qg<$14`#ieZq!vniHs7 zJEzGbwN&mfzdO0kBG1cKOW{%qyuSynV+nY>E;QbUoW{sQ`8XKCb&#Lx&A*WYp(@CC z^2i9lsWr5csDj)WRr8B`6K)RMa8z@a!1ApvZ0P>R>?aG@J~O#4R|Lov(i}BhBZ)}p zkNkFM{D9&=(2S^!z068p3xf|j9<={rD&piC9aiF6!$_y35oiz3{=t~GYmMIO#D~pTiFeO zloP9D<0#ASn>>XylPLoce+kN@VZ;E|Z9}+-m%{1t%J5#Ds&`UogQYU6d2Qn;OiBRe zKr5D&%&3N1QR0)-r?b+NbpM}%NdVpinFP!?A^E)+VOsW8yU$C^gomRB>QOhg%sR!u zx&vV#EbIb*kAYQ1;ZqE+w(Z9P#=Tf+M%;C%e2)nJR!|<+n%2BX)m1<0|I%>lGw8D_JNm6FyyWz#6 z5`;c z=45g|PyiZ6f0`@ZIoA9d8Eqt1ARx=OC&4TyVn57(BGkl1`Jovby19lv0NXy*E4Nq4 zoGJ_#P{V)Al6+ifM4KvT3tXPcCzK_?tC=TRZQNiSjL6YMDqmsnXU&t>%F`(u5Aol5 zzScaWg?o$xA)qE`Rla?~AeumtJM5=RxT#WJfl?~oI$J53&GR#p_>s>S(OC{qRKA*M zKV>FQKyA9~Z^nmyII{__U$m1(j(j%3qY0Im{7^(_F`|WQ*q12?;>fA9k56;J>_yi zf9Rh5Te?S?u1x(L0Zqhs78zGu++&NZJdAnZvkqU>EngEwf*c^e?OStZM#=_pz&$N_ zZK#K|APF)E7q|iCS&9u~$i&)ze!JXu)A&a_eFewjdt>cq3fYxA`8eh&eMm0tFHcU9vXJ>jK3u}Ko}%o5 z0yosGB$nuWnC*7yr?CcE{aG{JyD4+wCM~RYlCm@+Koz7i(#xlLJI;^2!kgk+NREQt zOkRc)*pPnAc59JgX1@GbU>>0T z$?j-iwSSVQNt%TdAavkr0@^C8UelJv#a%t-roJgI{3DTvrv;7I7&)iPNc*zgG6(EWsWWi#N3eY5$gWs^$Ki=Dr^-<+PHoYh-Vo?`EuJwf2i%AJm50 z!);{Dxh-X8awValF`UFCufi>Q5q1}~SUYRW0YX!~xRNB-Pgl%JXh zP$a#p<8BJ>LHV$jNKu*^8nYXGJrhW%QQe5jok^b2n&$?d6qIYiD(S!sj-RbBHNV8) z?E65K2WKBA-C;sDSmq`ycqdui+XFMNu9SEQ{Cd#3r*HB`AMX@y{gVZkIa1Cj!|_d2 z(UE7$`Hjp(7vxpeBTdOlq!vwS&Lg5@Gh8sve5X&+7sSjn%0UK%EuyhtI#3Z%b_rSIgk;a-DaM!rv;YeM>?zW^?S*_>eU<71# zt$mS5Xt43HAde%3g+Ph<7*t^LXQ(kJKXu4GkT_K3lfe=ob}^BmOB`~eQ12l{h>QIa zoX6IoY~y$Lk$dD}cI48XAn)bb3e;rQqEgbIbQ{3M?nClVzys2{`^aELFIio4x|e~_ z4%^0Gm1j1m4!b3DNl%9S2CJ`~n#sR04F4TMbVnlNHHc0Xg7Pl(r7F_%&SE;gI+)t- z@}9%x?}Dr{rN<+ak0I|IvRlY5*SGi#urP7?K8nK|Gfn}F+P97GUpI@1xvWq=YqCn< z(R9o7V`ZGiqJajxIGA`(t;8Fx8qGr1jeQ-`()J$YXr??dn?-NrHJT6R%S|3%cpzMC zVjvr3yi&o$=EIO?T|f@aGzvu^I+9sSBnY{deK;fWzMCZg?&6^`8HvTPzw-gnGR(1> z49wLDZdwSPG9Oba;@3K4ahu%mxBG-H+M2w`dMqQQymY&P0LS}@_L9>F8UOQ~AOn}wUQWE=8DOZTu2 z&YvW=Qc~jY1*=I8!q++H$f<;b0`_-5Wu|*ESb5r?_U3 zGQ;bBbSix+)E(Se;wk*<{BrW(QSwa&3|b?L9!Im;=B5nICq=rP_f55aJ=$TVh7ATd z5|v7u51$&sl5Go;QyNkz$4`b(o>BbeCjOn3(yz++H4^z-ct-3#vFkrG1+fff?2k{vH;p)Gq0iNEBBZuyZz zft(uL97nI+l={0OODou{_JB#Al^`OJX@T)=O%z+<=#6 zJ?m@d63`!T4rACmzYb~pEh&GSsKL@p3zQec?8(+kT}sD(K@%rK-24q6l;9CJW4NmP z1Z904TVPS4hj58J+mpqv8t0#KTp2$#K;`G=J~)a0dH;~^_xL~SMSdimWBXs17}yBA zeuQdM{!}QFhv$*W3>pLaF@BeL^=(PnT!?QGkrrlACZA;7GNcqp1er6a%`HcU{;9fM zOI9p4_y+f$2p3iqcspi)aHgyr=X;O{UmcSgR!{=V?}0mXMf|tdgC~{{cZVrhKHmzil5XxCuK{z zPM#h?b?<|oTU{$q4{E&`F9tRdU)nD@ zuw{thp)76N-8VATmo`?Bu9BO|jfd(9SvZ`H3-W+Z#Qf*04L=AS&m0_txwJ%W<(*^9`&>yr^~hv(#F`g_ zq)4m?C*H010&7$d_Q6Juj<`LyE%|P}Ts~DEQpCl_OI6zAi2~!~VlUnV&?~vR(@Hy& zhjkGdD;&|*8yGoCyxFPiN)=ZUC-tTo{^Wev?Bb^0KWtJdk?JP-TbrHPheySb!Fj5# z*E=;Ni0q0o`K!J=$M^*-zJI3c4H*%}^RccdKu4gW%zr@HZ>}S6~WiXun-Vw21ny>Gfq6Um`g_ca;o!6MBUu$jQ7avD!Yn8oxW=EO% zp1#A4ws!tb9)|a9+aCW}q8A2XYYel%nj~O{&>6aFp|aBMPUJr4Gme5->d%86Vfn z69M+fbu*RWJ!IIMG7|0vxni1pT~661W-J{@)=j33+Vmd3nK-?5uFhLioodNPt(wZ7 zPHX-s`~}+oM;FVDcE_a`n@19LqqtAa%&_7uCRxaA|p>0gY4-vjQFnh7>NdB{Rrn|HRRjQ zwBzKOS~vFWU^}ci1{dki5%NUoQVGvNhLes)D)rQjb&@$;x)~ z2OsE|Cf|ImF>iuC50yAz6xM}VdfT7M<>fUPg=s_Z6JIDw`r~|c>tI>2T8!cJY7w;f z-9N!!GRs#N%L_Jt+_a39wYk<@NQS1%%@>SAdgApv15_Jm z9Q(g>c`>Rgao?0`Y^0fPRKmD(k8=d9c1jK;%QiRUg#fn7lF6F)ym_{R(yz<7rnvV{ z@e(eQ(IK zg~px{=A$`D!gr7#Az3<@U|9AR+MPvwRj&e?A@L|jkCgjr7tG;<#{5xG?nwWb3~xrT z6g=hVJ~Eh6j&o)mAw2z}R5`3fi1k)KOQse3_KuR*kCwm6{k&pt>fV?NYDZpKgK{qG z{iRvypv6gkkr|hs9ca z4an{?aCeDS#W2Wn{IT9oi{Q!5@FzF`aad={&+{nJCH^)*KU2W88yf&w$fP0WF_4?< z#r4Nwm2yTC50DRepl@x*A+1DU0neBLw968Rkfex5@iPHPhINZ4Ll6BJ=i@ zDspmFHVp3#)Nh(5wbM9nJD#BrhvmpED9x42gQI2nBn_Z>7vwG*Wt&BEgS^YC7)iZY z+`Mm8N1%5j0il{m2%TJC%?ArRrE4ApLILx^zA5sz*K~66(}~K9d(laJDgl3aRKA^# z100a;43qt8N!v?a?5AbWSb@0T{9(JDO|ApFq2~{UZr>>P((FMA&8#H}>Z;|``O_;e z;QG&#CX^F8E+S_LYVLhmvB9@%gEWp{Fb`B=qpjac*);pI%i;dN`E3dOqmrpu3O#sU3WDh-?a4bzX^e@@pq*)tiX+GCAAHFIA*v#md?B!&u^{5(>o z4yj73+*+7qAH4^$sPO|zC2d+!yBRdFebmtuAm6F&U);+#`s;jU4%tx1$fJ_^OG1iP z$bZ4U$j%OZx5EWIjNvSnGkp?0ne?*Z9L7^(9{%Z-FDIe1g%XGdoz%G1KW;4dVsIP1 zvaa0tVrnUk=yW#OiT-q0on%b#%E257)v=!*%*IoZhO?}VRmorCq$L8z>=6>Lhx>Ne zY@WjJEoF^i(~y>)O?!v6@+hu#1dxg5Bwo8f+%-I|?N^Z7{)#+hr|k~eqoyQ(jf;7l zoJi$TO7iWw)qG2)X=pKXB&G*`hN9dQ-vSj2;!++zk;P*!$ZY$Ow56O0)nE+OE(h%n z_4G>iIy5UR^(5{XVoxpMUcE%XH=IsN)vcLq8tBm4&Th>deUtIV5RgdhA2>)~FfVD+ zTLuv~2Ng=_1pWM^Gm}3S$*~O*8$=5T&NC}D`QIWrsssToTw^EEkrnO_EHUbv?31^O zq(69CTV9H(Rep7vHPZ?7@J7S;dfaI4Fs3h%r6*deP6rC}gCUpqm!sn8`J4u4&6IgH z*7{z%C@1;kIuDIul0I8*r_VWqALOY%#EApoH?Mkv*dUA|Aix}2c zIwaA1c=>cdd;xpP?Bq*DGAHc_b!?E#4r;v)yXAludC!QVZ%4$mfRlK(#6?}#81+f|7WM2^7kV6cA|1t(UGt`(kQp0bX5DWq` z&1V&{w9@hx>s(SHpfSsNERr0x+i*Q(-9!v+OmefW{S{p9aPxWj2+g@RJ;s8^uc zX|tKBmj+sgsj@ov8`~M!(SYCO#MK>b_M1bfvh65;zDQ1;&fHvE2yLswHjm4}JoG0O z5OZCvXMebA0UXCcyFMX>%3XffaNcO=S@dV6Vguv`Lt2lbfmeQ-(I^9x+>E1!;r(Qb zk7l=3RvZb*#@f38H|oi9wJTBGLcR2vtwEH{eh8TPan7dv<)@ES25-tb97j4FO$C;GN@b* zl=hzU_Tv*|W6Ddmk9Jw(C&SEAAO5oW;%aXqBuSt9zt3Ms z=K}?hfE*wS51U8v6WKF-|Iu5;#*>@r0W!yZTDrcm*CoB1%BD`F-CZ6W?r*e2l z?Uv)Ys4mHwB2$NUy|iElch3uVEfqSBa9@^fKGT5 z5|rR)WG<5RL7Gy&X&7cjqr)2Z7(=}m`aj-q07KM zhSZVOMf%xv)wOld$Ou{%x1-9#u>c;HU^v-9e-ujW)6bHU5`__&o8767K}v{v$3{8m z#lVnhkQ37K4n5=0X_3x&V?-WR!Pt?VN^xes)lUcIj!WdpAc=e$ulPH8Q29a$a{s-8 zOstGv#F!u79HO)YQks-#Z5~HFh}YMuKyEe}-MO;DCnrW2I^#%z8OTh%G^><4 z18}53*G7e>nmxG;!wc=*^JU*0Vl~5gtjwV>8j-g!*(PNv%QjqSf?j2uSP3$^V>e-w z^V3APfDKb!KYoH<8F;|<%L$`ws~?WPo6#_b>8{O zf~IAsuj6flP5#~Gg-tRpKKHsal7(=?7_SUxB2PYD{^K{1U0*qnNIRp@*e5zHFDC%T z$-{NluLRoUY;2jjv~`o5a<&u#=SW!3m3XKo0#$e@S4N)Wi1D{^Lj>6DH%D1nW3cx# zNy)|{9rv;|N4N0xJB~@*q9^}Hxw83m&W+6Dxp-2Hmp{pn4@Wf~o68^bbETnyOR;vo zCe3;#jt!$hBX{>R-uBDVYk?pmm1KN$5g)oW&Y?$Ny_Oq%9ZMZ{_uI0#pp@1=n&TpJ zZwe?b_k1`veY{~bOUL+*jhIUurpE3-Hc%8fs!n9Qd~}6m)#0{W+t=ABzk7`(&0^1# z@5@-5cFeznN4=tIE&VK)Pc`CI1ENB4e+oC~XZZ zG;&(feR;!go4eiMW6^pUF1IJ`>;VkTek^2Bi;N$V2i7DeuO#GO7b?9;MX8pjjSo%% z`jY6phJVvWK%qV;H_s!VX{Ca`VWsK$#xEttqfK(tTIPXaC}?EWB=~GaShkPMgPXyU zA7*F}a;n?EQI?b&UltQsvek!N3~#k<-n}rDY>_LA=(NP1H@E5^>l(&JlPgMPs7F>K zH66n3Sgv`0b}G?At&zk=Sau8`XY%V(a&%pLqaD34& z{`FI-k!UeaU#R}ps4K0FEXedm<0m@u{28+C9B%UKaG^Pl;9B1Yt}H4oBPPo+V+lVK zB#OT#{fY#E=1q<9n!t!_m(7y+9-T?kzI*I8BDmZ%J=5YAMrn?3R=dOF6qvdoY&);&vV2{ru;V zAP*T&T51))waiQ+d9w8V%N&u`O{Mg6;X4N9_G8Qn3IyfLOQf!>{K^&hC;>S~eCzFJ^I!9*n$iYNbBLx`q7bMI{-(u}GP<_}s`< z{M^m`dM>hEefT#qs3l8QsM&}nzANJjE>t+|yo%094i?lmWoy~!Ilh%;18MW4X^bU- z%d+z(3pIgg;#5u-Q`V1mzA1k{*+M_-)G{eQgCDJ!tLwYTZ(d!PTmskAiOPw^8+*TbT+RVn;G>RL5=KeJW*-5gw!%x;Fb<)Z_OF68P zRJYRaTUQmd-KgcbhbBnJ60w)rECQkGZJ~ zQW9L6Q)kGyH2@B*6-BAVEu2~4MZQ0k-#A!fhBCPsGkHy+7n~q|i443+0}o5sw>Opg zo?0olDd3f&=NYVVt6RuYbr|c)j$F(QvQ88kBt^>@GtR#gT3XeO*qSF7ZC2pj&1EW| z5E?7}0j1Cbcp5j*i#U9jU+$&Bj7ClS{Q+FU%Qg|6V8j0yB4PR1rF^hURa#Hg8-v=e~))=0C<1n(#5%W2t?eZ3W`YJI#&Br{48_NrwO>A2GW)&=WbEFh&bJFqc z^epgoKd{O(7&`0sAv_SbzEe}Ezxy?*H?KhxkX^d4iAS@>%278HNabgxZqY4L9hR=M z_}zPx+COp&oyY-W5>6=HZ2rMjX>Qdxvg;UQeVK8jNe*~?m+*SlQw~zq`SB^9JPapmIw31?1$8z#8Iv?S)NPLURq&_tn_vN9!$=k|c z%{3)?sSHT+K!a}JCW*^i0xtgOXG5nYJcoIM;>dIja0Cj<4~Ot zAP}AsGg>FQ9zzukrFp3-CU&Pp44CP7X@jm$k?v6XZ`40vzJ8#4n|k zZ0zz*`L*1myi!3~)Hz96~1OyP`2 zCDF68_>WBMlfg)*x<;0Sg<$~!F={Y<_hS!NIOAF!^Tmf`~&&xPB>iW=wwMXW7Z z?R?~YiX!si5;y2ct%Ytc>p>{kf3MuI5;D#dzkD){hn<`T5!sqOY=d0ywr?xbg!+Xi zgDZ%3?=>Gc0et9;(rYnmjRUZkcy6Dwv5oIuc!J`HAG=)k^gDB7>ee!8sx` z_udEWZS@@~->s5oXUocBSvY|0o7m0@?dr>Z`s^}JIa-i&nMfAUr7di@)m~rra5apV zw)mzbJUlap)G7Jf=IUf?`Sku0c;*}de~Ye4R7h_vl}*$5;tL>FA~NI>hGXaiN5tGS zAoX#Jl+Tpk*5UJz7{7ImxJI@#%W;e4#^Op4fHY)JorA+Ruk`oGK{V@`6 zt$nRR-kd7m4(HUATL*|g&SJasW{p@E10k&)RpcBbCv9>LO8+XqltZS$v|lkH)c?KJmr?WXEhZ;G_ zfUqsqXYq5ZDr7zjTArCv+$82;J36>KO^+Rf1Y5?*3n_JcFga0qZ--2Uj=gMJf@;AtajnpMc!rfeU?804GIk_nzI~v=~JKDIi zy^AZ$u0q8*#a|wnM0CD(Bb@#AJtOsP&XYEuZ_g-s>Kc~xd8%icv&8Zh@*O6n^>-#@ zTBVp%ltUL&Pe-eKu}Hc~W&eHV``PVkkcmyuBbQ5i(--^%fyUQB7Gl!Zu>QG#ZvlBF zUG`=H=F3ihPhFVD;;r^C#UGM+W7t*BlyMC*>UqXFWip{$R_5?zKMf-$PTV(I?Q~4m zjevIn+J&e+dm}a)PqTZFSF3|$aN%Nkx=dD(KNZYxg5DJTsb6m7pY=m4 z30xQmLvqyv&`4PM?Lc9+t+hJu%jq>qJNg0mrENCP(*qCCThgIdrxlpp3P(wBl7+Z zS#UgT9E3aD%lx~Pg5V-Q;COmZKgvyh&}Kw(WCB2IF~(ZA3~|`lHO*ibO#vQ3Q8i?p zP@rZdF0b88BQJfQW=^)xImVx1Y%Hta2pmK~<3@?mnC+(TZ6jAPL8~y)a-g4wVhNND z8&bSb){QdSE7y~2XZ-P}|B#Eu%G2Y9&7!Q(uY@Bd&xWHx+~;#DKl>=Q`mVk`qE6vr=ru&Y-^i!whoaOFhPOWv%D3EH{)HWm6^ZBsN+M zVlQ*m0_6z+EYz-5!3l&ka`FO+jFpeGi3^y|w0;F^O=Nkp!PCAn-+VYXb!M5y*=uX% z4pw~BIl)}l<1^K6VHsf^g zYzNA3BLI=#*9wicEb_*)F&f>k`8R4`!CO^)>Cz#M`MDfWy)|#|9=V{6slM$jkf2fjRj!#mXDL!eACq3IU+09=7F)?GsZHQ9;6kjI`Qtkj%>TwDX=t^tx>|C} zjJy487e~mi7?Hjw$+2T)_yjWAr1E0%`nQFx^x-)9Zh?#+Mt#xVJ-XMEv|Ij?6QJMGb}EJ&FRd!_`P@yspHX0K z%!F@%&}D6z(X?26>KK-Qb4mQ%;jG=B=^GZ3f&wrO;3MtAQ|W)bAR85vBSEql5&7W% zqv<@roGR1ypD+y5pUIrbWO~U|m~u!?l9K`xNPs~R5ReYT5D+_}s8|s~w|8AvQO8}@ zLbD)N&{46kuDeQ65l6+ftgia$s%zQ*@0s2Ib$!?8awa)B=Pl3sl>52w2W7+!HuRQv z;C<2*lXk()g8!3arnOh>2iL_^Ufi6WcCb3oA4)JYP}pj*5NnK zejLL(pB*X>Yk8QiZGLj664$oKA#P;SEf`S_2;XWf|W^2Rc|IgVVrEq zX}8OgTw+-JxINr`o8CPLnD~lzc})e`wpOjgoYOE)tQvG4P*5A?`ZG%KHaC*XVo&j! z$5udK$*Vh2zKUunUmTF1d*m|WUao|s3%1jU?vr7#;#k8ol3XMlitUnY zCHi^Ez{!J7$}A4>uM4VW<9J8d_+=g@BEGy_Dj!!(lgTvf24i>67ucfKCte1f$QJdX zZfzi_33~(BpA2J4`OBN+;<{8nr^~fwPJQYDE;;;(b%rkwokFzC=9pXQc*fdIDIXeW z56}n8L}IhseAcERTIMm%E+^d&K4T}GPe5s|FZ{|KaD-ABa@wtmNAgXAQH z2=%K!UsjH{X)nW>W#bNSP8Bll##OBgvL~FS4%xJ0RC6m}RgRpntXx{gr4M+&Hiyt! zrlIq`i)8Ojan6|SY(p5t{q-aA&hr)Xo% z3T;ur3HsE>=cQ_dc8UYrxZ`p2NhaO+elFuUw#gMA0`qtq~^)+GJeYeR?IrEURNsFg!ASQdXjR#*1G-oTrvhX z(V!b%KQ~5CFe|iYsG?36;nUCng5wq&G+r)0Q>J4(ltjclm*if&G$4CjSj}5YwF~2x zN4f`dCs`JP0+qr3@%F^gIm2asClB&PQMyhZy@I`PxJ9hX5v>K2y$U})dBJ=w3p{eA zfSUWMMmFoHtg6RKdak@e-oD@PR>?J+TCXpJS7PlFJq`As?41Usq`5i9%fHN_UrGTY zG1vHDJdfG;FKhB@#Ho3lPzUYQp{PnVzdm1HtKup4D}--!fjP2WR=ccM%0ZFwYxn+1 z&fLw=++xJzF5?xvjgZJ>S(0ZS8EhOWOb3kH3MGU6EA{YtK>S#0KALSTER@AL&@dTC zE|Z+)oHBkHG{sty=k%`MWKLN)Eghbh|}7fL>vXZ%DG5q2Eec#Ji1L>wL$?Yw*+Z5SCE zV!v1`%HmJu5pC1%%DrZ45nH*(pHiNfQw#Xf`?Y7?we;6V`LbL(PF8M^3yF~w*@gu2 zlse)(pfhV1(cROzEgsEdA6$Np!)Kgxi=A}}Mbb~FN_u=1%Yv5s2qK?PRzsqv8T`eH zM}FuO+U9b$;a=928|!niOjEV_ZQ24k46ZpK4=YF{YL-A&l;|*$x$sWpD-1Vc$NGT+KSW2-)XHGH6i_oWUoHSKq+7qY2xOjWJ z*R$o@k^JC8Cn+0*B;AtK$J#JK{ik;V) zC+151C_NK8?$Juq_=~iQYeO!@5zF9j+nVIWJUPP;mz8A=)6U_FcTXaG3(GrUSm^`u z+3|<7l7DNEnTzG8I!AycWz-s!5$CI^Y@kg<%iqtI;%iBp#olT#WJgsIPIB{p%r`CWPPQSBiwULnVH^WVEm&5Pn( zl7AM<>vZ)^<{*r=j(V)?(Hwe513}}jCt{||t>c};?AM?XG36Ti6n!#&uJzE)WJ`nm z6qkQfFAvD&)veEhZHn&#=WWU>qjble!$P>};q#pGMND3uD))Ffxxb4^bA$Z4O@?fz zFR1m`2KlR3CbqN6Z=Nr=hO20nMK=I2#4^GZj(#d=NH*Z$oV^YVJN%Hi_bsx1!%rI& z(oVjNW)b>F(xkJ%q{;rr#6S7)yv#P-0^@{w`s{mm_Me##xiWokW4fI(vz~@uaiBDe8rwY=;iWE}EafDC zyj>(srq@GTbxM)(^i<=kFze;c(X2$eDC4aG!i(M=#?X=Smo@Ul2`vAMHZnmM)o9x4 z{(5Oe&Qi)s2<&mVw1u4Np|$lSqj3$;)_vc~9tA|=%a{{JvV5j>kt|DG41~^prQ3L| zUOp>Q)=S&q0Pj&(_RYKDO$}L><;EwB6zdHc{EGKK0Ip_FFxF0`6PurJJYJ=hFQv0X zj!ed9Ae4rZ1DMqAJmY=J@Y1`0PaV9ENJZP zr$qP*_@6uVYJ?6x8GE6XIfOmoXpqoS$a=Zq&%L;WkHBW%;P9WcMg^4*P3_N;$)<7F zNM3%}u=<}6E>7}|*EMi`m*h!Ma@#u(#?eLfPnK(LaARp8D7SX!$=7*CZk|lflRK+; z-St;G>?Ij;zNdO7wrr=7-H;xTY1_w8S!4msk+2$gW^7@Kc3h{=cn>@%mUUdUM%{!- zLryV9oF%7e!^^j&*532D++OkhNSQShZ>H~Im;kK#ZSffm>Wntl%irob)r0m=&*>!& z&qS0aBERfk;_$)6XZyJ4*i^4UO=A62^S|%Tr$ZM%;|n@Kt#<}7CNI^>Hy$Y+ zzP=k$v50(eiLr8wd1xp+OWsb0owm5c=nG&sx9y9br(aT@ov&!q6!2vGz>==j4OCNE z%&-4JfgV9HV#(DF-1VgCvi(nh^`W+LofTi*Ais^F*IbGFPkz+ionzeH&~!)~oxMR7 zPqyVhf9M-`C@2hkG*5OmNl$~UA1cOvDVfXf&%N7J+6+pS27kCtq+mAW4t6?={Di%~ z!492fEW3oy&A&q19rBh=;P>WS4WpFoUt~?L(w~2@RipRGJp_?K+a2T~QQXAO?On)l zM6I65dgWGIU#+oIt~a5Q=<;@|FL)n(S7B+*Cz~j*l#={epzrs19@$v}cmEFKvPLrt zH?=RfnKzFLbfGN!h&+BDTZo@dck4|rpGF{MzYx}+c|6zHSF9z^sn4v$diP;)9X=TZ4yU>z%{@%{nPk5F z+{uFYJJC6ea0?oY>3?KAhn)g9V!#)(u8>|HJHKXCgCesYc$nYp<3yr62zqD>jgIaH z<4rGDZ#YL*b;PJXfx9p+=%qX3iMss-y z9IO{sCogS~Cw4))O8{vEUN;@i_{s(eOr+>PTduOKB@%xI1nhF{06q10vcJ|UDl|SU zZc10IgcB11MW1)3@#F*bA9TpXPQtRtwKBfcs0XI!w|5NYcYY9oy|3DB80Q)#C2*HP zH_|pp5}lM{k~L(_&b|bTb@^3bCM;j<$=!Gt4{eh>`he6J{U;b@E-+X;5<~lOK#QO$ zVh$#0klfioN-RZyBxk`+1WBm8cqiHPfO*C6t~$y_raXIrjG3?O&(`ov-rP-X8n45+ zFjr2TYHb@NcQrJn`TFN+%Ktm=!+8CYOA2cs+t#0@Gs^hBpoRNGEtm)M`GKYwgEch; zP?l}%HM||xcI7Qfd$_m{YW3b#;H&LJEbYvhx>6XRX|RIIF$MNy>QGqLbc0ORKBR7+ zJY8TvA7%BW4#^o&ji{?Gj2+i$&pS>2QX@a)$Tyqim1DK2$9K*=B)ur^omx1XYrlsP)D*y2d8O z<&*RD{0$>kl3de(WVx~JK6%z<#Y6m4%jo!~3v|;xd%d=xeeIF!19H{{QVvb=MF3mC z6LP1pjDRv%PA!(^PTf3po#I|@Ty!@h>uBKdC#+Ezx8HE@lHE)IMf*}(P^6kVDe=Iy zZ*YX^rP*Wktd3kQyYICi-{X1qzak4JaoWE5fg@rrE#?vnrD4^8-c0-!>zceI{Rj^Z z?VX(uoYHS^9TR_{RB;D?y<2X8@+K&;_Rd*clZzKK1$$hw=dVQDna6O6*Z*dZhP)#d z%j}miTyWIN#jr_vbZAmO7oapsOlxP5P>sJ-Di!n-gk*CM6Zg+zf@D5UO_iaIKrd4~ zQ_dZse&aFEU~oY|FKjU8+^cu*o1^gEJI)6_%xt9Q8qKh&w9B4p%5b~5pJv36{nvGx zZSgRF=k%mE8ISI;0-4+vKra*@21GniV#+5E%gRw!Z3X$AfN@2`zTI-doW2GbHQD@U zbRdy-Pnq%VF-*m9&1(O$-rCff>1|4Du6XavYzu>R(*mB|b*|)I$it8z_#oTh_SR5F zf@j4lpB}WXC-;`QnxEwidyudc)!hkAruR}x=XuI*(pJ8`3uGY&p&BE8CGpE(#b`HhxkHei`zfBp< z#5@C=7RYr(yUIJ6@~pFE|Vu&8ON&u+$ooT6A2oNcW8NT9GPnJrX8C1 zxq}I`bKY{68Q^BS8{~dHImftV%uqd8ueeT2ZDk(8TP4Hd7dub>oCM=)%iN__{fnS< zadr$#q}Y&q6jB}gz1C7gP>0Ir^JQ(35}VvsF6aM|DM-D|@w4ke8;zW^Jn3x}TrW{< z@iEnM_cM&-nI*i=LD{JL?ukNK_N;tcC5@}hx#T5#JB&BV*Kd=@it~{v3mKCaDSD}L z_eQcpEgWx6xT|`-|IktDEBcQ0I-lhEL`bLxtdH-EX!vEDGfKJCMQsu>Rn~Udv zth9V@0MatOl{84`L+j8T%xgdTeF|*T={F?MlNQSF=!;KpF zKXg^JjayYT)>qtjS^^(Y-nqfJs+~GKx03Y`rqFRVb}@>*-LtusJVNWgY*^;~z4iU` zxCZg^PQ!7z9C^eTboJ)-UH2%r`@7ljOoe-AS`BNH_cQ?EAgFG6jcsn;V8|~K#dq$V zX*{6jQ&#**HeW&!&2Dap{k1`UNK5v497&cmj&2>2EtfRJCagw7gHibL6{%RT5}xLc zwX(iJ)@_rw+u;316AyrF@)F2$X36rHoH~bTn7=G}+AMbOb?>O05DCE7U!qjed|lCm z+d3ukh^9xrq3UPeSe$&bL6#sOO|_#DeQvX^CK;c_GFy1O{J4g>zO&f@#Sr@ zVy$GK3|~uixxA#f{HkZ<%A5Ge!DcxfFUZ>UHiUiuIgJqmJ9Im?604Wk1drqyxK5)_WKIiwLkX76BrK8zAaFSAW3GdDk1iST;XmvBRzCK1 zZcV19$pe$*#2k6b&z>rc#YPSM-pg~0b6zAH6#M7|=5@*(RcVOIQwtpJMs~h@(WBnq zb&MTKhY&$`HZ z1(a-mfJl>@yh$j+M1EI;*|K;ZlAXEvMs104d7kq>?7;c(2E_UnB)>10yBFD8If=$Op|BHMWYp8L!0#rehaR)JJDd5CZ#sGJMK@^} z&~Sfzbcqxd%M%`XCM@Pq^L__cn8OFYl@}K%*3!-xte+|C^!}xPH;#PqX8xIviXchZ zRmMHFv1<($k~A-som1tQPdL;yiL^ID_Q{gx<67xCWv(L(w3|iAqh~w__Jo#nzuf5E zGnadjIde{w)*UkHPWYUddKZ?J#M{nW<^P`Ji@q#IrH|8FE@_pGwU+B~8oVnOO=mIS zb(;$_(*VcElYR}B_7CMEi{zt##6oiKD-b*T%{dvdfs17yD(dy3 z6Rp2LA+NVxmSHS&58Ec|Rsd%7(f?J~No^*5sG^w8JW~!#k=YL^yt{a=KGm;9jt=J+Ol*w#ya2&fR}lMs7AffvwI@M;jL)345zeaZ#(OW|})Pxx^#q+?aZo z;rQTM<~uz~KBT+dEyvW#{kfiX-^v5SG`~Vl&^KHU$-cd1T~v@~~nHw{9gO7&8OB1cjE}rgFPra`r9CoYvvo+r z@Ms~ImoOHZx_i!p*I@Se2TIr1xutfU$Yw{l={@V2()b9S9pk+^d81RQUaY-Fd?XZ8 zL^AT(98Qkk?z5KH=%tXiow+lfSwQGuU0Ba0Z5;5)ck5)@MmC!@xLrSH>w675exR_K zGrW5)*I36!){nfuTq41%be<|s@EC4c-yugu8orPX$3vn3GdVw7xm;*utOB3yLFPC& z2S*JCO?!K*^teHz#NF~7H7u10pfPm&Wu`wfzM%v6gs-0P73UQiH`an7avbu29mbLD z)EYiK=M_6%5=*${1!aJ}?hbDUR>6EXLwUyr7Uu1rYlB6X>%!$df`9tp~BWTYZU108Rgb8HYz00Sk8rtzq$F=p7~=!T0DSf+Mi27(s*_?wgxU9 z^SWYLV#r4y%Di?~@fQ_wF0`I4?aOszt9alElMO%Wc40YTs6>AC-fC6tBYV7rCN|sS zJco5xpLcj(l7FAIUf#b|_U`4RGhf<}Jh@oBjbffFSJT30o8Q&-y;JdVQN_uC9p!>o zB;)_&k#nu9iwGJnIEKnq#`W@Yom{h77Tsw5`|=#GS$HY$J}+C!o>gBud*-d%k|!0* zx*6@T3Zpg*aVaenV_O^!$Kq3#M`AWLN_-+8-8|D_+_u^w*+aBIi;Q6R$YeBEx4Bd) z0@bBsU;qqTbPXxn8GoXM+6V8m3!4=RJ6op&=?ICoLuZDDBvdIRLD05_iW$v_U^H{p zbTt105x$O|JT*tWC)kiMtE!V52>G2ermL80kSCyVi^Zclut*pMOWHPpI)ODO9PHqK zKyw`R@u4790wsUszu>T2iryZ{GbxK&m{0M95!>q^jWWQJt~y9`=~mB#h{W#?XSPj& zg)JQ9S-Ay$0VuZ9iXJX+t3wkK^3!OD@t6YFeSpVRK6OkEbZqnh`lB;Z(M1U{fD=6t zAb;4;T}av~YcovJ5xcWpg?9$ zUJ*@Xc*0BGcFus@nO3gW(Ml^C;YF!SSuni$Y;T1lP~C>IxRUO7*xpMg($n4U2mh^< z%j9)g+*YJ|HKM)f#dsZKxeu{kyPy6#-k#qMJHNJC(Nzig(G8=6G04x8^+b0Ett$q> zobCkOGJOh^pMgL-s251Md26~D_=Pz{GsL6-6z-qS42NvShMq^dRQ@O495UZV^9q+! z#~0Qsi#yO_k7nh6|M>81hW2LO-rA-)k)JFfN}3u{!3rI6ET%& zFmW>)^7u~?A{uN^>SUEhf~O7jumeaEA*8{IW=LQXqTH>QxAApWuXh_m10@=SQekEF z9K`KWwT)!9P1l~O5F@M7bu`BCYxK!koojeG+nJ_*=L@Gg+L5|pC2)Tx-E0pfV;savP$boR`h5}&G-Sjs=q5~Eb-sR}}cKFO_V2K3MB%7lHNG0zqxKJQ0Nwv3w z0|J!Dtkapad63h~dm#lyYAn^pf}$0h{|WUGRqsxE!f5EToU2DOOu;bA3Ggh;`5>8^ zZqVa46wcX7TEN*BK|GKLQu==i@KFojlJ8DTb--bWbdz&Gscg1Cdk}Ik1csEKBy-yo z<=u~PTNQib+ekChcuK>wCe08ng>s}FAR%ft43esV`SBpZi>+Y?!7|WJQ>4YHvhYFw z@#Oyn$7v-MTcYyU%4wQdo6Wwm6?YOHwx*Ho#p1ygjHC~N#t8TJL)idkXwFDg-D5*h zYh&zyC-wHLRa`e1>XT4t{Z9UoxTuU(#a{9C9w3pyj)Wo|i1|d^3oFV^5h>>X*b7*v zJ@2q$mGn40T;=&9R+E#g;E*yn(Sb8Y9)E|jmR_7Ppv%|pXIgo3q~Jhga=$e^l(P-P z0UW{C&Y_46O56{DHOq_0U+W$;L#f0YNexym0*tD5%XS-%mw^_WYNk8WRV+KW1_FNX z2mArdTzzWY6m6mk17K853tk5N6q_397`^FOnr8tBDDer6(X^EZ0pbq;2Xkhk{^^Uf z`>~PG^rSzd{28+54cs)b&W&~+3x1qA6pS^G!JLI`vl|!53x6w1AMSp>n9eGrbrnic zi##IJoSp(Ln`O6C;z2D7)IHU2XsFD=3WPe~u=;MwY@(=6Be?0WzA3adbh-NF(!us*uH-V+*n9-3(LHAeU+d2Ks|TSx?Le z%~lk#^-q}x2tdN{S4GXf2dZ@bXqiz?3%&&gGSc@*8B>i9YNbMm7-D>f>vC@csleZyU=9v2dLe#_XKOQv+dG$3AJj~iU4jkciMBf;JZ z$}76NbJF=(ih%bJK9c36MYR8tf#1nQzYY4=s0z4Qedl2SNee;?=+D5LqeVXN|EmBv z5tAEeV^J2apmt>hf=3JR2XSSM!d%euL=2}J|ZSqu38S=E8Bz_$;0=i@8<};Kd@)lQIQ6T&maTPdv~EWp*gI?=iK7u%um|%dbE=o8OM< zWT9dwVB`T{2YUA9eDav-U86%NB++ckS%v@3(>K>3p)QzoHX_vnq2aHZs$R@O>Ur>1QF>?%Bk+WmvT2|bA z_Xd%K)5K2FY3R2TJNdI#H@pWq{%Lu!yw~F;XAT%jqRzxR4OsW)_03mwr*$P17|wbw zMyxGC7b)|w|L87AJguN6RU>Gyj>I9deC-yf3YhoVAhI=kVE4lt>*kPST=&t~W9_5! zUK8EHOwFof9#E?h3F|%~04IL9Hk*)BAEP(NjW`C5M*96mTuevv*ix`Z79KF{xH-8S$J}0}iOZWde~M zJ#HcSNjF&Qb$P9Isp=y>07!|bBwPc1H`JauTz%snAaJ_7fZ9|YJ{4-GtS{**Alag( zU%`AqJN>XCo&xl%2pmnU`ZUoZD!rz%c|3_SPkB?)@Ed|&tTkaK-ELXw|mwun#49p~0P;E_)4q#%D*)yuC zwqn8Xhy7Il9)f%wFN9IVw5k3h(0yOFtDWBnd7pJFgb$znaK?Z%B#fct5uYyrl0tUy z#$4yh#8m^EJB3U)>^%jMb`T$II+{7iTyeCQfP{3#qh1W4Qj*{rdk zow;o`Ah-aMjd;#%JyoLQ(IR%!<2@SX65~}CqK6O&F4?20aPy1;^6ufV@hJvHWt5v7 zF7{2tpD2T9Rel*gG*O~vak2&(qByrY-C>@UhV)f^tgkLaNi76!&w;w36b7sK}Zu6;Ojl; zW<>bG-c96{`VJ-D2c&nDZPIiIVuJz%VM*&$8lVjmrlqpFz1II1jC|Qm2Rn(wZ;F(# z%x~tX4#bWD#Yp3+T=wSsIc`{;Sc~ReCFwG)mNQ|5V*yTHVm#IbD-qk{i*^86o#4@w zTK|ny5E^&~Vf@FI7}w>I`>`?p_}QsBm@{9b|Iwi! z1c`AF^@v#B&8=Vn>iZup!_;8`Liiq*KXEPjlpXmvsJihJ>-s;HS3N5KNQkLYQM4I! zxCjjZCsn-WacPVgl||?Q5bOqfi{;g9A{v(3<|4hVYDYR}qD2BwcgdCJ@*)~kLSCow zl}C#?srSJ3Aj1|gUxNpc(P^i+LPK62pi(#Qi1*gFg=1PS$uTY{_54sOy(L3&_HgGl zFCDP9tKTtmKr(VgF-sr|q8qrw-!0hl5PAB65M-N+g8*CtSkoOS_sBZXm*(%_dhME2 zCZ{3QjNm)6yaD7ccqHIzO7rY09*M6{Ll}o7I|*+nh_%hBw=OJWO@`KYyT~>06sT?- zUxq9mE-1l9*!Y1ioYp^jMq={eZVGll6G6PhD^(Zu`<1poBt}lND=&u>5q^#F3K}V_ z>N~Z*zpt=+wo3!4Kw`V{QMcyGkDm6xfY1|;FUHf_nGuI19SV_Ls-S+k&f{G^2Og*O z%lbANOLL{yUB;(~xg))IW4k&~=;}NC-#5dd-B5J2yJsbX*+Yq60N<;Mub-ig2T*15k;w@L)2Gm|5Dj)8kX$wKfo#4B?`K^Lxc%1AuC+~1H+Y`!eBzhr{ zL_p`4X(aHKBMy6pc0}(y<=yP{WUD4troNe*AH?}fJg?F|QOk{%VDF2qdYvX~ItPzd z$h&A#TG?4KWF{j07CtQJBJ4Y516#!6qdW$&qvTk7CAE3rS^H&+S^%zwD3n?9UX#;)gJh{_j2 zC!M0mvKRyYfY(Qs7*8G70kUdpuL}9(r-CMsvEuNz7kN5pVe*OAvFF4Cs8tg4ms;^W=;#^_*yc_qUa5vNqQ9Zjbn0$cJ`5p=!s zVu^RV!aO@?CwsEkH>}n(s-eRRBp$Ff4wl`8&TU6KkLKiKogwll<1eaJPn=zLT>*JW&igF8C1;yV*69Cu%kZAN#0mE zAkOz;4QV|dgWv=|FupL$N0NgRHo)0VvP3aK3$u(!u8ViUt0@KxiZ%D%kh#sn&qY&y zv5;XU5$3mEFC9q4>y62qXM4)n$>b%1)>lRGn+wz3jhY)^vuad%Zb|%>LOgnw6vqHb zL!ctIb;uc8#L7g%i2p~r6|bE{UZ#8xNC2rU%;tA)Wvui!orA|@1l-NH6gINFNF5 zl$)6hXDNHFzqi{Fl^s>~HQBL5p=5g%W-O=VDwtt;LVuN|z%dNRi0KIIc_g_wOP1u+ z;Vt2|5;^o6&%#O#@s^ zBNjE--2uZ`Dyu5M!b2=3=={yP#g%l!7=(lS`#Mc1Q}Oz!HoC1Vm1Shqz;r@zDDT%` znfmTTZ?>YOunra)HVj!6DQYxF!o62>Yp051BY$`&=jQ^hKeGGM)98rg%L1>wTv|r%1p%v&`CcuZM^=7I;*bc^F@8Cx$PQ=4N(y=7re@_= z^-HYbaBi}skXlW$sE+Ko!ofq9xhLO^PfISq_y~|ei|nrFSo^k=pgtfybeaU4E8PMxE?W1e(uF~?2$d^U5iqeRfBR$!`(yaS6pjhQu)Ivzf5I}0}X5|tX zRIidF71U29F2?6@SR0F)q{PVQhy2#mD*0!Vca>*vbKgdd!R0`m(mWnl(!C9=w^EJl zZI(~5AHDR0y+;TWUs#q5h?~z+Gk{_Wb zxC=C!knw^Dw zsg6;^(`3gb)|;QZJm5P5+4Z}d)xC|%&o%T=k1N48v_5DoEv9SI zhu<>U=<^NbIK}rN>Bgr&qBnyS=iF9l!SBaDK1}yG3$}YLZs}T&v`}s3 zgeDt7-z@I(TGG@q#I5xIwtUenAA^E3QbWnv@T4P}l;=g^cV9H)m3E`x0zY?J~@k%(sP&U?GcA#e}eYfMLAg z`W1o^qU$!@BuGR`nW}TMe7)b8r_f~P1wiQY)#tWIs1V{hPVt779b9_bVfB5MaLT@RC1C46p9QyWu!ffw{Sxf-Rdp_;%890z zx-%#B`izP~!x|7dxU-UElV$b80n@a#BBw>Wpf_4U{EuZLEJxa8Ui#EV2+TTP-OCvt%9rZJ~p(T~2ypvx#hub^Jkn|Ea(=AA& z(BF&F^tJS=0g|~DxW8|CjSmZCXQPxN{AhOPCa-rX6)Cm1klaexO?&H|6#%=kTR5jN zSHLC!EIpcMuN}lSPE`B>5K)av9b$e?w3EzkfoK+_K}`h#h_<3bvNhWcSmKjr4|gGN z%~4JH#IiPM*t}LQZiZ}M@ry6u&hV;-I|gV2#_ix6#`#sm#!Q#(k)v zJ1?X=)A+jB>{0pZ6*BCQyi}B#b`yC}f0MHt?SVe>nGCU;GoHMtY;A)0!wwFOXR#EC zNyG?{jHYmF8AZmhmL+pN{DJamM4CYF8aJ8tx@>dK0Ch%h2%6G~M@FToapmDmg_~|G~CjV!TnVm)QAD6`ya!uqP;2m63+qx*< z!|%Q)N1KhT7G5Jd_{J}d(GZ*p`=!*-jX#S9;hlEfakp1tR)zYmWbbA zpR6o2*J`F{6HDOnW_h>Sc>}xq_rpnuWDevpdp8-6>%sA%(tfN!ua=~u&(=G|td4uV{1t>*)jT4Mum5dj83pydI3f;3ZuP4s`x9;aW-(0_L@bl$2V%HQu3= zGo&t0ZiQ9FBQG~L4XxOZBL&v^>IUp*9RjUU^DXAeJkacXn>-Utg0)a=F~r&N(LlT9 zE@38~LsZ7kV={!Nmbgi$kYJPF8t{+hUj^f4NKL6b(r%H>mjz9l;q1N4io-^dn&F66 z9BAfQKn`hL*h4-Hmbv`jW`U|W2UvE6+Q{_m4hnYVgm=vL~}m2IV!&tSZ~9SR;q=T zfY?Yes|2I$W@2UXL6kvA4v?O-or7X;u^9W>s#L~O84>N6U!0{z#3h?c<*jCA z3=bvNQ5?|p{+bMVxy{(?@$d&iw209fB6~5%yv|5IT`GC#snmX^ zG|^tgngVV@X%2$kHXv-OsuDIv!_yRiyPdK(6j+ZG9Gmwf!`T-1)^e2op_W>i74Cm`&U(2$FaAtv8MNG# z6(0ipU02F`~~EuO8Il8 zeKMMZHmn6a7WC1NP*~83Uq2{$bFfTtAJ~6fUts7#`>K4IThRM3at=m)EisU>$1NK> zI8-C8n{wid$p5iWM|r5d^Gm~Bb25^2^f@`%iITxv5Hwkj=EsA1&Kb<*bhl)|Xk}d^ zTmf~MLf)MvOFy0UV{PwuAny=#3K+XZzP4c?jUUOSRX!kB`o!y!BW)`mWV)YJElfXc zUL(Xq-v^5>mkn=S>lYzU>lq2*Rcz(FWH47Yv;lSw7>^eM&21PN&&lC^NwSEqk`*;{ zlzB{5l56n3F$U9`$f6oIN#_nerwH8Bif~YGFDHTPvpz21BB@ER4s6vmO+*Y)^TCW{ zeh%jkRCZ=QDU*mXB2V}5o_cw;hFSTL6cM|r zR0XZPoYVtK9d>59JOmeT$h;yeR*)m#*U0`BIdQl}WP4nl@wuDF*_BViI$-U0#`Aba z^wIn-O=l2VG}`yWEX%#*CFNR4R&YeD7-6@!#Ez@$yR4DaK81DSBtSHS;@ewfemk>q zhTik<@M;VixSwxJx8XxtH)MT?h*6AtZEVLKH_BoppRNBi^7M)_+#AN10Ns^-PnYrb z7LrqQdC!^}*^^6B4&e?r{;7u8|EH3$*5^iCa#BjV^8wOYB#Z2!qqzbkpImN8CXHZE z+8G%!$!TOmU`I$IQ0xK=Xg*OGe@wN5L0?Izs&9#PPG$1Z?1ZVP-qXtZ3s&ynpUmYS z<8|cR6>5ZkdxjeZQk&}mc@9O9kZ~g0%A8ElVLh6y%^RNtbhAF0FH7?-)Eme%%B}ul zrSfvLG_*$Zx*kQ|gls#%ye=o~R_%$6&L6Olb)5<7!@Yj?&DwuleiF55d*Tc*l` zgn-EvbxPxBwxlnUm&X3IU_xD;_-Shlc%O4{++~PW8QVTyDP!JOeU+2N5iqMNH4o`I zK)awRcF}-()hPvR?#$Mhozt6H#w^R0=1mt!|{}lpJdqKEIy8RuyZA=jqby= z6GKIcltAR;8baZKeX~KCT-V3Sac-a=;A3T6QT5FKJzi0986ZilaKOH#QGb{^7Q36Y z8Rzv1?Advv68BP?^+yu#mkhA`1jqmdIzn>7aE0m58J|9=#y{GdrzFaJ;nzmx7Yn6l zDN6+}NSD?%fhx`e76Gp0NB;PJ2gyL5Yl^qC&pWy3*Hmz(I6Dtw{b= zPe>lLK6mjMtk;PaA`A2dKtotP!$iEBpe_*gw#l1$EI0Fm?8)1Ji~;YpgfnPGY&jFF z5J*Cd773Ut=mx$WzJg<<#)I9aU}0T0for-WSb(G4q&g^4SF;Chcb@Ev4636 z#e*53(^wE73j`@QNS(8oE8{6u`mtp;F`QLZ!A4lQUSJ^pGtI$r0Fh9+xPcN)#BvuW-%=PIi5aN?*eiF} zs57w2L0XnCh9zvd!1!6=Gp!t9emI*;J=$#j&(ipGr#zHH)q;dW7=vPeRibuaOC!)3 zvhRp5+h^{|CD}(^$0u%7h}7e|GG71Nj#^loKwyqB6qQ|DNJ((X8{t4xt*g9_cl0xrn zZw3hg)&}Z$dGYOoxI2Y;yjeM;2*J?mZEP*sJPIBv;#T<$WC%HV)|Gv*wR+|Rw!?$9 z#>My>K@09Jp10G`VqU_gWdht{t6 z)CT#Tb|cNtr49_D5P)C&&vn|4LIu?49M0a4THY~SQ^B8L-y9c3LcFn?jrjfJLHfWN zfC<_IJ5RvuDox&s_K+zzlQuT;2AVO}42|Df;%0m`!M?eQ!|#--;3eZ{mXLYIrIzJ& zj%eRw)?L-{Np*6WUw&znl9}+Tgw2PB7|ZJ9waSV~bqwZR35UI9yF5LeYWF{iV>tkZ&9x|yud8bv9ro--kg8RxQ8yd{PwT9%$)nRB> z9?P@xvJ^M!X|4qUVM=lqol)f0X0{+{AFJ@l@zBf2%RY#k>|Hr}PyN(~A#GJ(#aU>- zQ5`S$)R6+=bfW+yuyg$06XTWk7WH?qyF=nBwiagbp+=A#)Vqj_d{UePv^U;VD;~GB zpr*nZBgA#sPSV7 zy9@cRfc#KzoM||0Ghr|vtJ!fCTgIj4rq9Mq&p8$cbjaXjh0ci8TPa<0If5*DzP>K0 zc;4-Kle#F(wjc~hM}UX7h786Ztn^54LLQrjA~rRpVU-lSRNLc|eIt?TA;)2xqoT=59SrPL zHKg9G@5OD5W9-iEb~e5?Kmbr7oY{Gt#-}e#l6z}ColFYqFfDR3yzBN$bG^5jZ=>cc zS51{cLorf3zO~pF-#tVIHMzBQhIxH)mVIJQ?3I)L1utL0 zx6d>n69~vTqt!UyhLnR|=i|;_$^bY6(GFVwt{z|p`+B5I=qb|<1EOhZKNf}qXMOA4 zRg7y8;_fnzbfC~->xz!}6k&*jQO5Sx@KlvDABV)eOaO%bDV^p?G_ssSMl(Zn%{g zgUD>qI>!^ga)?xWXluYXTFX&sFP_S!zJ4q#oN01tc5HDr7iiZthBlxu0E9AZA8yvK zU7aoGm5BjWpIwj@n>JQs$Fn>2_)9&8p}sL+KlHa+7W7P2TEoLzzFGU>q$i&xZz!q% z-5wYz2F&%wiS+iS+Tsr=^@>?Q?W~y`Ox6x6+_gMXs7{-a1ndD^I+HfCiwvM#en2b;X!)5b4Xys z|5T+m{OS}|YkwW!O6$!Y?B0Q1p)is=oE|v02g9 zB_$d*$?B96k35-8ni%}WxCrGK>Pr?!qZ~z|5^lZtICQ|WC20#7(6EIb*oRf-I6`89 zZj}$tBRpVp-RUt-hF&FG26wQSXPqd0VW}vVBDa-Ix;Jw_>=SZdiaHlL591}~*Rm;2 zv>snBx4IB6Lu6usd^)W4Xb$eTJfqoboT;HzvT+=-vhk5e?wBWLPoe{;3GPz0r}vN6 z{eV-NwkQ5#+%bZ=`?^_ZJHm*3S>SyZf@!nI@B|4s`rl<+1ADVxpodYCuk=<9eiFfzdi_<$7nmaZ`t(Uoox*M;Db|lt;)i-#klc zn~hm*a%#TZhqy&3;yq+<24qft@c5q8aECAT5RGxr7@KgiFkuVkBur_F^loBZ(z6~h zeoa`vt?ST<97_>=^^tu**hyly(^86Pn& zuAmspNq2*SXeLmAfN?2NDPs#ELIT|HlOj$2U4`BqkCc`b<4`XR%g^fS1x}?2dJehs zOk{QWaUd)Br*cpev7J-tiyLULxO}3gIU-L^m5mcQeIPM~W!ip^)*!pFM^2og2}^mW z25&l6KQi`WSdW855)}rL@BwmDa(9m0?KZY8FhZv?IcGI8CAabj_Pv!7Em<-T-}iN8 zt?^Ib^{)4kRvzfxkQ=(ZJ3P0CafV5U+mdqzX&m78yC)`Z56i-dZe<-|Ykr2%6#Ew7 z#RUs^rDNwyGbshbs-_1h{)R^!)w24ez9*@q({Yl~^@hh7g_myITPAmIkDuJ`h_-zO!wab-fu)RYe?*=Wo8oB+ukN%c0QwRDj zC4M+#iXQ#TCpkKdv)bi?1uO>mc%tGefWIkhEgTX*zEnQf!^fNLi1uG=g$Ax19mXTy zUCi5WKHd5urXQNs<m zYm}U@$)My~L#1O8lU zPUg1it~X2N$5Ni+ANg{)(uCrBT$tPobA9j>+32-ipyFgC7o^rPb%V={x&`FNM6+V( zMlEEGV$GJhjLAh3JyXuG#XSw**Rmft35z*1)ku!FZx`TVnY0MpHQ`XW^^|-ne2?cC z7ZyqH2vmjPfS9XU`tN2ixRj+b`3pZ;6{sRvPx=x>^O?Dw;Mx28`HSZ#4=E;}^h_f4 zA23fVP{jmKbD3N|iLx0+Y?(%XwXyi^MFVR&@fK?|BEc%noyJY|)RTktG`{P$MlMV8nUEYaU&i;y)v$cwaquZ73MYJOiuNX) zxWk3HO2Z`6B7+xL{$rV-^+rZnYNsxMvtuyR^e?d1c4gKt z+39(uTV_^kgZQE*Z4I!k33S_R_hhgqHHQ+|avM-phi#rxAmv5Y*dm!-BX5ntq8T^D zItStNj0K8M03pYXLRN^LlcCX$E>anC{Wungq~*~js!~&>p;S&N>TFMbR=^ytOyJn`+9*ek!1NWhihI{OkRDWI>2kI zqRw%99pV1qmZKDs#C04yAFphl7gZqk8<*0`Nbi|Rv>BA|%49G5#BMB$y_bnw@BIVd zH=b?7Np{u{vc3FIyIHd%&Xbs7dn#nX_P2r5a7~xrJ6itH)_EZLP^R2yD%ipMo?PiQ z4>;poIcFY5?HuwlXUEpn#wLQch5cFnWh=t!%E_$I7$3U&Oy!PzBcXhN!R3pAbC`ey z7=#}e%GUCggOg_k*r!ohs+``DDfVp_Bzrw1E6K7@=a846Ft$I)?!9!+eEAt3;sDO0 zl34$B5tw?(2<@5A>Pc_Fp{ju>1iVWn%+BH{^jxADv7Z;|a8Yx~KLHzITi3QE z@AOb-Bczl3p)T#mv#o!);)Wpg7myRi%4KyNxUK>@eq4Hkv8+J;g1!ob=d$=L{#!h) zd|Ub}>yZZeYPP`TT1Oc_V*Ou9+@C35QhPGx@fJx8$TPipszPaWcf>8>!*3Rkl{%G)zXT7rfpS#Cy5b7vtX<|+2@kuX4<0)xFTz+CF?X+*bP(d zsucvx-nF!q_~g@8I!XQJo|Zn_`ZQ16$CEavV_E)UTL%_npg+y?&KUsnW+fze3fm4s zwbT&xoBnkH`@tXaE@YFi@;99-v!IyM((4Bkh&NVlls$Q|Pc?rMoXqdOH(l0sa>(#3 zfk3hpS4?BY=q-=u$VxbA_L7IyG52lkknE zEJ{Ff{TZwrYWub{kC#t#jZk&pRb_NBf|Cz>zAH4Zqou6xG0Dm^7M&rR#xU|niqq1$ z1JgP(r|(S`f};u$nvT^zH+%;6rX*oYTK+ggifHBmvEh?vheE+^|L9RKogsK(hMe6| z2NaXOUK%p(T6Y&i_B=`XXoA&ke>o*S3sG&;n12QUeK6Ki**0gc=le@~uK;4g0A#G? zu<^^eGiB`A);we>%{A4UQf^JkM`s#eG_D-NjJ>fT(5BlQuYvw`W~GLNUU&A+$g)EXB-&^O-r&Q1B8 zGy!zW*;a}WG_i(!FG;A0rMTVV9N9n3yc+D8cdOA;P0Nxj?J#mrl@rR${V;uGrfbsG z=w{P}REKPOSl+hGRz>r^B_0jFwOAwNW}-dznzr>aGfbB)7hc4(G;4o@b5h^sdgGnz z0HN}Q(^~n$HI?ew|DhTvXu6tRQM2L$Bvxa{Xr-%ZJn%`ZOJ1FA_n#K$#+1@S z(uo@=?_X>_w4v+e8FI_HF4e2EWJ$ewt~qR>}2*t4VUS@oCb)BDHA)*78`sh~6U64ec@m$}Q z=hgAPZ3facf|=o`A|`rY=wHEFY{&ECE35&Bw{H%#OcqH%tnAb=zQ;|8PVe_?il3yM zdJP>xW-8nB|5!Q?_^9fv{m&#BNIjX{B$GlCGJ%kggv-pG%$))ZWH13jmyWbh6az+$ zh!hb*FN!GG%Nmtc=|u&*QCUUTwXBM$sIjdL+v4i(tLy)Jvj5L#-`$s+nLGFX%K4r0 zoaec>cmWz)w!C(A=WN#b!S%-JwRZo+=w8+!U1~(BApEb-w%&)hbrPsh0966`_jpN; zGriH*u69$SB}k7?B>iEhCC8j#&SX-NrhGE%Sr8xhBugB1mOwoDT$VhtK}!1d8Jg+o zRkGoX$5}#;fiB*u3yq5#XtTtQ8g*jqo+Jl)O1di7FIdFw@-ESUpt^(&wC+MMm98Q&R_Kq*IV>C1k!Czr^vdN=JI zBwxQ-LUd*Jjm9SHjUSv1DkGg-R>1mac5G6KT#HZ(36M`J<+?iZ3497#8FIQ&ntlVp zxc)xT~Z75$zkO_Ply^ zn~O2I0lqu+I((*5j>yBwg)D9^4Mt?6<2n}5(0;O%goIJkldm*Q6W&GE+$e9_)&J-0DfR!;ZKufb1!*+k@R0@1$vWr8)f!#5WP^_mB?VQyHwdrzoodPG?c7RbrNZG!pnE8M8}d`__&F>DrAiFI1Zo!2rokA!#cu zd;zgE&-umj>nfaE>)>GG--*V=G-Kqd9GXG3_PPYiWS`5GrDlDVi*?dROGXq4PH-M+7u`y<vQE_VsE=h>+tXr&zOLwB7w-=ja@8X<6Jy`&t6T{&3M{tJ z8AU(u%OzY5*_JLpWob=@bN+k7O{9k3^F<{l@ISfM=I%yTHfmLGD^||CimnbK*^d?7 zap#p9eGY1q2gC9zxj}iSMB8_Mm?}pujwTX7*S)9LZR4lq{IO~-_dB1k!LmmTt2}~I*qh!<}f};#AICFM+Sfn1L*a70UwhO%4FY=9Qr4~fLhyA z8~A3eJiLf93`IKrQ<%-CnhvpH*_x9la3U1t#D24#@5=PWFdjNAb6w9y6uc1HzMTI$ zHdNcDf3KDA4ZfPgEWNcO6l6;eAN7NPB&?*S z64@W;xZPbK-%pa8`cua+C5^%Twp4~>dH%}78C%L_IP?eE>;!kJD)SgUPWwq94CKu?^+L=KqftYG>mg=hl>97bVc4kOT zR5GjN1e|)Q|NEHMul6AYA!*2qY}M}YFRP>y$Wg7d!NlnIM;B&92W7~MH?i0L-9zs8 z>sB6+9yMSvF>1F^WuaX4P?1&T*f3I_Gvu~(N$w>>Dc5lnQbRDiYfT`OV%%0GpQXwD z5&GFsWdgCWvd}o3-jPzcBRz*MGN3s!e!Aq2vBnj~7EqB0f!RM_I9i%fq~d_X$2RzPGloG4!uCBe!FR^6(ZEB8#&V*RAz zuC0X9uyG{KJH=>869j538KMeS|4oydYi4TyOtoi6nkHR>@}pOtM);`*?z^+B(`F66 zrSMqQYn4z7i}|Yx>-=zAp1C6pUmBKEHh)j&hhXJnJJL=(f&++oxfjU28E}ocP{Swnwin{64 zr^bKlF#CKMHPd9QGFj#|GJ1LSRy>PK#$4^<`6fe$dwws@j=C4*S&_mt@ohvKirn9C zc!(PYB5O~UR4P1$Y1)MEUL@BR$hgVGW-l#^e$-1o-Nxt^&X;GV(KJ-Gp_GKQT~k86 z+>)C|XeM30uh9zQ1FOY1n>+sXR<+($#p;2i^wvzF(QlTFf=D=eszl$|K?euV?tI_& z#dtfa2jbq2PCYZZWDL)#pSkTu7Q-)-+}KId2w$Y~K6qzf=h@bahYn&SjhaO6t%54I#NALZe6R%^<&7IET$j0>7BmljitHNbwaLLNU4M@zQHu{QDR`=S^Wkdix@ zuk&s&KXAoIO_G9}16+L3!_PlyIK?ND3pAGF5vS_i|Et z#@sCEXCJrsb&B$vzntOe8cF1_whi9XOMtdwikSr<@E zBUIxHqkD>p29abgHXkOcqcXOV^0Z7`CpQh0UvI}Pyd|rFOP0}qCOJ;Pj=EL-`qhEb1UvCXhWsiSe-|aPtQIosdcSoBT6XJG=gll*vtF1&oja zxE_hih-K#7dS`X??*rtq2I^9Krpf55Ssa`$N5;$J>EbG(lprsTqw7#rl~=C9ftTGX zCih;k@%3ejh(eD`Y8RNBUGb-cTMW;WTX(i?vwpT+qY;8OTqVdI0;-#HEmc{_V~)C@ z>seP;QDW>IE|=a+;_s%NjTI$w5or@?Dvw@yevE&W7Zs6d0#reF;l1`IG9g;bp_A8oOIouEk!xunRupKgcHCDJ3?^p(eVx#gDv zd2E-y+23dAQM=1s2Of*#`4X7p%i#oySHQ8|{;+K7t*-i&Ip&7M=reAPorn}Jmu*`~ zl3Uij1$<03fL^(aWCt2+ivUVrb99x%!I5`DA$dPx|(e-AAx=&^_lnOLXVV;lh=`#K~D-^MW`Ca z0|2-+OH<>eQ7+GGmcF)?Z(zLHqQy|zcN|n2t|&lP+y41>p1fO=yt`TT76)I28oOnZ2=@|n_PYxHy`N!$+4t~?aQ)}PltubxXR!Kj>;=} z4AhXG62F1Otc)yaPd2)j7+d=gdWMa^Phtr---t&=d>*#?l7}#!O3T+yYBDD_UeQSQ zuW>KlIM@erg&dD#^3_=-X4%pt(+Bh1(S^~sOJr0Dd~u<|f88!~FO(Vg%Dmo6$ybI> zW}qbF6t8M+k*^D^$C&9RKaUhBG3HPWP?Ad2NLi&3^Amz~00G9oIZY7wzFGTif)xz- z7s$1=>6eJVuTN3EfO$FEm+T{@haQb<4Qs1=x_7@OP|l&AXLzkHYA1woel?80Uqku> zbvoc0I`%XD^jrOACrc^zi5(gG@zgEGe`C7;kaWWN?B`Jh#^Wp)m{!%DFBdI8D0XhF6ycoFwqSk-=?l{JE& zE9g@4`oBVX3q=rII3hBhN-n)grq7eDGaQ!rW>K8f(Y_c1apZnE0tu6KKUmFdHcruP zgkBLT-T=VGUKxoM0e!@(o*Jy;K0_(W)Nx6ccx3r1se<_?Vtvp{pNy#RXB=;uFKwCM zM}2uNQinOdU)B%7pDgx7FVB{%Y~%9`r4RK-4_pwPSVFCfE=nr*M;<^n*M4<*yfs_q zSIPE6)C&N4nIrQ(yRxfZ3z3OKtw&r#48NOBYLc_oT?)!H<%boWO2Tq<(6ni|Xj~*m zEYr)SH`)pRQyI47I}tL6mp?3{HWM3|!R}-3%9c3|EZcXc$eKyIPdXI=Dc2q34G{t2FtK+Itrxnwanr?Q@Vt2;~G6(jT z=UD3i0Y>dm1 zon{wj;f@|n0edyY09ouVZ0(Yfc*d>Sq*x^BO)V>dqa4<0{9HpEf>hD!s0%Pk3}x?zR{y_yQ= zRK)i8JuTOR5^bNUMq5^A%d27QOP~zVo~VIvYDQ!=o=B}_&L3{n<+@H4_RNLh+cEaA3kVpoNLblkeNa>pn;RF5IuY>W+X z%LT;6ti;Q2ku}f{n#};r5Ktc*kei$Hfk{J?j+ocb=(m|N|4`FLqcRsa6b{g7v_p~L zcyTqcwR-PTNou&`VfmW+P@wI4`}Zk2@1DloE)Ibad4_8phXuV(_LW*l`aUa}z9xC` z(q!fEdNSQLx@~h|W3DK=#W`4p)?lOeJ7bpxjPHDMk~pE`Q>?kPCf6s*n1FG3y<}9n zwSyX(ty1Ke$;8%3MXoUrNl?E$R^@GD%cfP}dpaEfPu(HL=sL~Z{&>ETR;T%^$QF*5 zD`5BW8AUgM&r}`E%L1}~Fq6=bE9Wk;c2ABs=C*ayZyr;t=N`(Yi1Cd3?t>pmu6rPT$L8~^*Uw>W?LGy_=N$C>G!Fm9Fh*$84S2EauB}NV_0zceBpI9~zM0?^fR&BR zHNL%w6>@Nhq|UUrmB)S>=V`x8z6bUa^|r=G=E}wyBx zL*;LGN`4Qh?sZjtTrU62hWwTBE*VT`38m|o#>Y<-ZmYD!A%(+UQ*`);Y6p*;Y{=f*#&V9S|Oe5In04)(Is zlj9?D>88V&5vs|l9@bku8b{>jlhuaVi{i{})(1&k!00+zj-4n8TXz^^M&!z{W4n*q zDBrRQa^bi5Ek~k#6|zABc&#Eq?H)H`i6w=JK$3WCcu5bPNxT7FuvRbIYKmir+tg(i4X zNlBMQ9dZM&dm}-;y`HnhxwjA%sk91taFDD5NMOGlz~WsXb6_dccZTFq4#pL0xUWEI zQQ9ux^Pp|l_LLsE^wQu^TKt$L4?Q6rs(}Z_Zd6`8Tq)g3;e|ocLAuSh>dZJFs+F@N z9g!3Cx%;f-Zu*&v(&YJEi9Bd`_woU9bGD=%kb7?d!(x5t!cJ?I_GgukCZFpWM#hiH z4r>M@y-7*G!_r)1|IvdF>VfBWlP|9gcu$%$lDMS3M}DA0 zdp7G#f~Ol{H(nC^ImfsK?3e7SlCz_%aba?IfSFC96WxMoA=hfnikIe=vO9pzK=~j^ zE9`Ynmh2vptHACW^BX9IcdVmBMsNgyfKXT-eGDec}LI40GEBJ*9D#G#>2!<`1l>f9|ZqF3Y zb`#}#Z?2r}r|DsztWS5~VP?y}a%`@CztBzBE7gY&SDAaF_>x@vvn|7GWln_Eo%nS8 zY4S&MpLXs|9}J@}sjzULWu69auJL@MLXf8Si2jnR14^v^$qRB?72T&r&ZIJ)IrR7_ zN8{XUR6_av!F-87-m*nrevARh&3FnbNuNI3hxLr}*UAU;%T6jUUKJ9P?hlEXqYNKm zbAdJ&o|ta#y+>A)<)w2QOm^FH>c1>xdyV`&j`S=U(SaL*lH$lfm0MNcEX@bxhT%ri zpE&p)aS3z_!6sN~GvuD^A~qP*I3%d|ZL?q-2}RR-$uk!^LUpTEXLi#TGnVeU;q!3a zN_hpPo)a>@(2WC6{dZ-4w7x$X{IJwqps)O3h*L&EvSxaB8Y|)dB1b3>-c9zw?v@l? z6Lkb-S*|S5d`n)HBLEH6=cd96J*RYiD}eg2V^XM=AWdbior?m&Sy@z*%g%8LS%!j(Lp|i>2cl9Bz<(doLFe>NYO8T zH>%@hnGVp&et5S2d)Ok`pJ%qvG%pmnCJZkoE{v+iMde_w1)a=31m!6W4m z1OTtdtln}7qTL1D=ZK3%P+15tk~sZ5gbe_9*fZzI)?Mc2`=yBB5uT0NGAiKkn@LHM zZ1EdbnQR&k?a>+uzoMj~w;r|sdR#snYkbt?2zuUM$xlWX(7+2em;FP;KD-k-!OCm)`uO&tM|=VZ$hV6~M7wJX9{Ss?S;c*09TWg9DMSDhY1>9$rPFUb`s zpxXAT20pPdO+H#FyZz?1De;vBF41^Ao#+hr5G$fQ_cH0YDsm5)=DbuQREWN&6>uCa_Q;mCQvSHLmM$Qoh41re zA7V|6jLNEuWb5*(PoP@uiWqo}|I1eo_L^c|`uSHl9i5|#s}&;j$U5oYD;?)5V&9$P z9Nqb_F}+}c3pOyAMSSwW-yA{n^(ROkx!P9BCCz%UOuAcz`SLcQ(M((rTio0^L#Ey= zTTYlUGUQPPC@e?sMFK(3TzEUIpR!rKcNLJ!WlVb9boy98Gk`Lrne0hAmX2|#&09XVJ~i$XERw0@4*o2kHlO<Pitjrfw6tQyob`LEYiq4^1na4tAF_DYPoomG+!*=HPS+(fwN~t zfiYMsc4LoI__0IDF`oDX#d=&NH#~<`LX4?cdqaoO&;1k=(UKyV9I_#?tMCU zS|85lu}Nc~5J_uXF@b=Es7>#J*teskV!Bb1k0CU7WqMW(sZa25Bb4=4JA&H%1S`&k z!(i(>Qn0VsS!@PF=0qHhJIc3fQ z*=B(8RQJi0G|#6m0aXhamtG>hZZwk;$E<+bh*RpVWl}g!>p3g*w-;~ZcLKXLtf@7h z?AyqPl$`9|on6wF=_&fEAz2pWpCAt&myug%_G@6IC|=T>F$83>@?znpn%|D%PCG}C z!5~2qx{q`EvkDoLYIB2HX?d-Dqlzhvsx_M2-u=du0^^%T8vMdm2RipY`x6$tM1UcB zX4J_g8(DX24@$4g>~$b)8lE?e04!+hVB7w zDRliFnR2K4SYNHDC6>lo+xqZo#Xb1RBq@hcyBi&i*kZm*>^bE* zxor%;I6%I zpTs4+9OI2AoTuc`tE;x9aKRW=pv9nI2EY*H?+JrvTWbQtY)0$6fGGyYD@al8Dj z3VxO)fVR92AV>1@G`6l?ZvV`4HBFI;+$B;s+4z^811%VYnwA^PmLpW&My(Lukqt6> zvYdN_c2-{?di&Vu!8-O@{utx0S1Rf=x_Gn-9f#_ixGZ(INx>elGO?RYhtC-GcvB@W zF}1IzEtVFjg$~Km$Ep9w%RVeLgSujvx1TIAjkl>D6GNaA9u7uZTAbbmr({Bb>;#f+ zoK@u2^M?H_MTz$Q2A3&C*1tyLO>SPSoeMXEkuKlw=~yJbRS@m62JT-H{jDf^Hd_Xd z;sGwB1HEmwxw-q8D+`R9bLc<=o@?GUKAxY$*$ez38sxb}x(rXu zh4xuiDEsYpv<_YeG7sSit)~=izoUL>%EUpMqV((|+q7?{IJ4>x8h@pvM)lA5){?Zk z=6tb))%NT8w%q{=$=f()wY!{SCr~ zH9fh=9Gp+DxSV@O#vE6e5Oq6#cW$~ib-bR62NW_d&E~31IYYJ@X4*PsR|uP@y$xKv zY$rX%wnTe4Y7wo!#E|_fWl%FedLk?OOCc9nz|UMOcReibcvte?=lM2^gtzf4a9{cI zZ&Ec7>uc|IbdEH#fxKlYx_8U^_K%f`?VgEXG&I^dnI*CtQrR3OJfOPVFFI|Vc3GDe zie$;??cfmXvxX!W7&l1ap&^<}cz-wm2a*gas+!x8Wq%8#-js%9+Ec^+whPQ;f|Mwa zlBewyi_X(g9(fGl1eZ2{*5$NLm?<6o$a>fpRhL4wPdS{rm2ql@H8ml|r^uEqixT&d z3NFI~;9kTQez|g&F84vz_K;@%l<@#XcUz{-qc=C;YvIZ>qdH$9>*b5>pN*f$g`d^v zCj3Rd${-1?-`RTx;!27LdzJz412iaNbk1gI90C642a(rNh@WLACPX{3my%48lh!-l_}ZA9yPOkQ&L^6C z)`1*lLhQd#mofp~WAd^hf46399-y=o9FK8VraU_m$mXVY2%0SUYIs#B8BhGN6jwXQ zA3Xt%{Z-(>3)gGX=b23T+4L?;aqmJ|WqqFS`5@Xj@%CtFN81S8kN$?a78T^x^g6BCJ+=(lfBm)N2PxSAlLINMGrlsF+U!Ei5(@pxdd_!c( z4kqnol4ADXqmrI!G-tFwBL`wKc#j;sg*=Cqj%!la-#7`?r0T1Af0Je!ihS1ReO+Z8 zorT{B7+l;&MdIZ`9$@`e#=-~%Hyo&Yufu zV$(tUT2SRAkJbNWe(>)xBFI)xY)++QrRQS{!NdZEJf*;nucZzKIsBz3?q%$a0{t?d zyI7>>RDN?rel+{R=rckaJ>K5c$bF$YBDaf9>Mmh>0thr@`C-00q+M6lE|G=bO7)Af z{!UqOzN4bgUkhS4ktVtYo6~Swdw!0U^Eu3GsEX^(STd?{@=d0Ue^j@8v;I;*>N1T( zb#iWe!DPu1Yf2dl-S}p-W>V{+4>HX}4y(Ze+(d?7AzRMF%MJC74-v_%CJ>+)P|AnM zfpTS(MyH=%jQO0llgJB>rXfO}9eK+BLI=gw6}naV9Ca0XZu%yRUqas;w|* zw@{&dS6@N)^iuA?@4u)^DXxyKD+72-?F*TcH|6aM>~~7z>r|Ygq*w+*!x6B5zY6Jw zzl`IQ?<~rpLI%B&iNJ+FHnohx2sUE&aF`(54)apczzOF0WKc$s;E@YfSicnLr=ERH z>CNGm{88>1O^6$vRwjE_Fs-lO#B?0ZvQoOslRbBTV2sF=xKF-5%WL$xKxr!xg0l4L zWn<;cKx3;Xnt(QxG$nWZ!tZ=HTIT+Z>`upAa0Joy$j+ajf2xF=Z>wVM121Ge2rwEc zFTMluEuA1V*oaafaHZu^;ge_o%=WVejfg!opf`nduqV*T`ec5cwQ^^yBU7Hq@U90e z0%efB#v!%+2#Ou4o|EI{_#%h_<-Oz9Eb4Bc>F$Pnzaa|E=;!SQ}N+<%4BU(Qf=kjmnjQ)AC&O1r{x9v>z3 z7HJ+DS-JG~G5PFU3>{4wY331^@kwUg)H1#f$YrR!ogwG#(LT0!MLte8&Se_?%H*Sq zn25z=W!?Lln)7J;%6;@>NNR&Zi_d20URgE3n72SC^a8OUjwf{*Ie;6ND5CiCa|D;Z zXpYEyx3oiY;BHFNSkJ3Kw(^@;-hOa(^@)XX1y2X+}WYRp@ysFAT2cz_9Igir}c(K{eL$z48sDkbK`Z?sq~OFzg}4=24AG5 z%%N^sUMRb@!?!9#=0h*U-_X8?e_Wgn;I9@&DZRF$hq_13Ia-^!?60sPMf;bj+eDdk z@hi%Murkb;QGvAjmnjly!JoPqVvbzRRVgW#eqI^nHe!u9ng(R@mb^p{WLF4Se@HUQ zjOk@Y>y>B+kqWb83%k-8+-Ubwd1=4#-Nj2E8X(yVsiDIcp_x*1eo6zsA22=78||;! zXlhX`dSV!Z|Hd(T3s`REr^%l2Wea9_xXU*j!@WpgY4mIckx1nk)i*L8l9oME__}$# zyNoZBRlA%i^7S{IsW4Tf$#W>*(O9~zPuy3AHCEAW0-}S zX4F?^JP=`sjAIpYek~0q=FVzPzC$H`O`hC;Fde!MC}3`;FwPrr7*@#x)VxW}YX+*wkg*eW z-nPt<9W8V|2o@zCxA|sROn9 zEIGc1)u>%Z{@wIh*!SnfS`B$+yi~5>^0jz+_K#UnE`8Fc3wkg_VgA?7nK{kaWq>U! z3DZdKQP^eGN2qx&dc>=x3kn7khhs%&Xk1>r^bPZ~?;LB?J7N1_|T|j#p zYrflHyW-*aUksTz(776?r`T;zFXIC&{8!$gV8RhwphrvpGS(}bu5*K&Vkf_H zP<-GT>4A^cXG`>XEFmn0szy-qs(J#fUso?iVd4rcT}&HnQP~(qjpt)oceMi0&r7#< zRK>WGx7#>I+7GPet~~8D91i`FPj=vOw;wjLQ`9JS&QmA!_p9`z{N)NgB(5%u4bQF# zD1SN{NEnRBL?o1~3WvinZ((aVilPJ}0!q7+GLBn^|MyW4z3?1Rk>aCD)QV7pvw9o^ z9ezHb2QQt`%Fsu_ioX-{N1W9YyF^86fZb7MRIeJ!62z2wMUEoK>|NF8vB}XD1^mb)_ncBI}L~taYwKUXW%ODtpDJu$YyogtwA8EgsB<~WFhNpwmNKqz71iV6L`0FA09=~1 zzQMFd**C}_(!2@*NcA{IHUfD%C~Z(u(4SKl4h4%(xtVJeNY~Bae{p*vDx$%Cc||z+ z`M=s}0Ky#+)a6x!lt-hk0)zGA$sLcp7wka_zh`K1Xu0f~JP{=gKfg=c3Yk?O#UUtx=t6pz*Th1)_Exeg zBUTO4VF(oM*EaVEhJ#%9_gKG>e@koVoD)ul>V z1hg3P*(pvfpaxmjObjDfL(viCW53UvuTo945JK7<2yJkU0}dOuYH(*+4!|9lS9pwz z+q4+s2-LmT^af(NAP65Wh2sE7F%vd(y#weva@Nc^W9U59q^e#tnQI?6X@|N+F35VU zfU6qNDw+s%axSDjXc~eu4)!OOTO(Sb^#iU_)%AH#u{}8 zXc21L8%bkLue;qk>Y{Y41awsKloi$2dejwGtx$5nyaJ5wf$+=?IMQ9084%zf3PGc} zL6Z|lT|6C>BZ!uuz;4woQ74HVtRxvUCQ-9cUX*alY`v)}L!(~^97=6n0I3W zu?;Ljko$Vi6rf*b)2-={+SPVu+Gi4@AHwja#KrK(F(Ob;`v)b&KV-(xwQ;V=hnkQ# z4d{12Od3eqj3Fd`WmRJY@yL?6?AD~B)ijVy0Vna9N7~MCU9qekKVgv~R3Rg6@gqr< zv<6@}C_4lK9RpXP+3WKbZke&+NIqocnA30@Sl8Ns0(_1nIYRALZ^)Y27#Ji~1CGw1 z-_BIO34;e`9^+-6PH4|}Se;EIO=*A#wVkO{?;Xim1Y2zD+U|VAd212!&5TsQa#q*y z++@0xW;AS*zhG5ia%w-fQMd@(ZQXkFZrb)qgPU`c_FB5iHgsbFe(I>9d9f0rdh*n@ z{Io@?$Vuk_=^S!GbHPKBndMiM)(m4FIi+7k;1_e|oLtG2DkO|mZ^M|RYtx%DiT1Tn z+eY>%)|xM|ze47e1Xjal*FdJ2<j{Z8l}riHrwA!>oqG?pm0h2w+eroyTi z1RNxYf3*3ON=lQ93R{3`6ise!)_=tAJWX!|wF4jpku+ukN(LQMRY&&)teM@S7wCH_ zn<7`xUeqIHe?nU^(bw5jM_|FUN@%R1r(|UW!goz)&>l}M;xHv!6Y{lfhOf_JETfOX zXpGG&Q$CFk=cjF`P@KdFG@srOX;4Y!3&xMWQTD$a7v|*R+$jm9E3A%OD9GSOVK1)f5gCdNX(_XLRl&;!N_g2FU z*8-bkm9kXU1~X2%F${rlUB60>bdCsY4hKFH;#1<=NTmG$0V0{LkhwO2NVnIwxcfYf%-`K^lsHB{R% zor4i7a`qgIL4mM&2nHUI=dij?WPt53wi@q|O{OG?TKZNcI|-%buov(<+Sm7H9kEjI zA8c!XlFQq1kU#NWR{37u^A@Gr;0LNcg-MU*jBv;A>D&_3W^xfO0ggu`WUh9w`ygGy zAa)+AWK?P5<3H3s9pEoWk$sp-LjrDsUtB4@v8G6#a(?*iha9_aasHR`x!>1us^jlP zaLKWmh`{!+Yc-JTN+MpHQKK4>Y&)QZ*qJlvEOvb7eT#r(2PNc=1RV%jox*}-w>?hz z$@O+Rd%V`TE+ZdLj^!G5R^LS{oI<5@SPk&}dEs)EY00D)w5!9~M}LcVbz6&bQYmde z>{F~47+@O*QLRqhj{|WkNM*2>$SUF!*{h&(X&-`9!z5`T)ZTzq;(Vv26t^KlMa}^c zCie)*yP6TbHlvc!V*A12%*sH$0=Fw=5-E0Hm^#*sv?A;on~0tNaJqiAZZ%)+o6$r+ zj}>WqQv>CTa9?jb>Dg6)Yr3$Q~OyG=);q9fcS0jbC(C0DW_IY6-mn8`L^ z=n6qN54A?laDE3<2yYo(GU=k;{g#Y2)KwfU(^KH^#{|l!QVNAT%bXjw z%`_7juk!scNOCB6*Ot=P#5n*FLVJJ_Bk}4Rk;s3ei@_zJ& z;_@W$Vxf*ght&i;sS6iSo5O*f&O%- zb_RLN*FsccJFDE7Oe<9P7UT&WX|TuRSyUsLODi0wE^Z8QgRjkH)zVSWo>;g!4U>;M z&w^u8gMNi3a^j^_L(*%7oqHX2XWzEd$(RWBi#Y_1i?hLwklnaAo4^6X#->;09a?AC zvo|L5Y&DrcRsLbXbKnn@Cp*gfge;^>{A-U?B4F41K56;y^06&@fpx;=SL4ucx z>^oi@zqSoHV;DmfL1#4n_ZU=Fy{Cv&Hzaqs(-Hf&toMOq^Gj`=Ka=kE%SV#KG0m%5 zpHMSn`0xX1o*$$=C^Eok`zN1qr;zpf|CeQS3Qe?@YFTz_^1JFe%c)y-$)bRZc;j^k@3t*9mDvgaX= zNRw#yT$z(z3c3@+id*j;K@tq?@hQ6Y>+7di;(Rg3GzVgt4zYv5biAEzECSA{a)Yy^ zb0E7zuBOsmcPIxZS@E?)J+dRaGYrPnXE9u5_5BH%Mp8T9wypO%J zj|eE@uRoN})}L#bU57c0G%+-IgRDeF zwtQ-Dn4;lxQ?)wlYg8NPa`-aq#5UB-LR1(X{;J0_JgJ6jAEauulgi_qyuSA1tZWVd zk}Xbe{d$N2NpaNDV6rJ6o4~^Gncevf*E`(f;`};<6OrPU6S+!KZ$%*YE{8*d1N+2Q zrD=aEi*+7yK4~6goz@@ZUG}ATr_`uN!`f7_50WGLDs7VB#w%vrqtJ+JlIX@P%LUgy zjgddGb($`K%bfXd%x4?=?Zvs#oNPA+jt0vLxc-Q=fjGr-vNgj&M8#}zbNN$l@hL9S zHo&r-Z)g!H5{~8=VrREm#y@GHbYg!v*6^0(!DRMeKPIc~L;h5Rj3Lt>w7u{;z|lem zfIoTr@uy^~hJ1FByi}-+MjZ7vv)^=B&KYtq4S=T9LRHR+6h&@N=&mCvHYW5u5j zD@6od7dK|aJY>75X6JVm(l5!g=t;OUpT1AC=^?6q##d?9MZy(`)Of=GLEK+r%A%>U zTyjrABU^HqSupM9PT)AaC3>91c`%h?wk6+<@_?)o`-x&GWe2#qET1ba=B$}Juo4g6kh2#f<-Wh%9Dax;X(Bu@gj0o>Snh$QtV3H%k98+=IXAohv}Y{6^r@99 zO%1CL?qLwIdYN4W5^PDf+vd~=)YTQ?gb}tAx>DX7S3<>wv<2Q5)EX1hNL0dlc1v~< zg8;Q%;BO zrrowtuF3fPQM5S5mgF-|nzE3^1^7Zi^TN~y7!d$6id`)0P=F89057ctg&hV%kxnkk z*S?YRJdur$UJz(^?p!`E| z0DtuW{bjxnyQmhjM}pFf1g-W6_e+faC7<96%p6|5(M{Knigb?FIr+UzE`f=iAjwKi zi5==fhJW3IrV=`4Wn}iueepvsdiyLfa`B$&q$oA_CGg{N1)3bt3Y7MgTXG2gUC(&e zcuwSVXpqMv^5OJR{Yz_R_vm34uJtpbET_9NqQ!+=$Wgj@!oFLz;~CimqMAGM`P9Wy zgp)!B5pTXJMX6arD2o>1zG1@IHTAUKMNu;kN|Bap2WKGKg^_73h_>dZ6WG;?CzF6q ze$JwVd$c=OF@bmG<5mZphbYu1Cdoo-WW`!p_%B)cj*WOOA)j%6FZ3+p2a`BVir}9n zf+rd)%56B94X665k7w!j9w6t+cJT4kl>{>J19Zl8%pQ z1Bzh15~ZTmjR|P;!5I}YzjN~&vZ55~B}cICLzFpxpT&AQn8Z|a4*5cbw`7`|x-}k5 zqQDgN#6&3?$f1c8m9H!Lql{3BXdvKxi<+uAfjnXC{iIS=U1C@HL&nu*s;c&WlAB8r z%lHLOMA}BPBJ1J@6Ida`!Du^A%hY^(LRr+6$gJA(rCZBrk8o~UH>ATfT-RUz=#xY8 zio}LJy^o5)A=9#4{(w4K-Y7A97N}z%@vfsAibwOw)5*>6I5?I~au_lzS1#^j73JXb zM*K!01Z17RIYMm+^x}pwV9?lQRGlkmfPrDD!w_4%a6&#uXCcwN0Nod~lHCXQ!zs9ia%(DG3d^ zzl2#^wLZSai3d$uj{}ut8AjY9T|zk~viq>ygePM8*48AjsL=2WbARj@caKhSN=918 z5~_uak!4l!4KO*Tya-V^qPDQx;YY<1oSIeVL}xePFUSY(mUYe?XzPe<0O-rM6i01w zb)3oosX5y=5>T}zLsu0_jjMA@g)i#X)*em;d%PDRM9M%o@0RrSLh)$*R*FhlI(eFi z6cu&x^``eI-q(ma9Oygr(K+;=t87V1&~vb@stz3j(q-0ALuKK{KsDJTAA`#t30BQZ zL$@p+(~S=wmM1CZSTp)E6=DfHViN(YAJEx#uqgkB$do)z3dc-vJ z13He9__`?z%{UT@95HyK1ISl!$kirC%|r%+m&t9~PqNOoZqHHKJk}8>H59OPP88x? zXbr9DKn@my`h?7_X-UvA3_5?O0L2RPZfON*105M;Y8=a)zJ9g@Qhpe0GI)xN5WC8n zn;Pqvh`j)OG`%>7@REG3m7RswU_NuHT~9JA4a;#wZt-4}( zbJ+4NnwY5L1Us%YrzSE@b^YC>4nSzVj%!n8L%-@MW!>S4lQn3Y$vN?HGS_;O5F}*g z2!_Ev3qJG)U0A&P$C){t3nUayrLd0te`bQI-Y8SiVjnk6>fw^rJdl)>XLv;a_ldiK86mE+@QT%eXavy5RuI-PtYtQ7| zK9dxyawz2o{r1_s>n1OSXB7lInO90yoiYQ@WmCa1^$ zzts(xVa$S;jEm(}^Qi^AR&l>8hV3a32o2II=n~_wC zzGn5<(*P7F*--NU$=3>B7~nEC%ojLaS!Mo{we*vOEpwI^jP+bXS3QuU$vBG}T; zv)nie_`G|1>Lac1g{1%$ba@2^9Pfw^%6Hig%Xl^j2}{8KS7Ee98L~g9>Oy6`=+T}? zG$-~t$h{yMh%ZJ7NL}AeIUWlGYVh3 zMR)ggqWHF2+5Ei!{)R^R+5{X8RPmuPw$c9cjEk; z^+%=T`gEm0u$^TXsv_36M!-tBZ-1J~Q?XmL9{A#(QQNJ-7roLuy$pl zuG`hBI*P(4nM6#ef2l7?o<*IQG}9+!oqzT$l(;@bOpOWa))uLwf|g#wKeV@2z6Jj+(ZMR{XkEgB3a%;hV^&Y z-iNgw2HP2zo+r8@p%H3IkA74U-P&EFwvf!P5gWlG3-wV7Ecjqg`#Ixe75syKYoIVm zRJ}OAc$w>}<(fj;wsqphckvU(0VIc`*OWHU10RsK!3=f}pO)TdB%;NdkG&x*vmIaQ8@y6g5h`2el_EmK0>$PvOKCD0uw@BG) zG;JmE{?cl%av>6(k7*-zvgM{ej=<7w-7$%^0prFDd~Hx9e)E%LJOxeMKL{i_B=7so z7d_Z}td;RwsS-+-7P4MXIrVg<_=cMx9$C@G7GU z<&He=_E4cCOdoR0sYhG4N)3=M&6OYBjDf?+K}YVY4+1a*E=%i`5@BElP>)d1cou;o zJ+|^dK%<>!jM`O@58xev7Rb7TqqodtTPozQtKe*Is$bl zHrh)!x^hs{qXsIY>-dp6HBCiqY4XR+G+64&{AL{FuJ-Y>$_bH6lZj1Mi2dq^NTHt| z0yDghK+C*T1Rr~A)|@ISl|6G?GD5`ah15WV$|mleM=bE4qSzFt=6fhbGyf>48s?;W zHY0YElhM~UQ$c58vs=X&N;0~AHkUK1u~hSmbY_7QlFFeV4fsnP(X~2jjCw?>wMk;I z<)&@R3brIAN^Mm>N2yZnL8&!ppRQjLE+~V&NNy7wc+JnykJ)}>Ij#aOVzWE8EXDhRjW0Rsghf>apVCJ(Ana%py6e-7zmZ&^Ve;XZM}&U zSYUu_g0eD>DP8(h23SnFJ;)?)gSd(=RaOq8;?=H{&VG_(s@q7BfU*vuX{W{E9Be&R z*0xE&xZVw!+|oCP((A%$as&;#PLj4Q5HeJbPitlcA+fA!P<{=QEiR)6w16OB58k27Ya6PhBGA&A z(vd8ZA-|W})x#Km*sjuQn8^jy?d{(2=%qO-h39-H2bK>^NNb&;OXb&MPa=J+fk4Zi zt`jmWr$#8?{841O8mcHjhmDQ>s6H~_Pg@$8V^5$@4Cio;QCDw04!F`kuM#*J91NQ2OwZB}yi05Nl zZAWnD{H+z*aF47nwM(D$1aD#`B<>x+imU#SljC)mSUp54>%_p)xA2-pN;KtNL*x z4g-FRAhY{OZnCGel|f%no6hh;t7f+LOVrVuFLhJvK5Si=s3S2$*(UGJlWJCcw}xp6 zB+qc#&&zRG?GKaoiLa%%+mx63lI6$c5wokot1y1V56@>Y`rh zNBxXAO+h+Yg1Mt{!Pn$a#+i9t2lgXlc)5urj3kz3Ez*&v-Sr(Rd&cYG|9=3s7s#v( zdMxmQ`f+;4h~@n4Rt~Wr1LcDeJ(_5i91$%8fK5Cw^OAoXfGJ$) zW{E|ts|sQ@U56pAmk-rDGU3`~=SoEJiR^ellWcbK=mz*)FYy?&5d@d*;hFE@J7F0B z^wvf^KYCg}siFZ_eygJ(R$IID&RpY@v9cMqFUmarR*31rNqFfWJt^9eGZ{Uu>G)_uWxiEdMQ+)Ebm*>1;`Gdf#QX@dV{Z+>)^QmFV7{Ggd+vg7#z9 z2My{fQTD(juxI@vJB}Bx;gTb$9Gx|dFbUZ9&}=~jd7^$=*Q3DK;b7% zYSfNIlHV<6f-Dql!ohmE%N@-N;P+^H!h_b@MAZwattZ9ALJZ1+^I1k#g#^!QJ>``` z8?ao&SqTU+)S9In^1ZYz=f&rW=BFyaig!KS&obN6-mn<=UCXX*mRU3D{)xUcaYbRTlF z(5@e>Z6)D^kEo3r92{RJ+ntR(j#s&_2-2h*5<1okS-PQYRDvk$alio19#^ce4x%Bl zC~|3z)J?)IdrtICmUsX&uxb|2b!AJVP6!@Pkp@wBO{F`=>a7GV8RtQ=NmWex6t>{Y zT|(m&p+#DwF1rTpfT2KJgip!yX)Ubi;WVAFnwB>3vX_jf%~6;6(x`?`x94hE$eKUCfs#tI2RZ4EmM^6P> zBKINZhBhO}HgGguMdV&U(;!;MPHl5^&T*3o;E~=dB~-j4izx=lCfASBeu*!~TjPuV zw>ALB$&GIK-f^ieP}i5*2F4e6@Aa6|uYO_I64EyQVGY`uACna>ML=tDt!ITQ9g7pr#|r0lmLxI`FUnS^*3{+Foi+|644t%_6|X zLNguf%B3bwmyhHB(RAK{P1WlgPf81&Z`0E@EgjHc3oUIA$!T)Z6dFi@0%eNKGRvM- z3RY1;%208DC<=mzbt6**aUs@?+p97hNU!2v*LBsa*Wc%j_var7C&|glcf8+sJn!># zpR*%i{HC&f-nc_Ff#KEPGh0Hb!i6G#wsX_CdVDGBI(?fwpUh2%?@*u;Ls zmJ?!XarN-)o5QS(x1jU4YSYOQ=-$6~j4r3AMou(&=}#XM=O^|?24y_8vk9^uT}oI> zt0wj*r>^9aAETCwznNhzcIj&Tb|PzpPrfm}@w+rk0ksae_Q$k7N`IH`1Mfh2yPF;+ zEnTfg>IhpLK%?10+i41&5OUVWcQU$G%BcYvAV(>uHbd=7g1nSQzAuI~ttyZkshg6- zmwVw_x1N;nE|R)EfB*;N`zb5m%9SkT7P*+YwPm|y#v?-(BY)({*<=^D(=G~*WsO#6 zkA(cALgpliE3%>k%T~_@n9+KB$vw)zv5k}BBmq|mfVd?`N;oWi9o0fTQ6|$9jq8i; zCr6UpYU?PU!5!i*nh7L}LkCMs7Xm0IpIio+gmr%|qXa3oFXZ`C1!GrECOg1!wMHhK zCsXL84Ve1}U>=P(bF}ey^lU7W{YsXGS@*$k04mtR(Y?l#-@<(|0AiDSvMGFnjUgR2$zC`*yw{1*=ExX6h3WaLkKJvG{(kx#-x?rCF`a-m z25?`d=Yo7k&{z_nAH&;pMK#rjsB>#hk*o7bRq~jQiZ9MaRWO==vWc!ZICu90z5s?4 zplT;>%W*cfJAd53M7JcES!rS1vX>{wy(2jO+|vuEtmRFV0(_D>g)h8f0*!>$b5c~$cq!ZX)eTA`SfL6w+=~*C#Ev5+0#MRg z5DOHKb8TQr!y#*SnMQ5jrWX>W6HAeIC1rgcM>u&IW#+7$7`JV~IA;Oj1i(7>lgy=t z1P^*GNlKp_7_4;EpY_0BhIG!0WQV7NT$YDhlF&)r5ma#faLno5zqy=Serg69jaffBjui>8q4Cy{qW-NwogkF)g zb<~t9TizE>z~S$i>vsfdZZ_qC8FE9hI@zU!=y6yLst6=R<(@2=lhCx9q8%BA%aAq! za7@kep;)XoZn0JzPA`z$5ws+*-uZ3oP@*?(g8_J|`BBH&nbsh34szu}{#b{!ZV(I^ z3yzv1OWXYhvhq4w7}*;Vk}Jtv%dapp+qSv6m#%G2{VnrkD{Tfu7*tWNbg0Nuz(`Rp z=tZd}y$hJ%P311Ueh%H2$czCbrEtJP9<8c}uVn#IG;c`6({~rm!C$D5Ufrs4}c7ET(3GTkZWs_j6Uw`EZV z0(cw(O?x~NN$0_qRnalxwOk_^2wCWs^pSX8EQSm(XD=K0Oe4Ber<1{D`^~o_I`|wH ziqMw5i*N^{Wvy(g`Sg82paF#_>Blu4bflLl{^hQ0i5b&eK2Va1jrlXx*gcc1Ghucx z3aX@UK+LXoMw%WGZs?Q}sc2fS=IB4W_C>t{1mqW9tG)wgEx(cSP;jIojpd%nD|+by z3P?t?(S0fjf2RD$EH0@>Ny4*%Asujm`JEpg0ge}x)O^DgMqkl>BPR_DrY3DaWo&}Owf+04u`qmE8B{cC4BJT*GV3I6aRz03? zmXG3Dg6)lfn}7=jF4TZ~K&Dh7_ic-Jp>;f)6)8k>>$RZ#@CA)Gpv@^Wmw-j}`iy5A zn))O8H(4gm*P_`c^PARpGOk$&&z<_BWqmnX_=?ZVRbEeP)>OkM-(2DaFL2Ug_3l16xVS<5j9GZ2F^o7m48PDkB^j7{j?nM z{Q{h7mM-!K0Zr8QZj#I>9Y4f^`m6?d-ae_iE<*Bbd65A1;q!x8esbUqqZ#A;Drth+N2Sg#eJD zqx)4pL|?+%-;H2Z8kai)t?T*e-z;uIWg|c#TW*0rd^kSXY7HmU{=c$P_Tw!1TCD1m z`jzWzC7xDq4ytE+X@J24RmR6tkQINeTshrgXO64?AXcu_JmLtywKYwRO3>(=B7bQJ z9JxqEI7%I|H-f$zGAUl^R-t7g9d#Obkq>6S2V~&InR{xVg!07n{KZA$ki4b5O)bx& zCK9@cR^$TS@2mAA`3o^Q@|_KZ%nb%TK1?EIUReg`812z;r%>3Hn23~4gTRCkYDroC zNhV(PTv4i@EZwq|vwe>P%`GaHa&VxW?A;7n^Q%f=R>GR$(9a zGlIA>WHm3Et7+PuS6F8|={3Sa7R>@_0u^6rjX>+x(fSbXO5+$8E-tBoNHl+Sl7J;B zd;1cFwY9H!FH8ntNrgOJj!_<3(fk^W#rR;m=U_56EMO0On^v=%1OWB7vSuw0?eS>F zVYh=O1;GE)bFwdNo64A+c?b$? z4(G0Ve!B7Cbmsr#!4#u`YI2Y(0GniV{xj6T-Pt)i^?Wa&nlqYM3Nt1o}5GO7w3qL%uHZ|F2NUDL(*&F z)w&En8%i++cxail&O#Ov`{nR9^pwCL4i|e~GJBX@ZY2~gQnHwcA*qut9p7yC;<5bJ z!WE5ACbc*4x4|IBDL7d3%JmKbIfge+*GJH5&IPeR;$~R;W6a7E3n94#OvO81S2e1! z(}?M;!yVOj4a-u;7!`6`rpz{*-FhRRboV&?IX_>DqU>0Qyq!lK1OwrOE5=SQ&;~5^iRPy`| z@5(=?B-1lx$tCGB%2d+BGqGfDXZJl9M_=h)xJLrgc5|2cETc znZw_7xT6&JmQNR{s6xp8{YuVBo_&KzQoNMqne~cca{&Y4j{j*Pn(x_pK@6EqDENU0 zP4c$LFz{yo^6N)bPmzNXzYhRQ8F1%LAyZI@V8fM5S)GNVui zh6rSKfQ#i9+d5Vr-rqsa43I7%p7hNX z%$=zRG+n*my4MdtjaOr+dsc9b3A8S|BL4)=vwY!q1=%ZJNj?v@Id!kDP{zX*fCzl{ zH!l5};9zkL({qPZq4oS|J?>ty8SU@MW|dg}xzyto^hFr&n4!V^+J5G~7=FF67hl&K zGE%N@+-?|8mCJJA=KR=8z18KqR9!=5WMg);JEOv@sVtHNY=o3lxev-ZPV}S0*e!g~ zCnd6KhRhqp*Egyq)g>{dR$iOPFKrx32M0Tb2+NWW79t@DM3gqL!tPHJSTSqu*K5M4 zp9}e$+IKJ>EQ{O0KKaBdFgwJC-_dgpUZ=0=RRO4PLptrOS?Q35!P0Z4RCdQUcx!Zz z*a;FhTegCZx0@D@lE;&cJF;ZU^}N2Kx{lW`=r3aoLB zXuJk!saOL?m$ZaeIUyD1RtdGlPc&6DHD}8LmGVG&m5MPT((k=VW*D>3Tas6@$)u9a z1C#KsdTaz_GmOAc&zT()bc};?%lY!w6a_s@@85VLI*a?0GAOlT>m@0Xn35>rU#hsU z{|eI7HESCWC$QY*CLgFi5?bMCF2~=<7KK!7EHA+S0 zF9p3}wWYDfG^>^Y~_=sA*Uu-p97PzLrAibG951Z4b7xkI@q z-@n@0=I4^}Ws|@%1`U>2hx7zBuDPD@i(9Poft7{r;fA6mT2Uk8!bzxLY(Qar|=m z7&gjL>c&Qc91gPCw67R*lAA8Z6odcq%SSiJp+Y`3J(@eQjmpGmumml>ZB->>*E#59 zakf0wlRTK-oX!12GIA6czA$Xi^wz0i$uJ%ExDT(wzUgAWpc}aqN}n_=JXfJ38!|S- zfNt!XY=1kNw@1CyF|vCAg&#(aQW{l`hD7<-74U}R;8a*|K`Z*Le@A1ezh=^pNm{zFdCnsF zY9vo^wls3WrpCR`x$X?9Kg;Ovvfj?e;Q}g%fue6Xa*h3Bh7Q#m^-@x!q{zRytJg4l zI6ZzzOCqx*UB^Z%3hb~&BPmjeiXk+?J$heng%K>Tr$z;cEkB?uYEzx0mr+^<0nrZaGeMTr+8GLV1OfO?JC#No3y6qDYQ-RJSu zH#bsc3S5S?>Q!Vc#Gt#B{m|45j1pUK4C=!pPzMd#Pb6{%8;$8Qf0aBRz%#ibpPvvZ zm*JC*d289-QRu6@m?^(rD|bVRqKYh9>lz)Tw7A$A)u*eA?}xU12U7Vlj~BbQymu)9p@WGLRXNb#r7w ze@C$Kf-bWC0yZD0JsHr;+Ek|N?_~u-HCB-PQR(=N#o!$HO@Bmy@7mHn+lr)NNyz0< zrI3b%hQs`n&r|A%#G5WorqBfNEE{YO#^wn~(!9nNESYC5v#v|~d`Hl@=~j9562*`9 znn49YwnGKD8SBr4Zx)#`M0PjeLYuvl{x{)AhHK_%#pTwc3CxwT>{6wE8jvCD2K;@( z8r>$U9_|V~JBMs-jM3!uC-dcs76#*%Vdfusx*`wEKuw3h-L{%{+OpMB7O*eVl`Jo& zo4Ql?<;fv1EnbuntRo5k+pOOP9X@0AYKF3Ravk-C24Sv!vS_JwLvbzaOZUs(tCf(g zIG2o-0ibAfSnlt`+q1Un@*P{C3foWLD%YH6ZZ*OuoRUu$G~W6%q-HAYW+Y(G&zIFI zmV9o5wIrYev=G+5)>XQ$MmCL)k?;s0VJBsx$F>I5j8{x4^pdwT-!Y-fdKASJ~b4_3Gn- zi-3-MsN756l(opkC1ZJSP#1m%GT-S(JCm9 z)T@w!JDPI+0R7pNzqvGd5Ji4%{|A9aZ`a?3zaW=07=N?dm_{7EMXqE>lAuxRk&F&% zfOOApM>dsEI(Cqoyp?)j&>|nR%F$2{iD9Kw#1Z=58cHK?p64R>qs2`U$tJM!k+#K>+hCVo7)xMN{?gO$*q~9)d6JI9{sm0am zu}S`zp&*^+r1`p0fI>VoMosklk*2>i+_UAj3?;&o8S`bak}m*9tXV?8sDv7bGfqM#apWYPsY^9dDQHS z&NgjJm){h~zu6_%-byP~V_|-)ui-+Y#%TH^+1RmN&LQaFx!M|CPy>1q-M^(g>5efn zbYUZ!$3-T~^h> zj|PK2s-W&-&PdXPIlv3Dd!2@0Q*$pN_sTrd5q!8pTmS$%GMh>QkYF}+ezb8% zW-BNCQyFr_U7+>4WXbO7mT~?!IT@Vo|^YDeyVS|*F{PeY)+L{!?87M_=-(S6L|4T z4=q8STnTJksdCRY^PqZb^7iVexa#3eeD$>n)e{&jXym;-7ybn3M{8>)mt3&n;pNO6 zA$1|35DBG-9_K7E>ouK7VvbaEseCj<-tF7y?I=s=VS&U(Zb2(K)Z`M`y;hQM1}4VO zv(9SsA1n8TW>QEjDR)}aFFA5+hKpgu%$*xXZojm@R?_}Jlmb=7fyx+zET{H>DVe3O z6#M9xHTPL|64{hwIxGB=J6;B4+5OcR!vHS6y;6O?QUZ~Y0ewe}vXuI`!`}jbu%c&P zm;{o_Xs+kG7N)Bq-Z%n_^yqdMCY?6yUvh}2jdqdyT4dn{lkcSs{O940a#>MFwWPvo zohIuvEgUlDEnHb2gIplew953qf^D zoYXWE=bVmUmpSRXC`4viC9x-xn43ALP_Z3k^*W>k>N(Ek$qb%3a z0MpnAN-f~w)UsZ1b1RLHCoPaAO2$5CaN{+x{6A-_e0i~aeLh*CbeI0v@5b;rJ16Oy zD!GiXMYDW=-5C$nhCpy}rl@Cm)I%rytlj1uYhK_8V}x(-?4phgUa?o9`SHVYXHxj+ z68+JqcSr^7687yAwf6l>u3SDfSFV%!zWX^=|cA1e`{s#BKz4bdVvu|OLGf5 zs$jcyajv@Emv@!_Oy|Pr$qdF7Ejm7QPsQUj0k!XC1+||`4{DH9=Qpz0k z)a1z&$-X)2RJE8K?2PoX6*4d_nxxTc#*B?(?#H85N_j|UNVdsC$j14ktQ#>-G~>$9 zdq#uV@Jr-k>je$r<)iB~@cC`3^j&6MuZOwuc#7P5sa(Fso|#ZvA8QOpp@@)AUaD*) z)o-=b%a<3*`t{UmH^MX|*AJCH*3_Q5x9YJZ`Mryrxn7f@*OoS2RU-Xu9?O$0^AH;} zQ#B7JNeAIK!Lm#*v0m>|(?aprxC#YfX7xv?fL72%BcWuubvYL4x;pFqj#{Uj*j>p< z{Ni5-u%qYZbmIwaMq9MieaUUI_dbGK99cANAY8D_(;aHB>d0SY?VXD7`{-KB>_BQq z=_#M581^^*5q6g=+9s$UJi&=d$i|~!RrE-DwkoF48iU#^#xx=l8fty-a zb>!&E=6nWL1$)XC-uz_}IXsX%w2G-6`F@fNUT)1W)m(Y<<(uAeS8vJCtU=V0T(h4a zz3x^yzqe&*!9kNEN!Kf0@H0dpyiKKrM)Mu=<90w-9G*>+2dR0!@M4@5%edz1rgV|o zzV zOSFjS4>t6qOb0qPQgs>j z&f!HRu=-|czs=kv1Ws&I=`}+BS+06D6;W5The}Eo6zI^tQpGvW#6_E3JX5s>JaLUZ z!;A*|sb4LCiJ_Z#q`H5cL z<&TvdHK^F|ravM@6-^(+8j}?pbmktuc~sc!>%tPY9%SAR zZjiae3XKnSaFHHmn;#^PCox6lY|)BvpfR{l_6Oyk` zcIG!jTML7Wx6+6uH*4Q>7f=%2Uz_=jmrPRgy=qN$8AvM#Y1FnGOXc~;FoVEBVIi)N zPJ89cRC)7?XxF{NZv-`4@KrPBe*9JH%@e=^&6Hln+;4%GqKU?QB!c1X*%!Nj9Z;V5Z110mz(3BN)!x}=x83Jv96L^Ry!p4g%Z)>u zcib+$m+*Uw?w9Rk%d9K4i`Zeid#sTw@26JU1gh@(VKRIG>mG@mP;->~QArPpMt-el zAq<_uhSjnZo&UFMt-3jH};%j;v6ry>7WgTh$Xx42azFnDCqVd z4J=apu)6BmvC?~}9UiU0&e0`uqE?22G=S?-qw|-x^WJmA1lB9oMb^ry=C1u{m-?8hl| zxlQ|O8j_h_nDcLI{<)g57_^-#$yFsyx4S*7<6wv{8f|#77phQA?-bggDRUS=>l&_Z@^_Tp z7s*o-fN4-3oCi!ee9R?J-sDm~RJRk*E3oqErA&YS<#MQpF?t0=ajKi4bK8wjZ9;|w^)w30k*9lyTS=M)qo-Kb&B^PqT4Y1@W*#5aA zbN|66 zE>mDtthZclnIRXKv~`ksPe|V*gt5@z#~QH@N#g|G^7H}YnI|MPnxFOSBsN6JTDY=K z+|MgN50;PiN$6JoT6hJMxW1_RgmP@T|9OC8fJ|iYfU(f9Z|D`*&6vKQs}j3gV&|zh zu|D4FRV+h#n*TiD-gRF4SzvjNARPu$TwyjG;8CXSlRJQr2P(~)blEm&;3<(y8T_q= z-1r2m=HB%r54^P!GW zjk5e_G!p!?koDEM%FfOVkKffYK~JY&`!WF!)R>byhU53kYb#jFF@uf%TM?R+)Nbyr z>0<9PUVotgh$?tes_b%be)UPE`BEcz?~B~pQE^g#$^i^S|@eeJ9wodx+@DJWk}MwMm)pz=WpR?Jk<*TlyZp6# zVf}19Eg`laZk&u<*08Siao$*S#Ko_n%sBXYadhJWFrT@Zyf8aO#xIl~E^)wWlxFxF zz)tQPBcC5)^uN4-CAg+g%V__~WHo$#NG=^FEw9MXI{;MCaXY{o$ZUC@cZ7O6Uum1- zqLG4gbLD;Zl#aE%Iz+oc|NS%%KW4RkPkz<#=VjF_nQ|i+3bL?bO<8Qq(JP>eg2%v; z!Fd!BEI=+R_Z01$k8m_CG4jxG+3e$|T-ymcvwaX*2aOXi7yTh`t!9Y6BqaRjvuse(d!F|(t-=HU$;5YgZb?Bvi-6U2!^I&PAxhggCr@887 z#E5?eh za@5^^R$cnaHdV{>TD_Et<+|lgNMZ>%0`gm%>_=+dC)bcww&|t|NU<%89#L@q@w|q~ zij+Tdjm(%!7*?B(AXX3@vi{Is@$m6M%DBmRqne<@Oi4iEvU{7p)L1Rgqtyutv7u4E zGaMD>qa(QQcZ2xW0G*b0%TzgXSjzyi<&fp?>GZ6-M!tdm0wM7vdD2CG)$u)#{O<79I^|?F&+Ch#f@vj zM9TI`#{FOL61H>_*A}1~?J4ksY2^6`n0ZLfRQ1*=pFfU843>k29*4cRi9)YkpuCgr z#}gI5JamW9aq{)%I1lYQ6%*vHqpX{oypZ(*CkH8A6)4p%uDgy(FTZ=mGwL3`_n>rG zOEnAEIW{yfhQ?;!-yeIbNs%E>ZPr9#XvLxlAoWHmoH~+TvX+-+h+HCJP}I5 zYm5QO#y_3|4QPB=BD-ff?4y&TrmyoBKJ;<9oO8*qI|yWkD!Yi(smZ8B8UmfgE#}7w z4%<0AGCn6Y+5MMi;BMdmHql1V|2+6m>6fo0fPU#VkUy?y0B>L$ug=RZ3rQM-HW#wA132W zW*!66?RefeK$|&zqxOQ$+-pq+rdAsp7P*|~k4W7}Kd!IgJvHjtcgi{Nr}csBAdBRo zeDWcuo-|-sWoCtJwc8$seGdIQ%P!g{zpt0yk745F`R1CFYmK=%4ezyIVeEbp@34OP zO5LAygYq?-slrIl9wWM59(KMYQ|jtZ&yk%yjL4CkJufb}ZJaXgTK66_9(e(#)$i|c zct>2`H;klJa(w;cJ;Mv6acv<=Q{k4bD;^3jlsUh+!(XPznFo*Wke~WkR*%}vDYD=t z*)>OY^wyf$<`lwkmj4y^v_EXs7a`yA%2C<7R(5rzSyld21|WYYPS}_CM&4_Eg&+2{ z$dr-52SPFq8Eb2s!4OTP+}_X|;>w(Q%|-7aa)A2G_%*P9W6sw7#!$ z-5Ea3NN-jd9Jtc3s>*6Lu^X%I5HGbRK)4|vCCL44^vQ5Bfs5`d+ThjPi9uY^mrO@h zpQPu{%H6t}4)0-?wgH8#SxjS`JeX%J8E-u`I=q;@V@lf*wG4k9!;Cd87I`1xn^4>1 za#6ra?i9W$NeZQ<{L*^PI+qAT?|7*bW08QX zwFAcD337Kx`TLY^bCHlg1BD`=4%4w~$>Vsm>4+-TP%5>z+80f5Q3SRE zZHIEY9A!VxN!Bkrn;?^BSPwd?eteQ^pp#+><<9X;Mv4|y9ts-$P&I?J@I85Y8B?FT zT|Ss+mBqkVXDxkFp1Miie^py`rY$rFVI{3dY6K!IvR(g7ggVD(ev?`gNu?Ma*|3aTUkOZ<8a7t+#g8Jd-LFLs*Y~P#^S`_B=mV2gs3%2~9g8gSW}7hjb-p z#G5~b>Yh6SBPJWjFUN0_u8*9aDi1xOMylW`tnk+Nq?RIrJX@({w$anTu*>c9dTx17 zlCGnYVSN6UeQH*C4JzQ0u6s0QPBPuzw9^d^PwYU)CzM8TC`j{ix#tdYner3ScX>%W zPyRKW(y-l(FczOOA6;0p+8J4^3HF6(p(d!p(BV!Cqzo#%wvULj<$Tx<0~R`hljGX2 zgA+DUAqndTSj#dZgVs%w3*VKU8PZZD4JYJw?ev3P5IJ$!z{$?c#2#LfU3DPVcy}$u z7?>sBQ~kl~OTv%z;E^j{X6TT!p!>m`lvDq&_0|#7ojuF#gx*C5lAnw<68N`OhFA zug8e~@}$h`rRRC&18hIJ^ue|%1_#>~7cC?-1i`)Mt+cwp6x}-2xI=Q%-qO%!hy?%k%FD|Mff2X2KI+H?8caC5=Be=TmtOienSuUm zB+CVTa8B#l$SGitL2FQY7`DzmU08Vk&gGVSW?R#X;)cs-NybjZLEkinK8s~HMpxUT z!d1NUIZHV%zXMTl-fahKxbWS@vW7-_Z54dpkblRUT#LA5T7vXFU)n~Jm%vH|k0Aol-K%6mvn1dN0~c)olhQ7SN#4Q zc|buu)k`J+BXe?W?JcBZhZ{$v#b*qAR~DU+mohx>)Wi?b$9%n#KWA*WJbP@Ur8bq+ zFHo%L&UiVOhlj_);f4x*9mN$~E#eTT_Ok~GT^G90VzYhE^9D{h^t5CnPp9~z9_ zJe~#wa&g_KT35$%B2|Wr`6=A+P;>N%l}Upjp@p3WN}`!8;Y&d9SGw5Dw7gh^Q zKUkRFiPGIIPrVtfH}{BSfTn;d)#|xgz0BWAyPu?ANq#;np~X1tl`1mbx78RMVJ%#6 zgXg4l=`DY*i1f7<5imw#B=c;_M)r{2r?*AfT^pLT}wWi*Qy`) zc3!dAx|@ZV^g1Vo#ycar$ih@drMnCUHB;_gLrpIrJ*II^LKL;t z#p#WRY^8KKj*UE})+4I7&^FZtcP62CmbR&jW`B0rBoyHnRL4Y~Z6G{vnaoQ0S%J6L zLTeB-ce0P`9`I8=Dok1Wf*QOF^*p%dsD1_skNOUnBj2a z2?Da^4XYrt?pqhwHPD|jXOq0RiChx0rO?kWdR<b z%2D)AO84nJV%2NyI9>a?bxw0JYdrDCgJq~6o<4Yx*YR$L&$CZnY?gja7(09PbS}Ry zNvX2vZGL37OKWwz`6K03&GA?CHxG6Qrzgury_B-wFL8Ir0>14P)BdJ;RaY58z1NcBr!}Q^`$LRV zRo`TAHm0nft0jby(>P04@D?76H=2@LEJk_SLOJ%ZTsz40s%FAC zJ|Z8#1~W&<`0){$QDedDgo#OQGSY|HE zFs@5(vyDN?^2P^pc!S)2Qu++DCUIlBc=dAC9^=aAKPq--3oLJzmp@sPpXf9(fB3Db1H6V+aoi| zo(bQKRT|EZ>3dM-EwF5L>%vd$rFH)%^)h!=%MHV2NVB#U^vID{DjX=2+@-GHUG;K+ z__(5G#T~|w90IvjgW3)|{8LA6M=1BO@d97#aZbH>D=(4(v884rkX1>(aP+Yo<<)qH zmxRgQ)G;=OH|{LjdmNQ|-jF5~_yfFI6HimY)|jyu$!zb$B~4yPqa z@9ysGau!pbw`W#r?Tys@iT&@?0?Bo2O>bLMcMM~jWDZ8(^|5ZyU#Or ze=2T7XbCdPIX|uM%<$*MGVMGmfx=1V7g)1jtKkct;jE|Mr~f-_V`%GZjU-ue*pp@4 z@GUKTVg9uf!2D3~SoY%b@RNz44QbCJ`1U?WeC$7uOW7)$g9eEFYZNRLeycD`-?#JD zJix@jLb3B37gkTGqoD%NX1hUyBiq7ncFo{zdKz@gmh*yg@Je(ij7ob7;Ji)sK@-Or7d z_Xn_m0`p8bt-0Ogd)Oi|SIR4!N&4KG!Mi?9q|5>ld6o29D{9=3Vre#-9f`d{r$wtNzMuJ1Yjwyktx+a`?=R34cFN*JkCS7Czu-&V5x=(o@ZKdr|#*k_$gCrc%!UPgIjvcd77kC zhZyHm##4mlxpH%|I3p4nTJ_QF@Qpp9{gWW)pO*eZ?Yl37H;%eLO)Gffw$e0(+V#*` z5t5Wbbdv{;c6Kwl$7>VYua_4tAoXc^JFvp3%Fs6HlYMK9j2p;US3UPOpZfYO_2@fZ z!)%?rU46eF?ra*g|f&=WFgC-Rqj zWmhUikV;Ki$yEzmr^=!8q2MGWodN_o2#}k5#KP#5AFKLW=&37y$a>C&-m%=~6oGKFws;)mSR|B`rqrjq> zp(9_(*gP@lXhAJ~T+c`2HDxy84Y^z&WLMwFM1JTed$lb%WcTWzKKM6JJA1nOl*qLH zQoa^;Mhrp)+zz!XbA%1OA*$5<+NFfDBpF&EBJ>$`PYCBP4HjRb9w9gVE84@9Isg#V zu{Sgm5lNK?K9(=OBN~9`U#}Ri$s_aSFSedP#6jYjYYcZAKc*Nrm$+cQri8o;g`tn* zJUEcX4}^`aA5zt(lzyE@o?MSi0e$fevHA)GU<}lk?`UI&G1Sy9*%dkT`WZ%@(f@Vj zB;WI+XKzk*iIQE-|5Z=!leu=J3XG--RF$o`CA=c+ETcvi+0!+X7U%|PKi}&!!89%(ki`@6A>!j;J4Pb9} zV>XN%M1t|g6rd^3pXJsg%X3_>t~h`*Sg#j@k^S<^qmpw_nKWSIB?o4POJwd4)vSN9 zm+a3oA5RQ_2_0`g%tq~mw(wW7p!<`p@n&_2ZqRWBN93(+ z;bl253$!hK)$~P>c=UC5I3D7N7EBvwNf#u&ZP3J;~__dg`A~hP#o~991ze5R6daW|h4$$s#2iQRs z^b@ULj3dG9^*K+L(b1{8OHmdIJe8=lWy>hAd_lezq!W0tzZnb=M<6R12qv5)1M4hB zK!TT{?fSbVK0x*fshk++*kP(bMh~&_VMaT^{dRXpXbm?GIa`L|WTRfGe4^TN&CQXz z;Mj9|;!ceDTfU6q4Fo%=cu|)m!QeA@^H6bPT~YNi{tpQbYE318n$#p{cG9_u&T2d0 z*^7c8wH=ZYaD;$aW0+`348*k{`2{GW?El-}oD(%hV1q!qP;zP*GFAbb7yrLAONq#A z9f^Sx0X4!{hq0qs65h4H8+8~ZRXz(A?TroDo>P^eAXE#B1T_ko+&HQM%FLl7#9c|H z@(Y;=SWm1F#`cFa>BaPAQ8kNEkC%mFrjv zQIuwsU_0bD{~|hfdh%?RvX(R(PSYW%nh8GJIbJ)8N&z;7W}jve>RwRoSw-%$SO_#L ztOb^Aj*ru@wM!(n^`7DY>w%$09L07%51^GL2!DB?=(O|q)~nI)V!GJ>EVU{Xv5Gr6 ziVa^;!DG@@trW&87)Ivk@2{iox2BQ_rSsU!ph6lBYxu!99ruKmhBsBd4uV<83^fr- zg3UV3;zCDESujGg*Sa*&_O{UERe_AP?#_ny&^baXvJK59JV{=~STLc?hvv)!SR+Od zNnB8BWU!#7Vj)mh!=TVj8L(2K3SO-rw)?dEb=@Rb=v475I3yODId)MmK&MWqM^=F_}IZX zk7qouVFWFjKMT|oL34sBE{%!n+JY(=!pMP8Ye#zKg8r5SWc0|(AN_!dv?Jpjm9zid zhjoL!R|RBL)09_@6Osjs0wKxjO6OR84iquk>j(#WV1XlJ(5G6ruhPeQ10KrYAS%Ff z{+G>)t{$tx^0sv>WV2y()L6iSlqy#E$q(?x(H8`yjtt{@LHpmI$ab|P&u(kqX zBswf}DrumGQswGjo#-qj(S}J5fJ(BgaXh~YQnG|RWnv|^z6bEcewV9p4<@UYSL*~C zWmq%PQL`fq1`?Lt2CiWAI7Z*iCF)rP=ZRN3C6xH98JdQ7a4|S! zd@Ae3kcA@eM{dICF_?hTee!lOxhi1G034kz(x4hO2RDiaf;V}ys`pAj$2gtse&g+XWdz&^nx?XF&n3R8(jlD(U!)|B1LBh*fAo zQ=+51D0goh5M`{Ze4IkLSdBJwaBoMP1Gc^4i`Qa@i--%NOUt@GnV%m-@(n=`xDb<3 zum{$J<-??e><-Yb1$`xZ0exaV?mb{EPJ&Z|Eo>c(*EK>}sn7pwv2zwUmD#x_Ddfl{u*pZ~@Q+SwMWop`gXW=Y1Ji1*N`f2jN&5Y=ttu^(sfj3bMvt zjJTX;2LIY(WqwXsw&V zp`kn*Hzbu|nP8x%426BMKBPb$xh2vogF`r~)|^e18ULfwbJXEC5x2&!*$Dk<#ozDu zl$U{4<+p)wKx>w2hD&qd2+tvEqlQ4%Cjh?mlMJkolmv5qoC_Bs7>b~(P$B%$PafO4}eVLk=hr6JJK&Ve8(0^$M zjdL&(1?0Y@0*+^n6R`2^kVRpCR;0NQkw(vV`! zaZw7ItkG^LV0aTSdbkgk6@l4}O%ZVxV)r>9Ih$-}IzpEmqr6<93X9{SHLJ-9ly8lA z$;QV)B_p%~0U5nz2B$dSR_C5#<;=sT;*16X5b(3gTsXy*UNB5-!VNCazCekA@jwG4Qh-ZccU@06m}c1PzNoh7%|Wd9Izp@8z-Cgak(D z9ToF`6~}=(GXQs%+Oa~`mS4qe(L$c4#C5m;t5qPN&6me%$H;jDRSnREgQ=J(>rx%Q zffJc$Zg)5lZwuK0#2OM}>7=d~yD7{i#+=W)$GmL5bwICBiJi7upd!##TE^tg( zHy{&=|D-?*AoTHaYZ5W?MG2A?j}RjGkktSuDE(A;R-;%(PGv!cwyOlqb|fGZ#)*~b znc%{Cru(Y~0xv{yaFEx^*!b+Aw~R9v0XBskU4$Nvbu$Zs*Pcm>!g1O-yV%y2WT$az zkVBmPfs~~H2Wyy=UCC*Tw<)!mXw)%9vyzQ&ZbOndJvbggD5R74bOTxdk#U}z4fP3V z6Lc-X-_n>7#9>r}%u8~!s{mJlBS#_hM-xDRDVE3Jm4R+RtL;pspHTqLsgjm!_z2}1 zRdKSN`(fDfhRhGS*T4gMuWGGIp39)wOQi~YcpentL^Vb`;)DSJFYZlR=U9e zR04lxn{jC3c(6~+>B!R5^mj`T+HA}-P%qnluLDC;z)=X3sST`t(%@L z1_Sz1C_fugc3frrCsA*aQ|m@jNN&xPq8u&POkwIR-v*)_AiOl&_NKU0A zAFZoK#%03bM|s6R3z|pmIl+X2`zHYP3>@ zpneFY@D3VcSU9pWHEs`gz+AQT;8<%t1C^N_&AUM)VJwG_q&;2^Cgown@L!2vVc^=1 zd10&VMlLtdR&Uq3Yi-;Ml;S$^$kZ0N9+jXgtBPPj+=NFPMRdG$8%A{0%xuSIE z1L&-bl*+@@U95|!ix;hN@5szXq=aA=VwQY171)$dOz`t2DNw;azR&Bt&SGHcVr?EVKn97 z7C>K^!`M{qV5Zv>@>rk>im;SMc}J#VrOv=03Fv2wi{DGW`&gzVC%FHNk4LDu zQtc{hJ*Y8xKHbd^^EvmlmWodSl~)>CggTa46qBB_lrvWI%Wb*4(-y6KGk(!>p1z&oc9n5;;7b8Q0N36SL_N7L4rFnXph9za9_)8UxU~l zOUV9jS2;&VuUCG`Y*y@?jfpX z@w}FoO$w0|oQ0McPc00pb5HlKZp`TV_}M=xAxG~d;oodi!wFlmO)Y|;2zxJikUIE+ zw2vfoO2j)Uo%{XVaYJQTSlXwK=LU!k|GMOo0h-3&3M}^n;Ig8X4B;pJLyWorXTf8|7 zVeN31My9u(A$DjRPd9bIYQH%Xf1+j?i=yo?6*Y0e{sc=Q>20c9UZcFon4A>ZtJxrO zt)xO|9`u|05wfY`i^yur)!LT#fF~JO(ARTTqOmZmZJIGU3zP6FO1M6P0=&e4xjUw2 zFdQ_XJ%Wx1-aZ9ti zb|&v{dziV@8+^eenb5YL34oa~}x_cRITy0uT~ z!mwjoa&Z4}3CKBGojQ_@eV=bOx@39oFCbu#>I_vr29*k*=;Y>Be({rvz(bXX^EG2( zL3GMjL!(19O*$H82csnQ}VIZE)4f(j?)UVgGm)gt_~m(mAhiyhAa zp^0Huq>J1ad6SNroDaAf?zG4j_qC<+r&~TO&f@^%!JyfRE3^T`Hi#3_C+$CEkQn2XvtcoUgD#W#$+64ZJF$#!G_j$myrAHPz+^&c!%pK1fUBwe z>qMCDNWArOH6Y(5P(Q@G{3DN}09JweBz%y!+(tpR)FsHaEV-_f%%|Kd0=21^y91v| z4(XIWL~p7lGF#$|x7-q2EEngo0DOTqctFfcI_u)g`O)2eJJRL05#QY$@2vU3oq?q# zksy6>l5itB7I953%20^yC*9!u5Bkl?ar!<#K0KMDi9kf`o5aY-YCUMYsYlXf2yljE zqp9te|1GdiIHbND4=|WhS~Q0tm% z4Jrj|&9%Z@cvQ0yQ3CAhROMSiK$UdY)*R#lS?Vl2>j?=TF7xaKl7}6fjb@?`&&Uz1 zIb24*gZ5iEwNQDh=s7FJSz2|ttXTC(@N#iANopsD^EkQO7oj|ct$M~~uZf8)7`V3! z^N<1qaISGnubz(!Q{ZPb>FZG@K#B_$NW9DMDaMfm;~zxD>GC*?GeEUE^}rvp6T-*c zi~_8GoR&UcJ0juK(!wvhqZDyhm#}$Hb2J33$CAQRl>`YfWINC{0YkI4>l8E$ne3^M z@W7hzbAoXTbth`y6JzRLh9C}M?+hW1F^5l8s&!ubAY)TFNc%_Jo|JZiHWqlO8hApoIapb5`3xEDTN+ znkPu2;^4@08K$39SlfEze76cuQ1g<5#p<_KSYKCAo*1Vubj`xk^vXtDY;!3>6g)Qt5@7N%ed*OQ3|EU7kKWROV} zd}m^@+v>ycfkt8zq5RbRfn(o^mkM7D@Vpr}-g-u}v#yraT^B0P`W4Ct^(NT)f;*)HFzRkmsSd#5ZLfIC;gMp(B+cH}rzSfsGfVz!Au)F3qqwct~y>r-O9+a84`RRy~%TK;VvBnKti(~SRe zCd$_-D&7+8na$cE|7Dv6FvgX(w#&K{sYb=xB*QLSpoKmUc>zZyBY92P%_QZkwNoX4al5AI|dvV;SnYajD?wzJd`H1jgxGNrbUlcJ#dpw%^-Hzq4H zV9RMLhOEyyN#TE`b9A+hGrHw#Gn19BNqu!>C=WbVOvF)P_c~8{Bo0(?`kJJH<77jM zi&_YW*X)w&aX6>ra`>W_uHYtsn#i?1sz&v#%43Yc|EqAY?JTZJE|$rqbSmX#6oBg> zk3m2$KOtoU=OIHgGr{;h9bsOr*al>|b{PKF*^FV-umjw@24OXJ`-;9&)EO(Ftq^$` zj1&=;^r)1gOslRcoR^VD!UMuZMrJW7L)&k{)y?lE#U7GlUc8)(dlMO&?VTi?Vf0Dj zJCprd8yZrm|K>Zw(`#T-1qb`{*x|ucQ&S#Dy;Cqq^j7M zs{9Nl!W(q=^U=j8`4J|H0O7t`f-l>>46TomEhL2vg9=cExu z;)hlS+uV5Z7M~@3I690girtYKL+LPscB7AX8qd1oskgL0u2z0r4e$Go#sSmV*NtVt z^itC_|Bt8h0FSEN*8fZzX{;ohBuqjA84^P3&di>fJq0q506{{P5_$V;oB6r-FTFR0ltw4+mJ_qq$8nzXpJa>TP_Jl8&)Q!hFrx%At%wQ=KIDA!W zpPSp=VLq15Xp);|x1i4T+Mrd(IEl_hTc(zr=u$yL`{OhY@u{YjP;-}HfA~Wgz1HD! zcVFr0HeS)Lx1@o&WE_3AKhj~#7JqWJ@ro^P7VxV|aB`h#*5lQB5y&{g#{FeFvVC(D z`ubSncExFWl@!f)kyx7 zvJrXlp!J}34ZdAu+?bvT5-B99r7AY}*I>{Xc0!4Akuem17PweLu&_>^DOV{d_hziMZaAqaJy!0_J{Wy>{JxHwt%3?r04 z{9&jjryod;KAPV89&fq19EM4MLx-ZeUx9H6y3j_J)#xDmsULW0Gcau6npSG-J=mYY z)xeyIi7;>YDLedZAXd1zvw2;Kycp(&mo!mS_L&0*G`q5STxEx?6UZRB<#cNBYUmK1>r|_Y>uv#W08MEMb?~U4oPo%r=Q`dO%2_ z&@u95O;vrSOs?UtAE%QP3&>6B5~kxMD3yb8CGhsl`pjl}o<@--z@10D%KkXL^C#z8 zzHy<8cdqN-`VPG!Vd)CuM7&5zN`__iH%r(oz-u8^I}A!pYYG8HWK59hPi!WE0l64F z){6Ph{OG3{UB`_>LwW4a8i7?I+~W?q0P9dg4omM!`{tbHPcpPrdwzN@=p9Nk^_^}w z>y1d7Jd+_Keem?M_{T*^J$bAjdr>s5C~Ex&+uucW{sle8Kneri$cP;HGX`ZAew>j_ z3LjsuIiEZmHriU(kBZm^ z@|41p8IG_q=M+w_DUolgR_$gh*=sySI<IQyOKI4RVA?FQ@g_i;T)Wks$A=WSc!W zBf^0vP^SyJzXlkywJ!Ro_Gsjql2W31Aqf|e^R{y`nHrcoCicHI!TV0(1=9p8LZP#S zCPp84Ys?zXKwlH)`$pO{jAyxydn)?|x4+FtPnC7lO~y9CxRGd;-bw;ejAspVA@Wg0 z-1xeKFM7LbNjl0c9yqiJ?Y8@}DMT|o-4rveeLWgK&5+qj@nN4L8;X@Loda)#nJ^a= z$do?z9|auX@$Mff!vabZ+Pa&km(_iwvMB%4jE0Lq1_7X;5Wk^;+*We`Dt`Z}dOllg zae5G97(gPLv1TjaFC&!!SPo@DGsezjH)}1G_cAs>R4hlEc#foEhu<2L&oo;i@@z)y zQG5`x<^i;-xSq$l&=pTl@SDUEc{Wc*pky!6f#|o%lhvqCa5cHECYMAPJ@e2&$^thb zK;%HlO|woc*g#%cN51bGRf3>c@57GJZhvqQ}eqJwT)Kul@hhi z&yOaR@bN+5@*M`Hs#bi!9N{&}OGeC)*M~}Jh_b%cLW+b|UP~%rhs0HQEuxxu9ftWmWp3V)NT_pTE(tI^ zM*ErU#v}cbz<<2SQ-b6Ie+d2@8$~~vd$2rIudTf?U-U>nYBQjlP@8QQ$55-j#`wLT z^N_K>pHb#AE-2FOwBN#ZOOfo&b5G^4+PQ_=uenAIQICH0wK}OCq;bZw0uB~wL$0s$ zSFO^~V%l>c6XCuzKq*w;ELS$ivWf6ua(iWv^v(ef=&$5Qqr~tf&ablbW<(}XEc#O`wi>aJ5g&R%Q+-RL7^pZF$WJn!p9&0rW zgpDuR6s|)-_nlBWP&dfW=9_aFqn5NI?fQe^k`0(QUsdhos;EGHtij-^Bs`52~5 zL^3BN$D48V5q1|JK5{R4upbli-eH-<7(r(ppWJ%0581%%+VacC7()#Jb-_^gYowke z)z!U;(~Zl=;0?3;l4hco5b&CHfE~@t$FLxN3=p^53y&fwCO^21&rIXNeyC*0)HK{_ zNgXKuQWGYQXH%tDw(%xKgpBSpup6^R5T5(2KDwZL;v-4h7bJ{uT$ zfB7g~4k27Pri56JQW@26DGwlvCNuNova~|8ghmlrUPzOGWDVB}(1a41n`&g1$jQu9 zU`EC^_@<$ai5#HK09$j}7~XxtAkB?rkHe2kZEC930exP{oKFqI`Daaao)|S?YT4tA9ddT>f# znOQ1l(B@KP&8Di~FrA~0P*sSdtY-iuSyDo`X}BOt8cMM@1$JNQ;U!!FeqG3FKOLP zI>|40(-)?$rNvQ)_v7PGTHs>b6p#*mPPueU{4eUxzBkYqVX?eI@yo|+nXlN4pNX^< zw@qteWm%`^#7mb!@ia()F{O^ZjXDl(imCQieG4rgK-;c*(V2e%lRj!DX`+Ph8+v@-3#BA|-)uqwWs){T483f>s0h;oN- zdk@m4k@IZCOu+5?p1nMB?HB<@@qKRLc{X#-N1klMU}^4e78;E|RDU04JhtGUEyAi5C%6uw1C9jWg zcsO)ozx9%4Xw@k%gqWF!ezkzY zwibsPC&Gno+viM1rV5L8AcGsI!t8m|EJt6iX!Pn?M8Q?nC&Tu&RndFtkuwdLT_)F4 zkAEoK**YWg&G=k05?cJ|H&xcCK3?SM@x+G#RSFEsCj%U|xoK!aLgc?LIiOMES5@-E zxIbHYxLTDU4oRQUNMteHtgpw7+mNX9?y(5940@KV34NleWiBmh(=xy&&L(F+e`*v7 z#Vs)$}(CbvzMc7xxoo@a+gl7R|%^SginP)w573!J|g0};I@h&;Ql=~ovff6HiQ z@)TPB!}j^T<%OYgZH956jNd<;T0|HPY@RA*6k?(2bx?V1qfIaWc$v0XmQK~y{X5}n zvs2szr2Rk_@uzIM2{q-nYCu*>0dcCuS;@2%b7V{nX4IEvH2>j}+eRecC1brXWd7U5csIffg!XrD*#PZk8?zXtQWR{u zj}tEk?OQ#Kf4EqMSQDlyCTT^BS(m^uO^jdG>a2li%JP|qBGRLmv8~$ZE|UXIct50- z9WzsbDAC2O4~A1ISM`ZEgQpC2giKUNes^i7uO}$U3wVqTL(Qbb=HFbI7+7D!2&UF! zUbEU6{mn&kmA(&kEmrtcvzO!)31QA8U5~O*soco~4Vr6;Iafs@f2>SiXB|z9{^}x& z&1b$Xlud0Pu+z(v^w?8^I0}h)RKfDCU4uE)Ia5(9mMj`hc#t(P!bw)Ci=-_*KGdoM zrYlP>GxF&qKje~|vYo#{>(ceUjHsbem#8(_IK(AbUS|Kg&j;wG1J8ISE{g`2v6NITf~7iOsOU>Zpien!IO ze?>ecH2`gv^c(*frw%D-wm(8DF!OtB_s{HX3rBJ-MG;WRgao!fs0l9+!N_;xM~gBVcQCGSztnLpbPciPm!?LuGjSms_9!KN zC6XD;whhVA9gtc9>-c&MMqxtu@1b<~8t-4IbVS!0a#<7IcXF5>ei=|CYnkW}nv~Hb zLfbcG?MUuu*5&77taZtn!Lo1|cI&#nsifcFdXB>Z_(N_MMr-9DEQ3d`7p6P-Ju1G& z>EqQ-zK@bl>8vccE{y~E}ZrKr;JV;!<<&POm;*Xjosooe~&2B+b&)VUl{$e2fVH_^8 zjGj$9T=G#{CjAk9WAhwyV<`vlhe=5)U!`T{Wjm`PoRd%{3lVOTle5f}6df`)PU%PD zjBLYAAl;si>H{K%If)9w4p{OyYlBOP?vIl8Uwg5)x3x` z36%Dar*ue$(u)HV>gax>G&nLf07lDQZi1~ zIaB1Nw93PrtpV=pM!B>I%e{W4IYXEHVS~$mV|AW^**4JS_TrC${v!&Q>@ph1GvBvb zyt<>GbwOdWn<#4%j6lW*BV_V?*3a~LI<8x}Rp}1EL4<-&JE8zf&LD=mMi6i!qXB8 zL0DUIJDHkb#K}okAD3jEDPyx3&wJp-H?wjYtC3WhE@zF`wlG%Bm1jm58(RFji(NxT zl`CI`^>#mq(sfbXXmZe4CWC5}Y6n0rNurKH(luCv=?@pQkxID=206d#*aF}gnUSZw zr*i+aTne$&fMm9|v&eOnLoFGFK6TJ~S2a^AnENEmX`J;3*=JZe^R zDzz#SV#-+0th%5imxeTLn|Lpo=MY~iUu zbtgC(Qf;2rGdeR_r_Wn?5*W=aO$Eumr zBfQYk^AS_aaJ+>tRb_hmIty=}olOu&c47 z{T`Pg8W)ilTR^)7?29Y3*<=<_qn0W2nxJOykrC&pTpY8n&;R=+!p*GLY$$s|GH*d! zT_S4Gd{3Gxm~P{N_p7d|4}TVRG{}X?B0iPh^o~QCD$2vnZEMifpmqyvu?rfofR$X{ zxJKv1${||)tG9^QUz~>giY7h`TM>s`#%F$z4!J%Zp8>D2aGWL#{nmXcs@6B4M3-cp z3x(-bX4Aj4-8v*UmNT*!&5k|8ppu}|(MpFNOghdlZfQKkT#}h&N+fZhEb2+IfJ1El zl<)`0*dqAsJqpDlW4^Q(qH*fYe06^Q<_b9)CUnq2zPJe(AGxU5MDv3*baP}>5uf#n z8tGYKU0$mi6{rP!%HPU({Gzs$6f|rzx@Ck6~R22X0ePvs(Zy4k72Kl#OqgZos<84at1t#~WH?hNxq!)Oy;a&c z*^&Pd*$NUwPm@}-P_>xsXjrHDp=B3v-m(epbxHKaah=%|kwK#*S;g<@P~aB7;)c}} zQsWYYJLw<-8$uTl(-WS8PgVVs3Ed;)#VQT|AYG%`iS# zO8UwtudRv99NAQx2-5c?#%KR27c$X|A(=5m9=%eeiHPTdtx0BGk}m0>JZ4HmuEcr~ z&4$|;<5Sn_s#-pX{b`%G{xHwanlpVy7GH-s;Lb0ef?ewJaIu|ki50{i&Quhe22!sT zu9nry!0>2W%n$+ z>!d_dVL_|wAo4>hGq8EyMl#F65Nna*Z-6&_PAn5&tv^&9Ld>rtI?_>I6R zlD?V1%$}E`awF%p%;>K&zaus%=xKDZ@+2G`!2uS+yd_v|ORDDse6;4M_OUEI-S}6d zQC?)dT)^9rB0;d*qkSluwbqX+i)P#rEdiTM-4p-8Iyw;FV*cnbvr`!YSc8|A&#W~Ey-!mdnXmjO#Wi*;^oj%PE+K7gds3qM^mrVLM`LZl_O;LJA$u#O_o>-*T>Cv}@o=*X`tn_y z!XS02XSRQoCcj)LflTB4ko90H!qRfIQf_a|WEuKfkJaBDUE|a}!>w}kxAZagpHkJc z4ja|bX$*$9*4MFyq&UOy4E$5h-S*6jv3lHN#$xEF0cUM@v3D&Bg|wP$9lXogn~w-Sk) z)125^ew8*xman3q4A5Ypn7`sM8Ie8EE3Z4nQ8#`8;%+Fq3B|WgoGw`n( zg1Aec2%az7oJTH43$Ams!){-rJ1WiARdTQq9U`!bJmnVh@?@mtKhq>}4u{qtV?IGr zK@>5kTJOWLC?V9M;sphQ4Ds0yT+Zv0*)jH!0hZeeVs$CZ!EcdpgvWV0gI_uX^Xjk` zPKC(Nl8K$u0Sn3(sTK4+;Na7D&uAZOJU5l%75LSdUE1CSAzRGO{q5lqyekz_WRL zOO(p!l7Kvzt=T_vF`LIWB8R-Oxr7uO>xs68j<0g%TA<~0QG!?ecFgP=)^Xce7w}(o zD=g#YIu^>LIn*1GZjyhm#RW#)s8O!0!_YD*DNxXmq?H}ZU91*ve2H^eE{O(;57x%G zJZ|_@{WPe68E>wIRW?d72EOrAWa3B)4I2sT)kk2;_qd!@QIIDmYv2lPah%x9m<^+o zne>AFY<|;v=ls8hq3IR3m-TYVHKYXjHr(=>Ng7ynj+Do3N7%eNi=9MI+JA=JQNpdd z2DLHi9#CS!A%-HahKN=;u}x0Ayn0P#7Nl@IYBQ znd@Ad4jKgUNUBdzgUHPhwZ&bPRr!Xlq5}1>m!8FW!SOMijOaPiV9UK596__Bh}fZo z&Q&%D21<^nn|BXDNDqVSliGp2=AV=7$fRf$;@ax~V|qJpWh6@S>Z|a+rHX2pY@Z_^ zUt^`DM%N{@Exbl8^TBcg8n(ec)=HzPxD{9B2vq(B0YO$zg7S2rVctk~ zAr}g74gA`zZG>c*mb8`wTJT6-UOWHZb&9IlHXK!AVtlr{)v4StPCPXV%zvjm@_w9l z;ULXm@{mpbj1@jkT~Aw{1#%LQw}W)~K5>2Y1E5}}>|L#+P7=g^qqE7GFn^v$Cs_S? z`Dao$>1*FRT7#ii!KBjH?2(aG%uQeYI{g@%YGmbn7YSx*Eh$d@-DqNaoW<2>1c&s@PNBn=$?6Yn`f#wTQ8?OXcr4ur4W zli|B(=cxL=pec|pk7UXIbJcZk=v`dh>`zl~dCOL;bU4F$tVMUw@)2cZ)B`y5fQ_w7 zd$MzbZfV&l>0@Q+bwCtxUgBx7<)tTf%comeJqg zZM6zv7e1qy#hwR6LQ3PAP+(ERSU@0dgPxg@#0o*s-$Lt1G9CxJmR;em+O4&=))Dr=zVg! zoRZU)lpuc$mv5sis9Vlo5lV~iNFxTxC=@RuA6y!plSIOoL?IG9#&)6Pt5)KzEeq*{tOndKHXg742q%JedWZ3y5QCqiCwWX z>P@2ZMas; zm+K5}nK;TiR?cT>-Aj`IHSI^b9@-r@Td@=ZwoGg3)4sAEqBPfLHbJc+weu1|YK4GXUbj8#aiGLr?)%RibnqfMly3Rypy{8zr2F&$pDJY}Ax>jcHV)#n8t1Emv z1m7VUuFdZME^fzS=J%B6>iM$!tITiwP0x|{Zdey5rL*L>c~)yBqeo`dPs1Au+&2f zdB20B$SAEV;Vk#=&U<7@Ch<`0i8{D>!TpYt=g)Om=m+RnSh6!}d_R?OeY^MU8G5S( zoz2%wmT}jUCC>yUb)(kcr=ehR9@g;im{dGhYssW02Roc`OGvrBqUWv{ zqjU=LNIJnuDF3{z^_~BhiTBQsl*JlaPdYa~#d*ld!+EHm2lJop)6I7ib+OJ_#@FUg zTPJs1ceYf4jFzviHnOU$eaRXn_YLu)N$WLnvSgN-nK};dYsXv}sb#y$MzzBY5~uMq z{vn$dn5n98t1;$@vmvljDEIn>tYeNC=ief(4oO>PqW6GVwB?2@3WhB02Pzqr$we%e zxS1H0E6+@k_sT#pqOmK5K?O);qdL3dD=*KoX|b$rlqF`&Q!0^aJa<6ujYg__N?p?p z5D&?~A#haL!EW2(k0ta)yCrcKl?3BZVL{8deaW<nGfNJnntKwk_k9K)E$HnJ?CsF(xpnMW>I zPMKtHqJnAa#!}RiD{eRQRBPM#ZIEH3x)qeUi}2B~JE2tV@$eX%rdZ!wIui#~VF;Rg z$$nIgVx@TvDl6KNFGUhPdRwHrfMq+Tmli?z;`OP;yNHQM%9lT}x9y5lxjkR5OqYe1 z*q(m6X|M>~QAVm-tld4Q zuI{*=?OHn{2xA_W#3A*E@bcxGYvkk@d1EdWWD~WAgN_+J7B`X4tRJQ%ME2=j9~7@4 z2$n5rK$&Fj84UmKNoH+grigVr&BVOxzyY=f^3$2eHGSiTTLePb>3KOs@w}U z&ud(%{kt#3@P*~+Y%)5sWn3mvsQ>Q(uDoGchen?TQH>S^a)A)i;ufEAebZFL-A%o}T^{7hDS;zb?PoTww^P11#NLVcto z>*Uz&WMl%VGNC}8(x-m_QZcKqt@plsluSE~sZ+C>@A75=qi5W9;R&4GR6Ah-C&a5Es`(JTG2(cKF718ku~tcH2$zpHR2YJ zr@vfP+RwbYd!M|Gz*6Lyjw0v@QF27}@9JuL|K{YlMfNDG59y^iaj>gw25BgMUpIscRoZ%0@hw1iha1&ZwR zbni3oPr{+XJT$yTRWSdimNpV4;LAI>uxNo!;~(druio9)6&-Wj1PdOu z7?uoJX`kJpqr9iDQXb;$ow)@Ib!~;N?1xe{XC7WEPmdvw%GuA7tm~X7-S?Q6rZiCn z8|jhLuf`h9Ypi!$VR>Sf_&BEF6weA)^&*}GrU<`woAa@Yo)@)8BGa-+;#S4tVFRgbuLhT+(I#i=B zrPPUv@ygY27v++c&_=_@2HL}}Qqz3rcE!qXsc0NMlkb^LZy^shx}N4WVw{^iP1MJN za`||+6TIG6Ej7C9ocYgG8~)qn@r=JC44&sp`nr{guMF)+E2c#%x%~hUn|?^MzN1Y^ z175#@ZboDO-EhuwGhKd^szf?YdwUd9(*AUoygEaU z>~wD;f3miSH|QevlPAY#(}e8zcg#*=1(Bq>MjFR~KBvDBM`7m&V)m7%GFKd`CzVev ze7D1M!dPL97RTc{FEhcuuDA+8;W-s^`LJcAIf-&XMj;lr43p$O-Mq<=m!}w?43q$k zo7VbzZrpGYcJgx7Hd?U6+Srdt$!k=j5-XKAYW!l)UV`HzRfAdQ5$%Pr?+)`bby6~3 z$$y}W)VB3=9!Ct6YB%(i)(sA;qbWz-)?a5SkRen8L6ZK0l1ELk{Opp};k2&mH>%H& zO*=BVNl3Pxw#v&%viv$3R3Yy@)tZi9ORn@JBe^AAu5G4K(m5z{1k(bJ?TQNcBEdrc zF++dza2W>!a@URWOH2EciaVzzBUAQY#Ns_1V6P(>2ABTbRVbtrRWGmR(%gMk7jJ%a zfegEX+4*Cw9=bUPH{6oa8B*&tN9$Y3pfoaywp54Z-3yD?sw-A7Uh9=|)_l3MqhnEdA=opJxg=?EIDkofgIWj^7m!eCs5>Q!6e|V)AdEdCe6`Na$J{b)Xw9)P%&V#~#HB;0X8bHNurBt2e~N0!>}&F3+7I_zFQ@#IUo z)IPmKa+;y`rI9jrA|?O6(^yp0rev!^O zZufR?NttVI&>G;Pqie?D1~Sb`$q3O`Zfz;kuQPLy7`tS$U)Y3i&S_ffnDgLb^%nzj z+GZt2z;FBcDjL_ZbMi>Fitxd}GCT%$3Qx0-#iw2JlIqt<8Xs13s(n{*>=FnhD4moq z7|`TbdA(m~#tq23^R()Jb-TiskDaTamsro)>vTdS_LE=EKk-TAm3`5FQ6i{NFYY@X zo_8LguPNH;l#=UkcqZ1rrr$dtu?d=l-JY}hh}Zk+3C0l2Pzb!^2T&|>R+&T`|ZI42~YUV{5k9O!6;uWmm5x%@`pMQ*JTr z0e~-#rgt3l`Z2OYwCnB+#T?0v6Xf;jOv_6eRxBRn@HHHvxeKy^&GsLGzXOf&EBPRc zFDK;R_NJqJ(Y>wlYWSAXQgl$7UO`{5T9FfZqq*7IGu2$JMM*(Jo&!zhngclLEoj3> z`JTz^bfl0tR~Ll;*SZLu`>cWHeOk}LK%BFJdaWAZi{gQ7SP|?!s-|0;4XoM5c zl;tz{Mz7r@`=2U4#Iv(B4eL%9?Cw~&u(i`gyOi#CzeVKHSLM$~W9yy9>ORyilwyjh zZJ7_HGqCPjV_zxj;atPKE}L)Exv}NmZU`6k4$(R}xe1EBpmk3IxjngX8sBVCJGXr# z-RhaC8;w6z7TlrB{pJ1Eg<2;Bt`RQ-Uw9Ui!fUyEbFAx_sveiM$j#@(+D&8F)vWuG zOpsSsEX$t%*`@mJE&1PL@^3Pe=UUZ$)ecwB$_67quHe3Z*pFSpB4m4d_8h$d6d^ap zc!rB_i;THGl0hr03HzAroGwS-Px6Mh$3Z5}VmW1!^vdYCMJ-s~uKXjj!C=@|-Nh@q zm0ID&^NkA%EJv|U%OUNY^B>wn`fDtl-b2mis*sGC)ByT$#dS5((pNjMe>=ou{&-*8 z(M0(Xh+s%0U0$N1-#$Cpd58!4qKz2eC+ANhAm)OPR&o0M^H5s_l9ZeXdd%U?-#HD& zeG>khLIezE38-~n`DqXAR+_){&e^u5nN%eWE&v?P2SVC$W*s3b`-*e}F|+SpiRkOb$@C_we^z#( z{InG_GNZVI#phBA;;`(z&|$aVuep}rFGTDaK^r3dGkdXf&A)Xo7MvG;Wvfj6NG|)3 z=%6KT!Jp2Nw~ORJjXakLB)LZ8gIBlZyC`&`8gZE}CUiB=JGZ&`YJHU1Zpq(^lDH$> z@vFbfjwEa?SW!e&heNql(6+c#A1v0 zW6daz@tC8>G#vpD12uqKoHRqkveMm7x;}9*BP}1`IbkEedRhK4Nz7R*PAXGMK=6RR zqM&KzOVeR0k#e#rp8cFPFLp;C5^#XYIjOE5ccXNS#HJ*`Rxv!Vcqw9YrI1Uj)pPUq@}rmk4HKvo@s z&m7vvkla149ZRvIK(4)tAvwF5@aSxVH|u_oTxMAQoS>z&4xjoW)e2a;dKcfX<~^%V zGcaC)TfcmJj-UJVzDt|`C3Cct{f^4tZ{_u59(Y$TfwNal**?oxMI02!#7FbMdakDX^R5E z`2=$sVStuRnqFI&$p?0XjJJ3`!?D_Vm?A4P2`R(b+EBZBh+HG>;8cIVL2li~DMzQq z-tQsp9(nLG8T_flvH^@RL*h(-g$Cb`+vXHktH&KS&dbl%ZOzxwyIJkdR3HU$PcDN^K4f?mK%(U3mfS$t;uxsse#~L}@$xE$k>DZgX zA3s&#bY>>)ckQREJMqxM25mk#vYu50Swhj7y!-kF`QSg>(>q;{9usUw{a`Es$N$O{RI4pYO)iSVH%3#^_G+bg`lBy+w zr9uHQByR;t-*=4h8)uJ^_b=uXWRzK#G&E6TK8pqkp58-?Yu=%z@rAOaimC8m1;9wi z^sTDCdXd9|8K^x#V>{$|YFr4&=qy^TWHsYA%gLv)(CwR( zWXj4JsZXkTdf8`WptH>)eLNk-d!FFk=`#0IiH?%jyvH6?2Ox7JX)50B+gj^*s>Ze< zC}E6m|1Cf6wbp9ahcOAy>2Zc^v@#p&qy`_4D{DF5!KS`$!^g9FFz$C)UVF2Bs*~U! z>Dyj^}@!N?_JnXJ2t@I|zQaOVo1_1Z<&{SEkPlKFK0;E}Slsoj&2(N^$#0s6<-DuyoRl{0H(?^G+hN{c-or8;~qAMQ}&Tc2TcDY?h- z`>Z+i1Ucp8T>1SLfUJO70xQ0)vp>JA{xB6j7SYC4Oqt(;)^;y<)Ey*iQ#MHq_$%w4 z=-{f)7szZ7Gdr#S_2C45@ZJYBWE#tJtKKeZdM{DZW^tdMCl%wm>rMg&c&PLtiM zxXOjP{;bo5*3Qpsr~c) zGafju;|0sut9;}&+wmUkj>bh$TY#&RNmG=MfBIpH;qaRMbd$F2$j$TFe!*>=I5BbC zi|SlarkcH0b{5DQf7?urwoktlo*(W$+#Ad7DTg9jW|TW6_j4;PWgM^g%Fm>%ZRxSn zd`dJlD(qFm%8E0$P}m9Fsk*MGEs2F9DyIj{p9k4Y(z0&MlSEDjT zIOD6eooN#w45{&g4WrRV8F8V-rLC!;<$Rjrk=0W1O@53bf|sj+`=o`KY>*v}L-dgx zp|Of~XF4-=p=RZgh6svFp<>E!gRnOIeH1W~pE87YNoix4 z6?caQgAd?AcwKxG7z2DA)eaXd*2v)m+*5HO<7bhxpm8}oAPjRejf7N!I~~v#YV!|I zi8>9%OcR)73s0n^6~ye=Cy2@IP}@CWvhmm$9-r*TtrM&Z5c)M zR;ZK0aAF;F02C@y`9)Yosfjn#v^$--R5EZW8XB^dRmx)?b~fGP)P65jxgx=KI>qP*aN$*}OiAM{i}b(}lvZT4#t?<%Y}v-j5I7ek6eh zL8gTo2?cBz2Q07%07RxaD-i`@u=&N&1dwR}^mqh@nHLG#p}*bG|4%X0x`_Z3UzNw^ zwcuky5r^;KBRhoQB#FbkWn8q0-m<8Gb0)W?{~e82ZB-81?MIv;zAxVuI57Hu{DG_> z0aY#~SLU?yNH)TJFu~5?z5Lop2r;wjAOIj%xLymXc~HO?Lq&;pDxG{G59U=rKa3QBNcgEu>5W1l&kHdCLKtXJuoNtxmU3W%1TsWE zo?Iv0oaDz+Kv{THT@(JBh7k!ZO?WyNfsG#q?R(wolB-CVLpP zKVD$1*J^)>>Q~Xw1XJ=cHvfYTKU`%r)>2amkA$+aCxQZGb)#)%CM7YoSl{5Ilou=ry-B!zLsAJ@ zL`Yl!B_T|}f_YGpaIAEmfEAC|2LWU|=z5?R3>8cA#79KEYK&SOHB2kIL|Ga|(SVA@%UM_aaXR2SuE9e43NBpzQh> z2Uu`?=A4x7ev0P$|9E`QfN3?bNH8y0+?-Oy#dkSW+nD#XRc*;@$6ZNcRo*9gJ#lV0 z5PLLZXL1S56BvKAeCXMuq6eueX;s!k_dHVT_3Pr66$Bnyt|~jMVy@2f)WDt>EF24`XxfV3*tSta1kKJQ6`J59coyr-Y-K&7ey z#ddB6he3}^*zEEaVM<|$4SHf5l5kL-{j-G4j1@vXzP(d>WqhqGbIB^9XJuxjb8-1p zDp)c+Exm<4Py522B{Vhgnta`^cO8g8L00C3v~)EZQVNPCwFKb0jBSC&Y9)1*FEiSz zon>lkl}dzO-W(cpO-qZ5MP6X^jGw*m2w0Z(_fj--U|Zc(#dW`J&A>Z%gd6V8CMRi! z8rC~PYT)5g<~#bFYm}5ZJtMXy(?yp%8>+V($zF$Fqs7D$*dG2?)Rm+h%aN#i1%tv0 zQRPPRW=RA`wq)jH|(|Hl3KRy0-ysQ10MRZ;<=H$$7 z6dd$Jjs^l>pFiKo!Qq>c!td1K^9n+|j23)+zIGg>^o$BEm#C64x1ork?T%VkM_E?{ZY|xflaJH1>_Hq0_3^uPy0ZTF=hd4~QkBZQS+;Y-VA`vV_zdJZtp zkk7mukI2c~bWE@P(#oDt0V7h7fpbpmhdl9Pv+voAJ zU^rItx9}OmEm2kV!{EjjGPaOgg9g?5+d~qame@6mwrr2{O^2uJine=!8u{5{l(Ux% zTR0d?NGM^Wq+A6BigM=qVo6DIC30ZKVxZOxM}2M6wD@AcGU2JpH~Hk!J9a15u)U!7 z2!@Jn$QqIVH|lL}hRR3YNBXHB&0B1mb^nGJXYTIrndoPYTWI*gaY`GmLQZ=7Rw)-lf^8gcY zg*HOOrFlrVBW|etM(qI6F!-SVvmF69)p|O`m?1V^31yf}axxIat49HdhLppIJeT$_ zvN+q{O~R4t-j~Zi6k3&^MG~8yI)3Z5oPS6u+%%{~(bGW4@=Y%EMK}rQfd>B!G~Jsp zn6-f8iOs_e#GZMpwxscE4~I$ma4HJf-q?G|j$l_xE&?6Um%F`=-~)S`7K#RzkUxdo zllTd%)|@*yV8zZ|)|6V^qR)003R#`?S$Gl>jdYXai4 z=(S-*W+4z0{kcyWt|z7(&&Sgl??$G1?8)3RbP#RUB`b6KE_(WR9*axdfZQiX(7q{I zTaD@elALU~N&}wQPlb44Oa+o(EF^ZTSQo-zcqbnJiA}JM;=ht&>F9&OfsYs45m0~- zks`WGSJJr~79(}ldYx^)&N`Wy4iOS9_h?JV5!KO$_;{*DcPV8qtUzExG)`?5pd?CUb_-8((GNSh-^NL~UcXBaF`0(}{ z3aBx{Y06Oa8T7-rm+kwKbWDQKODTq+v-p6Y7d(+s#MYsuOMh%`53IL}b*M}sUKg&+ zBk4dnjeizFyd03WOvNO=<7ik9Z9OhGZjdbNIeS|4P`tqRSxznrCv0DUWC%mw(KSN& zi_?Nbja|RRrC;p})n{cDlI)mXlGoBSCt0_+T$EH$kp&$TJ48UsSJW)hXH0QVC>Bm{ zts@09u^)K_I;TF41826Q)aLb4OTZ#}JN{8ngHS1-lUQ3L+)GoOPna$J<+=Pa;wB~a z!EFILuk+}7+JU-kY)Fa;*)^t#?IR!$_s>N^jom-CK>@G+usoEeeff+hA*nw3|N3R) zc!2!6hUA#_j5aUHcMuR7qZNAa-vaY<{W>Qy%kbrh)xdOyti)38NK+vZyBL|y%^iQ4{+Oa(OI-7229PwDc0ty^x>tZ8kK#xjh zU_lx|s{-`0GO1JG!gxBC7rJZ8kTxe^Wm<%(>=M3^Vu9&G9Bzj}=09Y` zHYJhzrHR`otrUQ8dpyd?!2^S9>%x1IWdqt1$@;jVo+{)X!UfT=K?j=uWIReHbshRA|!Pw*y+z@RCX7wT291O=u)gFT{ zNFLSxO*$E=@8a=bG|%pX))OTOavcCx_9RqbQg9Yoz0}uVDK{_Cj(BFn*I8tK{0+%u z0II$-#FKCP2TG3t?A^hJ1o8IOFSpC#B8q_4g_bc?sKWk^%95@Jc_b22XDQCVHV&L! zCQ3r%MKOm>mD~u(4_p~9$g%5lWJVcUW6{hWc%*oKCoZFa>#j9FN#iL>hzK#FOmcDO zP-%EwVWRpD|3D8Bjz3a2-q`z!kN<~uk&f?2Tbnw8iHsNMPM?$`SAbRGf6dd>4bEl@ z$F5%msWIUBhX?!=!iKRMepr!vGHIj`NM?vw*v;!JmVi|Cs;1Z_p z<%<>aII_BLE^;pl7y~8`#?;A94Aann=?DXp|G+n`(t0@;Cnh8hBVYFfo~&5piN#J; zu1P7^R*7i|B_wzty2!1+V{AMF^~1?K#qG5Tq*o^uWs;q-T6f20 zl)=`Mt6DuQ%gqBiND-hOd?}^WPG85Xz2iIt>`D>D)WaP~2`4gXc>_T4VR=%(s=6_& zDJc<;1GNG|Lc(+;k*tA*TA_&221D_uOlcf0amP#BI;@C^Y8AtsWDV`f-o!j$EA`0a zV%CA%Frg?-N-+MLU&cns{scP8Hm}w2jwl0vmVnihyvvFi(bVM5P0a4!@*xzV2hZA( zk5QI^g)+(AI$fEc3bND>VLJ%{+v+b6l!ZE)bLI1zY$lG^-(XvpY79VmU_mA0^KcsC zlo&{87`iWm6_*xv3^o`!QpM$k#(o?=xvL=7GnL)Qf|{*XdsO&j+jF#t4c(N{HP`(- zsKoS(~{ zsT;)J0p<_AG%}?r65M1d1H;6XvbM=_f{KeXA+>~WJQNJZ>{MEf@!iS0At9y(1Cy@< zlL1Q^^e$F59CUAl4M{!4?pf%{kp1pJULhnWDy3Vpc}A}{c2N?p4|7HpEIsm85j`MH zb;~N*UjEPGf!=5+6)2Wk)xUYL19ghWonKWaDW9T7EFKj4gsl zP;rM+S)@fb-p zBOpu4G*Lg`p9Scm;`0$w`mJSIJc(W-2w$M{c6KmdtVd}sQ3|;})rRO}#pt3UxaeGo zMaim;JgQx-inU80D0|)1Z)}7Vh^arxL{LSx@UeZ?fu71^5SAM(pmIiS3Dz_KT`zZM zVFkS1wI}w2#PGLMxSkFfKQ5%qE0=|Y=SD> zm+8v-Cij(=k*UT7#qxV&Kjg}`9A^5V{%AUAqW5Aohs1Zbr+bgQ(TC}%eLbhqoe(D; zlzWR~?FQ8k0=2NbKqtCseXp=|r5cLm%H%@a9EWYLC}11ny3xG9Rp*X66EGmGF)nYokP#0S z>>@4<%AaPcT^no|gL7xg@7mO1$tN^uc5YOjTJ2IL$4KfM7l+-=@|LkKC>CaGJ1I!B z5{F;i1&$r4gJz2HC#N3E>?vjSk|w!i9Z33FPy0xck&1;F!tboL|I{zd!nv$cL%ZI7 z2%@~!;B4$HXsQz8A?j>e>3Ke%*~Vj2%^-d|ag=1&;rQZS>V*r64>A^sr!c4S>Dalk z2Lv_vxG>pRmsRLNjGeLqlXW9f@ajQI#Plj;%0*4-A9#BMu0PiAKl??De92+|XZ zcZ=5*lroet8WuT%9S^2Sk{hyonx~7Y)z9ADv>{18sg`F#$Y)d1ogCS|i91$cQrHw2 zDIC3MmevpmW0yho7?ghmfi;G$eW}bU@LVAo*@p?^8z9e`lw@^z{<|-7c`8bIjYdY~ zcgY57Wsuzvf6duPtG@wl!2W$OdVUbj)m%2RV-=cOyq`l<@WlHMD5;bm_`szQG0-GKGu_@G&x<|M^sqY=Y}W;U5l4-Rf`lR{0*a_>L5+&8Ql*Gu+qh!euWJ`YEK#v5 zu5NQ(^?BXH_xHQ5=X&;!-Q{HF%sHQOf9~?W-)|@;gM@M9Pr`voTFIyF!y~5#C^zC? zyaeA679!X4t%gGDhmr1}hCHYrZ_L44PC3@2Fl$YlwMgBB`A*(C$Y+n zHwL3Az$8fn83g0)p^}kejn!5o7lsG7LwKKyp661)4fJsrs0W5+`mu8rUyPO$8|4PpgF&Z^|Q7PWa)HYt5}haI{dMw zTFPKDXej?+U(t)Lt%wctA@|E6KF%R|aD zAY;Rn?2OylR~Tnm%?a)c*N~4hK1-3|nX=804wIFn=PgrymD zd7uyAx6lv((9l-aQ>Wcc^(ofiR7Lndq6p}_!%X=F0|7|Aced&aeZ)%v<+%NQ0P9+p z?9-N!mk!Rp4HDB%f3up?uhEuK}XyUQ1SwbTcrFdh3fcYJGr+$!+_LeA7%#YU#2Qos=8(ZR~2bOV-1`+r9#?b{1DbHVoeyAP!H-Tez{1j{)HM?ky5n$ za!a}x4l7AL0Zm#ADg*rW4Vs+cC=AmvjZA|2e`eD_6TkuEdkl|#m}I3ZPUQ1}WcXQC zH>SZDD9st*waHeP`6eMoOsbFMo(k4<4$Y7+9TclcCHm|mJG#Jlq^cUCyx50>St;s) zPxD0BZH3y^$=DzToZgRRh{3klMyrZy|kI0}$ZRGQLX zzoD!tj-Vbp7pbyY(VLu2`&>Atyt%iOj&u%55YRHl`1&dVKn618j|?T(4F8%rvAlo@5{#aWM~aM&Ba(b`$# zB42N zY~sm_^H^uBXumu$j>N07?1ioAZhgbTZ0fR#ZN#AoM^DDZNEkn_MH^kRQ=l+ct9Gia zoZq49jKAiM4sql&=4?=}{JD-c63WYQ&3L`|uoca)<{%xDu2~06GMObQ%40jav!FtT zhUjU{NHHcK^q2emBp$f!P0p4|MwM_Jmw^m`KNP*uK{3rM$13Gw#=Y}hdp^dHyn0B% zOabd}ndAVm1k~y{_&J8d{*G`O^cM0*x7>6NE~`~rMz<}gOy*La$v`RuC(9XYF}WCK zOEND*S`ii277_NbMsJc?qoMb68Bu3iWJW$UMCwa^x!I(6tHf9XF;qeHADDLnBHg1A z(@ATTN4m2Eo&LtDbdoz{^+@DN>$*QPr&*xT+}|v1FelK!BfS(A}Pe@NRSba;*H@-5sV=yoEbfoB#{cmQ{UT{{vmTn zx~`aKYuWdRx$&*6wD#GF6#NLGKm;fi*TEKb^7pEH`7=a=vb~!5xGDr^IrL)u-^b6< zc=E(Bvhtmd6iwjOj?gQIMg`WEa4;b};4#K4jP1vX?I&#Ab;_aZ*YJN%fAfnhb_9PHE;>sCLJRFhn6;VVq(r_=67@B_LcN~IqJ{u*HMX>MaeUm1rOa7d1g zA=t*7^dQjbBy$&?jq4_|(?1cnvtT!H)M(Yl?9Y7bz)s z^j432U&lI;ne>gK>}C2=w7ui1BG%o21_iqRPhH2lI7krX@oKriBf}k7qdmGTGu1eK zPW&MQ>J{nGWjmfM|LrHa6G)`NM~dnDBMLYn`GRnR*g85drRx+Uku;p`*OD1cg0Ng> z43%fJndN?X+&Zkp7+U^b1l8ng7k7#6DE{Fow}raaXrkwC4=fSvvfNDKBhFy2bPcol zHI2f>^=0`~Gq5hm8)XB1(p^OmE58pfRC#Ucm2`l`NsB71kbVRw%YGzuVG5>}U`aJG z->0rKYrJf$BH;nP+#f4U#d3@#_zw{CsPZnXFdpk;olUY!#DV03CosrEYia*LF~mQb zlTWV5wJuOvG+y!vC)*4KW4t*~`E@$KHN&k9gJKMpW827@_mvZFu(Ud>1zG;=nBM|THRuBl- z1ritdjQC56!+6);v>$(wsybV<&LXXBlR$PpJY+(g;6)H22l+xdq z!@-))V17N0(ff9^m1W|`%HlCZv_96Ho=OaCFfyCHTRcOVB=oRVKmY1Nu&t^tx3r2@ zehzk{3Xw{BG&t(L)+@>fEa{_U_E2@<(N~FvQ+14Fb1ErjNos(5fW3x+B11AsmbJ<` zb!{_s_t7Y=l}q38Mdm>*;2Ar8+HJnS83H}8)t-S_<99A_QKTV{iklxjtYnzkP)~dP z_I32bR1P`28n)Mfm_lxo846kd)h<|`pibh7}x<6g6W6V&13lb%Tq{%Mc*ituRJj# zY6|5f@TyB#R*Y<>3+{UKZCcC^vg8VHE+iufD9{s*exWP&7GMFgpRP);)Hjo6VpFn*@6o=>iV|dhqc^5=X2aWnBYb5c zZN1i&g?dt)hu00NAZdgY(!5cLup!U!7o^TT@<}BYB}&W2)ijOPx~S#@uzF@ZraQK7 zo~%>pfX^#96iFww3HN&{jiU@6QuuJM<`^tcyG1;&cRhV88Q7 zDHPuocxfjz=fj!RTg}d#hZKoVKLfQoK2Zkw#E`XVL}MULCKRgU1h$IId^mc#O6o^< z9puTw5+0!7HUenNW3&xF+vs}R81qyT{Y3IYUSzs1*;oh|b5qkF_DaSIrPj-?`d zN>a#4iYwhnY&uKt6KE+X*G&dImY3R`3V<1Ge9|a6pqVSZhNK+>x`Y*YJ_9yN!C-#3}mPXC9VI)NT)QB?9l_WxKHQ%%`Ph6B!tkw zwv1sW=cQ~JMT@Ha9a))YZAwtmlrPhbPb*ki#S>^}Ai2->keg~;kPedHA`nJofJDAU zlT3u?em(Dh%cILDNS}$_iM+M-NIXb6-Z>`&Y%<> z4>*@(A7YIK(R)GAo86HAa9~7eDAObr)x)cYVgSqPdHypQ%GtBXslCOObX^+Pj3o;| z-UlAi1>E(jVkHR;Aj`|xm49DX>j}K`K%s_CEb=)#jWR$0=ekzWH}NVwgECRu32pJb*3fB ztJCD?K1}^bCDublm`@rI`~mlyF4E$_DeF^lXVf$P`(*ihHc@~-U>gcis9xGVlo41z z461uGQ(oOvQesvi3=#EE+h$PeV@r;>>)V@rh#M&7=6o%E73Pw z)i;|Xp1NW8<59RfN$&Kf1FbTCD}WZAX-ZY)>|1IG2wuuC4=4em!jHU>DX1i1i*pC$ zXSQ_bW`jhgFfXU(Q)-JMFMnpd*hhd-q8OK)K(imb7C~QR8V?>{5?wn?<|yUQ(+25j zPjKZ!>eD$}7>o?c(`P-k{$9o~ zQ<<(?c?sH)CTYellU-0y10m*m4L?0ySMyu{25j4TQKr#82B;&1g{c1o_RL`f)EZ(y z-v}cQWrO`XpV|m$E%0XY*g&}!ewygOf_yJw17Kcb20A!FD?=eMIu)oo|1gO#%nO~1 zn(TrMRb}zXWs|7dVRE@~QLP-D!ysrq_GA+gwebQ9r+`MTi6y|l8w>Phk@$xNo~k5- zmw6Gi211^mFIX6mr12#`~A!#F;y+Ud$|2wV8eXp*$ZtRqqeBCx(<54#=37 zqEuCgidxOeubmu0q{p=_lI%YDiRklnNW6ht+R{H33JyfogHx*0Cr^*%4JJ*aoi3<} zn4Is(;@?!x>a0%Uapq;l&_ZH2 zD*2SDy0oc~xwylEx6?_2Bxr4OH2-dsg{?|wI2PvbS)^;^sj>2>Nvu6*YT(Zk`3i^$ zC1>00;M$y~|2-AIR==kAdd@Ry$vBQ)%k0`MSIw6C{wrr_a}%l;IQIBaOJfYmwDhNG z|J&2l3$54s5+_GyWCL`im85H5^s97vqDuZ%uTk}X!%_OUE~TsAa4u@9vu<0#7Q*;2 z#|s=v(z`6(`bEJg@=`Xl^}$Hk`r&G?ZClsO55t+@#hLTT@(vJpo07$BQwRIisia20 z1!Xvl^JpTK`=)CqY+60pUE&vY_+No~)+5)I2UxY-drCju93UvN- zNl!9`zkHbaz%P5uH8x5N**G)oF5~aH@{frP(^!uT)g2T>IE)@?klWkwvEaOv|}FoU#CYBUBu`3xH-$@CNz*3 zv6u6txw0cE0Rl%lE9rI49R~r5&%8iAE@^VjVE^_)j!@lt`q0y69i~aRG=v5>=ww$luZj%feUL( z7Zy4|#&x5NTiY#5t2B~Wjt$2F-WL0fQ&)T#Wo+%0(xrH=W$sepFHvd@L2@mtSwGWbJjs|eLmpY*|_e}O-Yin z0Gt-P^Cv$Z3jxg@TX&M&b*X&1P)-dw%NF-}YdP2rs&^`4uLwKP@N`drkEj2OG%}Ut z_sggw(8=NVN7ivOTM%zFmWtiE0(<>P^U72-s-rGSex!L`&bFLN1%!|CFKmoQCSE2Z zYRm*}!_}Nx?I3v+6a)2Nz?=@E45=LkITs$(KQ0Q`8XIRSwYCgiUXI64FhaX*sQo~h zdQ4f>l8J7-g*@LXUSA8j(lK2#qdU^gH*Jj%+l@6P_*HWA*ws%|$MV!XIH>?yG|Wd8 zb0m8q$An2(ekrnk$^(cZ>zc)1+l}e2vzBEwu2w&MV4G}8kHrpSrgc=taplWQzA}5h z+&4t^Ej&_?E45t;%=B1i!{#BG#-3r=W_Oi&Ah89W46khC0QJeXL4gGhoD2CAB_?t* zUfJ9lh+nG#ZeqFoGM7A5=jYXOm;?xm?pQk+YMLYTRElNheqIStSx9EDw@#LEjhG2O z#eVewZdbl|3HI99k|jICBuAq~`OHL08bZMcoV4M~c+44b3d{(|<$XD|5XAj{l0q5S z8!Pe(!6E_e!lGoRw%5cNRqhy;tl~-%Y1SM4VA7N&hTM>@w0gAI4ZL zke};p&FqNpV0cQzQShp z9zyUrWH$b4TYN(PGM5n=8?ZJc@o#wwQ9a|8IlU>?#tOBpy-V${7?<_yyzDAtC#EFI zDBK>kW~DS%D6W>`OK63BJ<(m;@D{s}KkmqpjSg@+K6z_i<%cmO@2wYceI5FtL0K`C z-dSL+q@VJma@qVCnRAENLBL5pLwaVgM1c&>R8K?>SF(Cer8(((2}aGu3~C@l29kiZ zq~2jp1y4dgm*y*aq4GKE>N>3o9-qLtd#_d}Z^^}x;IK&A#AJ6As#2CGx->^aZ#W*& z&tsWRsMljW4*e*PYJL9*9~3F#vzb#+E>vPMVp}0l@&ul?nh8b2vPaiM2o0O?$_6ya zfWq^U)X`wY0@tQ;gsH(u%R-6^07>MXh8o>Cy{NX3S7T+8$~dGH40=F*T+Od7yny!! zw9aB`7wyGc3l%q?%s@(Wx4X4eY@+^AkFc8}<+K(Bvq%<44 zAvs)fl6>&VKUOMmjOMoJjhVbl@nv#kIsaSPY&}$}XVc=0a%#Ff6W(92@-smuIqH6>S^VhyYIq zfY_925N{R8WB)5PqisHhtAsV5I(0{GxPV+Z11JZZ z&3Ot$SFUU06=r@SJ4 zFT(Zsr9oHca|p<>3ur{dKtTk_!&Zk~35RIgIt3!cYEOXa0DDELY4e_;)jw*h~lgzGVm4KlxS z@Bum5C3BZ(&`LYa8*U&qfazt&1aV-)l}C;*?TJX?G;aFzL=p%u<+Z?gr0efMg}gSE zer!n_M4=d2%|@x4-!UiN7+WA4`^(T}M8y9slKL@{Rz()A`&wJ9Ymd5QNXGS*?JJn! ztclSLaRyGr$q2t|jJ<_wIz#(PflO~^gZO*W%rkqR;P3oOI2Io&U2M#{){M);BQb>27A9H_4-K?MPo4f9_i7iy{;4opB;cZDgU6f zZ+}?!Yoe85{N-}q>K3p2h=$>DoGEp^+w^!odJ7?q^@Fg(31|XR^alp=oT+$W`{M|K z8OCRC()`qb*-@&vUU~jpjsjAUx3Y ziQ^URhy^{PVr>pGZYsPICf$w zJ+gRIpvTDteq#l%<})TWU>3-Yb=h*yH#O}0V}sTVvajb#PcJCk^%7rhy`gA6qchKa zrSemC$B^dAe&gxA-nfUbQyxc_(@tKFbm;G;Qgo{=xYN^;yTUlNkj?wZyspF6kFl&Y z`8SVrP)8apYi6@|)y;bjK{eV0uf=@y)%qc5evH_~I~e|Vip+cSbfYeTB|L0@S49w% zewdW!+in@DGLj|J1Ao7z@%;pOUPVQ>T|;9azI92qz1}=`ryNkR`yHDZtg>6JeQ{?k z%9>&sb2%B8SNoV;;v8lQTf7_&=axwQ`R31>VedK2chXvUhIOSKp;Z16u3>_Ho#W)( zp)b;V1VIjh zJL!xd1NSHAQ>UOPV>yBi3l1V#9JV@$sl9TsA?M!+a@_K#QW46w2$%sX?piHdM_c0y zn(0xbQ!L=O|0e$)Ow$5_k3ZZ7&n`*{+2+;u#wm38Idx$THCS|=xg9m}#=rUi6vbHk z^D_Qs!~MxmU*DZatgXs{J+E7}z>TJIA8$Cux5beVlR&LSX(tyjnuF3+^l2 z?=m!-n>DDxTBR@JpqM_2OP7bDUu|XH?wT&YHOhUtJM9Xm*uRK$g?x>Pvj({#qQE)f zE~WYE3|w)$wN2<7mB82-iQgwcf61^t?1q|xx!ldNlQ+89lXC``zsE4WjvD!QgG6tW zFqI)fWXN`Aq_u&yJou1MMM%N+<9iEOS6#=k*@W~ zFAL<~eXVucn@wj3f;J@4d~(he*2DL*iH*e>?BAfVyOh1$ZW|%@#gb&J``2%-<2AS` zYOa47$^<`DYPtKda@cT(9CB=;j7f{G9&RjjsV=l^O{X#5Yu?qM57XF5fr8_|w;l6Q zVQ)OwE+g{Peym-u-v3kAHT*_K)%f9dKt5|7r(`Iv145WjWAy4zI7Q0siHB%B#(i=uM9uZ00vO6%5 zGEaB|<8N2W6BEpLNwR2)aOyx8&8FP^)%hJ=@%n~eT_Pd)(WC*c(e}7RS&?rTD?=B5A}F*!RY>!2r?CcUO2Ffm-E}-i<1E*(&rBO z=P>y%m9Mk7gmVgH%@X5am026FwM}T8^Z3CZuaZmhh@CaJN*zhDX0uv&&0mT*m1^S1 zmJ&QwZQ$~k+XDMEJ0oHUW!jzj^3)2x7|SC1WL>4a)ne4w@-1%elb;K@N!3!0&$`Z6 zi{!-y!3{l{Db@gXJvaHal$EkcX#k66sWD`hwgO2ons1{;L*^~x&I~5ob3Qc_(4FAG ztaSs}SS|`LoL(

    7+^7xAJpC%XdN9sFv~5i8de-+H)tKDvTf3A3*;u&~TCZ4{@X9 zyw2Pw#zyfS$f~W~DAlwP$*i@oc1lJp7xLf5yo3Y{V z?@M4s%r1U6$-Fj^wFbp#Q2|S6_b!lzcjW7~3(K=R6e=9(ps&D!DM^7vMxW`DeG{*_ zy{_nCOxn74dHu#wt2dyQbkt?-B*=et%l#Ws@&PKCB_GUz1V`>F zRC<8NCd)cEi6q^;`TFoDD)Hq(871%44`p@A^%J@JL3`)s{qkEWv7UFlJb6(xkSSl$ zoiCS^$ehicgRaqpzUKh3Cx_?A{OG)1{|oC5@zJaX%g7)*^ZMfyhDY!Nq#| z?g%MndF3Wnd_6b?&Id9(zn2>+m7SSE@ny)p^8wUb5d3B5w5~CrHIc0QX#3e&6aRN*A z$TPPvz+18~KZ|$stc>*nCGBDCEE(IdOsb>qv)K^E59m zKixrT$K&nplBuN)x;sIi_++kVn@3MC3YfcXO?dG33RYIVrD`4=;URgi!dO>@o`kE`}_hEWI2pCHbolUgLW9h2g(X(C_=5(A$lK4UL zsUHi=zObUV^p(98^3y2ywc6fMTcZcxo-qnr`#30lS6iOSueq`ygW?tE%&7zVsiq3~Xar*E{js zy4SIJzg5)M_n2+dOyL!ojirO-i#bePK|#@5jcbvEX~0Ax4R^o7q@wR7%FI;RJVh~C zKlQUt)p8UsepfD7Bj0KG_I`3?zx;ax<6d;NW(|h3e6*4qmIX?2`{sQL4P>=sP@`fY ztZv2gGCkx%3Gyb$y!+(THd%EK3^iSfg2~rYFoML!YD&9g`rt!3^ zL90nvrt_~*8qwQ}wbR);zYiEbVASN8x4Yzj<_Dl<<7GaWWD6zgIkQBYY2@<7a2=A` zh3MR?t~2S0^|EY)e9)l@Z&Z}3VBj7ib402LMXi@x*e{rGdm}H{r${;m)4aIPuIPEN zSdVIlw0(;;yq|rz^<9yUO3HNk!bjf{oNd)QmP2#oh0%&KMpu_=#y)%QS6O5*<>5ir zM^W7p-pTS;-8K~n#8|`nG=7A@l_?KZN^dHb#gX>pfFxk9Dc{Z(! znsg*BiU5DUqq;rT=Am3>p9B$rA>Ajor zo0}qo4Vbw!@c12JDPwt7U{*YiaG^GA15OCb?q%vMvz|(U-+AO4l5;^Rx(y~i*(UPh zJccE48*ADTD_$SCP+nEoR33Y%^3F($yW4O~5kFQ`F1*4#lh6Adtl~_D8gmE=(o~y9 z4Of$A$+_dCVU;Y{p-{KF7ITtJs8AfO9TH=&TvZP96k!Wpl|2XHlwBNUA~3H7YQaKR z%C;k&*Bz3Md|+|Lgz>D-iRYxRoZE*wVuvyjD2WTERp{o6sG4;xiOv<$ix|g?Ib|3WDlNCGP3&NmK_k3OZCJU zB>OOXrqRi-YEvDhFfwNo*6CQqZz7PXw&ydVw8wen-^GC^UHt4WB46qw#~0Z`CIm3d zWBY8@qN*N;X=A6}O$NBmqtm|qD6g3_lXqr$%s+zrmU}QNUtZeK#bS`#wAfNMl58Aq zV!8%I-7RWAAOtvA-N6Tp*_tiIsfE)$kTO+M9$w>P)nWO2apxQ~RrBP=kn~%~C`CgK zSwERSXRN|G3-lgV0RXbzM_h|*1J_K^K*j0MvhtK#$;GLRz71TSu&o3(KB+iY#sP*3s(JvHDQyPVCYxBvfK@NV zKC(SavY(RckIJya?A^Jk;_H+V8)Qd@j6Wx~3yp0^mcV)*kae{k8XFtjwptLsQ2bj@Obx&Bftn<>bk8_qizVfQ4_*m#gUQl@~^W zs;YzjnSvz3pI1+i7b;}%VLF9Y-yDXo4BMM}D_%#?IxpCYR+yGycXq+$JwtIMy5@$^ z&#QcIa_mx@)v+nLFbujG3&;S>p_1^RTiGU%4v^}HScd#o0%zw6<1I!m@{s(+!={KUamde9T0M{?pa7wV80;)j%!f(k@bmmWV@F60%o_^IUq77zT0h>pB}=W;`FF{KlVe>JuQi!Rh-qTnB|$m! zv@FFT3Ea6(KlQniB)|CzRfVujGa**yy;_FJT}$QR34vix>bRd?srows5N zi`&9d+$yPQ(r^&V!13!BOge6MxaqLXtH}ZerEebV^MA%j+qr@2iD)>=_6&6dCyyf` z91dLeBA-z+wzfk)4QjIMFHe1NEiQ`-BsP}v<;Butm_SZik>l8$(!!;Ox5)6T;cfBy zqsfW#D4pzbe}C|kb#h-bXudtRt|VLdbOf(49N1f};0dg*`+Qjf1DvFv8_S>Nj#x;H zYRP}gtiNcH3p}z%{`eQhY*(Qi9vD0O35Ds<3Iq`w;h?%mg z%$kfF(??qcdZ|kWu58x}j-cE}|1b?7e>iK&uoGXRo+y+1N!RA+i+M6MQ*v=cFOn+? zaK-q_Sonv)eid)z8Rk!m{T8nczMqyq+1nwv&Wrt)0zoQnMR>6kJPa`WLjBgpQjk}hv?V}O1fVH9vyTx|MyQagj-$Y zzNI1Du|v4~OE~_#^t=DVghp)@@*!XwpF}sv`>!kBj#-$oO|kdCxQ#iUDF0ksFJI^i zJXmKfaq8bcUkR~;);${)+Vpy{rYKjJ$^9c$CA*@%V@i3`dKrMTStqWQ<_7JgP-A$> zd6I0()B)C^8okT@6?g>Q8x-Mw%+n4)cq0{nrZ=T|fwrv1$7kbY!x|^6E7@1}XxqEG z6(){i!Tz{}2@ia68yEQ3Cs)YvMbaTQ!k`omV(GX3_O`?a$oZ7DC`fD%^<{7OHUN(} zyB~Xv6ct2%EZDg(F4iVryh*M(S5{ubx&YQPW`q2;RhyLmG}OwBrL{{kSvDz|$%oa}$LQ>r>@vx;JQX*vlYaI_%d4x(hfU2E9o3piW*i@Zn~~ z^S42bvVH~6wEeD^=Jz^rnLNGEv~P%)%H1~4Y0%;?1K!h{+uZW+=lR^7w_8m@Ceqk2 zPMmbJ%Fp*$>q>RAZ%bvVb|o0|E6iXr<7xc7OW5iEXjXhI!OY#m<$i4&JW;eVz50Q@ z_HsY5C^0VOWqB#fLY+`&7s1;%C_e^_+;nS!-iBvvxI)gs#|qg;)8oL6^GTM@)D!2P zjD~lKlk`l+EefKKDrYpUx7Tjer-{1|tq6bgssf{IDZiUONqz_DkXBE$#kuczUrO^7 z=lT4VtTiHxFK5uxOVBeq()rs%GQuT;He=lDpLtx(Md&i_{p%Q=>~H7h zJ3R$;^63C9EgyRH67t9(Z)F_PORIBXH@FK}y6?`sY;&$a3F8^C%D~$}E)Gj2D_^$LosKu2opsCvQo9hRh{1Yt1UtP18J^ zDY)cWjbR?|uY})xukMlDHy)O$qv)-x|8Kt3l*sjO8^c|ck#?95WTe`w?&3pzU2vaDI98thDIm3OYAE-eSnp)pSl=cLi}E3g z=or}8J6CcXOg#P>^dZl$mWGw`P=U4Ft8cMM;$Hk*5$Ov$qfTn{^J>b(VfjJO+rtz`-!3xisbgn%LctP%1UW%(z4>9RDGIC$d%}GNf!c4!tq; z95rMl1)jZ9QvWI+4qS~NiXh+>o6wdDY^iAU#7pVorgyp1L+9H(QR52kB`@8pwtwNd z)()rcuO%87y)^qoOwRtjM6SU@^L?8^9W9L=FWa{~(iF;=9dtFUtmXp!WS8h?dcjP6_ z8a;m{p1NdI@PXhJJZVO!1xp0G>@(74@{%Dh&hET!pX8*=nlMG2Jy+HZ?a?#|jN% zzm8Y`Fa>lq>H<@dOhv2+_X3kJ>V%fLss|@%ovhPKI?Q0dpqz;qx~terbOHy zGPSh{a%n*NeyaGIw$awL$-0{Ulh?CbQ?+j$w4Tk-HS#aSS5L}|IpitnYURSBPI>Ao ze6JIWtRG_3Jg7Sk`a0GxIrs+iNoD^755@)^MW>u`CLO#aqis!6|99g!x#{(lbX5O9 zO}I|F^W?2yEU(CW+P-#QEn8BeSJ2rxo2}8kTbipocNf}x#(_QZZJlI{Hy5TULS@%! zW6vm=+8!Ng$akx?xIFV57RR@bo4#a)`iAITkhWAgIgVj`F^hF)#JxMbb9V8NW=*cd;5iN`+U1;NSWstkp{h4bs?>zVVPx%aX%#WuqLsndM{@=9lUKhHsW3 ze*lpSx_uF}ZS(^w%f#yf3nOA~LIp37CCvoR9* zO0VG?>kO*M%@dbkzR(xF&gSX9277$XGCekVq5^QfKG{+(eh>)e2k~%4NY^=fF3{WL zJey{=&ZYcwn*;FldUT_roS1aPIK`yT%FK| z|N7+vD?NovJd@w3q=IZ*`?2CEV`#w+h5V&%mS~N6I6-}q>s#eWJJgwhv_w83U;jb% zO=zN{!+R~hHC6$6rhq)B)@t*&mRZClq+LRC{AyYEMc_XXeICEOS+B)=(uR)=Hi7GN zr_TT`${jWQ*LxfB6V#PBhR;~V9`96+62{|pm*hMyzkbXq@OwQUaMy?%E&&4a@6*gj z6BXsTW1#%=8X{DP;0~J`H3dWS-n=qda!^_-8`g2QQp;rTm-)4gj$`jE6}?P-QSt|o z(LiX-GM!1Sn2CyhG_S~iytZKUCOY`1^Hw)c=FxXWlq?FMSUA`A5JuD|Kbp~R2l1T$ z%8||AF*h>{=&d3@EekJ{zy!&?L_RNTPy!5zzg{hN52Sx6kB`AUfE2?o{r@aqPLRoP zfm-(F0jL-r#{Ic`V2b8RW5l;@zDWgRk&Opt+qfzNafj8!!L36BL6kPOjNr z;-Ox9PiF2St*^U}!4_07Uzj7V0WxQp{0j_HU|>Lh z`c$#J_>A1B*xD~I;(`pjLj2o><2Dqn?=R-{k$oGWv<-CB_m9-ds?VAD&tJ3FtNxmx zzIyd}tQmVSaPFsCBK@jDv#@vE!G}&Xn$XL~vY*A*@SK+%Bf*HWI;yIx!V($JNB*;( zSi-JYJ7Zrz+SL>=aN89PG4d0yjEfj&M0We3hSQgQAxqx)gx?Bt3R!(J_0s+8x$l!2 z;(uInHjjtB=y#WhCLelkvd#^v5qf_q_l?xaBTF1F7#|u+>KQpxPl1T`w21hoOTVkEe`NE0>K%|0NWs<8Z-zBO>1HW+ zlMe2FM2B$8GUksJf#s~*eDWGly@ciD=j4E`-66g6AO4Nu8Fn!=v+xvH|DT@M9})E8 z5~M6haVg8N*Q!=-bU1#MTZ?~(|Nqb0t8m~zMcJ#S&{5_KRRVj1p<6G zmIYxjp~pl?vZ00zR7!2%JMwWSf3^Dmmd|A<4~XPpAz)xa_C4@D;*T{QsDQT~l0w!y z6SB{qSjt=j)~3i(jfNX^D#%Ts6+t~45v<6Fr5k}_TPz3{j~n(zW>TLHG8c)Zk-8CF zqFs=mWNm=;1aRpd253GJR#N>FL90%AL;hT{Y( zeLN72$-h{=%EQl4Gh7JijhiLft`^tgNWkZK60d0ui_+Q8-s z@WU=;?F}WKm;)li8|M4`F3XjA5KG+(46xmHt&>0bHq3RZMQN(lIw3v6C`~D`MNuUL zp16zlHB1c4B*0HlK89naD}tkYFv0GI2#yQn7~>!Z^Lwi6RP}(0ENL30-48T$>Exmz5eV{4SkRa%CW{Tl zcxZ!%`@}F>_d%xcN&u6%ODJqd1QU#|i&fjLo6^d50b-jgauFPsR3 zsQdU@|M$>7VKyQM3S$*1lsW8OY?%$K-Em(9RoRYuS=Txjdku~={YKXuP_{I}S>4xW zL*dM_Y4R#7pqUtNFSVb@X1T&OZ$D81;(|NlB>O|={`f?9SK@JF!!^}PFh#M5I#4J~ z(Vpp>dip2~p6u#?zp1(@qLutA<#lIPAfuz>j@eC&N3?8QlR1TrLQA0bZxa|}@06Oc zE@-Z0=eXY`?gZG=m8c?dr2LtGWvnI_4~aDu6L)nlK+PtTvRR<}MHfH=5FMxDb+TNv zhxq+XGn+2xJuStl>=%YKp0Du}Bja5(REB*$pKGCQHlL6E1u=uJQ`O4*ptQ(zE_nj9 zxA3fpf!X}_pCFCTrehwisa_cTARu5R1w(_@f$e=FRrQ7}aimh@2RIFv_R-{Ol|1CA zpv(pT#Hn~JQ&!XZLUI+ff>cvOP9+QM^|()Qu#&~*eQU^%x{tA^J??Gfce-8dW7TgD z?>gjyos_d^8VrS)4{wh|{@n&iQtx}e9`&&i*m_W1K>>s@UTb&%+1w2GC)Y6u%7?^R z!ZUTPFy|*%C|w)&ht`#lyUj$!#-B{p$NmdCM?P;4$qy?nx!Io#B50|Nz`(E=8>clK8%T>b4?2A z+aKG!O~VS=x->hn>h^N=cq&)~Z(#8( zYJ*e*Q?MlTRV{JYOQ9oCf=YHas*Q}3FRYfN(ZTSMHDOaChQYyCryQP+WR(*_d_ofr z!%$n`Jd7mw)+CWmTh;$R@W$-crW#PxjD z3(C4{V_UifsS{BbN9@Cq3^fb< zk+86z0CN|%*4XOPlELgLFT8d$V%xbfJ1;GnehW$qXXra3z2HiPGP1r(TWhIlrvcaK zeUc=T=}TfADCIUDkUZ_=hxD+<#bqVnl2GR5oW%d|1;~E}l0({|0c97vjP((yGp~tn zaqvmysN@Mb7U}1~D?m}4o$U!l5I*0+_0FVYJbGimnW^9cW;PHFb($oW(J7_F%V7}PKR?l#xNLT>Lr`vn4 zM{kb94hm;&ko56%da9hh9t#CG0OABn!A?%VoE_hIeX@L!=28)ox~9E=jm!pT%k{|! zc5z~1ci`Z*K1+oOGZZ|XM$p+ipeeqBvY+O)rPO67piz zS6fw!EqVuUHSFs72mujzBl^%fUZ0+7cSlaT&rtVln&DDdR#1jhObo2ZbYU|*;oLw9 z=uw}2O*Jkj88UeER6&*4W=4wfSt=);CN3qd0-K5g7yQ9^rZYIi`tKn&v{$jqm2j15 z2!#y8v1$W720`!fkLcpX6_KIPl?GEu+;}~K_v2}J?Rv4PhW@)@!4irZLmDinrK$?xD*T0r)5ueCY3 z@!O1SmMu0R@{qRp1s0{Xe49bT3WI>hrj;AZlBLJ=c*qkJM;TyetjDDtoEb$5q1KYzd8(z9R2a!DvGqrf6I@42mhQ(d^>;uT^Jc0T&eJloQZ3@E~ z@Q=I>>p-@TTqEBOTRj(p!t`wDRP(^{?5a@U7_cM!P(dfva-=U)frmiG|bfQHsfoi(M8@I8d$jp@i8SJBEKC9{9DB) zBB{(zoqeBlyGR#)oJ{*7RY@WmAXO;4%}r805F?y+`e|rurLPoXL=lI=al*dLOXeY9 z@C!!fIthjXR#rOKQn=Q04G_;6Jd?kIIeW>Q&r(r3c6mljTt|A)dgp;Z zqeZmWk88y}#RI7{>jVotClRt{d~uqpB{e4^;D728*#Vrv9CX1z|Miw9q5h{VCjn-- z|GRP-RT^y=KZ%PZ$I>{-l)xL;SJD~}#H(|JNg@q^!{nYsE%tXRmI3f+Y#(Df1M_{0QAj`J}WNa$KfGFjF3dQSp46Lc0* zLHz??JST&~!r~&NQH|T3^0zF!cTRA)eu*VRh@4^fA36IMj%bh1{g!cWzAd1J$RJ(6 zu`eeoS?RXE>^#4m*OwSr4+P`KERIZ7SEC;xQ@yc(8O?5dB!NRKO!abHzLVxmPd%M! zL7(|N+7zbTo`daxjTFRyH8#KT2IsC1Y?iSFBZr@5ev(R$A$1EagI1r zHcK7Ucddy9E%lBP*qDiZfxOr+(vvoWZ}$3JoblAY#*zbqOU6iYVlf3o4GmQ1|J!nJsOJ#u-NmM+vSL84+`KLj9K1<8xC8J>+Qt zQo&+xjHCjCsDQg37Y)x6Ppvk-eq&+)qr2dt_aWcXv zhYSO|MRenlb;Y<}a-Pvuw~N-xlW{!VuQ@xgj7d))iTr}wT0x`!QMMf3@AoHeluJ)>SNAG7WFi#z+r+W|Im- zP(h{?D=G^qFge~wo=h*j4@NOP9S)Z&h{{n$074?q_^l8{EPn8kT->52SL6e^z-hi4 zXB^AyJ+kX_xvvjRDq*>Rw5ME}Z8ZpfH1OQqKWAdXDQIE*$wskbtWyb%8nf~BmS0-TB-GclntrHu83Ipf~HBWS> zDv&9mbOUvoJ?~VJ86V%8SXM}KhA5YxADg4iqPzOC z;G((NSP?C{f0xlPrSV%s+X0&M3dx=l?Gva6(;A+3NcH`^r+6 ztSNy4DC}NiCMGrJXYrvrNk*d?)1qRdU_cVeTsU%JtNURxh3I?-W|d)_to$rO6}W@Q z&@!4Fm`Lm7XJx|#qwK^_rpv9UC)&A$kPL1N9Yn3~7N2>J2Xj5dl zw6C_IeNW62sA{5_n6s0y?t*52_K}Zv&A)|zR z3Wo@}ufVRp^&89B<67vQo$6xM5St?<^-x*=xZDQ|jiae(b5dexPPe8O<2F86h@l`t zLGze=9FtI#D?g?f`Gz#583)T^1iytKmVwfGNW|Mqj~_Og(ri9^S2e)_76hUY@@`~@ z8qwZF3B?zgD$6qoyw5FaS(qjZoGwiw`kNjn9bCT4LP#1;)uzHZO+nr(Avj83J64fOJ+<>bJ5oj28-(1Gqh{ z_mDQ3KcB0W@I58A0Rtix_$Ei8BCgA=D|eCa2e46t2_<7uLvk&3s&RjzIw!nKs0S)D zE3h-S@%l786Vg*MEC(O0*U3j)x1?3505rm23E%! zTbxe1<2Ai0i8fwsQ&|ctB=8viQC8(^g_4o3gi-{$QkWN@gi3YS)pYV|KCj_)$TPa0#K|VS zG0O$J4#PDrU)NgL>fdENlO`aAgS9fgL^ftybCb!YRTa$ckJ&MTPARRyFb1uSY-RTz z#m-(`nN9W->n1PK5KlEJ#d?%DUI9tQqI?;asq@qqX>L}8wU^Y7qXe#M&Ipow-FM>p zO^<7FI5gk$hXTrY-SYzgQU0D+>2PprGuYtb5o6OXP?N_QcI2Fw|W{FYo=An^lXo8>+`YFix+I=9FyWe6l%2#mcZ#y^qr z#Xt1+e+RQ+_3Q^_-b>FKL1W_ED0clM4k&fxYa<^w8Ma>3gh@!HR zRVMLRU2&Q{HYSxAI~?+QF=0zco-y6S0Z`1~TO)y3xkJHf98`h}f-FKNZ{U&wHc2c( z*zbV45hsuF^`|9{vrm&I1x1d?Rpu{HXh_Tu2W_e1Ab;2R#vwOBe*kr0Nj@u?PqP3$WvzjV)?NT$!`+*prW7=H<77KclKPPTnwH8Elj^wE~6kI)x5> zZBZx@e{DC(kQ-mWTXcE)65e5#yLCpWpQk$H_yC%forPYFLlp@TA=$~`!F zDvyeQfZH#XyK>A&lH{J0({;wz3Z2fVfkVnKpD3>4?esR21MWTf+F=~3V9}r&c$(ZM z3u8_)hl$fkE(yL-Ts(}FEU(t1?800o)s*)gS{iT8C1?Dd#j|Bo{ZazV5)!PGPZTQ2 zgRqkda3M*%9Y`Dz~=pnG~3`m1JiU(vt}Z>BG#P$IX0RCM#W?A<)}yferx>R_n-IqgXg%jXJ+ra ztb3JfU6SkAuhgYCvRix5an>Z49xzvw8PmGO zkCPLY#F3|<%3&|(;k!88=f;QUb|b#VlJ=-}onTj6Bf5vGD|LfVKB3u|k=c^w-Y8)Q z*%tSmyUCf6#qzn0Ze+tikMxN1BIwQm9gtp5<=~L-5DsOtSdoBKrMMj_QdF#MCZ5ZdC~K1> z>^IkPWHz5Pj1+myt2?m3Xf2dE$y3&8HLb8uHoLC{?FxCfoM_bi)MxXB`aqJ1KFPX- zViM)V3FHw@?F;);vhjVXzW5D)t@(Q?_@cAbxn>GX*Lbv4)#PKSFo+-$!zMCkETRAv z4A^FYj+vWM!@iVajzn^3P{JBTMb;sa>DgtrTz*Y)toI<-ok|wVOfgwY9)p}q68&vDF_4kvbYbFrzKWO z6veoryZeEJ@O1q!lmz?nVmgw||CWU7AVbA>-01BzmA`Ou7hY5PW-GQpS)e07y7$L4 z`BSj13laLOYk$aGkgK<(WGGbYGNp41)Ve(mzDP{n<>3N_US5~cP|a;B;7#@LaFLS$ zTqOvI+l`I_dKi!OlecMhLjdj@nt(oF8vvK?I_33X)3C%*W ziy*np?W&Za4Q>!*Pxg+Cqi{#^%rY)roOYlL4(zYIO*QJLO zq=Lcc>!?|B7}_c{?sG+OxTzaRayJU7>Q2;X)&Y~lO?9#*!t)c5yWPMP`*6mbFGgIV zc3Xdu1DzO%hBK-0F7~uBM~rD{Y2YaU>--XgTFt!0MJ&3va07W)a{lN8WJvF9)24;& zee!Z{d#waQ=v%UnI>`c%T(G;^Ye*e2#gTJiGBU2tB}K>E?*+b{B8f(B4Ao$2bay4S zuWP>9w8fHS@>U+Dw&4qO#&c>}k-cQzaKrLT@QCg+`iEt4ccMThPTs9BkH&;L$d8Zajb)jh90$M9BJu zGf>+NC$Q@4jsAs7qjQY~*sP$WF+pi(v-0?-KFdKt#5&Rt%FHt=Dy7xc@es!{XzYYk zOg-}sV4$vflDWa5pQ3!5sn#*kU>RDEq;VHZ^!D!Zt@=qfq*Ib<`nxJ>9(uxC9#mbg zgw$ek&jf0e;W{E1{?lH*3ZY<3DEJzV_ZfcX=!89-i5QvTac48y?02uZEsGm*bm3-u zTe_o^Ykru(75c@3?ME4)=W;?Hqa7s6v*e<%j4K&#|PDIF>lsF|jwX|L111HVv2RLqM!<$*~$>`SHW$e5b9> zc+=atL4BN}<~rb>fFB%2R;ok+rjM93l;ic(S=?UI?l-;?>M8O80?)w#JxRQ&KbjRt zZT85&ddu2u3x5z7m`x!26WP&!rnJwR65H4-HJi;0fR>6^CVd~7IiX&uEXjJgr9_g& z$jTrA$#MS_WK?W%`6PgXK)pQetJ<2@)LR40-%{j<5^Yka1-KWJm(X^cD3*}iV=gam z>Xll9>%!n57D{%&x;llMpb){?c&V6H)F53@u0HPGtX6~&+fFIn*NO`3g8Wc#dQsit z3@iWtiUGthpJj%LDO!tV8=DB|kF-?-JPl>#sTZ)xqUFPDht|u&wz>N8jkbE%QE83H zOA%ne6JvQ=tx(U&mN)up%{wWvW0#TSFmhALSekzMC`e`l-#LdoG81?pt9PoOHBGXO zElE|EYX^8cyr%eMuv z4e|f=5$nY&&1)AwCI)W2B6c&fZr&qYVAWQg2YEIkrTXSeWK!E6#4$rzMz15#bBtnp8Xl$4U) z#Zk{%U+t!Y*C%=9#uF)7Pe>^z5v4QI<#ey5yC=pGY7{Pn{HX16=z4s{#zZQp@XOW` zGTBQyCL3R~a>-NMJZ)|4e$#}j?h`RS4R8$I1QmvLmDTjAI8870zku-&$GSP)VK`Fb zk4kO1@lC$mQj|t7FweFVk*hd%Eft<>#THL-?kz7 zNJEmq;Y(IDh11cD#jHN-l-xdqU>=WqeNS1M_(o(lWejK` zP<)5oozY%RAxLH=wZo}#_7v9QrG6Ok?N!*ZlNvFPGX~^qsADg45=Ch3F6u>ToH8`#j6dAuiY);T$wG#rdK^_aJD0PX( zz*L!+D))?xF3aUO%zj-*@5UOsi?k{RpCs?`S~9xq z0zA1ZM=BsDYr=5(Zx3osmh|gQgBG^!*;JlmV4)Tm>F_C}gP97JqFO@y>;;*MFraiM z^HWtxdtPc*e^oNtPAbK+Ru65Qm#VF`2eqYPGI=(?86T_HK)G)jj#F%_BzQGj8;PrY zX4$|r+M{WwJ*S)!k-Ud!UsrBsLG;63dSUd#ux?IloE!c8g)S+NuoVi55L)08H;f)k zXh&XSW`g-X&Oa-JXKubiK7`!IYc^%`Nt}ObV^-t@z##=fa>+wkng9pn8I@^7$)i6I zba#>yV{o9>wWw6eA8Cl%8%?PW;KL*|@F?3RlPEOJPAUrWutS<4{G|uRsS_ZlOyw&7 zBTv!aJO{{Om~$dX1u%c+u#)Jrp^PN`4ejP$36XJvJ_(3k);Gv7Kwn-Og1Cmuf2S&R z4$NhZpe<6tXK5gWe5V<8O$yLfjPd~gooY0s8a+oS4?5OKLGEW9Ok9_^=y$YF%Li)( zO9c6nyllP#5l^H?Dc`ytpd`GL0hXX{kd$15YMRDH(0meuZxk-r^EKl5w8amgTCaQzH(3R}3{XXNwL@%w-` zm~u|Fl=P=HQMYy$^XoCHD)l_Phc*Q5>LqeCeP=saevHl43GVeVtOAZ91X;W5FB$Lm zfX;eeYTIcwBVCC5jq5ezZLuIX`x&s;^T^M0cAJB;xlPv7ChnDo2pZ@-C}m1y;6Q>e zHi6GI0isVClqJXK~ zau9cb9K?~Eq;{cRe$Fwb24o(2eL~Ct_5$Fg@zy}O5|bT?9P60JcF7;-kjh%b_3)e<*K`lac3d|TG&A}l?*OSywn1cVCP zWrCd$)-;B8Gp-n9KgO0Rua(D5EQ{Yfr$B!OA@}%d(*N3WCNWj!uFUXrX|gL*3mE%q z(>M(vQQ-$_tK-L&xcYH60LrIIPU;6FE!aa>KUN`fuPGYy*A!URXdb&?zX)Ahva?Xu zR^rv>_su3p1UANRHZtz6n<5X`>O0=W{ym?@p1siZ9fz~FrNa^M@Tm1K$S;j-({#(Y zCOtAqE=f0@n+Vp%lKJU!V>0{U=PW?cb-eNG{hYuBL7vFvuxc8os~b*4U+TXV(uLF* zkXcX_UrnS)VS35)l4qtC%YOXNSm}wxSheX)P9~fR8i&*5u<~{eFjQors>Z39aUcY7 z97+k}%*b^l6MAqB-@`Y1EZ`F$ zF2JiHG?<$xuk^*ZFRx1j-mwmdXfKkKQIotZK^$9gYcZ+c!^Ro^P7+q*rLl0KJg z7Aq#6eFzib5Ufe)te=ksu!S8#`5|P@!8C>j^|5)4po6p^*jm|GFl9ZT)HKM|W96p| zzVc)d-E-j+nu_J~0ck6be~B0R=NTUA(Y`f}g9hl#%Df0{yJ9qv&ogSseer)(jTHoS zxEFS>PVzL1_Lv8ZIk(G>kW_c$cnJl8i@QDLwcZCo;7bAl_!M~U9V-luTt0#hqX4}#i+`(`B^^O(( z+nAjkIiyriev}uR^pa_eq8-px;C{4A_*De{RIKosR2iB@ERvUIeC>3tDaq+AS0#3I zlg|>#;XNl&i-fogjBL-YyH8t2vIs?YL&d$g4 z@m#?|^Y|~MnWxo@t2TadlC1z-;*;O9anF3#l8kWIQt3ehqrE2LAX2_Lwec5cw#t}e zlcZ}Y$Q{$YzJ$AUa^5S^PHeW3j~k6{nUMp=J5HI|GoQ3R&Kwr;%l>@HetT%P7gO$* zbCsfQcaF?D=kiI6M>8EMa-8(O2YL*0a7|rGaaF!bk=uL8&J;J@bsOVBhXQ6G^NKeB zbThOxlUhY{T%^PZROT~-&}earJnq8nm0!=5+oxp>qcO{E{F)$hsySe+k4A-mamww= zZqOcKm%W=$M8GBE8SJee=9d}#K9miOzdF-U3-wx(IVqXJ@|wFF!@J2cy6f8WD0%TV zwb^b@9M|;S`(;88qlN9iW;DbYJDt4ySf~8n%qsezO5Q)m=IOkaenG$}yQfQLa@ObM z%Gi?Q28CTtt*lgypnL)H<7=OmPzaeRt;*ga=}|@M*P~XipHpTh7=LGUeq^-3x#8=a zO?m^E%Oo-SryB2ONO=xN)R0I%RUi^mK#NaeFxn>P{*oc@&C<%ty}8`*iUX}Idx^nX zdM`t6ZE$5Mi_72rBEPCvI=;I+ohW;?w)kIUr9f~C$YJ~pzxfdvm-Pn?{swf)DIa#% z*zi;2IIJyQ!*yhb+_Iz@+6iTGGVdTiA9^k0AJm(t7#>8L?Jf6R+2PkRNS=|S133Q=f{)j3%{C?1{R(p>ZQJ9-H2R{QQuEs zNul_HbDKYza~r15*v6R&`6khhatBNE7!s@>IXZuqcXEtKf|N`L@j@9U*uGKj&eHCW znY2Z?scd<=$rBak%pTzx2{L%9F$ysV^a{buaski`wbr2guTk|NI~`3k5aOwq+7ON& z5B*!1Y(KxVYLGG1sgxM+7qZH*8|mt^u}aH^XoED&c0OxrY3OCp8j*48zVtm$38&0% zso|G1qDN>0*ylPK)y#H%+SmAUh7&v*0$-7HwHcp>4J5+0=$5GwX**wjGc;&dBpF_6 zGN-gxzCd%+{BI_ogik|uH7i4RelMB^xS|8v31AiHW=n~7_P0Pi)z(wtmedG_THPCY z3eCa{?CpA6Q;XKI0wXrH^AY22Iw5ljqKP4z50mA3YzmNd)Q7eTBU-jYw`G9Xtd|$VJoOZKLoLNkE!Hvj$;Jh?pz+R3>#}UF5LC@g zksm2g8?kfg$mbG8E)AaMr5SHcV|I2u7=Fo+E9Qga!{?};XN}7bHyPA;Nc4Jr#?!RC zT2_znP3h8QLE8X!(!}%GTR#|0PifVA4NBZWS=z@kJuE%~t* zvIn?$k0lu2BpDABRgiL^7=#h0x__o?IFuxlT|8q-wJNPyI{!%t(zg~5hScrRc`U+E zC6_duqtGuu_p(=-2jgx2P*Q?%&MZuhaot2*PcuJ*yKogrjmvL+z@N6&yA|IV`p_YP zMcMo!DHE`g#GUcsM;vl@j@+$5(6_19{X@A>p<5b|JSjwz(3LHfu5RN6D_ikcX`bEA?SJ`;YsO}$3Vj5=?_*}C? zE(&69E>FRD?#**w5!W~!l>@gdpJklBfKKc|bzv^Bxh9v&A|DBA+~Y4(xyD=3@+JF~ z?DFk^d15fvWdB^*krw3=c--N>Hd()ZPO|&~i<#N}h*{vI6-81;r-5ar^0B`u7j1 zW#=Oq3~$=Z@T-}8!~4pxb=MrVce@M(UvJNpd=JZFvJoky(^~%MVe}aXp_nmwfjrk! zmx{BMyvs9H;YC15G5!o~-Ec<4HbdRIMMg2>i?c?R&2wa~ zRK$GJ9~42rbb)FNU8t1t%-KREb==*H+!dYQzR(;}3vRgq_(MRbs{>K9PWi)!;yXSx znmpWD+RN>WXFA?Wy>kQa@#Cy^YL7uVa}fvav0&>x{gi-c20lcv{Z+=)e5g2llhN*z zWqnky9@Jib!||q@4EZD#IZt^vY}Pxtfp2;iS@Ryq9;pP$8{NX2y2v7)5Nf1ItD=+^ zrrDpZjFFadI`WP&cCUnGask6lbW;l#xNOBB_)y9MosY<&L(snxQnsS&V?Ee#R zUG<@(141_&a=WQ`pzBrU=3fL1j_}Qf0!Cr@n#?;(J21H>UenK(Sm83D3vqlqoxfdE37nC1naza0SE_pGZdwXj5LQXfu z5`08?*OD>4D5fnkWN0_}h8&1r{%SNgc4_2F=pvHKkov&feW8Yfe1UlB3P2*p$Snses@#&O@Sf7syBjo$Ln*C7}AuHk2^+v3Z1A)yC&pZE|1NKQU-3i1Zm+2!(6mZ}q9FuT_>Y--Yxff@Cx+ z`hhF!pFxJrV9WoP(p2a2r>`*PWDKa4#zgtFTqX{Ycjr5_J7F$@-W1*Tkk(I=m#nt& z>bKT3g}LyAMk^lJN>qlA}j$t>qCh8ehFjX~~s*6}{c%9+h zmS*`5`?6{4AfxOz55$EZQ%qlm$n(>5ukG#UcI!2?O7XAB3GBR-G>aKbmN6>o`%^b# zJ4@JppByS<=ChZ}z6KBxG9fLp#u%Dmd}R=;X*6MLk{1m9$#zSVh}(J!*shU5WdK|V zB#kzdI@EXWXtsgUR>+&?a&DNYT_`F8=radqH7?B1hmA{+r!STRO=y_Xi)fsJszwp} ze(@1?;MxF@ZmI!~#_Vi#7+-0?b;QXE=2^2PSY~=lSXvYH50-pmkQQoQDK8p$C9O<# zdy(NpZ{r8C1RN*(03kKjl-3wqu9Ps)%Mp07?m z9AT?(eugKGjg{xD0RVE0^Oq3*0Y_^)%olE1WX8mFK4|1*iYvpo&B_LIOa7YHjbdx3 zGen~{XFjT|AmHl-A;?ctSea|(a?57AswHJCM5IQmOB-iOVAtc#y`5Lu{LTM!0)PcZ z8(P6)^oQ!pX$j+;w@(NsmKmQnN@jZ7E}P#zE>bS%o)702Wyt&c^J_{Vd_{k`4p>{~ z=7Rg;heecYgf{#K6B(0JR~d}sFI*0C+2yDV&P@y zbB`>Wou-X&b&*Mycc|Vnqe5QJZo87KC~cwoHMm0HR7kpfy8;#SfcbQ4xV~KKdeEjK zJ1&*7`yCl>pgfFsX1WKP$8YJS`#WkHmT;+2#JZ?n!as+bzvo z+(5!D>s$Pwgz$42#*8Q#dg>A)tWbNs(Wf8+8?(Gw8acskBX%M!DHY~J3XVA{&T`|X z6~?iJSudLAXQ>)>%UFlJm?fVti%O9C2UtDH(UAmnmLte34<)OA@A6`DOn{>$vrpRU z4Xa#+<;kmg>dXIRn3n+ji67U)(z=tMej>R$$@1_e?OubQ%UK~mw6*2Q2lLR6Y~-do z6C+{lB!?MDYH|#;nZ`?i#3?3Qhc)>&3+zauQIKvw z+Hs!EpLJY?(iG8XKPvOGaSS2{WNM1+DJ*+=7cNB!TcAe!AhTi?D252PT~ZRP%jU>! zDMwC|ts5@8OfA{|jK1bnwzl~sS(eC2Nu>cHD)#b8MO6Q>b((pEL}mOw`J&voyHLKJ zBKG+*y`08O&3Wf0SIB5Zon+LihO=y2tc3)3MH&1UGB6}xrpu0Od2SNa?cF@xwe9CC_Wl?8Cxsly>pBk4cT}hojds8*3j(mPK{mA{OQI651%QM z(;+6?j!;~)ms08%mCW@wljODJ^{0(OEqP&{E86Yz?MBknQ zo6WXl_N@b3DNT8UlB{G>lHuA~R&^GZyZzG%Wqg`oZ_`+L0<>nRsX zsg#vLfP++zOx|fiGc(+Hs!_fI^JlER5~nTC8*WIJ%AizIqNMwwJ8oQ4Mso9NvW6$G z#5FRH^dxp>GO3-)pELM@H>Q}anm-9E0v0(rv^+AYU0I(chQrCEgV27L|N3R`T0Bf+ zdU8jS@qLnv?WN43_P)TBEo14lhFbRT7UPE`nOP}2R?6srS}uR_d|)5r=Bk4>xk3II zPH#f|@Txw^QS8OydS>p(K4ZG%ye-24GgbUZ_*kZTPMWH%XS34ele({fT_ zewjYhSh@;|7rz_tR7(YY;nX6+y%z7nC>(7mYO?(h-_v$VITP(;E0V*b)F*M2fG0DpnN9rYH3?a{qxt3lk+^-mR26C0-^NBc zGMch5U!k;+KJ$nXekMtl=gNU1o7wp&K}El`a0boq1jWQK$phQ=Sm}w4`N#m7^1VZn z`;)RW52rQFp_vS*bx;P6lHxQsv~=H=WL-_lGk51Q>i8VgeOE}%a0Wd5D&Rw2uy{Jt z4!ofnV_Aa8FE|?dvZP<7QS1ZI<@21ql)v1P5%zbH-OX6#KTy13{hA@oEdSNh=uhcI zdDzrHEy|T?O=Q6!V=xooJaHX2?lfdEiS%OfW|Stzo7KhPgf0pX3dsKyGCB|}kok2_ zE-C{qk=s@Z$?UXx_rg>zvWHw2w2`1`ATvntolto z6dNx_j+!?vZd<||F3-m-1qPZYOSq5B79V4TymOy_9yr`fTK(zpu07yY$F`9awfHWz0$@!^zf}Kp-$26>MqJ!O!v|ci;mjUrKxPQ$G z4@l#it{NcSM$5zSZ<_BE3^C)8bCFwVDHcO@9|M z+(Rc~QeGJ++ggeIi1XKOkWm4i;BS{^YPty%D;euM;B})@hFJ>8BS845PRln5Y6e41 z(sQFotE`!0vn&ud&#*$19Y>y)cV@`d%j8m8|7fSULQ!4y*51M>NcE@l)FAr1o5>Ct zkz%aKE!kVxJVACqx9pR`>#8ov#Dr}!HWbPLujEd!)yGq26u|*bNivNk_58YdsMw_N5*m<7(J;_Z!=)?33dgS|& z^6Pju&&TuKuPY)>CY8u&I%y#x3Rr_Pj2K7c{#@pSoWdnznh$AZ?QW+wOiNmlak@~- z0sypG!rvwshw2$5ji~6Q@XB0-Dv}_s6vu@!VuCr0SD}_Zr%8c8mfYqvLXGCs_(pq? z{C7On1z^^pa@Gv`seUtjc)QKtF;N!QO8;7|knvpM8v6Pf(`N_sEbdD(!{dwOt{mVv zn^-#WZtcv!w1}2S!(Sw=1}Q<}Aeekf$j*jVn&ZAk_{$s`Y4mZM%V`0D#?4x7v(5(& zXsm3OIg2qF9TVM9k^VQaS<80c!nq309+VMvfesbYV9uWxEo1Ai>Mak3 zSu^&M0kv623ni%>0uKyU>V=w(AIfW&*$YYPdkp%@Xbt#efX#FtgaDX4zoa!GP$;u1 z&C^|m>@8&M&f-J|nl}5em!vH=3!ROt3!xa6^F4g3YpFRakqZtmmGEHF z1sRZAN9jqsO^38nnX?9 zu76*4CQ0|Pk`AIt#;lWuTKaei*GXgmHhnus?x!U|+l=VUe^Qf*zmKIGPcxQHrrDZd zoJxwgjp>EP$~=N#_!A(hApgA2*0e@nD%TYE5Dd=JCkHq{Akv<}R{UMDA5=pclBtG{ z(00;CB9>9je;Y@<@(8r>l6--Ari=@UGaMA+j&~=@r&C~Q!3mJ@v&f)O0+7X*YoWJG z)LW2gS}bhRdD+)M&*G3Kg98M%7GqkmbyGV21XJCIqP4`#w(lq9`GNWqUg_^48IMXt ziRPmh-Vk0}2+B^;c!`T>vHgeP267oo9_nrj8W}gz3-9w+btw(!kcjfrEU9^TsUJ>p`O72_= zL`eG9bX*z*pi%tr%AdXD&tT^!b8>t*Jw>L^|t$)jY|w7^L^Yt2k{}fzciAsO5_sIT>?YB`Lq)(&mlmhVq9xhpx9}w~}SUqo-yxS#w>h zF>-LSnGizAqgRJc#DummjHJh<-wIqb8cP>qfaSmdZQK7gMfOi+B|bYUo1zJ%P9F2Y zM!q`1VfYJWb7fl@J?kVw0`kr}tqfjT*x}W`Yy#~Kx?(;8@EmP)Wub@uTUN; z5O=fOax+k}^@sQ=vUMNRFjXMq&~nha_|IeH(K+UtqA=PiNQNiMHU=Zfx*;w6XP&&^ zl#w+u?iLR72jZLa-FN3Pkcs6uAubfv&0Fij8Ez6Rs{Kf5q-<>{4bckgu%@S$j+K9} zfg_(Y9JEzkXu5-CNW*&+SYS2B6Yz!WcyPSwmKE~FK&oPB{eXxB%^VrtP)ym}vQR*p#>-hq}reYjmI78)B9}NeUn8 z+Bub#biwY$h<`_q|Ywak=211!p30{*fKF zAZ(C096wMxrKbtHbRyHB3|r}bwHtR558!BSW6$n6haveSG5k

    Guy|Fsj|UT3qE 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≥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�lT;ZCcfdCE;96}p`RvB-E@~G#SOYGP} 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 diff --git a/tests/data_samples/neale2_saige_study_manifest.samples.tsv b/tests/data_samples/neale2_saige_study_manifest.samples.tsv new file mode 100644 index 000000000..fe5eb82d5 --- /dev/null +++ b/tests/data_samples/neale2_saige_study_manifest.samples.tsv @@ -0,0 +1,11 @@ +in_path code trait n_total n_cases trait_category +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/PheCode_244_SAIGE_Nov2017_MACge20.GRCh38.tsv.split*.gz SAIGE_244 Hypothyroidism 406300 14871 endocrine/metabolic +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/PheCode_008.5_SAIGE_Nov2017_MACge20.GRCh38.tsv.split*.gz SAIGE_008_5 Bacterial enteritis 402707 2737 infectious diseases +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/PheCode_153.2_SAIGE_Nov2017_MACge20.GRCh38.tsv.split*.gz SAIGE_153_2 Colon cancer 385807 3051 neoplasms +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/PheCode_290.16_SAIGE_Nov2017_MACge20.GRCh38.tsv.split*.gz SAIGE_290_16 Vascular dementia 402572 189 mental disorders +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/PheCode_288.3_SAIGE_Nov2017_MACge20.GRCh38.tsv.split*.gz SAIGE_288_3 Eosinophilia 401446 71 hematopoietic +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/100920_2102.neale2.gwas.imputed_v3.both_sexes.GRCh38.tsv.split*.gz NEALE2_100920_2102 Type milk consumed: semiskimmed 51427 19497 +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/1031.neale2.gwas.imputed_v3.both_sexes.GRCh38.tsv.split*.gz NEALE2_1031 Frequency of friend/family visits 358821 +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/1428_1.neale2.gwas.imputed_v3.both_sexes.GRCh38.tsv.split*.gz NEALE2_1428_1 Spread type: Butter/spreadable butter 360291 131190 +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/1428_1.neale2.gwas.imputed_v3.both_sexes.GRCh38.tsv.split*.gz NEALE2_1428_1 Spread type: Butter/spreadable butter 360291 131190 +gs://genetics-portal-raw/uk_biobank_sumstats/harmonised_split_190318/2976_raw.neale2.gwas.imputed_v3.both_sexes.GRCh38.tsv.split*.gz NEALE2_2976_raw Age diabetes diagnosed 16166 diff --git a/tests/dataset/test_gene_index.py b/tests/dataset/test_gene_index.py index b9dbd1e8c..467e41090 100644 --- a/tests/dataset/test_gene_index.py +++ b/tests/dataset/test_gene_index.py @@ -6,11 +6,6 @@ from otg.dataset.gene_index import GeneIndex -def test_gene_index_fromsource(sample_target_index: DataFrame) -> None: - """Test gene index from source.""" - assert isinstance(GeneIndex.from_source(sample_target_index), GeneIndex) - - def test_gene_index_creation(mock_gene_index: GeneIndex) -> None: """Test gene index creation with mock gene index.""" assert isinstance(mock_gene_index, GeneIndex) diff --git a/tests/dataset/test_ld_index.py b/tests/dataset/test_ld_index.py index e6609b3d9..1d10cdd01 100644 --- a/tests/dataset/test_ld_index.py +++ b/tests/dataset/test_ld_index.py @@ -7,10 +7,3 @@ def test_ld_index_creation(mock_ld_index: LDIndex) -> None: """Test ld index creation with mock ld index.""" assert isinstance(mock_ld_index, LDIndex) - - -def test_annotate_index_intervals(mock_ld_index: LDIndex) -> None: - """Test annotate index intervals.""" - assert isinstance( - mock_ld_index.annotate_index_intervals(ld_radius=500_000), LDIndex - ) diff --git a/tests/dataset/test_study_index.py b/tests/dataset/test_study_index.py index 75d8a4978..49ef3c5f9 100644 --- a/tests/dataset/test_study_index.py +++ b/tests/dataset/test_study_index.py @@ -1,9 +1,10 @@ """Test study index dataset.""" from __future__ import annotations -from pyspark.sql import DataFrame +from pyspark.sql import DataFrame, SparkSession +from pyspark.sql import functions as f -from otg.dataset.study_index import StudyIndex, StudyIndexGWASCatalog +from otg.dataset.study_index import StudyIndex def test_study_index_creation(mock_study_index: StudyIndex) -> None: @@ -11,82 +12,121 @@ def test_study_index_creation(mock_study_index: StudyIndex) -> None: assert isinstance(mock_study_index, StudyIndex) -def test_study_index_gwas_catalog_creation( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, -) -> None: - """Test study index creation with mock data.""" - assert isinstance(mock_study_index_gwas_catalog, StudyIndexGWASCatalog) - - def test_study_index_type_lut(mock_study_index: StudyIndex) -> None: """Test study index type lut.""" assert isinstance(mock_study_index.study_type_lut(), DataFrame) -def test_study_gnomad_ancestry_sample_sizes( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, -) -> None: - """Test study index gnomad ancestry sample sizes.""" - assert isinstance( - mock_study_index_gwas_catalog.get_gnomad_ancestry_sample_sizes(), DataFrame - ) - - -def test_annotate_discovery_sample_sizes( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, -) -> None: - """Test annotate discovery sample sizes.""" - assert isinstance( - mock_study_index_gwas_catalog._annotate_discovery_sample_sizes(), - StudyIndexGWASCatalog, - ) - - -def test_parse_study_table(sample_gwas_catalog_studies: DataFrame) -> None: - """Test parse study table.""" - assert isinstance( - StudyIndexGWASCatalog._parse_study_table(sample_gwas_catalog_studies), - StudyIndexGWASCatalog, - ) - - -def test_annotate_ancestry( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, - sample_gwas_catalog_ancestries_lut: DataFrame, -) -> None: - """Test annotate ancestry of StudyIndexGWASCatalog.""" - assert isinstance( - mock_study_index_gwas_catalog._annotate_ancestries( - sample_gwas_catalog_ancestries_lut +def test_aggregate_and_map_ancestries__correctness(spark: SparkSession): + """Test if population are mapped and relative sample sizes are calculated.""" + data = [ + ( + "s1", + "East Asian", + 100, ), - StudyIndexGWASCatalog, - ) - - -def test_annotate_sumstats( - mock_study_index_gwas_catalog: StudyIndexGWASCatalog, - sample_gwas_catalog_harmonised_sumstats: DataFrame, -) -> None: - """Test annotate sumstats of StudyIndexGWASCatalog.""" - assert isinstance( - mock_study_index_gwas_catalog._annotate_sumstats_info( - sample_gwas_catalog_harmonised_sumstats + ( + "s1", + "Finnish", + 100, + ), + ( + "s1", + "NR", + 100, ), - StudyIndexGWASCatalog, + ( + "s1", + "European", + 100, + ), + ] + + columns = ["studyId", "ancestry", "sampleSize"] + + df = ( + spark.createDataFrame(data, columns) + .groupBy("studyId") + .agg( + f.collect_list(f.struct("ancestry", "sampleSize")).alias("discoverySamples") + ) + .select( + StudyIndex.aggregate_and_map_ancestries(f.col("discoverySamples")).alias( + "parsedPopulation" + ) + ) ) - -def test_study_index_from_source( - sample_gwas_catalog_studies: DataFrame, - sample_gwas_catalog_harmonised_sumstats: DataFrame, - sample_gwas_catalog_ancestries_lut: DataFrame, -) -> None: - """Test study index from source.""" - assert isinstance( - StudyIndexGWASCatalog.from_source( - sample_gwas_catalog_studies, - sample_gwas_catalog_ancestries_lut, - sample_gwas_catalog_harmonised_sumstats, + # Asserting that there are three population (both NR and Europeans are grounded to 'nfe'): + assert (df.select(f.explode("parsedPopulation")).count()) == 3 + + # Asserting that the relative count go to 1.0 + assert ( + df.select( + f.aggregate( + "parsedPopulation", f.lit(0.0), lambda y, x: y + x.relativeSampleSize + ).alias("sum") + ).collect()[0]["sum"] + ) == 1.0 + + +def test_aggregate_samples_by_ancestry__correctness(spark: SparkSession) -> None: + """Test correctness of the ancestry aggregator function.""" + data = [ + ( + "s1", + "a1", + 100, + ), + ( + "s1", + "a1", + 100, ), - StudyIndexGWASCatalog, + ( + "s1", + "a2", + 100, + ), + ] + + columns = ["studyId", "ancestry", "sampleSize"] + + df = ( + spark.createDataFrame(data, columns) + .groupBy("studyId") + .agg( + f.collect_list(f.struct("ancestry", "sampleSize")).alias("discoverySamples") + ) + .select( + f.aggregate( + "discoverySamples", + f.array_distinct( + f.transform( + "discoverySamples", + lambda x: f.struct( + x.ancestry.alias("ancestry"), f.lit(0.0).alias("sampleSize") + ), + ) + ), + StudyIndex._aggregate_samples_by_ancestry, + ).alias("test_output") + ) + .persist() ) + + # Asserting the number of aggregated population: + assert ( + df.filter(f.col("studyId") == "s1").select(f.explode("test_output")).count() + ) == 2 + + # Asserting the number of aggregated sample size: + assert ( + df.filter(f.col("studyId") == "s1") + .select( + f.aggregate("test_output", f.lit(0.0), lambda y, x: x.sampleSize + y).alias( + "totalSamples" + ) + ) + .collect()[0]["totalSamples"] + ) == 300.0 diff --git a/tests/dataset/test_study_locus.py b/tests/dataset/test_study_locus.py index 0121d3b80..2ca793937 100644 --- a/tests/dataset/test_study_locus.py +++ b/tests/dataset/test_study_locus.py @@ -1,20 +1,20 @@ """Test study locus dataset.""" from __future__ import annotations -from typing import TYPE_CHECKING - -import pyspark.sql.functions as f -from pyspark.sql import Column, DataFrame - -from otg.dataset.study_locus import ( - CredibleInterval, - StudyLocus, - StudyLocusGWASCatalog, - StudyLocusOverlap, +import pytest +from pyspark.sql import Column, DataFrame, SparkSession +from pyspark.sql.types import ( + ArrayType, + BooleanType, + DoubleType, + LongType, + StringType, + StructField, + StructType, ) -if TYPE_CHECKING: - from otg.dataset.study_index import StudyIndex, StudyIndexGWASCatalog +from otg.dataset.study_index import StudyIndex +from otg.dataset.study_locus import CredibleInterval, StudyLocus, StudyLocusOverlap def test_study_locus_creation(mock_study_locus: StudyLocus) -> None: @@ -22,24 +22,19 @@ def test_study_locus_creation(mock_study_locus: StudyLocus) -> None: assert isinstance(mock_study_locus, StudyLocus) -def test_study_locus_gwas_catalog_creation( - mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, -) -> None: - """Test study locus creation with mock data.""" - assert isinstance(mock_study_locus_gwas_catalog, StudyLocusGWASCatalog) - - def test_study_locus_overlaps( mock_study_locus: StudyLocus, mock_study_index: StudyIndex ) -> None: """Test study locus overlaps.""" - assert isinstance(mock_study_locus.overlaps(mock_study_index), StudyLocusOverlap) + assert isinstance( + mock_study_locus.find_overlaps(mock_study_index), StudyLocusOverlap + ) -def test_credible_set(mock_study_locus: StudyLocus) -> None: - """Test credible interval.""" +def test_filter_credible_set(mock_study_locus: StudyLocus) -> None: + """Test credible interval filter.""" assert isinstance( - mock_study_locus.credible_set(CredibleInterval.IS95.value), StudyLocus + mock_study_locus.filter_credible_set(CredibleInterval.IS95), StudyLocus ) @@ -48,63 +43,197 @@ def test_unique_lead_tag_variants(mock_study_locus: StudyLocus) -> None: assert isinstance(mock_study_locus.unique_lead_tag_variants(), DataFrame) -def test_unique_study_locus_ancestries( - mock_study_locus: StudyLocus, mock_study_index_gwas_catalog: StudyIndexGWASCatalog -) -> None: - """Test study locus ancestries.""" - assert isinstance( - mock_study_locus.unique_study_locus_ancestries(mock_study_index_gwas_catalog), - DataFrame, - ) - - def test_neglog_pvalue(mock_study_locus: StudyLocus) -> None: """Test neglog pvalue.""" assert isinstance(mock_study_locus.neglog_pvalue(), Column) -def test_annotate_credible_sets(mock_study_locus: StudyLocus) -> None: - """Test annotate credible sets.""" - assert isinstance(mock_study_locus.annotate_credible_sets(), StudyLocus) - - def test_clump(mock_study_locus: StudyLocus) -> None: """Test clump.""" assert isinstance(mock_study_locus.clump(), StudyLocus) -def test_qc_ambiguous_study( - mock_study_locus_gwas_catalog: StudyLocusGWASCatalog, +@pytest.mark.parametrize( + ("observed", "expected"), + [ + ( + # Simple case + [ + # Observed + ( + 1, + "traitA", + "leadB", + [{"variantId": "tagVariantA", "posteriorProbability": 1.0}], + ), + ], + [ + # Expected + ( + 1, + "traitA", + "leadB", + [ + { + "variantId": "tagVariantA", + "posteriorProbability": 1.0, + "is95CredibleSet": True, + "is99CredibleSet": True, + } + ], + ) + ], + ), + ( + # Unordered credible set + [ + # Observed + ( + 1, + "traitA", + "leadA", + [ + {"variantId": "tagVariantA", "posteriorProbability": 0.44}, + {"variantId": "tagVariantB", "posteriorProbability": 0.015}, + {"variantId": "tagVariantC", "posteriorProbability": 0.04}, + {"variantId": "tagVariantD", "posteriorProbability": 0.005}, + {"variantId": "tagVariantE", "posteriorProbability": 0.5}, + {"variantId": "tagVariantNull", "posteriorProbability": None}, + {"variantId": "tagVariantNull", "posteriorProbability": None}, + ], + ) + ], + [ + # Expected + ( + 1, + "traitA", + "leadA", + [ + { + "variantId": "tagVariantE", + "posteriorProbability": 0.5, + "is95CredibleSet": True, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantA", + "posteriorProbability": 0.44, + "is95CredibleSet": True, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantC", + "posteriorProbability": 0.04, + "is95CredibleSet": True, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantB", + "posteriorProbability": 0.015, + "is95CredibleSet": False, + "is99CredibleSet": True, + }, + { + "variantId": "tagVariantD", + "posteriorProbability": 0.005, + "is95CredibleSet": False, + "is99CredibleSet": False, + }, + { + "variantId": "tagVariantNull", + "posteriorProbability": None, + "is95CredibleSet": False, + "is99CredibleSet": False, + }, + { + "variantId": "tagVariantNull", + "posteriorProbability": None, + "is95CredibleSet": False, + "is99CredibleSet": False, + }, + ], + ) + ], + ), + ( + # Null credible set + [ + # Observed + ( + 1, + "traitA", + "leadB", + None, + ), + ], + [ + # Expected + ( + 1, + "traitA", + "leadB", + None, + ) + ], + ), + ( + # Empty credible set + [ + # Observed + ( + 1, + "traitA", + "leadB", + [], + ), + ], + [ + # Expected + ( + 1, + "traitA", + "leadB", + None, + ) + ], + ), + ], +) +def test_annotate_credible_sets( + spark: SparkSession, observed: list, expected: list ) -> None: - """Test qc ambiguous.""" - assert isinstance( - mock_study_locus_gwas_catalog._qc_ambiguous_study(), StudyLocusGWASCatalog + """Test annotate_credible_sets.""" + schema = StructType( + [ + StructField("studyLocusId", LongType(), True), + StructField("studyId", StringType(), True), + StructField("variantId", StringType(), True), + StructField( + "locus", + ArrayType( + StructType( + [ + StructField("variantId", StringType(), True), + StructField("posteriorProbability", DoubleType(), True), + StructField("is95CredibleSet", BooleanType(), True), + StructField("is99CredibleSet", BooleanType(), True), + ] + ) + ), + True, + ), + ] ) - - -def test_qc_unresolved_ld(mock_study_locus_gwas_catalog: StudyLocusGWASCatalog) -> None: - """Test qc unresolved ld.""" - assert isinstance( - mock_study_locus_gwas_catalog._qc_unresolved_ld(), StudyLocusGWASCatalog + data_sl = StudyLocus( + _df=spark.createDataFrame(observed, schema), _schema=StudyLocus.get_schema() ) + expected_sl = StudyLocus( + _df=spark.createDataFrame(expected, schema), _schema=StudyLocus.get_schema() + ) + assert data_sl.annotate_credible_sets().df.collect() == expected_sl.df.collect() -def test_qc_all(sample_gwas_catalog_associations: DataFrame) -> None: - """Test qc all with some hard-coded values.""" - assert isinstance( - sample_gwas_catalog_associations.withColumn( - # Perform all quality control checks: - "qualityControls", - StudyLocusGWASCatalog._qc_all( - f.array().alias("qualityControls"), - f.col("CHR_ID"), - f.col("CHR_POS"), - f.lit("A").alias("referenceAllele"), - f.lit("T").alias("referenceAllele"), - f.col("STRONGEST SNP-RISK ALLELE"), - *StudyLocusGWASCatalog._parse_pvalue(f.col("P-VALUE")), - 5e-8, - ), - ), - DataFrame, - ) +def test__qc_no_population(mock_study_locus: StudyLocus) -> None: + """Test _qc_no_population.""" + assert isinstance(mock_study_locus._qc_no_population(), StudyLocus) diff --git a/tests/dataset/test_study_locus_overlaps.py b/tests/dataset/test_study_locus_overlaps.py index 5ff820c8b..6d0f0b434 100644 --- a/tests/dataset/test_study_locus_overlaps.py +++ b/tests/dataset/test_study_locus_overlaps.py @@ -1,11 +1,87 @@ """Test colocalisation dataset.""" from __future__ import annotations +from typing import TYPE_CHECKING + +import pyspark.sql.types as t +import pytest + +from otg.dataset.study_locus import StudyLocus from otg.dataset.study_locus_overlap import StudyLocusOverlap +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + from otg.dataset.study_index import StudyIndex + def test_study_locus_overlap_creation( mock_study_locus_overlap: StudyLocusOverlap, ) -> None: """Test colocalisation creation with mock data.""" assert isinstance(mock_study_locus_overlap, StudyLocusOverlap) + + +def test_study_locus_overlap_from_associations( + mock_study_locus: StudyLocus, mock_study_index: StudyIndex +) -> None: + """Test colocalisation creation from mock associations.""" + overlaps = StudyLocusOverlap.from_associations(mock_study_locus, mock_study_index) + assert isinstance(overlaps, StudyLocusOverlap) + + +@pytest.mark.parametrize( + ("observed", "expected"), + [ + ( + # observed - input DataFrame representing gwas and nongwas data to find overlapping signals + [ + { + "studyLocusId": 1, + "studyType": "gwas", + "chromosome": "1", + "tagVariantId": "A", + }, + { + "studyLocusId": 2, + "studyType": "eqtl", + "chromosome": "1", + "tagVariantId": "A", + }, + { + "studyLocusId": 3, + "studyType": "gwas", + "chromosome": "1", + "tagVariantId": "B", + }, + ], + # expected - output DataFrame with overlapping signals + [ + {"leftStudyLocusId": 1, "rightStudyLocusId": 2, "chromosome": "1"}, + ], + ), + ], +) +def test_overlapping_peaks(spark: SparkSession, observed: list, expected: list) -> None: + """Test overlapping signals between GWAS-GWAS and GWAS-Molecular trait to make sure that mQTLs are always on the right.""" + mock_schema = t.StructType( + [ + t.StructField("studyLocusId", t.LongType()), + t.StructField("studyType", t.StringType()), + t.StructField("chromosome", t.StringType()), + t.StructField("tagVariantId", t.StringType()), + ] + ) + expected_schema = t.StructType( + [ + t.StructField("leftStudyLocusId", t.LongType()), + t.StructField("rightStudyLocusId", t.LongType()), + t.StructField("chromosome", t.StringType()), + ] + ) + observed_df = spark.createDataFrame(observed, mock_schema) + result_df = StudyLocus._overlapping_peaks(observed_df) + expected_df = spark.createDataFrame(expected, expected_schema) + print("RESULT", result_df.show()) + print("EXPECTED", expected_df.show()) + assert result_df.collect() == expected_df.collect() diff --git a/tests/dataset/test_summary_statistics.py b/tests/dataset/test_summary_statistics.py new file mode 100644 index 000000000..7225dad1f --- /dev/null +++ b/tests/dataset/test_summary_statistics.py @@ -0,0 +1,93 @@ +"""Test study index dataset.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +from pyspark.sql import types as t + +from otg.dataset.study_locus import StudyLocus +from otg.dataset.summary_statistics import SummaryStatistics + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +def test_summary_statistics__creation( + mock_summary_statistics: SummaryStatistics, +) -> None: + """Test gene index creation with mock gene index.""" + assert isinstance(mock_summary_statistics, SummaryStatistics) + + +def test_summary_statistics__pval_filter__return_type( + mock_summary_statistics: SummaryStatistics, +) -> None: + """Test if the p-value filter indeed returns summary statistics object.""" + pval_threshold = 5e-3 + assert isinstance( + mock_summary_statistics.pvalue_filter(pval_threshold), SummaryStatistics + ) + + +def test_summary_statistics__window_based_clumping__return_type( + mock_summary_statistics: SummaryStatistics, +) -> None: + """Test if the window-based clumping indeed returns study locus object.""" + assert isinstance( + mock_summary_statistics.window_based_clumping(250_000), StudyLocus + ) + + +def test_summary_statistics__exclude_region__return_type( + mock_summary_statistics: SummaryStatistics, +) -> None: + """Testing if the exclude region method returns the right datatype.""" + assert isinstance( + mock_summary_statistics.exclude_region("chr12:124-1245"), SummaryStatistics + ) + + +def test_summary_statistics__exclude_region__correctness( + spark: SparkSession, +) -> None: + """Testing if the exclude region method returns the right datatype.""" + data = [ + # Region needs to be dropped: + ("s1", "c1", "v1", 1, 1.0, -2, 0.0), + ("s1", "c1", "v1", 10, 1.0, -2, 0.0), + ("s1", "c1", "v1", 15, 1.0, -2, 0.0), + ("s1", "c1", "v1", 20, 1.0, -2, 0.0), + # Same region on different chromosome - should stay + ("s1", "c2", "v1", 1, 1.0, -2, 0.0), + ("s1", "c2", "v1", 10, 1.0, -2, 0.0), + ("s1", "c2", "v1", 15, 1.0, -2, 0.0), + ("s1", "c2", "v1", 20, 1.0, -2, 0.0), + # Same region on different study - should be filtered + ("s2", "c1", "v1", 1, 1.0, -2, 0.0), + ("s2", "c1", "v1", 10, 1.0, -2, 0.0), + ("s2", "c1", "v1", 15, 1.0, -2, 0.0), + ("s2", "c1", "v1", 20, 1.0, -2, 0.0), + ] + + schema = t.StructType( + [ + t.StructField("studyId", t.StringType(), False), + t.StructField("chromosome", t.StringType(), False), + t.StructField("variantId", t.StringType(), False), + t.StructField("position", t.IntegerType(), False), + t.StructField("pValueMantissa", t.FloatType(), False), + t.StructField("pValueExponent", t.IntegerType(), False), + t.StructField("beta", t.DoubleType(), False), + ] + ) + # Create dataframe and apply region based filter: + data = spark.createDataFrame(data, schema=schema) + filtered_sumstas = SummaryStatistics( + _df=data, _schema=SummaryStatistics.get_schema() + ).exclude_region("c1:9-16") + + # Test for the correct number of rows returned: + assert filtered_sumstas.df.count() == 8 + + +# Look for medium size summary statistics - diff --git a/tests/dataset/test_variant_annotation.py b/tests/dataset/test_variant_annotation.py new file mode 100644 index 000000000..b79f0d5ed --- /dev/null +++ b/tests/dataset/test_variant_annotation.py @@ -0,0 +1,43 @@ +"""Tests variant annotation dataset.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from otg.dataset.gene_index import GeneIndex + +from otg.dataset.v2g import V2G +from otg.dataset.variant_annotation import VariantAnnotation + + +def test_variant_index_creation(mock_variant_annotation: VariantAnnotation) -> None: + """Test gene index creation with mock gene index.""" + assert isinstance(mock_variant_annotation, VariantAnnotation) + + +def test_get_polyphen_v2g( + mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex +) -> None: + """Test get_polyphen_v2g with mock variant annotation.""" + assert isinstance(mock_variant_annotation.get_polyphen_v2g(mock_gene_index), V2G) + + +def test_get_sift_v2g( + mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex +) -> None: + """Test get_sift_v2g with mock variant annotation.""" + assert isinstance(mock_variant_annotation.get_sift_v2g(mock_gene_index), V2G) + + +def test_get_plof_v2g( + mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex +) -> None: + """Test get_plof_v2g with mock variant annotation.""" + assert isinstance(mock_variant_annotation.get_plof_v2g(mock_gene_index), V2G) + + +def test_get_distance_to_tss( + mock_variant_annotation: VariantAnnotation, mock_gene_index: GeneIndex +) -> None: + """Test get_distance_to_tss with mock variant annotation.""" + assert isinstance(mock_variant_annotation.get_distance_to_tss(mock_gene_index), V2G) diff --git a/tests/dataset/test_variant_index.py b/tests/dataset/test_variant_index.py index 8801632ee..9e31e9d5c 100644 --- a/tests/dataset/test_variant_index.py +++ b/tests/dataset/test_variant_index.py @@ -1,9 +1,20 @@ """Tests variant index dataset.""" from __future__ import annotations +from typing import TYPE_CHECKING + from otg.dataset.variant_index import VariantIndex +if TYPE_CHECKING: + from otg.dataset.variant_annotation import VariantAnnotation + def test_variant_index_creation(mock_variant_index: VariantIndex) -> None: """Test gene index creation with mock gene index.""" assert isinstance(mock_variant_index, VariantIndex) + + +def test_from_variant_annotation(mock_variant_annotation: VariantAnnotation) -> None: + """Test variant index creation from variant annotation.""" + variant_index = VariantIndex.from_variant_annotation(mock_variant_annotation) + assert isinstance(variant_index, VariantIndex) diff --git a/tests/datasource/finngen/test_finngen_study_index.py b/tests/datasource/finngen/test_finngen_study_index.py new file mode 100644 index 000000000..4e936ea55 --- /dev/null +++ b/tests/datasource/finngen/test_finngen_study_index.py @@ -0,0 +1,23 @@ +"""Tests for study index dataset from FinnGen.""" + +from __future__ import annotations + +from pyspark.sql import DataFrame + +from otg.dataset.study_index import StudyIndex +from otg.datasource.finngen.study_index import FinnGenStudyIndex + + +def test_finngen_study_index_from_source( + sample_finngen_studies: DataFrame, +) -> None: + """Test study index from source.""" + assert isinstance( + FinnGenStudyIndex.from_source( + sample_finngen_studies, + "FINNGEN_R9_", + "https://storage.googleapis.com/finngen-public-data-r9/summary_stats/finngen_R9_", + ".gz", + ), + StudyIndex, + ) diff --git a/tests/datasource/gnomad/test_gnomad_ld.py b/tests/datasource/gnomad/test_gnomad_ld.py new file mode 100644 index 000000000..d64ca2568 --- /dev/null +++ b/tests/datasource/gnomad/test_gnomad_ld.py @@ -0,0 +1,67 @@ +"""Tests on LD matrix from GnomAD.""" + +from __future__ import annotations + +import pytest +from pyspark.sql import SparkSession + +from otg.datasource.gnomad.ld import GnomADLDMatrix + + +@pytest.mark.parametrize( + ("observed", "expected"), + [ + # Normal scenario: the ld index contains all variants in the matrix + ( + # Observed + [ + (0, "varA", "chr1"), + (1, "varB", "chr1"), + (2, "varC", "chr1"), + ], + # Expected + [ + (1.0, "varA", "chr1", "varA"), + (0.7, "varA", "chr1", "varB"), + (-0.7, "varA", "chr1", "varC"), + ], + ), + # LD index is missing a variant in the matrix + ( + # Observed + [ + (0, "varA", "chr1"), + (1, "varB", "chr1"), + ], + # Expected - the missing variant is ignored + [ + (1.0, "varA", "chr1", "varA"), + (0.7, "varA", "chr1", "varB"), + ], + ), + ], +) +def test_resolve_variant_indices( + spark: SparkSession, observed: list, expected: list +) -> None: + """Test _resolve_variant_indices.""" + ld_matrix = spark.createDataFrame( + [ + (0, 0, 1.0), + (0, 1, 0.7), + (0, 2, -0.7), + ], + ["i", "j", "r"], + ) + ld_index = spark.createDataFrame( + observed, + ["idx", "variantId", "chromosome"], + ) + expected_df = spark.createDataFrame( + expected, + ["r", "variantId_i", "chromosome", "variantId_j"], + ) + observed_df = GnomADLDMatrix._resolve_variant_indices(ld_index, ld_matrix) + assert ( + observed_df.orderBy(observed_df["r"].desc()).collect() == expected_df.collect() + ) diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py b/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py new file mode 100644 index 000000000..ec4575d51 --- /dev/null +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_associations.py @@ -0,0 +1,96 @@ +"""Test GWAS Catalog associations import.""" + +from __future__ import annotations + +from pyspark.sql import DataFrame +from pyspark.sql import functions as f +from pyspark.sql.types import LongType + +from otg.dataset.variant_annotation import VariantAnnotation +from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations + + +def test_study_locus_gwas_catalog_creation( + mock_study_locus_gwas_catalog: GWASCatalogAssociations, +) -> None: + """Test study locus creation with mock data.""" + assert isinstance(mock_study_locus_gwas_catalog, GWASCatalogAssociations) + + +def test_qc_all(sample_gwas_catalog_associations: DataFrame) -> None: + """Test qc all with some hard-coded values.""" + assert isinstance( + sample_gwas_catalog_associations.withColumn( + # Perform all quality control checks: + "qualityControls", + GWASCatalogAssociations._qc_all( + f.array().alias("qualityControls"), + f.col("CHR_ID"), + f.col("CHR_POS"), + f.lit("A").alias("referenceAllele"), + f.lit("T").alias("referenceAllele"), + f.col("STRONGEST SNP-RISK ALLELE"), + *GWASCatalogAssociations._parse_pvalue(f.col("P-VALUE")), + 5e-8, + ), + ), + DataFrame, + ) + + +def test_qc_ambiguous_study( + mock_study_locus_gwas_catalog: GWASCatalogAssociations, +) -> None: + """Test qc ambiguous.""" + assert isinstance( + mock_study_locus_gwas_catalog._qc_ambiguous_study(), GWASCatalogAssociations + ) + + +def test_qc_unresolved_ld( + mock_study_locus_gwas_catalog: GWASCatalogAssociations, +) -> None: + """Test qc unresolved LD by making sure the flag is added when ldSet is null.""" + mock_study_locus_gwas_catalog.df = mock_study_locus_gwas_catalog.df.filter( + f.col("ldSet").isNull() + ) + observed_df = ( + mock_study_locus_gwas_catalog._qc_unresolved_ld() + .df.limit(1) + .select( + f.array_contains( + f.col("qualityControls"), "Variant not found in LD reference" + ) + ) + ) + expected = True + assert observed_df.collect()[0][0] is expected + + +def test_study_locus_gwas_catalog_from_source( + mock_variant_annotation: VariantAnnotation, + sample_gwas_catalog_associations: DataFrame, +) -> None: + """Test study locus from gwas catalog mock data.""" + assert isinstance( + GWASCatalogAssociations.from_source( + sample_gwas_catalog_associations, mock_variant_annotation + ), + GWASCatalogAssociations, + ) + + +def test__map_to_variant_annotation_variants( + sample_gwas_catalog_associations: DataFrame, + mock_variant_annotation: VariantAnnotation, +) -> None: + """Test mapping to variant annotation variants.""" + assert isinstance( + GWASCatalogAssociations._map_to_variant_annotation_variants( + sample_gwas_catalog_associations.withColumn( + "studyLocusId", f.monotonically_increasing_id().cast(LongType()) + ), + mock_variant_annotation, + ), + DataFrame, + ) diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py b/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py new file mode 100644 index 000000000..17195b0d7 --- /dev/null +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_study_index.py @@ -0,0 +1,60 @@ +"""Test StudyIndexGWASCatalog.""" + +from __future__ import annotations + +from pyspark.sql import DataFrame + +from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex + + +def test_annotate_discovery_sample_sizes( + mock_study_index_gwas_catalog: GWASCatalogStudyIndex, +) -> None: + """Test annotate discovery sample sizes.""" + mock_study_index_gwas_catalog.df = mock_study_index_gwas_catalog.df.drop( + "nCases", "nControls", "nSamples" + ) + assert isinstance( + mock_study_index_gwas_catalog._annotate_discovery_sample_sizes(), + GWASCatalogStudyIndex, + ) + + +def test_parse_study_table(sample_gwas_catalog_studies: DataFrame) -> None: + """Test parse study table.""" + assert isinstance( + GWASCatalogStudyIndex._parse_study_table(sample_gwas_catalog_studies), + GWASCatalogStudyIndex, + ) + + +def test_annotate_sumstats( + mock_study_index_gwas_catalog: GWASCatalogStudyIndex, + sample_gwas_catalog_harmonised_sumstats_list: DataFrame, +) -> None: + """Test annotate sumstats of GWASCatalogStudyIndex.""" + mock_study_index_gwas_catalog.df = mock_study_index_gwas_catalog.df.drop( + "summarystatsLocation" + ) + assert isinstance( + mock_study_index_gwas_catalog._annotate_sumstats_info( + sample_gwas_catalog_harmonised_sumstats_list + ), + GWASCatalogStudyIndex, + ) + + +def test_study_index_from_source( + sample_gwas_catalog_studies: DataFrame, + sample_gwas_catalog_harmonised_sumstats_list: DataFrame, + sample_gwas_catalog_ancestries_lut: DataFrame, +) -> None: + """Test study index from source.""" + assert isinstance( + GWASCatalogStudyIndex.from_source( + sample_gwas_catalog_studies, + sample_gwas_catalog_ancestries_lut, + sample_gwas_catalog_harmonised_sumstats_list, + ), + GWASCatalogStudyIndex, + ) diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py b/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py new file mode 100644 index 000000000..a79f9eb4c --- /dev/null +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_study_splitter.py @@ -0,0 +1,19 @@ +"""Tests GWAS Catalog study splitter.""" +from __future__ import annotations + +from otg.datasource.gwas_catalog.associations import GWASCatalogAssociations +from otg.datasource.gwas_catalog.study_index import GWASCatalogStudyIndex +from otg.datasource.gwas_catalog.study_splitter import GWASCatalogStudySplitter + + +def test_gwas_catalog_splitter_split( + mock_study_index_gwas_catalog: GWASCatalogStudyIndex, + mock_study_locus_gwas_catalog: GWASCatalogAssociations, +) -> None: + """Test GWASCatalogStudyIndex, GWASCatalogAssociations creation with mock data.""" + d1, d2 = GWASCatalogStudySplitter.split( + mock_study_index_gwas_catalog, mock_study_locus_gwas_catalog + ) + + assert isinstance(d1, GWASCatalogStudyIndex) + assert isinstance(d2, GWASCatalogAssociations) diff --git a/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py b/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py new file mode 100644 index 000000000..0fc3ad5bf --- /dev/null +++ b/tests/datasource/gwas_catalog/test_gwas_catalog_summary_statistics.py @@ -0,0 +1,17 @@ +"""Test GWAS Catalog summary statistics.""" + +from __future__ import annotations + +from otg.datasource.gwas_catalog.summary_statistics import GWASCatalogSummaryStatistics + + +def test_gwas_catalog_summary_statistics_from_gwas_harmonized_summary_stats( + sample_gwas_catalog_harmonised_sumstats: GWASCatalogSummaryStatistics, +) -> None: + """Test GWASCatalogSummaryStatistics creation with mock data.""" + assert isinstance( + GWASCatalogSummaryStatistics.from_gwas_harmonized_summary_stats( + sample_gwas_catalog_harmonised_sumstats, "GCST000000" + ), + GWASCatalogSummaryStatistics, + ) diff --git a/tests/datasource/intervals/test_andersson.py b/tests/datasource/intervals/test_andersson.py new file mode 100644 index 000000000..e269d74e4 --- /dev/null +++ b/tests/datasource/intervals/test_andersson.py @@ -0,0 +1,36 @@ +"""Test Andersson Intervals.""" +from __future__ import annotations + +import pytest +from pyspark.sql import DataFrame, SparkSession + +from otg.common.Liftover import LiftOverSpark +from otg.dataset.gene_index import GeneIndex +from otg.datasource.intervals.andersson import IntervalsAndersson + + +@pytest.fixture(scope="module") +def sample_intervals_andersson(spark: SparkSession) -> DataFrame: + """Sample Andersson intervals.""" + return IntervalsAndersson.read_andersson( + spark, "tests/data_samples/andersson_sample.bed" + ) + + +def test_read_andersson(sample_intervals_andersson: DataFrame) -> None: + """Test read_andersson.""" + assert isinstance(sample_intervals_andersson, DataFrame) + + +def test_andersson_intervals_from_source( + sample_intervals_andersson: DataFrame, + mock_gene_index: GeneIndex, + liftover_chain_37_to_38: LiftOverSpark, +) -> None: + """Test JavierreIntervals creation with mock data.""" + assert isinstance( + IntervalsAndersson.parse( + sample_intervals_andersson, mock_gene_index, liftover_chain_37_to_38 + ), + IntervalsAndersson, + ) diff --git a/tests/datasource/intervals/test_javierre.py b/tests/datasource/intervals/test_javierre.py new file mode 100644 index 000000000..f2be1e5bb --- /dev/null +++ b/tests/datasource/intervals/test_javierre.py @@ -0,0 +1,36 @@ +"""Test JavierreIntervals.""" +from __future__ import annotations + +import pytest +from pyspark.sql import DataFrame, SparkSession + +from otg.common.Liftover import LiftOverSpark +from otg.dataset.gene_index import GeneIndex +from otg.datasource.intervals.javierre import IntervalsJavierre + + +@pytest.fixture(scope="module") +def sample_intervals_javierre(spark: SparkSession) -> DataFrame: + """Sample Javierre intervals.""" + return IntervalsJavierre.read_javierre( + spark, "tests/data_samples/javierre_sample.parquet" + ) + + +def test_read_javierre(sample_intervals_javierre: DataFrame) -> None: + """Test read_jung.""" + assert isinstance(sample_intervals_javierre, DataFrame) + + +def test_javierre_intervals_from_source( + sample_intervals_javierre: DataFrame, + mock_gene_index: GeneIndex, + liftover_chain_37_to_38: LiftOverSpark, +) -> None: + """Test JavierreIntervals creation with mock data.""" + assert isinstance( + IntervalsJavierre.parse( + sample_intervals_javierre, mock_gene_index, liftover_chain_37_to_38 + ), + IntervalsJavierre, + ) diff --git a/tests/datasource/intervals/test_jung.py b/tests/datasource/intervals/test_jung.py new file mode 100644 index 000000000..3fe50a7f8 --- /dev/null +++ b/tests/datasource/intervals/test_jung.py @@ -0,0 +1,34 @@ +"""Test Jung Intervals.""" +from __future__ import annotations + +import pytest +from pyspark.sql import DataFrame, SparkSession + +from otg.common.Liftover import LiftOverSpark +from otg.dataset.gene_index import GeneIndex +from otg.datasource.intervals.jung import IntervalsJung + + +@pytest.fixture(scope="module") +def sample_intervals_jung(spark: SparkSession) -> DataFrame: + """Sample Andersson intervals.""" + return IntervalsJung.read_jung(spark, "tests/data_samples/jung_sample.bed") + + +def test_read_jung(sample_intervals_jung: DataFrame) -> None: + """Test read_jung.""" + assert isinstance(sample_intervals_jung, DataFrame) + + +def test_jung_intervals_from_source( + sample_intervals_jung: DataFrame, + mock_gene_index: GeneIndex, + liftover_chain_37_to_38: LiftOverSpark, +) -> None: + """Test JungIntervals creation with mock data.""" + assert isinstance( + IntervalsJung.parse( + sample_intervals_jung, mock_gene_index, liftover_chain_37_to_38 + ), + IntervalsJung, + ) diff --git a/tests/datasource/intervals/test_thurnman.py b/tests/datasource/intervals/test_thurnman.py new file mode 100644 index 000000000..7b4f03995 --- /dev/null +++ b/tests/datasource/intervals/test_thurnman.py @@ -0,0 +1,36 @@ +"""Test Thurman.""" +from __future__ import annotations + +import pytest +from pyspark.sql import DataFrame, SparkSession + +from otg.common.Liftover import LiftOverSpark +from otg.dataset.gene_index import GeneIndex +from otg.datasource.intervals.thurnman import IntervalsThurnman + + +@pytest.fixture(scope="module") +def sample_intervals_thurnman(spark: SparkSession) -> DataFrame: + """Sample Andersson intervals.""" + return IntervalsThurnman.read_thurnman( + spark, "tests/data_samples/thurnman_sample.bed8" + ) + + +def test_read_thurnman(sample_intervals_thurnman: DataFrame) -> None: + """Test read_jung.""" + assert isinstance(sample_intervals_thurnman, DataFrame) + + +def test_thurnman_intervals_from_source( + sample_intervals_thurnman: DataFrame, + mock_gene_index: GeneIndex, + liftover_chain_37_to_38: LiftOverSpark, +) -> None: + """Test IntervalsThurnman creation with mock data.""" + assert isinstance( + IntervalsThurnman.parse( + sample_intervals_thurnman, mock_gene_index, liftover_chain_37_to_38 + ), + IntervalsThurnman, + ) diff --git a/tests/datasource/open_targets/test_target.py b/tests/datasource/open_targets/test_target.py new file mode 100644 index 000000000..a7035e26a --- /dev/null +++ b/tests/datasource/open_targets/test_target.py @@ -0,0 +1,12 @@ +"""Test Open Targets target data source.""" +from __future__ import annotations + +from pyspark.sql import DataFrame + +from otg.dataset.gene_index import GeneIndex +from otg.datasource.open_targets.target import OpenTargetsTarget + + +def test_open_targets_as_gene_index(sample_target_index: DataFrame) -> None: + """Test gene index from source.""" + assert isinstance(OpenTargetsTarget.as_gene_index(sample_target_index), GeneIndex) diff --git a/tests/datasource/ukbiobank/test_ukbiobank_study_index.py b/tests/datasource/ukbiobank/test_ukbiobank_study_index.py new file mode 100644 index 000000000..2637563fa --- /dev/null +++ b/tests/datasource/ukbiobank/test_ukbiobank_study_index.py @@ -0,0 +1,20 @@ +"""Tests for study index dataset from UK Biobank.""" + +from __future__ import annotations + +from pyspark.sql import DataFrame + +from otg.dataset.study_index import StudyIndex +from otg.datasource.ukbiobank.study_index import UKBiobankStudyIndex + + +def test_ukbiobank_study_index_from_source( + sample_ukbiobank_studies: DataFrame, +) -> None: + """Test study index from source.""" + assert isinstance( + UKBiobankStudyIndex.from_source( + sample_ukbiobank_studies, + ), + StudyIndex, + ) diff --git a/tests/method/test_clump.py b/tests/method/test_clump.py new file mode 100644 index 000000000..ef9e560a8 --- /dev/null +++ b/tests/method/test_clump.py @@ -0,0 +1,196 @@ +"""Test clumping methods.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t +import pytest + +from otg.dataset.study_locus import StudyLocus +from otg.method.clump import LDclumping + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + +def test_clump(mock_study_locus: StudyLocus) -> None: + """Test PICS.""" + assert isinstance(LDclumping.clump(mock_study_locus), StudyLocus) + + +@pytest.mark.parametrize( + ("observed_data", "expected_data"), + [ + ( + [ + ( + # Dependent locus - lead is correlated with a more significant variant + 1, + "L1", + "GCST005650_1", + 1.0, + -17, + [{"tagVariantId": "T1"}, {"tagVariantId": "L2"}], + None, + ), + ( + # Dependent locus - lead shows a stronger association than the row above + 2, + "L2", + "GCST005650_1", + 4.0, + -18, + [ + {"tagVariantId": "T2"}, + {"tagVariantId": "T3"}, + {"tagVariantId": "L1"}, + ], + None, + ), + ( + # Independent locus + 3, + "L2", + "GCST005650_1", + 4.0, + -18, + [ + {"tagVariantId": "L3"}, + {"tagVariantId": "T4"}, + {"tagVariantId": "L5"}, + ], + None, + ), + ( + # Empty credible set + 4, + "L3", + "GCST005650_1", + 4.0, + -18, + [], + None, + ), + ( + # Null credible set + 5, + "L4", + "GCST005650_1", + 4.0, + -18, + None, + None, + ), + ], + [ + ( + # Signal is linked to the next row + 1, + "L1", + "GCST005650_1", + 1.0, + -17, + [{"tagVariantId": "T1"}, {"tagVariantId": "L2"}], + True, + ), + ( + # Signal is the most significant + 2, + "L2", + "GCST005650_1", + 4.0, + -18, + [ + {"tagVariantId": "T2"}, + {"tagVariantId": "T3"}, + {"tagVariantId": "L1"}, + ], + False, + ), + ( + # Signal is not linked + 3, + "L2", + "GCST005650_1", + 4.0, + -18, + [ + {"tagVariantId": "L3"}, + {"tagVariantId": "T4"}, + {"tagVariantId": "L5"}, + ], + False, + ), + ( + # Empty credible set - signal is not linked + 4, + "L3", + "GCST005650_1", + 4.0, + -18, + [], + False, + ), + ( + # Null credible set - signal is not linked + 5, + "L4", + "GCST005650_1", + 4.0, + -18, + None, + False, + ), + ], + ) + ], +) +def test_is_lead_linked( + spark: SparkSession, observed_data: list, expected_data: list +) -> None: + """Test function that annotates whether a studyLocusId is linked to a more statistically significant studyLocusId.""" + schema = t.StructType( + [ + t.StructField("studyLocusId", t.LongType(), True), + t.StructField("variantId", t.StringType(), True), + t.StructField("studyId", t.StringType(), True), + t.StructField("pValueMantissa", t.FloatType(), True), + t.StructField("pValueExponent", t.IntegerType(), True), + t.StructField( + "ldSet", + t.ArrayType( + t.StructType( + [ + t.StructField("tagVariantId", t.StringType(), True), + ] + ) + ), + True, + ), + t.StructField("is_lead_linked", t.BooleanType(), True), + ] + ) + study_locus_df = spark.createDataFrame( + observed_data, + schema, + ) + observed_df = ( + study_locus_df.withColumn( + "is_lead_linked", + LDclumping._is_lead_linked( + f.col("studyId"), + f.col("variantId"), + f.col("pValueExponent"), + f.col("pValueMantissa"), + f.col("ldSet"), + ), + ) + .orderBy("studyLocusId") + .collect() + ) + expected_df = ( + spark.createDataFrame(expected_data, schema).orderBy("studyLocusId").collect() + ) + assert observed_df == expected_df diff --git a/tests/method/test_ld.py b/tests/method/test_ld.py index 837615a98..7dc18f863 100644 --- a/tests/method/test_ld.py +++ b/tests/method/test_ld.py @@ -2,10 +2,142 @@ from __future__ import annotations +from typing import TYPE_CHECKING + +import pyspark.sql.functions as f +import pyspark.sql.types as t +import pytest +from pyspark.sql import Row + from otg.dataset.study_locus import StudyLocus -from otg.method.ld import LDclumping +from otg.method.ld import LDAnnotator + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + from otg.dataset.ld_index import LDIndex + from otg.dataset.study_index import StudyIndex + + +class TestLDAnnotator: + """Test LDAnnotatorGnomad.""" + + def test__add_population_size( + self: TestLDAnnotator, + ) -> None: + """Test _add_population_size.""" + result_df = self.observed_df.select( + LDAnnotator._add_population_size( + f.col("ldSet"), f.col("ldPopulationStructure") + ).alias("ldSet") + ) + expected = [0.8, None] + for i, row in enumerate(result_df.collect()): + assert row["ldSet"][0]["rValues"][i]["relativeSampleSize"] == pytest.approx( + expected[i] + ) + + def test__calculate_weighted_r_overall( + self: TestLDAnnotator, + ) -> None: + """Test _calculate_weighted_r_overall.""" + result_df = self.observed_df.withColumn( + "ldSet", + LDAnnotator._add_population_size( + f.col("ldSet"), f.col("ldPopulationStructure") + ), + ).withColumn("ldSet", LDAnnotator._calculate_weighted_r_overall(f.col("ldSet"))) + expected = 0.2 + assert result_df.collect()[0]["ldSet"][0]["r2Overall"] == pytest.approx( + expected + ) + @pytest.fixture(autouse=True) + def _setup(self: TestLDAnnotator, spark: SparkSession) -> None: + """Prepares fixtures for the test.""" + self.association_w_ld_set_schema = t.StructType( + [ + t.StructField("variantId", t.StringType(), True), + t.StructField( + "ldSet", + t.ArrayType( + t.StructType( + [ + t.StructField("tagVariantId", t.StringType(), True), + t.StructField( + "rValues", + t.ArrayType( + t.StructType( + [ + t.StructField( + "population", t.StringType(), True + ), + t.StructField( + "r", t.DoubleType(), True + ), + ] + ) + ), + True, + ), + ] + ) + ), + True, + ), + t.StructField("studyId", t.StringType(), True), + t.StructField( + "ldPopulationStructure", + t.ArrayType( + t.StructType( + [ + t.StructField("ldPopulation", t.StringType(), True), + t.StructField( + "relativeSampleSize", t.DoubleType(), True + ), + ] + ) + ), + ), + ] + ) + observed_data = [ + Row( + variantId="var1", + ldSet=[ + { + "tagVariantId": "tag1", + "rValues": [ + {"population": "pop1", "r": 0.5}, + {"population": "pop2", "r": 0.6}, + ], + } + ], + studyId="study1", + ldPopulationStructure=[ + { + "ldPopulation": "pop1", + "relativeSampleSize": 0.8, + }, + { + "ldPopulation": "pop3", + "relativeSampleSize": 0.2, + }, + ], + ) + ] + self.observed_df = spark.createDataFrame( + observed_data, self.association_w_ld_set_schema + ) -def test_clump(mock_study_locus: StudyLocus) -> None: - """Test PICS.""" - assert isinstance(LDclumping.clump(mock_study_locus), StudyLocus) + def test_ldannotate( + self: TestLDAnnotator, + mock_study_locus: StudyLocus, + mock_study_index: StudyIndex, + mock_ld_index: LDIndex, + ) -> None: + """Test LD annotator.""" + assert isinstance( + LDAnnotator.ld_annotate(mock_study_locus, mock_study_index, mock_ld_index), + StudyLocus, + ) diff --git a/tests/method/test_pics.py b/tests/method/test_pics.py index c63dcf6fc..1bef39750 100644 --- a/tests/method/test_pics.py +++ b/tests/method/test_pics.py @@ -2,10 +2,69 @@ from __future__ import annotations +import pyspark.sql.functions as f +from pyspark.sql import Row + from otg.dataset.study_locus import StudyLocus from otg.method.pics import PICS -def test_pics(mock_study_locus: StudyLocus) -> None: - """Test PICS.""" +class TestFinemap: + """Test PICS finemap function under different scenarios.""" + + def test_finemap_pipeline(self: TestFinemap, mock_study_locus: StudyLocus) -> None: + """Test finemap works with a mock study locus.""" + assert isinstance(PICS.finemap(mock_study_locus), StudyLocus) + + def test_finemap_empty_array( + self: TestFinemap, mock_study_locus: StudyLocus + ) -> None: + """Test finemap works when `locus` is an empty array by returning an empty array.""" + mock_study_locus.df = mock_study_locus.df.withColumn( + "ldSet", + # empty array following the `locus` schema + f.when(f.col("ldSet").isNull(), f.array()).otherwise(f.col("ldSet")), + ).filter(f.size("ldSet") == 0) + observed_df = PICS.finemap(mock_study_locus).df.limit(1) + print("TEST_FINEMAP_EMPTY_ARRAY", observed_df.show(truncate=False)) + assert observed_df.collect()[0]["locus"] == [] + + def test_finemap_null_ld_set( + self: TestFinemap, mock_study_locus: StudyLocus + ) -> None: + """Test how we apply `finemap` when `locus` is null by returning a null field.""" + mock_study_locus.df = mock_study_locus.df.filter(f.col("ldSet").isNull()) + observed_df = PICS.finemap(mock_study_locus).df.limit(1) + print("TEST_FINEMAP_NULL", observed_df.show(truncate=False)) + assert observed_df.collect()[0]["locus"] is None + + +def test__finemap_udf() -> None: + """Test the _finemap UDF with a simple case.""" + ld_set = [ + Row(variantId="var1", r2Overall=0.8), + Row(variantId="var2", r2Overall=1), + ] + result = PICS._finemap(ld_set, lead_neglog_p=10.0, k=6.4) + expected = [ + { + "variantId": "var1", + "r2Overall": 0.8, + "standardError": 0.07420896512708416, + "posteriorProbability": 0.07116959886882368, + }, + { + "variantId": "var2", + "r2Overall": 1, + "standardError": 0.9977000638225533, + "posteriorProbability": 0.9288304011311763, + }, + ] + for idx, tag in enumerate(result): # type: ignore + # assert both dictionaries have the same content regardless of its order + assert tag == expected[idx] + + +def test_finemap(mock_study_locus: StudyLocus) -> None: + """Test finemap function returns study-locus.""" assert isinstance(PICS.finemap(mock_study_locus), StudyLocus) diff --git a/tests/method/test_window_based_clumping.py b/tests/method/test_window_based_clumping.py new file mode 100644 index 000000000..0a5ad5208 --- /dev/null +++ b/tests/method/test_window_based_clumping.py @@ -0,0 +1,97 @@ +"""Test window-based clumping.""" +from __future__ import annotations + +from typing import TYPE_CHECKING + +from pyspark.ml import functions as fml +from pyspark.ml.linalg import VectorUDT +from pyspark.sql import functions as f +from pyspark.sql.window import Window + +from otg.dataset.study_locus import StudyLocus +from otg.method.window_based_clumping import WindowBasedClumping + +if TYPE_CHECKING: + from pyspark.sql import SparkSession + + from otg.dataset.summary_statistics import SummaryStatistics + + +def test_window_based_clump__return_type( + mock_summary_statistics: SummaryStatistics, +) -> None: + """Test window-based clumping.""" + assert isinstance( + WindowBasedClumping.clump_with_locus(mock_summary_statistics, 250_000), + StudyLocus, + ) + + +def test_window_based_clump__correctness( + sample_summary_satistics: SummaryStatistics, +) -> None: + """Test window-based clumping.""" + clumped = sample_summary_satistics.window_based_clumping(250_000) + + # One semi index was found: + assert clumped.df.count() == 1 + + # Assert the variant found: + assert (clumped.df.filter(f.col("variantId") == "18_12843138_T_C").count()) == 1 + + +def test_window_based_clump_with_locus__correctness( + sample_summary_satistics: SummaryStatistics, +) -> None: + """Test window-based clumping.""" + clumped = sample_summary_satistics.window_based_clumping(250_000, with_locus=True) + + # Asserting the presence of locus key: + assert "locus" in clumped.df.columns + + # One semi index was found: + assert clumped.df.count() == 1 + + # Assert the variant found: + assert (clumped.df.filter(f.col("variantId") == "18_12843138_T_C").count()) == 1 + + # Assert the number of variants in the locus: + assert (clumped.df.select(f.explode_outer("locus").alias("loci")).count()) == 132 + + +def test_prune_peak(spark: SparkSession): + """Test the pruning of peaks.""" + data = [ + ("c", 3, 4.0), + ("c", 4, 2.0), + ("c", 6, 1.0), + ("c", 8, 2.5), + ("c", 9, 3.0), + ] + df = ( + spark.createDataFrame(data, ["cluster", "position", "negLogPValue"]) + .withColumn( + "collected_positions", + f.collect_list(f.col("position")).over( + Window.partitionBy("cluster") + .orderBy(f.col("negLogPValue").desc()) + .rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing) + ), + ) + .withColumn( + "isLeadList", + f.udf(WindowBasedClumping._prune_peak, VectorUDT())( + fml.array_to_vector(f.col("collected_positions")), f.lit(2) + ), + ) + ) + + expected_result = spark.createDataFrame( + [("c", [1.0, 1.0, 0.0, 0.0, 1.0])], ["cluster", "isLeadList"] + ).withColumn("isLeadList", fml.array_to_vector(f.col("isLeadList"))) + + # Compare the actual DataFrame with the expected result + assert ( + df.select("cluster", "isLeadList").distinct().collect() + == expected_result.collect() + ) diff --git a/tests/test_docs.py b/tests/test_docs.py new file mode 100644 index 000000000..fd0d0b5d0 --- /dev/null +++ b/tests/test_docs.py @@ -0,0 +1,36 @@ +"""Test that validates the mkdocs documentation using pytest.""" + +from __future__ import annotations + +import pytest +from mkdocs.commands.build import build +from mkdocs.config import load_config +from mkdocs.exceptions import MkDocsException + + +# Pytest fixture to build the MkDocs documentation before running tests. +@pytest.fixture(scope="module") +def mkdocs_build(): + """Fixture to build documentation.""" + try: + cfg = load_config("mkdocs.yml", strict=False) + cfg.plugins["material/search"].on_startup(command="build", dirty=not "clean") + # config = load_config() + # config.strict = True + build(cfg) + except MkDocsException as e: + raise AssertionError(f"MkDocs build failed: {e}") from e + + +# Test +def test_mkdocs_build(mkdocs_build): + """Function to check if MkDocs build succeeded.""" + pass + + +def test_check_missing_files(mkdocs_build): + """Test function to check for missing files in the documentation build.""" + import os + + build_dir = "site" + assert os.path.exists(build_dir), f"Build directory '{build_dir}' does not exist." diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 0f6bb5dec..19d85cf1b 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -1,14 +1,24 @@ """Tests on spark schemas.""" +# type: ignore from __future__ import annotations import json import os +import re from pathlib import Path +from typing import TYPE_CHECKING +import pyspark.sql.functions as f import pytest from pyspark.sql.types import StructType -SCHEMA_DIR = "src/otg/dataset/schemas" +if TYPE_CHECKING: + from _pytest.fixtures import FixtureRequest + + from otg.dataset.gene_index import GeneIndex + from otg.dataset.v2g import V2G + +SCHEMA_DIR = "src/otg/assets/schemas" def pytest_generate_tests(metafunc: pytest.Metafunc) -> None: @@ -19,8 +29,9 @@ def pytest_generate_tests(metafunc: pytest.Metafunc) -> None: Args: metafunc (Metafunc): _description_ """ - schemas = [f for f in os.listdir(SCHEMA_DIR) if f.endswith(".json")] - metafunc.parametrize("schema_json", schemas) + if "schema_json" in metafunc.fixturenames: + schemas = [f for f in os.listdir(SCHEMA_DIR) if f.endswith(".json")] + metafunc.parametrize("schema_json", schemas) def test_schema(schema_json: str) -> None: @@ -31,3 +42,89 @@ def test_schema(schema_json: str) -> None: """ core_schema = json.loads(Path(SCHEMA_DIR, schema_json).read_text(encoding="utf-8")) isinstance(StructType.fromJson(core_schema), StructType) + + +def is_camelcase(identifier: str) -> bool: + """Use a regular expression to check if the identifier is in camelCase. + + CamelCase starts with a lowercase letter and has uppercase letters in between. A lowercase letter can also be followed by a number. + """ + return re.match(r"^[a-z]+(?:[A-Z0-9][a-z0-9]*)*$", identifier) is not None + + +def test_schema_columns_camelcase(schema_json: str) -> None: + """Test schema column names are in camelCase. + + Args: + schema_json (str): schema filename + """ + core_schema = json.loads(Path(SCHEMA_DIR, schema_json).read_text(encoding="utf-8")) + schema = StructType.fromJson(core_schema) + # Use a regular expression to check if the identifier is in camelCase + # CamelCase starts with a lowercase letter and has uppercase letters in between. + + for field in schema.fields: + assert is_camelcase( + field.name + ), f"Column name '{field.name}' is not in camelCase." + + +class TestValidateSchema: + """Test validate_schema method using V2G (unnested) and GeneIndex (nested) as a testing dataset.""" + + @pytest.fixture() + def mock_dataset_instance( + self: TestValidateSchema, request: FixtureRequest + ) -> V2G | GeneIndex: + """Meta fixture to return the value of any requested fixture.""" + return request.getfixturevalue(request.param) + + @pytest.mark.parametrize( + "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + ) + def test_validate_schema_extra_field( + self: TestValidateSchema, + mock_dataset_instance: V2G | GeneIndex, + ) -> None: + """Test that validate_schema raises an error if the observed schema has an extra field.""" + with pytest.raises(ValueError, match="extraField"): + mock_dataset_instance.df = mock_dataset_instance.df.withColumn( + "extraField", f.lit("extra") + ) + + @pytest.mark.parametrize( + "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + ) + def test_validate_schema_missing_field( + self: TestValidateSchema, + mock_dataset_instance: V2G | GeneIndex, + ) -> None: + """Test that validate_schema raises an error if the observed schema is missing a required field, geneId in this case.""" + with pytest.raises(ValueError, match="geneId"): + mock_dataset_instance.df = mock_dataset_instance.df.drop("geneId") + + @pytest.mark.parametrize( + "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + ) + def test_validate_schema_duplicated_field( + self: TestValidateSchema, + mock_dataset_instance: V2G | GeneIndex, + ) -> None: + """Test that validate_schema raises an error if the observed schema has a duplicated field, geneId in this case.""" + with pytest.raises(ValueError, match="geneId"): + mock_dataset_instance.df = mock_dataset_instance.df.select( + "*", f.lit("A").alias("geneId") + ) + + @pytest.mark.parametrize( + "mock_dataset_instance", ["mock_v2g", "mock_gene_index"], indirect=True + ) + def test_validate_schema_different_datatype( + self: TestValidateSchema, + mock_dataset_instance: V2G | GeneIndex, + ) -> None: + """Test that validate_schema raises an error if any field in the observed schema has a different type than expected.""" + with pytest.raises(ValueError, match="geneId"): + mock_dataset_instance.df = mock_dataset_instance.df.withColumn( + "geneId", f.lit(1) + ) diff --git a/tests/test_spark_helpers.py b/tests/test_spark_helpers.py index f2449c175..a38e8d5bf 100644 --- a/tests/test_spark_helpers.py +++ b/tests/test_spark_helpers.py @@ -5,10 +5,12 @@ import pyspark.sql.functions as f import pytest +from pyspark.sql.types import ArrayType, DoubleType, StructField, StructType from otg.common.spark_helpers import ( get_record_with_maximum_value, get_record_with_minimum_value, + order_array_of_structs_by_field, ) if TYPE_CHECKING: @@ -50,3 +52,41 @@ def test_get_record_with_maximum_value_group_two_cols( lambda df: get_record_with_maximum_value(df, grouping_col, sorting_col) ) assert df.count(), 3 + + +@pytest.mark.parametrize( + ("observed", "expected"), + [ + ( + # observed - unordered array of structs + [([{"probability": 0.5}, {"probability": 0.7}],)], + # expected - ordered array of structs + [([{"probability": 0.7}, {"probability": 0.5}],)], + ), + ( + # observed - array of structs with null values + [([{"probability": 0.5}, {"probability": None}, {"probability": 0.7}],)], + # expected - null values at the end + [([{"probability": 0.7}, {"probability": 0.5}, {"probability": None}],)], + ), + ], +) +def test_order_array_of_structs_by_field( + spark: SparkSession, observed: list, expected: list +) -> None: + """Test the util that returns an array of structs ordered by a field.""" + mock_schema = StructType( + [ + StructField( + "array_of_structs", + ArrayType(StructType([StructField("probability", DoubleType())])), + ) + ] + ) + observed_df = spark.createDataFrame(observed, mock_schema).select( + order_array_of_structs_by_field("array_of_structs", "probability").alias( + "array_of_structs" + ) + ) + expected_df = spark.createDataFrame(expected, mock_schema) + assert observed_df.collect() == expected_df.collect() diff --git a/utils/install_dependencies.sh b/utils/install_dependencies.sh index 58b338c0a..117fc1d5b 100644 --- a/utils/install_dependencies.sh +++ b/utils/install_dependencies.sh @@ -9,22 +9,24 @@ if ! command -v pyenv &>/dev/null; then . <(tail -n3 ~/.bashrc) fi -if ! command -v poetry &>/dev/null; then - echo "Installing Poetry, a tool to manage Python dependencies..." - curl -sSL https://install.python-poetry.org | python3 - -fi - echo "Activating Pyenv environment with a Python version required for the project..." PYTHON_VERSION=$(grep '^python = ".*"' pyproject.toml | cut -d'"' -f2) pyenv install --skip-existing $PYTHON_VERSION pyenv shell $PYTHON_VERSION -echo "Installing dependencies through Poetry..." -poetry install --remove-untracked +if ! command -v poetry &>/dev/null; then + echo "Installing Poetry, a tool to manage Python dependencies..." + curl -sSL https://install.python-poetry.org | python3 - +fi + +echo "Preparing the Poetry environment and installing dependencies..." +poetry env use $PYTHON_VERSION +poetry install --sync echo "Setting up pre-commit..." poetry run pre-commit install poetry run pre-commit autoupdate poetry run pre-commit install --hook-type commit-msg -echo "You are ready to code!" +echo "Activating the Poetry environment..." +poetry shell diff --git a/utils/initialise_cluster.sh b/utils/install_dependencies_on_cluster.sh similarity index 80% rename from utils/initialise_cluster.sh rename to utils/install_dependencies_on_cluster.sh index 781618f3d..39a61e5a6 100644 --- a/utils/initialise_cluster.sh +++ b/utils/install_dependencies_on_cluster.sh @@ -3,6 +3,7 @@ set -exo pipefail readonly PACKAGE=$(/usr/share/google/get_metadata_value attributes/PACKAGE || true) +readonly CONFIGTAR=$(/usr/share/google/get_metadata_value attributes/CONFIGTAR || true) function err() { echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2 @@ -48,8 +49,14 @@ function main() { gsutil cp ${PACKAGE} . PACKAGENAME=$(basename ${PACKAGE}) + echo "Uninstalling previous version if it exists" + pip uninstall -y otgenetics echo "Install package..." run_with_retry pip install --upgrade ${PACKAGENAME} + + echo "Downloading and uncompressing config..." + gsutil cp ${CONFIGTAR} . + tar -xvf $(basename ${CONFIGTAR}) } main diff --git a/utils/update_GWAS_Catalog_data.sh b/utils/update_GWAS_Catalog_data.sh new file mode 100755 index 000000000..667e995c4 --- /dev/null +++ b/utils/update_GWAS_Catalog_data.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + + +# Function to get the most recent date: +get_most_recent(){ + cat $1 | perl -lane 'push @a, $_ if $_ =~ /^\d+$/; END {@a = sort { $a <=> $b} @a; print pop @a }' +} + +# Function to return the path the to the most recent release: +get_release_url(){ + YEAR=$(curl -s --list-only ${BASE_URL}/releases/ | get_most_recent) + MONTH=$(curl -s --list-only ${BASE_URL}/releases/${YEAR}/ | get_most_recent) + DAY=$(curl -s --list-only ${BASE_URL}/releases/${YEAR}/${MONTH}/ | get_most_recent) + echo $YEAR $MONTH $DAY +} + +# Function to get the Ensembl and EFO version which used to ground GWAS data: +get_release_info(){ + curl -s https://www.ebi.ac.uk/gwas/api/search/stats | jq -r '"\(.ensemblbuild) \(.efoversion)"' +} + +logging(){ + log_prompt="[$(date "+%Y.%m.%d %H:%M")]" + echo "${log_prompt} $@" +} + +# Resources: +export BASE_URL=ftp://ftp.ebi.ac.uk/pub/databases/gwas +export RELEASE_INFO_URL=https://www.ebi.ac.uk/gwas/api/search/stats +export GCP_TARGET=gs://genetics_etl_python_playground/input/v2d/ + +logging "Extracing data from: ${BASE_URL}" +logging "Release info fetched fom: ${RELEASE_INFO_URL}" +logging "Resulting files uploaded to: ${GCP_TARGET}" + +# Capturing release date: +read YEAR MONTH DAY < <(get_release_url) +logging "Most recent GWAS Catalog release: ${YEAR}/${MONTH}/${DAY}" + +# Capturing release metadata: +read ENSEMBL EFO < <(get_release_info) +logging "Genes were mapped to v${ENSEMBL} Ensembl release." +logging "Diseases were mapped to ${EFO} EFO release." + +# Constructing FTP URL to access the most recent release: +RELEASE_URL=${BASE_URL}/releases/${YEAR}/${MONTH}/${DAY} +logging "Datafiles are fetching from ${RELEASE_URL}" + +# Fetching files while assigning properly dated and annotated names: +wget -q ${RELEASE_URL}/gwas-catalog-associations_ontology-annotated.tsv \ + -O gwas_catalog_v1.0.2-associations_e${ENSEMBL}_r${YEAR}-${MONTH}-${DAY}.tsv +logging "File gwas_catalog_v1.0.2-associations_e${ENSEMBL}_r${YEAR}-${MONTH}-${DAY}.tsv saved." + +wget -q ${RELEASE_URL}/gwas-catalog-download-studies-v1.0.3.txt \ + -O gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv +logging "File gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv saved." + +wget -q ${RELEASE_URL}/gwas-catalog-download-ancestries-v1.0.3.txt \ + -O gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv +logging "File gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv saved." + +wget -q ${BASE_URL}/summary_statistics/harmonised_list.txt -O harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt +logging "File harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt saved." + +logging "Copying files to GCP..." +gsutil -q cp file://$(pwd)/gwas_catalog_v1.0.2-associations_e${ENSEMBL}_r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -q cp file://$(pwd)/gwas-catalog-v1.0.3-studies-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -q cp file://$(pwd)/gwas-catalog-v1.0.3-ancestries-r${YEAR}-${MONTH}-${DAY}.tsv ${GCP_TARGET}/ +gsutil -q cp file://$(pwd)/harmonised_list-r${YEAR}-${MONTH}-${DAY}.txt ${GCP_TARGET}/ + +logging "Done." diff --git a/workflow/__init__.py b/workflow/__init__.py new file mode 100644 index 000000000..0205aa8e7 --- /dev/null +++ b/workflow/__init__.py @@ -0,0 +1,3 @@ +"""Google Cloud Dataproc Workflow.""" + +from __future__ import annotations diff --git a/workflow/dag.yaml b/workflow/dag.yaml new file mode 100644 index 000000000..a9416b774 --- /dev/null +++ b/workflow/dag.yaml @@ -0,0 +1,18 @@ +- id: "my_gene_index" +- id: "my_variant_annotation" +- id: "my_ld_index" +- id: "my_gwas_catalog" + prerequisites: + - "my_variant_annotation" + - "my_ld_index" +- id: "my_variant_index" + prerequisites: + - "my_variant_annotation" + - "my_gwas_catalog" +- id: "my_v2g" + prerequisites: + - "my_variant_index" + - "my_variant_annotation" + - "my_gene_index" +- id: "my_finngen" +- id: "my_ukbiobank" diff --git a/workflow/workflow_template.py b/workflow/workflow_template.py new file mode 100644 index 000000000..043733119 --- /dev/null +++ b/workflow/workflow_template.py @@ -0,0 +1,260 @@ +"""Generate jinja2 template for workflow.""" +from __future__ import annotations + +import argparse +import subprocess + +import yaml +from google.cloud import dataproc_v1 as dataproc +from google.cloud.dataproc_v1.types import ( + NodeInitializationAction, + OrderedJob, + WorkflowTemplate, + WorkflowTemplatePlacement, +) +from google.protobuf.duration_pb2 import Duration + +# Command line arguments +parser = argparse.ArgumentParser(description="Submit the workflow to Dataproc.") +parser.add_argument( + "cluster_prefix", + metavar="cluster_prefix", + type=str, + help="A prefix to use for cluster and template name construction. It's a good idea to use your initials.", +) +parser.add_argument( + "--machine-type", + metavar="machine_type", + type=str, + default="n1-highmem-8", + help="Google Dataproc machine type, default: %(default)s.", +) +parser.add_argument( + "--num-ssds", + metavar="num_local_ssds", + type=int, + default=1, + help="Number of local SSDs that supplement the boot disk, default: %(default)s.", +) +parser.add_argument( + "--boot-disk-size", + metavar="boot_disk_size", + type=int, + default=500, + help="Size in GB of the primary disk attached to each node, default: %(default)s.", +) + + +# Google Cloud configuration +project_id = "open-targets-genetics-dev" +region = "europe-west1" +zone = "europe-west1-d" + +# Managed cluster +code_version = ( + subprocess.check_output(["poetry", "version", "--short"]).decode("utf-8").strip() +) +assert ( + code_version +), "Could not fetch code version from the current Poetry configuration" +initialisation_base_path = ( + f"gs://genetics_etl_python_playground/initialisation/{code_version}" +) +python_cli = f"{initialisation_base_path}/cli.py" +config_name = "my_config" +config_tar = f"{initialisation_base_path}/config.tar.gz" +package_wheel = f"{initialisation_base_path}/otgenetics-{code_version}-py3-none-any.whl" +initialisation_executable_file = ( + f"{initialisation_base_path}/install_dependencies_on_cluster.sh" +) +image_version = "2.1" + +# Available cluster +cluster_uuid = "eba42738-2ea3-4b0a-ba1d-38428427e838" + +# job +python_cli = "gs://genetics_etl_python_playground/initialisation/cli.py" +cluster_config_dir = "/config" + +# template +dag_yaml = "workflow/dag.yaml" + + +def generate_available_placement_template( + cluster_uuid: str, +) -> WorkflowTemplatePlacement: + """Generates placement using available clusters. + + Args: + cluster_uuid (str): Cluster UUID to use for placement. + + Returns: + WorkflowTemplatePlacement: Placement template. + """ + placement = dataproc.WorkflowTemplatePlacement() + placement.cluster_selector.cluster_labels = { + "goog-dataproc-cluster-uuid": cluster_uuid + } + return placement + + +def generate_managed_placement_template( + cluster_name: str, + config_tar: str, + package_wheel: str, + zone: str, + machine_type: str, + initialisation_executable_file: str, + image_version: str, + num_local_ssds: int = 0, + boot_disk_size_gb: int = 500, + initialisation_execution_timeout: str = "600s", +) -> WorkflowTemplatePlacement: + """Generates placement using managed clusters. + + Args: + cluster_name (str): Cluster name to use for placement. + config_tar (str): Path to GS location with config tarball to use for cluster creation. + package_wheel (str): Path to GS location with package wheel to use for cluster creation. + zone (str): Zone to use for cluster creation. + machine_type (str): Machine type to use for cluster creation. + initialisation_executable_file (str): Path to GS location with initialisation script. + image_version (str): Dataproc image version to use for cluster creation. + num_local_ssds (int): Number of local SSDs to use for cluster creation. Defaults to 0. + boot_disk_size_gb (int): Size in GB of the primary disk attached to each node. Defaults to 500. + initialisation_execution_timeout (str): Initialisation script execution timeout. Defaults to "600s". + + Returns: + WorkflowTemplatePlacement: Placement template. + """ + placement = dataproc.WorkflowTemplatePlacement() + placement.managed_cluster.cluster_name = cluster_name + placement.managed_cluster.config.endpoint_config.enable_http_port_access = True + placement.managed_cluster.config.gce_cluster_config.zone_uri = zone + placement.managed_cluster.config.gce_cluster_config.metadata = { + "CONFIGTAR": config_tar, + "PACKAGE": package_wheel, + } + if num_local_ssds > 0: + placement.managed_cluster.config.master_config.disk_config.num_local_ssds = ( + num_local_ssds + ) + initialisation_node = NodeInitializationAction() + initialisation_node.executable_file = initialisation_executable_file + duration = Duration() + duration.FromJsonString(initialisation_execution_timeout) + initialisation_node.execution_timeout = duration + placement.managed_cluster.config.initialization_actions = [initialisation_node] + + placement.managed_cluster.config.master_config.machine_type_uri = machine_type + placement.managed_cluster.config.master_config.disk_config.boot_disk_type = ( + "pd-ssd" if num_local_ssds > 0 else "pd-standard" + ) + placement.managed_cluster.config.master_config.disk_config.boot_disk_size_gb = ( + boot_disk_size_gb + ) + placement.managed_cluster.config.software_config.image_version = image_version + placement.managed_cluster.config.software_config.properties = { + "dataproc:dataproc.allow.zero.workers": "true", + "yarn:yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage": "98", + } + return placement + + +def pyspark_job_template( + step: dict, + cluster_config_dir: str, + config_name: str, +) -> OrderedJob: + """Generates a pyspark job template. + + Args: + step (dict): Step to generate job for. + cluster_config_dir (str): Local path in the cluster where the config tarball is extracted. + config_name (str): Name of the config file to use. + + Returns: + OrderedJob: Pyspark job template. + """ + job = OrderedJob() + job.step_id = step["id"] + job.pyspark_job.main_python_file_uri = python_cli + job.pyspark_job.args = [ + f"step={ step['id'] }", + f"--config-dir={ cluster_config_dir }", + f"--config-name={ config_name }", + ] + # to provide hail support + job.pyspark_job.properties = { + "spark.jars": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.driver.extraClassPath": "/opt/conda/miniconda3/lib/python3.10/site-packages/hail/backend/hail-all-spark.jar", + "spark.executor.extraClassPath": "./hail-all-spark.jar", + "spark.serializer": "org.apache.spark.serializer.KryoSerializer", + "spark.kryo.registrator": "is.hail.kryo.HailKryoRegistrator", + } + # dependency steps + if "prerequisites" in step: + job.prerequisite_step_ids = step["prerequisites"] + return job + + +def instantiate_inline_workflow_template( + project_id: str, region: str, template: WorkflowTemplate +) -> None: + """Submits a workflow for a Cloud Dataproc using the Python client library. + + Args: + project_id (str): Project to use for running the workflow. + region (str): Region where the workflow resources should live. + template (WorkflowTemplate): Workflow template to submit. + """ + # Create a client with the endpoint set to the desired region. + workflow_template_client = dataproc.WorkflowTemplateServiceClient( + client_options={"api_endpoint": f"{region}-dataproc.googleapis.com:443"} + ) + # Submit the request to instantiate the workflow from an inline template. + operation = workflow_template_client.instantiate_inline_workflow_template( + request={ + "parent": f"projects/{project_id}/regions/{region}", + "template": template, + } + ) + operation.result() + + # Output a success message. + print("Workflow ran successfully.") + + +def main(args: argparse.Namespace) -> None: + """Submit dataproc workflow.""" + template = dataproc.WorkflowTemplate() + + # Initialize request argument(s) + template.id = f"{args.cluster_prefix}-ot-genetics-workflow" + cluster_name = f"{args.cluster_prefix}-otg-cluster" + # template.placement = generate_available_placement_template(cluster_uuid) + template.placement = generate_managed_placement_template( + cluster_name, + config_tar, + package_wheel, + zone, + args.machine_type, + initialisation_executable_file, + image_version, + num_local_ssds=args.num_ssds, + boot_disk_size_gb=args.boot_disk_size, + ) + + # Load steps from yaml file + with open(dag_yaml, "r") as file: + steps = yaml.safe_load(file) + + template.jobs = [ + pyspark_job_template(step, cluster_config_dir, config_name) for step in steps + ] + + instantiate_inline_workflow_template(project_id, region, template) + + +if __name__ == "__main__": + main(parser.parse_args())