development 7ed0e6ef312b cached
242 files
1.1 MB
238.6k tokens
541 symbols
1 requests
Download .txt
Showing preview only (1,152K chars total). Download the full file or copy to clipboard to get everything.
Repository: microsoft/rag-experiment-accelerator
Branch: development
Commit: 7ed0e6ef312b
Files: 242
Total size: 1.1 MB

Directory structure:
gitextract_gvj_8lac/

├── .coveragerc
├── .devcontainer/
│   ├── devcontainer.json
│   └── post-create.sh
├── .flake8
├── .github/
│   ├── actions/
│   │   └── configure_azureml_agent/
│   │       └── action.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build_validation_workflow.yml
│       └── rag_exp_acc_ci.yml
├── .gitignore
├── .pre-commit-config.yaml
├── 01_index.py
├── 02_qa_generation.py
├── 03_querying.py
├── 04_evaluation.py
├── CODE_OF_CONDUCT.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── SUPPORT.md
├── azure.yaml
├── azureml/
│   ├── eval.py
│   ├── index.py
│   ├── pipeline.py
│   └── query.py
├── config.sample.json
├── config.schema.json
├── cspell.json
├── data-ci/
│   └── docx/
│       └── sample-docx.docx
├── dev-requirements.txt
├── docs/
│   ├── azureml-pipeline.md
│   ├── configs-appendix.md
│   ├── environment-variables.md
│   ├── evaluation-metrics.md
│   ├── script-inputs-outputs.md
│   └── wsl.md
├── env_to_keyvault.py
├── experimental/
│   └── readme.md
├── images/
│   └── AzureMLPipeline.drawio
├── infra/
│   ├── abbreviations.json
│   ├── generate_arm_template.sh
│   ├── main.bicep
│   ├── main.bicepparam
│   ├── main.json
│   ├── network/
│   │   ├── azure_bastion.bicep
│   │   └── network_isolation.bicep
│   └── shared/
│       ├── cognitiveservices.bicep
│       ├── keyvault-secret.bicep
│       ├── keyvault.bicep
│       ├── machineLearning.bicep
│       ├── monitoring.bicep
│       ├── search-services.bicep
│       ├── storage.bicep
│       └── storekeys.bicep
├── promptflow/
│   └── rag-experiment-accelerator/
│       ├── README.md
│       ├── custom_environment/
│       │   ├── Dockerfile
│       │   ├── environment.yaml
│       │   └── rag_experiment_accelerator-0.9-py3-none-any.whl
│       ├── env_setup.md
│       ├── evaluation/
│       │   ├── evaluation.py
│       │   └── flow.dag.yaml
│       ├── flow.dag.yaml
│       ├── index/
│       │   ├── create_index.py
│       │   └── flow.dag.yaml
│       ├── qa_generation/
│       │   ├── flow.dag.yaml
│       │   └── generate_qa.py
│       ├── querying/
│       │   ├── flow.dag.yaml
│       │   └── querying.py
│       └── setup/
│           ├── flow.dag.yaml
│           └── setup_env.py
├── pyproject.toml
├── rag_experiment_accelerator/
│   ├── __init__.py
│   ├── artifact/
│   │   ├── __init__.py
│   │   ├── handlers/
│   │   │   ├── __init__.py
│   │   │   ├── artifact_handler.py
│   │   │   ├── exceptions.py
│   │   │   ├── query_output_handler.py
│   │   │   ├── tests/
│   │   │   │   ├── test_artifact_handler.py
│   │   │   │   └── test_query_output_handler.py
│   │   │   └── typing.py
│   │   └── models/
│   │       ├── __init__.py
│   │       └── query_output.py
│   ├── checkpoint/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── checkpoint.py
│   │   ├── checkpoint_decorator.py
│   │   ├── checkpoint_factory.py
│   │   ├── local_storage_checkpoint.py
│   │   ├── null_checkpoint.py
│   │   └── tests/
│   │       ├── test_checkpoint.py
│   │       ├── test_local_storage_checkpoint.py
│   │       └── test_null_checkpoint.py
│   ├── config/
│   │   ├── __init__.py
│   │   ├── base_config.py
│   │   ├── chunking_config.py
│   │   ├── config.py
│   │   ├── config_validator.py
│   │   ├── embedding_model_config.py
│   │   ├── environment.py
│   │   ├── eval_config.py
│   │   ├── index_config.py
│   │   ├── language_config.py
│   │   ├── openai_config.py
│   │   ├── path_config.py
│   │   ├── paths.py
│   │   ├── query_expansion.py
│   │   ├── rerank_config.py
│   │   ├── sampling_config.py
│   │   ├── search_config.py
│   │   └── tests/
│   │       ├── test_config.py
│   │       ├── test_config_validator.py
│   │       ├── test_environment.py
│   │       └── test_index_config.py
│   ├── data_assets/
│   │   ├── __init__.py
│   │   └── data_asset.py
│   ├── doc_loader/
│   │   ├── __init__.py
│   │   ├── customJsonLoader.py
│   │   ├── documentIntelligenceLoader.py
│   │   ├── documentLoader.py
│   │   ├── docxLoader.py
│   │   ├── htmlLoader.py
│   │   ├── jsonLoader.py
│   │   ├── markdownLoader.py
│   │   ├── pdfLoader.py
│   │   ├── structuredLoader.py
│   │   ├── tests/
│   │   │   ├── test_custom_html_loader.py
│   │   │   ├── test_custom_json_loader.py
│   │   │   ├── test_data/
│   │   │   │   ├── document_intelligence_response/
│   │   │   │   │   ├── multiple_pages.json
│   │   │   │   │   ├── simple_response.json
│   │   │   │   │   └── table_without_headers.json
│   │   │   │   └── json/
│   │   │   │       ├── data.bad.invalid_keys.json
│   │   │   │       ├── data.bad.not_a_list.json
│   │   │   │       └── data.valid.json
│   │   │   ├── test_document_intelligence_loader.py
│   │   │   └── test_docx_loader.py
│   │   └── textLoader.py
│   ├── embedding/
│   │   ├── __init__.py
│   │   ├── aoai_embedding_model.py
│   │   ├── embedding_model.py
│   │   ├── factory.py
│   │   ├── st_embedding_model.py
│   │   └── tests/
│   │       ├── test_aoai_embedding_model.py
│   │       ├── test_factory.py
│   │       └── test_st_embedding_model.py
│   ├── evaluation/
│   │   ├── LICENSE.txt
│   │   ├── __init__.py
│   │   ├── eval.py
│   │   ├── llm_based_metrics.py
│   │   ├── plain_metrics.py
│   │   ├── plot_metrics.py
│   │   ├── search_eval.py
│   │   ├── spacy_evaluator.py
│   │   ├── tests/
│   │   │   ├── test_llm_based_metrics.py
│   │   │   ├── test_plain_metrics.py
│   │   │   ├── test_search_eval.py
│   │   │   ├── test_spacy_evaluator.py
│   │   │   └── test_transformer_based_metrics.py
│   │   └── transformer_based_metrics.py
│   ├── ingest_data/
│   │   ├── __init__.py
│   │   ├── acs_ingest.py
│   │   └── tests/
│   │       └── test_acs_ingest.py
│   ├── init_Index/
│   │   ├── __init__.py
│   │   ├── create_index.py
│   │   └── tests/
│   │       └── test_create_index.py
│   ├── io/
│   │   ├── __init__.py
│   │   ├── exceptions.py
│   │   ├── loader.py
│   │   ├── local/
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── loaders/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── jsonl_loader.py
│   │   │   │   ├── local_loader.py
│   │   │   │   └── tests/
│   │   │   │       ├── test_jsonl_loader.py
│   │   │   │       └── test_local_loader.py
│   │   │   ├── tests/
│   │   │   │   └── test_local_io_base.py
│   │   │   └── writers/
│   │   │       ├── __init__.py
│   │   │       ├── jsonl_writer.py
│   │   │       ├── local_writer.py
│   │   │       └── tests/
│   │   │           ├── test_jsonl_writer.py
│   │   │           └── test_local_writer.py
│   │   └── writer.py
│   ├── llm/
│   │   ├── __init__.py
│   │   ├── exceptions.py
│   │   ├── prompt/
│   │   │   ├── __init__.py
│   │   │   ├── hyde_prompts.py
│   │   │   ├── instruction_prompts.py
│   │   │   ├── multiprompts.py
│   │   │   ├── prompt.py
│   │   │   ├── qna_prompts.py
│   │   │   ├── ragas_prompts.py
│   │   │   └── rerank_prompts.py
│   │   ├── prompts_text/
│   │   │   ├── do_need_multiple_prompt_instruction.txt
│   │   │   ├── generate_qna_long_multi_context.txt
│   │   │   ├── generate_qna_long_single_context.txt
│   │   │   ├── generate_qna_short_multi_context.txt
│   │   │   ├── generate_qna_short_single_context.txt
│   │   │   ├── generate_qna_short_single_context_no_cot.txt
│   │   │   ├── llm_answer_relevance_instruction.txt
│   │   │   ├── llm_context_precision_instruction.txt
│   │   │   ├── llm_context_recall_instruction.txt
│   │   │   ├── main_instruction_long.txt
│   │   │   ├── main_instruction_short.txt
│   │   │   ├── multiple_prompt_instruction.txt
│   │   │   ├── prompt_generate_hypothetical_answer.txt
│   │   │   ├── prompt_generate_hypothetical_document.txt
│   │   │   ├── prompt_generate_hypothetical_questions.txt
│   │   │   ├── prompt_instruction_entities.txt
│   │   │   ├── prompt_instruction_keywords.txt
│   │   │   ├── prompt_instruction_summary.txt
│   │   │   ├── prompt_instruction_title.txt
│   │   │   └── rerank_prompt_instruction.txt
│   │   ├── response_generator.py
│   │   └── tests/
│   │       └── test_response_generator.py
│   ├── nlp/
│   │   ├── __init__.py
│   │   ├── language_evaluator.py
│   │   ├── preprocess.py
│   │   └── tests/
│   │       ├── test_language_evaluator.py
│   │       └── test_preprocessor.py
│   ├── reranking/
│   │   ├── __init__.py
│   │   └── reranker.py
│   ├── run/
│   │   ├── evaluation.py
│   │   ├── index.py
│   │   ├── qa_generation.py
│   │   ├── querying.py
│   │   └── tests/
│   │       ├── data/
│   │       │   └── test_data.jsonl
│   │       ├── test_index.py
│   │       ├── test_qa_generation.py
│   │       └── test_querying.py
│   ├── sampling/
│   │   ├── __init__.py
│   │   ├── clustering.py
│   │   └── tests/
│   │       ├── data/
│   │       │   └── test1.txt
│   │       └── test_clustering.py
│   ├── search_type/
│   │   ├── __init__.py
│   │   ├── acs_search_methods.py
│   │   └── tests/
│   │       └── test_acs_search_methods.py
│   └── utils/
│       ├── __init__.py
│       ├── auth.py
│       ├── logging.py
│       └── timetook.py
├── requirements.txt
├── setup.cfg
└── setup.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .coveragerc
================================================
[run]
omit =
    */__init__.py

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
	"name": "RAG Experiment Accelerator",
	"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bullseye",
	"features": {
		"ghcr.io/devcontainers/features/azure-cli:1": {
			"version": "latest"
		},
		"ghcr.io/azure/azure-dev/azd:latest": {}
	},
	"postCreateCommand": "./.devcontainer/post-create.sh",
	"customizations": {
		"vscode": {
			"extensions": [
				"github.vscode-pull-request-github",
				"ms-vscode.azure-account",
				"ms-python.python",
				"ms-python.flake8",
				"ms-azuretools.vscode-bicep",
				"prompt-flow.prompt-flow",
				"ms-azuretools.azure-dev",
				"streetsidesoftware.code-spell-checker"
			]
		}
	}
}


================================================
FILE: .devcontainer/post-create.sh
================================================
#!/bin/bash

pip install --upgrade pip

pip install -r requirements.txt

pip install -r dev-requirements.txt

python -m spacy download en_core_web_sm

# install the rag-accelerator packages in editable mode (required for pre-commit to work properly with pytest)
pip install -e .

pre-commit install


================================================
FILE: .flake8
================================================
[flake8]
max-line-length = 120
extend-ignore = E203, E501

================================================
FILE: .github/actions/configure_azureml_agent/action.yml
================================================
name: Prepare build environment

description: Prepares build environment for python and prompt flow related workflow execution.

inputs:
  versionSpec:
    description: "The Python version to use in the environment."
    default: "3.11"


runs:
  using: composite
  steps:
    - name: Checkout
      uses: actions/checkout@v4

    - uses: actions/setup-python@v4
      with:
        python-version: ${{ inputs.versionSpec }}

    - name: Load all prompt flow and related dependencies
      shell: bash
      run: |
        set -e # fail on error
        python -m pip install --upgrade pip
        python -m pip install .



================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 50


================================================
FILE: .github/workflows/build_validation_workflow.yml
================================================
name: Build validation

on:
  workflow_call:
  workflow_dispatch:
  pull_request:
    branches:
      - main
      - development
      - prerelease
  push:
    branches:
      - main
      - development
      - prerelease
  merge_group:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/development' && github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prerelease' }}

jobs:
  validate-code:
    name: job for validating code and structure
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Actions
        uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Load all build validation related dependencies
        shell: bash
        run: |
          set -e # fail on error
          python -m pip install --upgrade pip
          python -m pip install -e . -r requirements.txt -r dev-requirements.txt

      - name: Download spacy model
        shell: bash
        run: |
          python -m spacy download en_core_web_sm

      - name: Run flake
        shell: bash
        run: |
          flake8 --extend-ignore=E501

      - name: Execute Unit Tests
        shell: bash
        run: |
          pytest . --cov=. --cov-report=html --cov-config=.coveragerc

      - name: Publish Unit Test Results
        uses: actions/upload-artifact@v4
        with:
          name: unit-test-results
          path: "htmlcov/**"


================================================
FILE: .github/workflows/rag_exp_acc_ci.yml
================================================
name: RAG Experiment Accelerator CI

on:
  workflow_call:
  workflow_dispatch:
  pull_request:
    types: [opened, ready_for_review, synchronize]
    branches:
      - main
      - development
      - prerelease
  push:
    branches:
      - main
      - development
      - prerelease
  merge_group:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/development' && github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prerelease'}}

jobs:
  execute-code-and-check:
    env:
      AZURE_SEARCH_ADMIN_KEY: ${{ secrets.AZURE_SEARCH_ADMIN_KEY }}
      AZURE_SEARCH_SERVICE_ENDPOINT: ${{ secrets.AZURE_SEARCH_SERVICE_ENDPOINT }}
      AZURE_SEARCH_USE_SEMANTIC_SEARCH: "true"
      AZURE_LANGUAGE_SERVICE_KEY: ${{ secrets.AZURE_LANGUAGE_SERVICE_KEY }}
      AZURE_LANGUAGE_SERVICE_ENDPOINT: ${{ secrets.AZURE_LANGUAGE_SERVICE_ENDPOINT }}
      OPENAI_API_TYPE: "azure"
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
      OPENAI_API_VERSION: ${{ secrets.OPENAI_API_VERSION }}
      OPENAI_ENDPOINT: ${{ secrets.OPENAI_ENDPOINT }}
      AML_RESOURCE_GROUP_NAME: ${{ secrets.RESOURCE_GROUP_NAME }}
      AML_SUBSCRIPTION_ID: ${{ secrets.SUBSCRIPTION_ID }}
      AML_WORKSPACE_NAME: ${{ secrets.WORKSPACE_NAME }}
      AZURE_DOCUMENT_INTELLIGENCE_ENDPOINT: ""
      AZURE_DOCUMENT_INTELLIGENCE_ADMIN_KEY: ""
    name: code validation through execution
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Actions
        uses: actions/checkout@v4
      - name: Azure login
        uses: azure/login@v2
        with:
          creds: ${{ secrets.azure_credentials }}
      - name: Configure Azure ML Agent
        uses: ./.github/actions/configure_azureml_agent
      - name: execute index creation step
        shell: bash
        run: |
          python 01_index.py --data_dir='data-ci' --config_path=${{ github.workspace }}/.github/workflows/config.json
      - name: execute qna step
        shell: bash
        run: |
          python 02_qa_generation.py --data_dir='data-ci' --config_path=${{ github.workspace }}/.github/workflows/config.json
      - name: execute querying step
        shell: bash
        run: |
          python 03_querying.py --data_dir='data-ci' --config_path=${{ github.workspace }}/.github/workflows/config.json
      - name: execute evaluation step
        shell: bash
        run: |
          python 04_evaluation.py --data_dir='data-ci' --config_path=${{ github.workspace }}/.github/workflows/config.json


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
#   For a library or package, you might want to ignore these files since the code is
#   intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# poetry
#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
#   This is especially recommended for binary packages to ensure reproducibility, and is more
#   commonly ignored for libraries.
#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
#   in version control.
#   https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
#  and can be added to the global gitignore or merged into this file.  For a more nuclear
#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/

artifacts/
# OSX system folders
**/.DS_Store

# Data files
data/*
# Keep folders
!data/pdf/
!data/html/
!data/markdown/
!data/json/
!data/text/
# Keep sample files
!data/pdf/sample-pdf.pdf
!data/html/sample-html.html
!data/docx/sample-docx.docx
!data/markdown/sample-markdown.md
!data/markdown/sample-txt.txt
!data/json/sample-json.json

#  promptflow folders
.promptflow
.azure

.vscode

<MagicMock*
checkpoints/
mlruns

# AzureML config folder
.azureml/*

# Generated Conda file
conda.generated.yaml

# User-defined config
config.json


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
  - repo: https://github.com/psf/black
    rev: 23.12.1
    hooks:
      - id: black
        language_version: python3
  
  - repo: https://github.com/pycqa/flake8
    rev: 7.0.0
    hooks:
    -   id: flake8
        args: [--extend-ignore=E501]

  - repo: https://github.com/python-jsonschema/check-jsonschema
    rev: 0.28.5
    hooks:
      - id: check-jsonschema
        files: ^config.sample.json|.github/workflows/config.json$
        types: [json]
        args: ["--schemafile", "config.schema.json"]

  - repo: local
    hooks:
      - id: bicep
        name: bicep
        description: Lint and build Bicep files
        entry: ./infra/generate_arm_template.sh
        language: script
        files: \.bicep$
        require_serial: true
        args: # Bicep files that we want to generate ARM templates from
          - -f=./infra/main.bicep


================================================
FILE: 01_index.py
================================================
import json
import argparse
import mlflow

from azureml.pipeline import initialise_mlflow_client

from rag_experiment_accelerator.checkpoint import init_checkpoint
from rag_experiment_accelerator.run.index import run
from rag_experiment_accelerator.config.config import Config
from rag_experiment_accelerator.config.environment import Environment
from rag_experiment_accelerator.config.paths import get_all_file_paths, mlflow_run_name

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--config_path", type=str, help="input: path to the config file"
    )
    parser.add_argument("--data_dir", type=str, help="input: path to the input data")
    parser.add_argument(
        "-s",
        "--sampling",
        action="store_true",
        help="input: run sampling. Avoid running on distributed compute",
    )
    args, _ = parser.parse_known_args()

    environment = Environment.from_env_or_keyvault()
    config = Config.from_path(environment, args.config_path, args.data_dir)
    init_checkpoint(config)
    file_paths = get_all_file_paths(config.path.data_dir)
    mlflow_client = initialise_mlflow_client(environment, config)
    mlflow.set_experiment(config.experiment_name)

    do_sample = args.sampling
    index_dict = {"indexes": []}

    file_paths = get_all_file_paths(config.path.data_dir)
    for index_config in config.index.flatten():
        with mlflow.start_run(run_name=mlflow_run_name(f"index_job_{config.job_name}")):
            index_name = run(
                environment, config, index_config, file_paths, mlflow_client, do_sample
            )
            index_dict["indexes"].append(index_name)

    # saves the list of index names locally, not used afterwards
    with open(config.path.generated_index_names_file, "w") as index_names_file:
        json.dump(index_dict, index_names_file, indent=4)


================================================
FILE: 02_qa_generation.py
================================================
import argparse

from rag_experiment_accelerator.checkpoint import init_checkpoint
from rag_experiment_accelerator.run.qa_generation import run
from rag_experiment_accelerator.config.config import Config
from rag_experiment_accelerator.config.environment import Environment
from rag_experiment_accelerator.config.paths import get_all_file_paths


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--config_path", type=str, help="input: path to the config file"
    )
    parser.add_argument("--data_dir", type=str, help="input: path to the input data")
    args, _ = parser.parse_known_args()

    environment = Environment.from_env_or_keyvault()
    config = Config.from_path(environment, args.config_path, args.data_dir)
    init_checkpoint(config)

    run(environment, config, get_all_file_paths(config.path.data_dir))


================================================
FILE: 03_querying.py
================================================
import argparse
import mlflow
from azureml.pipeline import initialise_mlflow_client

from rag_experiment_accelerator.checkpoint import init_checkpoint
from rag_experiment_accelerator.config.config import Config
from rag_experiment_accelerator.config.environment import Environment
from rag_experiment_accelerator.config.paths import mlflow_run_name
from rag_experiment_accelerator.run.querying import run
from rag_experiment_accelerator.data_assets.data_asset import create_data_asset
from rag_experiment_accelerator.artifact.handlers.query_output_handler import (
    QueryOutputHandler,
)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--config_path", type=str, help="input: path to the config file"
    )
    parser.add_argument(
        "--data_dir",
        type=str,
        help="input: path to the input data",
        default=None,  # default is initialized in Config
    )
    args, _ = parser.parse_known_args()

    environment = Environment.from_env_or_keyvault()
    config = Config.from_path(
        environment,
        args.config_path,
    )
    mlflow_client = initialise_mlflow_client(environment, config)
    mlflow.set_experiment(config.experiment_name)

    handler = QueryOutputHandler(config.path.query_data_dir)
    init_checkpoint(config)

    for index_config in config.index.flatten():
        with mlflow.start_run(run_name=mlflow_run_name(config.job_name)):
            run(environment, config, index_config, mlflow_client)

            index_name = index_config.index_name()
            create_data_asset(
                data_path=handler.get_output_path(
                    index_name, config.experiment_name, config.job_name
                ),
                data_asset_name=index_name,
                environment=environment,
            )


================================================
FILE: 04_evaluation.py
================================================
import argparse

import mlflow

from azureml.pipeline import initialise_mlflow_client
from rag_experiment_accelerator.config.environment import Environment
from rag_experiment_accelerator.run.evaluation import run
from rag_experiment_accelerator.config.config import Config
from rag_experiment_accelerator.config.paths import (
    mlflow_run_name,
    formatted_datetime_suffix,
)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--config_path", type=str, help="input: path to the config file"
    )
    parser.add_argument(
        "--data_dir",
        type=str,
        help="input: path to the input data",
        default=None,  # default is initialized in Config
    )
    args, _ = parser.parse_known_args()

    environment = Environment.from_env_or_keyvault()
    config = Config.from_path(environment, args.config_path, args.data_dir)
    name_suffix = formatted_datetime_suffix()
    mlflow_client = initialise_mlflow_client(environment, config)
    mlflow.set_experiment(config.experiment_name)

    for index_config in config.index.flatten():
        with mlflow.start_run(run_name=mlflow_run_name(config.job_name, name_suffix)):
            run(
                environment,
                config,
                index_config,
                mlflow_client,
                name_suffix=name_suffix,
            )


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Microsoft Open Source Code of Conduct

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).

Resources:

- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns


================================================
FILE: LICENSE
================================================
    MIT License

    Copyright (c) Microsoft Corporation.

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE


    requests-oauthlib

    Copyright (c) 2014 Kenneth Reitz.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted, provided that the above
    copyright notice and this permission notice appear in all copies.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

    threadpoolctl

    Copyright (c) 2019, threadpoolctl contributors

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

        * Redistributions of source code must retain the above copyright notice,
        this list of conditions and the following disclaimer.
        * Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.
        * Neither the name of copyright holder nor the names of its contributors
        may be used to endorse or promote products derived from this software
        without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    isodate

    Copyright (c) 2021, Hugo van Kemenade and contributors
    Copyright (c) 2009-2018, Gerhard Weis and contributors
    Copyright (c) 2009, Gerhard Weis
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:
        * Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.
        * Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.
        * Neither the name of the <organization> nor the
        names of its contributors may be used to endorse or promote products
        derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    PyPDF2

    Copyright (c) 2006-2008, Mathieu Fenniak
    Some contributions copyright (c) 2007, Ashish Kulkarni <kulkarni.ashish@gmail.com>
    Some contributions copyright (c) 2014, Steve Witham <switham_github@mac-guyver.com>

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

    * Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
    * The name of the author may not be used to endorse or promote products
    derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGE.

    wasabi

    Copyright (C) 2018 Ines Montani

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.

    toolz

    Copyright (c) 2013 Matthew Rocklin

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    a. Redistributions of source code must retain the above copyright notice,
        this list of conditions and the following disclaimer.
    b. Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.
    c. Neither the name of toolz nor the names of its contributors
        may be used to endorse or promote products derived from this software
        without specific prior written permission.


    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
    DAMAGE.

    llvmlite

    Copyright (c) 2014-, Continuum Analytics, Inc.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

    Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    scikit-learn

    BSD 3-Clause License

    Copyright (c) 2007-2023 The scikit-learn developers.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    partd

    Copyright (c) 2015, Continuum Analytics, Inc. and contributors
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    Neither the name of Continuum Analytics nor the names of any contributors
    may be used to endorse or promote products derived from this software
    without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    THE POSSIBILITY OF SUCH DAMAGE.

    Pygments

    Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    pandas

    BSD 3-Clause License

    Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
    All rights reserved.

    Copyright (c) 2011-2024, Open source contributors.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Markdown

    BSD 3-Clause License

    Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)
    Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
    Copyright 2004 Manfred Stienstra (the original version)

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    tiktoken

    Copyright (c) 2022 OpenAI, Shantanu Jain

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

    dask

    BSD 3-Clause License

    Copyright (c) 2014, Anaconda, Inc. and contributors
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    blis

    NOTE: Portions of this project's code are copyrighted by

    The University of Texas at Austin

    while other portions are copyrighted by

    Hewlett Packard Enterprise Development LP
    Advanced Micro Devices, Inc.
    ExplosionAI GmbH

    with some overlap. Please see file-level license headers for file-specific
    copyright info. All parties provide their portions of the code under the
    3-clause BSD license, found below.

    ---

    Copyright (C) 2018, The University of Texas at Austin
    Copyright (C) 2016, Hewlett Packard Enterprise Development LP
    Copyright (C) 2018 - 2019, Advanced Micro Devices, Inc.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:
    - Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    - Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
    - Neither the name(s) of the copyright holder(s) nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    portalocker

    Copyright 2022 Rick van Hattem

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Pillow

    The Python Imaging Library (PIL) is

    Copyright © 1997-2011 by Secret Labs AB
    Copyright © 1995-2011 by Fredrik Lundh

    Pillow is the friendly PIL fork. It is

        Copyright © 2010-2024 by Jeffrey A. Clark (Alex) and contributors.

    Like PIL, Pillow is licensed under the open source HPND License:

    By obtaining, using, and/or copying this software and/or its associated
    documentation, you agree that you have read, understood, and will comply
    with the following terms and conditions:

    Permission to use, copy, modify and distribute this software and its
    documentation for any purpose and without fee is hereby granted,
    provided that the above copyright notice appears in all copies, and that
    both that copyright notice and this permission notice appear in supporting
    documentation, and that the name of Secret Labs AB or the author not be
    used in advertising or publicity pertaining to distribution of the software
    without specific, written prior permission.

    SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
    SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
    IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL,
    INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
    OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.

    bsdiff4

    Copyright (c) 2011-2019, Ilan Schnell
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    The views and conclusions contained in the software and documentation are those
    of the authors and should not be interpreted as representing official policies,
    either expressed or implied, of the (Python) bsdiff4 project.


    /***************************************************************************
    *  the module bsdiff4/core.c has been drived from cx_bsdiff written by    *
    *  Anthony Tuininga, http://cx-bsdiff.sourceforge.net/), which was        *
    *  released under the BSD Protection License below                        *
    ***************************************************************************/


    BSD Protection License
    February 2002

    Preamble
    --------

    The Berkeley Software Distribution ("BSD") license has proven very effective
    over the years at allowing for a wide spread of work throughout both
    commercial and non-commercial products.  For programmers whose primary
    intention is to improve the general quality of available software, it is
    arguable that there is no better license than the BSD license, as it
    permits improvements to be used wherever they will help, without idealogical
    or metallic constraint.

    This is of particular value to those who produce reference implementations
    of proposed standards: The case of TCP/IP clearly illustrates that freely
    and universally available implementations leads the rapid acceptance of
    standards -- often even being used instead of a de jure standard (eg, OSI
    network models).

    With the rapid proliferation of software licensed under the GNU General
    Public License, however, the continued success of this role is called into
    question.  Given that the inclusion of a few lines of "GPL-tainted" work
    into a larger body of work will result in restricted distribution -- and
    given that further work will likely build upon the "tainted" portions,
    making them difficult to remove at a future date -- there are inevitable
    circumstances where authors would, in order to protect their goal of
    providing for the widespread usage of their work, wish to guard against
    such "GPL-taint".

    In addition, one can imagine that companies which operate by producing and
    selling (possibly closed-source) code would wish to protect themselves
    against the rise of a GPL-licensed competitor.  While under existing
    licenses this would mean not releasing their code under any form of open
    license, if a license existed under which they could incorporate any
    improvements back into their own (commercial) products then they might be
    far more willing to provide for non-closed distribution.

    For the above reasons, we put forth this "BSD Protection License": A
    license designed to retain the freedom granted by the BSD license to use
    licensed works in a wide variety of settings, both non-commercial and
    commercial, while protecting the work from having future contributors
    restrict that freedom.

    The precise terms and conditions for copying, distribution, and
    modification follow.

    BSD PROTECTION LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION
    ----------------------------------------------------------------

    0. Definitions.
    a) "Program", below, refers to any program or work distributed under
        the terms of this license.
    b) A "work based on the Program", below, refers to either the Program
        or any derivative work under copyright law.
    c) "Modification", below, refers to the act of creating derivative works.
    d) "You", below, refers to each licensee.

    1. Scope.
    This license governs the copying, distribution, and modification of the
    Program.  Other activities are outside the scope of this license; The
    act of running the Program is not restricted, and the output from the
    Program is covered only if its contents constitute a work based on the
    Program.

    2. Verbatim copies.
    You may copy and distribute verbatim copies of the Program as you
    receive it, in any medium, provided that you conspicuously and
    appropriately publish on each copy an appropriate copyright notice; keep
    intact all the notices that refer to this License and to the absence of
    any warranty; and give any other recipients of the Program a copy of this
    License along with the Program.

    3. Modification and redistribution under closed license.
    You may modify your copy or copies of the Program, and distribute
    the resulting derivative works, provided that you meet the
    following conditions:
    a) The copyright notice and disclaimer on the Program must be reproduced
        and included in the source code, documentation, and/or other materials
        provided in a manner in which such notices are normally distributed.
    b) The derivative work must be clearly identified as such, in order that
        it may not be confused with the original work.
    c) The license under which the derivative work is distributed must
        expressly prohibit the distribution of further derivative works.

    4. Modification and redistribution under open license.
    You may modify your copy or copies of the Program, and distribute
    the resulting derivative works, provided that you meet the
    following conditions:
    a) The copyright notice and disclaimer on the Program must be reproduced
        and included in the source code, documentation, and/or other materials
        provided in a manner in which such notices are normally distributed.
    b) You must clearly indicate the nature and date of any changes made
        to the Program.  The full details need not necessarily be included in
        the individual modified files, provided that each modified file is
        clearly marked as such and instructions are included on where the
        full details of the modifications may be found.
    c) You must cause any work that you distribute or publish, that in whole
        or in part contains or is derived from the Program or any part
        thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.

    5. Implied acceptance.
    You may not copy or distribute the Program or any derivative works except
    as expressly provided under this license.  Consequently, any such action
    will be taken as implied acceptance of the terms of this license.

    6. NO WARRANTY.
    THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
    THE COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE FOR ANY DIRECT,
    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING, BUT
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
    TORT, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.

    MarkupSafe

    Copyright 2010 Pallets

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    jsonpickle

    Copyright (C) 2008 John Paulett (john -at- paulett.org)
    Copyright (C) 2009-2021 David Aguilar (davvid -at- gmail.com)

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from this
    software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    paho-mqtt

    This project is dual licensed under the Eclipse Public License 2.0 and the
    Eclipse Distribution License 1.0 as described in the epl-v20 and edl-v10 files.

    chardet

    GNU LESSER GENERAL PUBLIC LICENSE
    Version 2.1, February 1999

    Copyright (C) 1991, 1999 Free Software Foundation, Inc.
    51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    Everyone is permitted to copy and distribute verbatim copies
    of this license document, but changing it is not allowed.

    [This is the first released version of the Lesser GPL.  It also counts
    as the successor of the GNU Library Public License, version 2, hence
    the version number 2.1.]

    Preamble

    The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    Licenses are intended to guarantee your freedom to share and change
    free software--to make sure the software is free for all its users.

    This license, the Lesser General Public License, applies to some
    specially designated software packages--typically libraries--of the
    Free Software Foundation and other authors who decide to use it.  You
    can use it too, but we suggest you first think carefully about whether
    this license or the ordinary General Public License is the better
    strategy to use in any particular case, based on the explanations below.

    When we speak of free software, we are referring to freedom of use,
    not price.  Our General Public Licenses are designed to make sure that
    you have the freedom to distribute copies of free software (and charge
    for this service if you wish); that you receive source code or can get
    it if you want it; that you can change the software and use pieces of
    it in new free programs; and that you are informed that you can do
    these things.

    To protect your rights, we need to make restrictions that forbid
    distributors to deny you these rights or to ask you to surrender these
    rights.  These restrictions translate to certain responsibilities for
    you if you distribute copies of the library or if you modify it.

    For example, if you distribute copies of the library, whether gratis
    or for a fee, you must give the recipients all the rights that we gave
    you.  You must make sure that they, too, receive or can get the source
    code.  If you link other code with the library, you must provide
    complete object files to the recipients, so that they can relink them
    with the library after making changes to the library and recompiling
    it.  And you must show them these terms so they know their rights.

    We protect your rights with a two-step method: (1) we copyright the
    library, and (2) we offer you this license, which gives you legal
    permission to copy, distribute and/or modify the library.

    To protect each distributor, we want to make it very clear that
    there is no warranty for the free library.  Also, if the library is
    modified by someone else and passed on, the recipients should know
    that what they have is not the original version, so that the original
    author's reputation will not be affected by problems that might be
    introduced by others.
    
    Finally, software patents pose a constant threat to the existence of
    any free program.  We wish to make sure that a company cannot
    effectively restrict the users of a free program by obtaining a
    restrictive license from a patent holder.  Therefore, we insist that
    any patent license obtained for a version of the library must be
    consistent with the full freedom of use specified in this license.

    Most GNU software, including some libraries, is covered by the
    ordinary GNU General Public License.  This license, the GNU Lesser
    General Public License, applies to certain designated libraries, and
    is quite different from the ordinary General Public License.  We use
    this license for certain libraries in order to permit linking those
    libraries into non-free programs.

    When a program is linked with a library, whether statically or using
    a shared library, the combination of the two is legally speaking a
    combined work, a derivative of the original library.  The ordinary
    General Public License therefore permits such linking only if the
    entire combination fits its criteria of freedom.  The Lesser General
    Public License permits more lax criteria for linking other code with
    the library.

    We call this license the "Lesser" General Public License because it
    does Less to protect the user's freedom than the ordinary General
    Public License.  It also provides other free software developers Less
    of an advantage over competing non-free programs.  These disadvantages
    are the reason we use the ordinary General Public License for many
    libraries.  However, the Lesser license provides advantages in certain
    special circumstances.

    For example, on rare occasions, there may be a special need to
    encourage the widest possible use of a certain library, so that it becomes
    a de-facto standard.  To achieve this, non-free programs must be
    allowed to use the library.  A more frequent case is that a free
    library does the same job as widely used non-free libraries.  In this
    case, there is little to gain by limiting the free library to free
    software only, so we use the Lesser General Public License.

    In other cases, permission to use a particular library in non-free
    programs enables a greater number of people to use a large body of
    free software.  For example, permission to use the GNU C Library in
    non-free programs enables many more people to use the whole GNU
    operating system, as well as its variant, the GNU/Linux operating
    system.

    Although the Lesser General Public License is Less protective of the
    users' freedom, it does ensure that the user of a program that is
    linked with the Library has the freedom and the wherewithal to run
    that program using a modified version of the Library.

    The precise terms and conditions for copying, distribution and
    modification follow.  Pay close attention to the difference between a
    "work based on the library" and a "work that uses the library".  The
    former contains code derived from the library, whereas the latter must
    be combined with the library in order to run.
    
                    GNU LESSER GENERAL PUBLIC LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    0. This License Agreement applies to any software library or other
    program which contains a notice placed by the copyright holder or
    other authorized party saying it may be distributed under the terms of
    this Lesser General Public License (also called "this License").
    Each licensee is addressed as "you".

    A "library" means a collection of software functions and/or data
    prepared so as to be conveniently linked with application programs
    (which use some of those functions and data) to form executables.

    The "Library", below, refers to any such software library or work
    which has been distributed under these terms.  A "work based on the
    Library" means either the Library or any derivative work under
    copyright law: that is to say, a work containing the Library or a
    portion of it, either verbatim or with modifications and/or translated
    straightforwardly into another language.  (Hereinafter, translation is
    included without limitation in the term "modification".)

    "Source code" for a work means the preferred form of the work for
    making modifications to it.  For a library, complete source code means
    all the source code for all modules it contains, plus any associated
    interface definition files, plus the scripts used to control compilation
    and installation of the library.

    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running a program using the Library is not restricted, and output from
    such a program is covered only if its contents constitute a work based
    on the Library (independent of the use of the Library in a tool for
    writing it).  Whether that is true depends on what the Library does
    and what the program that uses the Library does.

    1. You may copy and distribute verbatim copies of the Library's
    complete source code as you receive it, in any medium, provided that
    you conspicuously and appropriately publish on each copy an
    appropriate copyright notice and disclaimer of warranty; keep intact
    all the notices that refer to this License and to the absence of any
    warranty; and distribute a copy of this License along with the
    Library.

    You may charge a fee for the physical act of transferring a copy,
    and you may at your option offer warranty protection in exchange for a
    fee.
    
    2. You may modify your copy or copies of the Library or any portion
    of it, thus forming a work based on the Library, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:

        a) The modified work must itself be a software library.

        b) You must cause the files modified to carry prominent notices
        stating that you changed the files and the date of any change.

        c) You must cause the whole of the work to be licensed at no
        charge to all third parties under the terms of this License.

        d) If a facility in the modified Library refers to a function or a
        table of data to be supplied by an application program that uses
        the facility, other than as an argument passed when the facility
        is invoked, then you must make a good faith effort to ensure that,
        in the event an application does not supply such function or
        table, the facility still operates, and performs whatever part of
        its purpose remains meaningful.

        (For example, a function in a library to compute square roots has
        a purpose that is entirely well-defined independent of the
        application.  Therefore, Subsection 2d requires that any
        application-supplied function or table used by this function must
        be optional: if the application does not supply it, the square
        root function must still compute square roots.)

    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Library,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Library, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote
    it.

    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Library.

    In addition, mere aggregation of another work not based on the Library
    with the Library (or with a work based on the Library) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.

    3. You may opt to apply the terms of the ordinary GNU General Public
    License instead of this License to a given copy of the Library.  To do
    this, you must alter all the notices that refer to this License, so
    that they refer to the ordinary GNU General Public License, version 2,
    instead of to this License.  (If a newer version than version 2 of the
    ordinary GNU General Public License has appeared, then you can specify
    that version instead if you wish.)  Do not make any other change in
    these notices.
    
    Once this change is made in a given copy, it is irreversible for
    that copy, so the ordinary GNU General Public License applies to all
    subsequent copies and derivative works made from that copy.

    This option is useful when you wish to copy part of the code of
    the Library into a program that is not a library.

    4. You may copy and distribute the Library (or a portion or
    derivative of it, under Section 2) in object code or executable form
    under the terms of Sections 1 and 2 above provided that you accompany
    it with the complete corresponding machine-readable source code, which
    must be distributed under the terms of Sections 1 and 2 above on a
    medium customarily used for software interchange.

    If distribution of object code is made by offering access to copy
    from a designated place, then offering equivalent access to copy the
    source code from the same place satisfies the requirement to
    distribute the source code, even though third parties are not
    compelled to copy the source along with the object code.

    5. A program that contains no derivative of any portion of the
    Library, but is designed to work with the Library by being compiled or
    linked with it, is called a "work that uses the Library".  Such a
    work, in isolation, is not a derivative work of the Library, and
    therefore falls outside the scope of this License.

    However, linking a "work that uses the Library" with the Library
    creates an executable that is a derivative of the Library (because it
    contains portions of the Library), rather than a "work that uses the
    library".  The executable is therefore covered by this License.
    Section 6 states terms for distribution of such executables.

    When a "work that uses the Library" uses material from a header file
    that is part of the Library, the object code for the work may be a
    derivative work of the Library even though the source code is not.
    Whether this is true is especially significant if the work can be
    linked without the Library, or if the work is itself a library.  The
    threshold for this to be true is not precisely defined by law.

    If such an object file uses only numerical parameters, data
    structure layouts and accessors, and small macros and small inline
    functions (ten lines or less in length), then the use of the object
    file is unrestricted, regardless of whether it is legally a derivative
    work.  (Executables containing this object code plus portions of the
    Library will still fall under Section 6.)

    Otherwise, if the work is a derivative of the Library, you may
    distribute the object code for the work under the terms of Section 6.
    Any executables containing that work also fall under Section 6,
    whether or not they are linked directly with the Library itself.
    
    6. As an exception to the Sections above, you may also combine or
    link a "work that uses the Library" with the Library to produce a
    work containing portions of the Library, and distribute that work
    under terms of your choice, provided that the terms permit
    modification of the work for the customer's own use and reverse
    engineering for debugging such modifications.

    You must give prominent notice with each copy of the work that the
    Library is used in it and that the Library and its use are covered by
    this License.  You must supply a copy of this License.  If the work
    during execution displays copyright notices, you must include the
    copyright notice for the Library among them, as well as a reference
    directing the user to the copy of this License.  Also, you must do one
    of these things:

        a) Accompany the work with the complete corresponding
        machine-readable source code for the Library including whatever
        changes were used in the work (which must be distributed under
        Sections 1 and 2 above); and, if the work is an executable linked
        with the Library, with the complete machine-readable "work that
        uses the Library", as object code and/or source code, so that the
        user can modify the Library and then relink to produce a modified
        executable containing the modified Library.  (It is understood
        that the user who changes the contents of definitions files in the
        Library will not necessarily be able to recompile the application
        to use the modified definitions.)

        b) Use a suitable shared library mechanism for linking with the
        Library.  A suitable mechanism is one that (1) uses at run time a
        copy of the library already present on the user's computer system,
        rather than copying library functions into the executable, and (2)
        will operate properly with a modified version of the library, if
        the user installs one, as long as the modified version is
        interface-compatible with the version that the work was made with.

        c) Accompany the work with a written offer, valid for at
        least three years, to give the same user the materials
        specified in Subsection 6a, above, for a charge no more
        than the cost of performing this distribution.

        d) If distribution of the work is made by offering access to copy
        from a designated place, offer equivalent access to copy the above
        specified materials from the same place.

        e) Verify that the user has already received a copy of these
        materials or that you have already sent this user a copy.

    For an executable, the required form of the "work that uses the
    Library" must include any data and utility programs needed for
    reproducing the executable from it.  However, as a special exception,
    the materials to be distributed need not include anything that is
    normally distributed (in either source or binary form) with the major
    components (compiler, kernel, and so on) of the operating system on
    which the executable runs, unless that component itself accompanies
    the executable.

    It may happen that this requirement contradicts the license
    restrictions of other proprietary libraries that do not normally
    accompany the operating system.  Such a contradiction means you cannot
    use both them and the Library together in an executable that you
    distribute.
    
    7. You may place library facilities that are a work based on the
    Library side-by-side in a single library together with other library
    facilities not covered by this License, and distribute such a combined
    library, provided that the separate distribution of the work based on
    the Library and of the other library facilities is otherwise
    permitted, and provided that you do these two things:

        a) Accompany the combined library with a copy of the same work
        based on the Library, uncombined with any other library
        facilities.  This must be distributed under the terms of the
        Sections above.

        b) Give prominent notice with the combined library of the fact
        that part of it is a work based on the Library, and explaining
        where to find the accompanying uncombined form of the same work.

    8. You may not copy, modify, sublicense, link with, or distribute
    the Library except as expressly provided under this License.  Any
    attempt otherwise to copy, modify, sublicense, link with, or
    distribute the Library is void, and will automatically terminate your
    rights under this License.  However, parties who have received copies,
    or rights, from you under this License will not have their licenses
    terminated so long as such parties remain in full compliance.

    9. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Library or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Library (or any work based on the
    Library), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Library or works based on it.

    10. Each time you redistribute the Library (or any work based on the
    Library), the recipient automatically receives a license from the
    original licensor to copy, distribute, link with or modify the Library
    subject to these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties with
    this License.
    
    11. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Library at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Library by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Library.

    If any portion of this section is held invalid or unenforceable under any
    particular circumstance, the balance of the section is intended to apply,
    and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.

    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.

    12. If the distribution and/or use of the Library is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Library under this License may add
    an explicit geographical distribution limitation excluding those countries,
    so that distribution is permitted only in or among countries not thus
    excluded.  In such case, this License incorporates the limitation as if
    written in the body of this License.

    13. The Free Software Foundation may publish revised and/or new
    versions of the Lesser General Public License from time to time.
    Such new versions will be similar in spirit to the present version,
    but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number.  If the Library
    specifies a version number of this License which applies to it and
    "any later version", you have the option of following the terms and
    conditions either of that version or of any later version published by
    the Free Software Foundation.  If the Library does not specify a
    license version number, you may choose any version ever published by
    the Free Software Foundation.
    
    14. If you wish to incorporate parts of the Library into other free
    programs whose distribution conditions are incompatible with these,
    write to the author to ask for permission.  For software which is
    copyrighted by the Free Software Foundation, write to the Free
    Software Foundation; we sometimes make exceptions for this.  Our
    decision will be guided by the two goals of preserving the free status
    of all derivatives of our free software and of promoting the sharing
    and reuse of software generally.

                                NO WARRANTY

    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
    WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
    EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
    OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
    LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
    THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
    WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
    AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
    FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
    CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
    LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
    RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
    FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
    SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
    DAMAGES.

                        END OF TERMS AND CONDITIONS
    
            How to Apply These Terms to Your New Libraries

    If you develop a new library, and you want it to be of the greatest
    possible use to the public, we recommend making it free software that
    everyone can redistribute and change.  You can do so by permitting
    redistribution under these terms (or, alternatively, under the terms of the
    ordinary General Public License).

    To apply these terms, attach the following notices to the library.  It is
    safest to attach them to the start of each source file to most effectively
    convey the exclusion of warranty; and each file should have at least the
    "copyright" line and a pointer to where the full notice is found.

        <one line to give the library's name and a brief idea of what it does.>
        Copyright (C) <year>  <name of author>

        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public
        License as published by the Free Software Foundation; either
        version 2.1 of the License, or (at your option) any later version.

        This library is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        Lesser General Public License for more details.

        You should have received a copy of the GNU Lesser General Public
        License along with this library; if not, write to the Free Software
        Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

    Also add information on how to contact you by electronic and paper mail.

    You should also get your employer (if you work as a programmer) or your
    school, if any, to sign a "copyright disclaimer" for the library, if
    necessary.  Here is a sample; alter the names:

    Yoyodyne, Inc., hereby disclaims all copyright interest in the
    library `Frob' (a library for tweaking knobs) written by James Random Hacker.

    <signature of Ty Coon>, 1 April 1990
    Ty Coon, President of Vice

    That's all there is to it!


    itsdangerous

    Copyright 2011 Pallets

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    pyasn1-modules

    Copyright (c) 2005-2020, Ilya Etingof <etingof@gmail.com>
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, 
        this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
        this list of conditions and the following disclaimer in the documentation
        and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGE. 

    contourpy

    BSD 3-Clause License

    Copyright (c) 2021-2024, ContourPy Developers.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    GitPython

    Copyright (C) 2008, 2009 Michael Trier and contributors
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

    * Neither the name of the GitPython project nor the names of
    its contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Flask

    Copyright 2010 Pallets

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    joblib

    BSD 3-Clause License

    Copyright (c) 2008-2021, The joblib developers.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    cycler

    Copyright (c) 2015, matplotlib project
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the matplotlib project nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    mkdocs-altlink-plugin

    Copyright (c) 2018 Zach Hannum 

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

    mkdocs-video

    The MIT License (MIT)

    Copyright (c) 2023 Mikalai Lisitsa

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    pycparser

    pycparser -- A C parser in Python

    Copyright (c) 2008-2022, Eli Bendersky
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this 
    list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, 
    this list of conditions and the following disclaimer in the documentation 
    and/or other materials provided with the distribution.
    * Neither the name of the copyright holder nor the names of its contributors may 
    be used to endorse or promote products derived from this software without 
    specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 
    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    oauthlib

    Copyright (c) 2019 The OAuthlib Community
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

        1. Redistributions of source code must retain the above copyright notice,
        this list of conditions and the following disclaimer.

        2. Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.

        3. Neither the name of this project nor the names of its contributors may
        be used to endorse or promote products derived from this software without
        specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    shap

    The MIT License (MIT)

    Copyright (c) 2018 Scott Lundberg

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

    idna

    BSD 3-Clause License

    Copyright (c) 2013-2023, Kim Davies and contributors. All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    filelock

    This is free and unencumbered software released into the public domain.

    Anyone is free to copy, modify, publish, use, compile, sell, or
    distribute this software, either in source code form or as a compiled
    binary, for any purpose, commercial or non-commercial, and by any
    means.

    In jurisdictions that recognize copyright laws, the author or authors
    of this software dedicate any and all copyright interest in the
    software to the public domain. We make this dedication for the benefit
    of the public at large and to the detriment of our heirs and
    successors. We intend this dedication to be an overt act of
    relinquishment in perpetuity of all present and future rights to this
    software under copyright law.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
    OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
    ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    OTHER DEALINGS IN THE SOFTWARE.

    For more information, please refer to <http://unlicense.org>

    sqlparse

    Copyright (c) 2016, Andi Albrecht <albrecht.andi@gmail.com>
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

        * Redistributions of source code must retain the above copyright notice,
        this list of conditions and the following disclaimer.
        * Redistributions in binary form must reproduce the above copyright notice,
        this list of conditions and the following disclaimer in the documentation
        and/or other materials provided with the distribution.
        * Neither the name of the authors nor the names of its contributors may be
        used to endorse or promote products derived from this software without
        specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    paramiko

    GNU LESSER GENERAL PUBLIC LICENSE
	Version 2.1, February 1999

    Copyright (C) 1991, 1999 Free Software Foundation, Inc.
        51 Franklin Street, Suite 500, Boston, MA  02110-1335  USA
    Everyone is permitted to copy and distribute verbatim copies
    of this license document, but changing it is not allowed.

    [This is the first released version of the Lesser GPL.  It also counts
    as the successor of the GNU Library Public License, version 2, hence
    the version number 2.1.]

                    Preamble

    The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    Licenses are intended to guarantee your freedom to share and change
    free software--to make sure the software is free for all its users.

    This license, the Lesser General Public License, applies to some
    specially designated software packages--typically libraries--of the
    Free Software Foundation and other authors who decide to use it.  You
    can use it too, but we suggest you first think carefully about whether
    this license or the ordinary General Public License is the better
    strategy to use in any particular case, based on the explanations below.

    When we speak of free software, we are referring to freedom of use,
    not price.  Our General Public Licenses are designed to make sure that
    you have the freedom to distribute copies of free software (and charge
    for this service if you wish); that you receive source code or can get
    it if you want it; that you can change the software and use pieces of
    it in new free programs; and that you are informed that you can do
    these things.

    To protect your rights, we need to make restrictions that forbid
    distributors to deny you these rights or to ask you to surrender these
    rights.  These restrictions translate to certain responsibilities for
    you if you distribute copies of the library or if you modify it.

    For example, if you distribute copies of the library, whether gratis
    or for a fee, you must give the recipients all the rights that we gave
    you.  You must make sure that they, too, receive or can get the source
    code.  If you link other code with the library, you must provide
    complete object files to the recipients, so that they can relink them
    with the library after making changes to the library and recompiling
    it.  And you must show them these terms so they know their rights.

    We protect your rights with a two-step method: (1) we copyright the
    library, and (2) we offer you this license, which gives you legal
    permission to copy, distribute and/or modify the library.

    To protect each distributor, we want to make it very clear that
    there is no warranty for the free library.  Also, if the library is
    modified by someone else and passed on, the recipients should know
    that what they have is not the original version, so that the original
    author's reputation will not be affected by problems that might be
    introduced by others.
    
    Finally, software patents pose a constant threat to the existence of
    any free program.  We wish to make sure that a company cannot
    effectively restrict the users of a free program by obtaining a
    restrictive license from a patent holder.  Therefore, we insist that
    any patent license obtained for a version of the library must be
    consistent with the full freedom of use specified in this license.

    Most GNU software, including some libraries, is covered by the
    ordinary GNU General Public License.  This license, the GNU Lesser
    General Public License, applies to certain designated libraries, and
    is quite different from the ordinary General Public License.  We use
    this license for certain libraries in order to permit linking those
    libraries into non-free programs.

    When a program is linked with a library, whether statically or using
    a shared library, the combination of the two is legally speaking a
    combined work, a derivative of the original library.  The ordinary
    General Public License therefore permits such linking only if the
    entire combination fits its criteria of freedom.  The Lesser General
    Public License permits more lax criteria for linking other code with
    the library.

    We call this license the "Lesser" General Public License because it
    does Less to protect the user's freedom than the ordinary General
    Public License.  It also provides other free software developers Less
    of an advantage over competing non-free programs.  These disadvantages
    are the reason we use the ordinary General Public License for many
    libraries.  However, the Lesser license provides advantages in certain
    special circumstances.

    For example, on rare occasions, there may be a special need to
    encourage the widest possible use of a certain library, so that it becomes
    a de-facto standard.  To achieve this, non-free programs must be
    allowed to use the library.  A more frequent case is that a free
    library does the same job as widely used non-free libraries.  In this
    case, there is little to gain by limiting the free library to free
    software only, so we use the Lesser General Public License.

    In other cases, permission to use a particular library in non-free
    programs enables a greater number of people to use a large body of
    free software.  For example, permission to use the GNU C Library in
    non-free programs enables many more people to use the whole GNU
    operating system, as well as its variant, the GNU/Linux operating
    system.

    Although the Lesser General Public License is Less protective of the
    users' freedom, it does ensure that the user of a program that is
    linked with the Library has the freedom and the wherewithal to run
    that program using a modified version of the Library.

    The precise terms and conditions for copying, distribution and
    modification follow.  Pay close attention to the difference between a
    "work based on the library" and a "work that uses the library".  The
    former contains code derived from the library, whereas the latter must
    be combined with the library in order to run.

		  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    0. This License Agreement applies to any software library or other
    program which contains a notice placed by the copyright holder or
    other authorized party saying it may be distributed under the terms of
    this Lesser General Public License (also called "this License").
    Each licensee is addressed as "you".

    A "library" means a collection of software functions and/or data
    prepared so as to be conveniently linked with application programs
    (which use some of those functions and data) to form executables.

    The "Library", below, refers to any such software library or work
    which has been distributed under these terms.  A "work based on the
    Library" means either the Library or any derivative work under
    copyright law: that is to say, a work containing the Library or a
    portion of it, either verbatim or with modifications and/or translated
    straightforwardly into another language.  (Hereinafter, translation is
    included without limitation in the term "modification".)

    "Source code" for a work means the preferred form of the work for
    making modifications to it.  For a library, complete source code means
    all the source code for all modules it contains, plus any associated
    interface definition files, plus the scripts used to control compilation
    and installation of the library.

    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running a program using the Library is not restricted, and output from
    such a program is covered only if its contents constitute a work based
    on the Library (independent of the use of the Library in a tool for
    writing it).  Whether that is true depends on what the Library does
    and what the program that uses the Library does.
    
    1. You may copy and distribute verbatim copies of the Library's
    complete source code as you receive it, in any medium, provided that
    you conspicuously and appropriately publish on each copy an
    appropriate copyright notice and disclaimer of warranty; keep intact
    all the notices that refer to this License and to the absence of any
    warranty; and distribute a copy of this License along with the
    Library.

    You may charge a fee for the physical act of transferring a copy,
    and you may at your option offer warranty protection in exchange for a
    fee.
    
    2. You may modify your copy or copies of the Library or any portion
    of it, thus forming a work based on the Library, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:

        a) The modified work must itself be a software library.

        b) You must cause the files modified to carry prominent notices
        stating that you changed the files and the date of any change.

        c) You must cause the whole of the work to be licensed at no
        charge to all third parties under the terms of this License.

        d) If a facility in the modified Library refers to a function or a
        table of data to be supplied by an application program that uses
        the facility, other than as an argument passed when the facility
        is invoked, then you must make a good faith effort to ensure that,
        in the event an application does not supply such function or
        table, the facility still operates, and performs whatever part of
        its purpose remains meaningful.

        (For example, a function in a library to compute square roots has
        a purpose that is entirely well-defined independent of the
        application.  Therefore, Subsection 2d requires that any
        application-supplied function or table used by this function must
        be optional: if the application does not supply it, the square
        root function must still compute square roots.)

    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Library,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Library, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote
    it.

    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Library.

    In addition, mere aggregation of another work not based on the Library
    with the Library (or with a work based on the Library) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.

    3. You may opt to apply the terms of the ordinary GNU General Public
    License instead of this License to a given copy of the Library.  To do
    this, you must alter all the notices that refer to this License, so
    that they refer to the ordinary GNU General Public License, version 2,
    instead of to this License.  (If a newer version than version 2 of the
    ordinary GNU General Public License has appeared, then you can specify
    that version instead if you wish.)  Do not make any other change in
    these notices.
    
    Once this change is made in a given copy, it is irreversible for
    that copy, so the ordinary GNU General Public License applies to all
    subsequent copies and derivative works made from that copy.

    This option is useful when you wish to copy part of the code of
    the Library into a program that is not a library.

    4. You may copy and distribute the Library (or a portion or
    derivative of it, under Section 2) in object code or executable form
    under the terms of Sections 1 and 2 above provided that you accompany
    it with the complete corresponding machine-readable source code, which
    must be distributed under the terms of Sections 1 and 2 above on a
    medium customarily used for software interchange.

    If distribution of object code is made by offering access to copy
    from a designated place, then offering equivalent access to copy the
    source code from the same place satisfies the requirement to
    distribute the source code, even though third parties are not
    compelled to copy the source along with the object code.

    5. A program that contains no derivative of any portion of the
    Library, but is designed to work with the Library by being compiled or
    linked with it, is called a "work that uses the Library".  Such a
    work, in isolation, is not a derivative work of the Library, and
    therefore falls outside the scope of this License.

    However, linking a "work that uses the Library" with the Library
    creates an executable that is a derivative of the Library (because it
    contains portions of the Library), rather than a "work that uses the
    library".  The executable is therefore covered by this License.
    Section 6 states terms for distribution of such executables.

    When a "work that uses the Library" uses material from a header file
    that is part of the Library, the object code for the work may be a
    derivative work of the Library even though the source code is not.
    Whether this is true is especially significant if the work can be
    linked without the Library, or if the work is itself a library.  The
    threshold for this to be true is not precisely defined by law.

    If such an object file uses only numerical parameters, data
    structure layouts and accessors, and small macros and small inline
    functions (ten lines or less in length), then the use of the object
    file is unrestricted, regardless of whether it is legally a derivative
    work.  (Executables containing this object code plus portions of the
    Library will still fall under Section 6.)

    Otherwise, if the work is a derivative of the Library, you may
    distribute the object code for the work under the terms of Section 6.
    Any executables containing that work also fall under Section 6,
    whether or not they are linked directly with the Library itself.
    
    6. As an exception to the Sections above, you may also combine or
    link a "work that uses the Library" with the Library to produce a
    work containing portions of the Library, and distribute that work
    under terms of your choice, provided that the terms permit
    modification of the work for the customer's own use and reverse
    engineering for debugging such modifications.

    You must give prominent notice with each copy of the work that the
    Library is used in it and that the Library and its use are covered by
    this License.  You must supply a copy of this License.  If the work
    during execution displays copyright notices, you must include the
    copyright notice for the Library among them, as well as a reference
    directing the user to the copy of this License.  Also, you must do one
    of these things:

        a) Accompany the work with the complete corresponding
        machine-readable source code for the Library including whatever
        changes were used in the work (which must be distributed under
        Sections 1 and 2 above); and, if the work is an executable linked
        with the Library, with the complete machine-readable "work that
        uses the Library", as object code and/or source code, so that the
        user can modify the Library and then relink to produce a modified
        executable containing the modified Library.  (It is understood
        that the user who changes the contents of definitions files in the
        Library will not necessarily be able to recompile the application
        to use the modified definitions.)

        b) Use a suitable shared library mechanism for linking with the
        Library.  A suitable mechanism is one that (1) uses at run time a
        copy of the library already present on the user's computer system,
        rather than copying library functions into the executable, and (2)
        will operate properly with a modified version of the library, if
        the user installs one, as long as the modified version is
        interface-compatible with the version that the work was made with.

        c) Accompany the work with a written offer, valid for at
        least three years, to give the same user the materials
        specified in Subsection 6a, above, for a charge no more
        than the cost of performing this distribution.

        d) If distribution of the work is made by offering access to copy
        from a designated place, offer equivalent access to copy the above
        specified materials from the same place.

        e) Verify that the user has already received a copy of these
        materials or that you have already sent this user a copy.

    For an executable, the required form of the "work that uses the
    Library" must include any data and utility programs needed for
    reproducing the executable from it.  However, as a special exception,
    the materials to be distributed need not include anything that is
    normally distributed (in either source or binary form) with the major
    components (compiler, kernel, and so on) of the operating system on
    which the executable runs, unless that component itself accompanies
    the executable.

    It may happen that this requirement contradicts the license
    restrictions of other proprietary libraries that do not normally
    accompany the operating system.  Such a contradiction means you cannot
    use both them and the Library together in an executable that you
    distribute.
    
    7. You may place library facilities that are a work based on the
    Library side-by-side in a single library together with other library
    facilities not covered by this License, and distribute such a combined
    library, provided that the separate distribution of the work based on
    the Library and of the other library facilities is otherwise
    permitted, and provided that you do these two things:

        a) Accompany the combined library with a copy of the same work
        based on the Library, uncombined with any other library
        facilities.  This must be distributed under the terms of the
        Sections above.

        b) Give prominent notice with the combined library of the fact
        that part of it is a work based on the Library, and explaining
        where to find the accompanying uncombined form of the same work.

    8. You may not copy, modify, sublicense, link with, or distribute
    the Library except as expressly provided under this License.  Any
    attempt otherwise to copy, modify, sublicense, link with, or
    distribute the Library is void, and will automatically terminate your
    rights under this License.  However, parties who have received copies,
    or rights, from you under this License will not have their licenses
    terminated so long as such parties remain in full compliance.

    9. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Library or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Library (or any work based on the
    Library), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Library or works based on it.

    10. Each time you redistribute the Library (or any work based on the
    Library), the recipient automatically receives a license from the
    original licensor to copy, distribute, link with or modify the Library
    subject to these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties with
    this License.
    
    11. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Library at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Library by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Library.

    If any portion of this section is held invalid or unenforceable under any
    particular circumstance, the balance of the section is intended to apply,
    and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.

    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.

    12. If the distribution and/or use of the Library is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Library under this License may add
    an explicit geographical distribution limitation excluding those countries,
    so that distribution is permitted only in or among countries not thus
    excluded.  In such case, this License incorporates the limitation as if
    written in the body of this License.

    13. The Free Software Foundation may publish revised and/or new
    versions of the Lesser General Public License from time to time.
    Such new versions will be similar in spirit to the present version,
    but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number.  If the Library
    specifies a version number of this License which applies to it and
    "any later version", you have the option of following the terms and
    conditions either of that version or of any later version published by
    the Free Software Foundation.  If the Library does not specify a
    license version number, you may choose any version ever published by
    the Free Software Foundation.
    
    14. If you wish to incorporate parts of the Library into other free
    programs whose distribution conditions are incompatible with these,
    write to the author to ask for permission.  For software which is
    copyrighted by the Free Software Foundation, write to the Free
    Software Foundation; we sometimes make exceptions for this.  Our
    decision will be guided by the two goals of preserving the free status
    of all derivatives of our free software and of promoting the sharing
    and reuse of software generally.

                    NO WARRANTY

    15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
    WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
    EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
    OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
    LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
    THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
    WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
    AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
    FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
    CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
    LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
    RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
    FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
    SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
    DAMAGES.

		     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

    If you develop a new library, and you want it to be of the greatest
    possible use to the public, we recommend making it free software that
    everyone can redistribute and change.  You can do so by permitting
    redistribution under these terms (or, alternatively, under the terms of the
    ordinary General Public License).

    To apply these terms, attach the following notices to the library.  It is
    safest to attach them to the start of each source file to most effectively
    convey the exclusion of warranty; and each file should have at least the
    "copyright" line and a pointer to where the full notice is found.

        <one line to give the library's name and a brief idea of what it does.>
        Copyright (C) <year>  <name of author>

        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public
        License as published by the Free Software Foundation; either
        version 2.1 of the License, or (at your option) any later version.

        This library is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        Lesser General Public License for more details.

        You should have received a copy of the GNU Lesser General Public
        License along with this library; if not, write to the Free Software
        Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA  02110-1335  USA

    Also add information on how to contact you by electronic and paper mail.

    You should also get your employer (if you work as a programmer) or your
    school, if any, to sign a "copyright disclaimer" for the library, if
    necessary.  Here is a sample; alter the names:

    Yoyodyne, Inc., hereby disclaims all copyright interest in the
    library `Frob' (a library for tweaking knobs) written by James Random Hacker.

    <signature of Ty Coon>, 1 April 1990
    Ty Coon, President of Vice

That's all there is to it!

    scipy

    Copyright (c) 2001-2002 Enthought, Inc. 2003-2024, SciPy Developers.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following
    disclaimer in the documentation and/or other materials provided
    with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    smmap

    Copyright (C) 2010, 2011 Sebastian Thiel and contributors
    All rights reserved.

    Redistribution and use in source and binary forms, with or without 
    modification, are permitted provided that the following conditions 
    are met:

    * Redistributions of source code must retain the above copyright 
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright 
    notice, this list of conditions and the following disclaimer in the 
    documentation and/or other materials provided with the distribution.

    * Neither the name of the async project nor the names of 
    its contributors may be used to endorse or promote products derived 
    from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Babel

    Copyright (c) 2013-2023 by the Babel Team, see AUTHORS for more information.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in
        the documentation and/or other materials provided with the
        distribution.
    3. Neither the name of the copyright holder nor the names of its
        contributors may be used to endorse or promote products derived
        from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    click

    Copyright 2014 Pallets

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    PySocks

    Copyright 2006 Dan-Haim. All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:
    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
    3. Neither the name of Dan Haim nor the names of his contributors may be used
    to endorse or promote products derived from this software without specific
    prior written permission.
    
    THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED
    WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
    EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA
    OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE.

    cloudpickle

    This module was extracted from the `cloud` package, developed by
    PiCloud, Inc.

    Copyright (c) 2015, Cloudpickle contributors.
    Copyright (c) 2012, Regents of the University of California.
    Copyright (c) 2009 PiCloud, Inc. http://www.picloud.com.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
        * Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.
        * Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.
        * Neither the name of the University of California, Berkeley nor the
        names of its contributors may be used to endorse or promote
        products derived from this software without specific prior written
        permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    pyasn1

    Copyright (c) 2005-2020, Ilya Etingof <etingof@gmail.com> All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    numba

    Copyright (c) 2012, Anaconda, Inc.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

    Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    kiwisolver

    =========================
    The Kiwi licensing terms
    =========================
    Kiwi is licensed under the terms of the Modified BSD License (also known as
    New or Revised BSD), as follows:

    Copyright (c) 2013, Nucleic Development Team

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice, this
    list of conditions and the following disclaimer in the documentation and/or
    other materials provided with the distribution.

    Neither the name of the Nucleic Development Team nor the names of its
    contributors may be used to endorse or promote products derived from this
    software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    About Kiwi
    ----------
    Chris Colbert began the Kiwi project in December 2013 in an effort to
    create a blisteringly fast UI constraint solver. Chris is still the
    project lead.

    The Nucleic Development Team is the set of all contributors to the Nucleic
    project and its subprojects.

    The core team that coordinates development on GitHub can be found here:
    http://github.com/nucleic. The current team consists of:

    * Chris Colbert

    Our Copyright Policy
    --------------------
    Nucleic uses a shared copyright model. Each contributor maintains copyright
    over their contributions to Nucleic. But, it is important to note that these
    contributions are typically only changes to the repositories. Thus, the Nucleic
    source code, in its entirety is not the copyright of any single person or
    institution. Instead, it is the collective copyright of the entire Nucleic
    Development Team. If individual contributors want to maintain a record of what
    changes/contributions they have specific copyright on, they should indicate
    their copyright in the commit message of the change, when they commit the
    change to one of the Nucleic repositories.

    With this in mind, the following banner should be used in any source code file
    to indicate the copyright and license terms:

    #------------------------------------------------------------------------------
    # Copyright (c) 2013, Nucleic Development Team.
    #
    # Distributed under the terms of the Modified BSD License.
    #
    # The full license is in the file LICENSE, distributed with this software.
    #------------------------------------------------------------------------------

    locket

    Copyright (c) 2012, Michael Williamson
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    protobuf

    Copyright 2021 Google Inc.  All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

        * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
        * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following disclaimer
    in the documentation and/or other materials provided with the
    distribution.
        * Neither the name of Google Inc. nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Code generated by the Protocol Buffer compiler is owned by the owner
    of the input file used when generating it.  This code is not
    standalone and requires a support library to be linked with it.  This
    support library is itself covered by the above license.

    dask-mpi

    Copyright (c) 2018, Anaconda, Inc. and contributors
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    Neither the name of Anaconda nor the names of any contributors may be used to
    endorse or promote products derived from this software without specific prior
    written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    THE POSSIBILITY OF SUCH DAMAGE.

    nodeenv

    Copyright (c) 2011, Eugene Kalinin.

    Some rights reserved.

    Redistribution and use in source and binary forms of the software as well
    as documentation, with or without modification, are permitted provided
    that the following conditions are met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following
    disclaimer in the documentation and/or other materials provided
    with the distribution.

    * The names of the contributors may not be used to endorse or
    promote products derived from this software without specific
    prior written permission.

    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
    DAMAGE.

    networkx

    Copyright (C) 2004-2024, NetworkX Developers
    Aric Hagberg <hagberg@lanl.gov>
    Dan Schult <dschult@colgate.edu>
    Pieter Swart <swart@lanl.gov>
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

     * Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.

     * Redistributions in binary form must reproduce the above
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.

     * Neither the name of the NetworkX Developers nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    python-dateutil

    Copyright 2017- Paul Ganssle <paul@ganssle.io>
    Copyright 2017- dateutil contributors (see AUTHORS file)

    Licensed 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.

    The above license applies to all contributions after 2017-12-01, as well as
    all contributions that have been re-licensed (see AUTHORS file for the list of
    contributors who have re-licensed their code).
    --------------------------------------------------------------------------------
    dateutil - Extensions to the standard Python datetime module.

    Copyright (c) 2003-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>
    Copyright (c) 2012-2014 - Tomi Pieviläinen <tomi.pievilainen@iki.fi>
    Copyright (c) 2014-2016 - Yaron de Leeuw <me@jarondl.net>
    Copyright (c) 2015-     - Paul Ganssle <paul@ganssle.io>
    Copyright (c) 2015-     - dateutil contributors (see AUTHORS file)

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

        * Redistributions of source code must retain the above copyright notice,
        this list of conditions and the following disclaimer.
        * Redistributions in binary form must reproduce the above copyright notice,
        this list of conditions and the following disclaimer in the documentation
        and/or other materials provided with the distribution.
        * Neither the name of the copyright holder nor the names of its
        contributors may be used to endorse or promote products derived from
        this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    The above BSD License Applies to all code, even that also covered by Apache 2.0.

    colorama

    Copyright (c) 2010 Jonathan Hartley
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holders, nor those of its contributors
    may be used to endorse or promote products derived from this software without
    specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    mkdocs-plugin-inline-svg

    Copyright (c) 2021 Craig Roberts
    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Jinja2

    Copyright 2007 Pallets

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    numpy

    Copyright (c) 2005-2024, NumPy Developers.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

        * Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.

        * Redistributions in binary form must reproduce the above
        copyright notice, this list of conditions and the following
        disclaimer in the documentation and/or other materials provided
        with the distribution.

        * Neither the name of the NumPy Developers nor the names of any
        contributors may be used to endorse or promote products derived
        from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    fsspec

    BSD 3-Clause License

    Copyright (c) 2018, Martin Durant
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    spacy-loggers

    MIT License

    Copyright (c) 2021 ExplosionAI GmbH

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.

    Werkzeug

    Copyright 2007 Pallets

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 

    mkdocs

    Copyright © 2014-present, Tom Christie. All rights reserved.

    Redistribution and use in source and binary forms, with or
    without modification, are permitted provided that the following
    conditions are met:

    Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
    AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGE.

    gitdb

    Copyright (C) 2010, 2011 Sebastian Thiel and contributors
    All rights reserved.

    Redistribution and use in source and binary forms, with or without 
    modification, are permitted provided that the following conditions 
    are met:

    * Redistributions of source code must retain the above copyright 
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright 
    notice, this list of conditions and the following disclaimer in the 
    documentation and/or other materials provided with the distribution.

    * Neither the name of the GitDB project nor the names of 
    its contributors may be used to endorse or promote products derived 
    from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


    Additional Licenses
    -------------------
    The files at 
    gitdb/test/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.idx
    and 
    gitdb/test/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack 
    are licensed under GNU GPL as part of the git source repository, 
    see http://en.wikipedia.org/wiki/Git_%28software%29 for more information.

    They are not required for the actual operation, which is why they are not found 
    in the distribution package.

    traitlets

    - Copyright (c) 2001-, IPython Development Team

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    psutil

    Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the psutil authors nor the names of its contributors
    may be used to endorse or promote products derived from this software without
    specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
    ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    ipykernel

    Copyright (c) 2015, IPython Development Team

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    comm

    BSD 3-Clause License

    Copyright (c) 2022, Jupyter
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    pexpect

    This license is approved by the OSI and FSF as GPL-compatible.
        http://opensource.org/licenses/isc-license.txt

    Copyright (c) 2013-2014, Pexpect development team
    Copyright (c) 2012, Noah Spurrier <noah@noah.org>

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted, provided that the above
    copyright notice and this permission notice appear in all copies.
    
    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

    pyzmq

    BSD 3-Clause License

    Copyright (c) 2009-2012, Brian Granger, Min Ragan-Kelley

    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    matplotlib-inline

    BSD 3-Clause License

    Copyright (c) 2019-2022, IPython Development Team.
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF A DVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    backcall

    Copyright (c) 2014, Thomas Kluyver
    All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice, this
    list of conditions and the following disclaimer in the documentation and/or
    other materials provided with the distribution.

    * Neither the name of the {organization} nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
    ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    jupyter_client

    BSD 3-Clause License

    - Copyright (c) 2001-2015, IPython Development Team
    - Copyright (c) 2015-, Jupyter Development Team

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    nest-asyncio

    BSD 2-Clause License

    Copyright (c) 2018-2020, Ewald de Wit
    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    ipython

    BSD 3-Clause License

    - Copyright (c) 2008-Present, IPython Development Team
    - Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
    - Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
    - Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    * Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    jupyter_core

    BSD 3-Clause License

    - Copyright (c) 2015-, Jupyter Development Team

    All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
    list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

    3. Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    asttokens

    Apache License
    Version 2.0, January 2004
    http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual
Download .txt
gitextract_gvj_8lac/

├── .coveragerc
├── .devcontainer/
│   ├── devcontainer.json
│   └── post-create.sh
├── .flake8
├── .github/
│   ├── actions/
│   │   └── configure_azureml_agent/
│   │       └── action.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── build_validation_workflow.yml
│       └── rag_exp_acc_ci.yml
├── .gitignore
├── .pre-commit-config.yaml
├── 01_index.py
├── 02_qa_generation.py
├── 03_querying.py
├── 04_evaluation.py
├── CODE_OF_CONDUCT.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── SUPPORT.md
├── azure.yaml
├── azureml/
│   ├── eval.py
│   ├── index.py
│   ├── pipeline.py
│   └── query.py
├── config.sample.json
├── config.schema.json
├── cspell.json
├── data-ci/
│   └── docx/
│       └── sample-docx.docx
├── dev-requirements.txt
├── docs/
│   ├── azureml-pipeline.md
│   ├── configs-appendix.md
│   ├── environment-variables.md
│   ├── evaluation-metrics.md
│   ├── script-inputs-outputs.md
│   └── wsl.md
├── env_to_keyvault.py
├── experimental/
│   └── readme.md
├── images/
│   └── AzureMLPipeline.drawio
├── infra/
│   ├── abbreviations.json
│   ├── generate_arm_template.sh
│   ├── main.bicep
│   ├── main.bicepparam
│   ├── main.json
│   ├── network/
│   │   ├── azure_bastion.bicep
│   │   └── network_isolation.bicep
│   └── shared/
│       ├── cognitiveservices.bicep
│       ├── keyvault-secret.bicep
│       ├── keyvault.bicep
│       ├── machineLearning.bicep
│       ├── monitoring.bicep
│       ├── search-services.bicep
│       ├── storage.bicep
│       └── storekeys.bicep
├── promptflow/
│   └── rag-experiment-accelerator/
│       ├── README.md
│       ├── custom_environment/
│       │   ├── Dockerfile
│       │   ├── environment.yaml
│       │   └── rag_experiment_accelerator-0.9-py3-none-any.whl
│       ├── env_setup.md
│       ├── evaluation/
│       │   ├── evaluation.py
│       │   └── flow.dag.yaml
│       ├── flow.dag.yaml
│       ├── index/
│       │   ├── create_index.py
│       │   └── flow.dag.yaml
│       ├── qa_generation/
│       │   ├── flow.dag.yaml
│       │   └── generate_qa.py
│       ├── querying/
│       │   ├── flow.dag.yaml
│       │   └── querying.py
│       └── setup/
│           ├── flow.dag.yaml
│           └── setup_env.py
├── pyproject.toml
├── rag_experiment_accelerator/
│   ├── __init__.py
│   ├── artifact/
│   │   ├── __init__.py
│   │   ├── handlers/
│   │   │   ├── __init__.py
│   │   │   ├── artifact_handler.py
│   │   │   ├── exceptions.py
│   │   │   ├── query_output_handler.py
│   │   │   ├── tests/
│   │   │   │   ├── test_artifact_handler.py
│   │   │   │   └── test_query_output_handler.py
│   │   │   └── typing.py
│   │   └── models/
│   │       ├── __init__.py
│   │       └── query_output.py
│   ├── checkpoint/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── checkpoint.py
│   │   ├── checkpoint_decorator.py
│   │   ├── checkpoint_factory.py
│   │   ├── local_storage_checkpoint.py
│   │   ├── null_checkpoint.py
│   │   └── tests/
│   │       ├── test_checkpoint.py
│   │       ├── test_local_storage_checkpoint.py
│   │       └── test_null_checkpoint.py
│   ├── config/
│   │   ├── __init__.py
│   │   ├── base_config.py
│   │   ├── chunking_config.py
│   │   ├── config.py
│   │   ├── config_validator.py
│   │   ├── embedding_model_config.py
│   │   ├── environment.py
│   │   ├── eval_config.py
│   │   ├── index_config.py
│   │   ├── language_config.py
│   │   ├── openai_config.py
│   │   ├── path_config.py
│   │   ├── paths.py
│   │   ├── query_expansion.py
│   │   ├── rerank_config.py
│   │   ├── sampling_config.py
│   │   ├── search_config.py
│   │   └── tests/
│   │       ├── test_config.py
│   │       ├── test_config_validator.py
│   │       ├── test_environment.py
│   │       └── test_index_config.py
│   ├── data_assets/
│   │   ├── __init__.py
│   │   └── data_asset.py
│   ├── doc_loader/
│   │   ├── __init__.py
│   │   ├── customJsonLoader.py
│   │   ├── documentIntelligenceLoader.py
│   │   ├── documentLoader.py
│   │   ├── docxLoader.py
│   │   ├── htmlLoader.py
│   │   ├── jsonLoader.py
│   │   ├── markdownLoader.py
│   │   ├── pdfLoader.py
│   │   ├── structuredLoader.py
│   │   ├── tests/
│   │   │   ├── test_custom_html_loader.py
│   │   │   ├── test_custom_json_loader.py
│   │   │   ├── test_data/
│   │   │   │   ├── document_intelligence_response/
│   │   │   │   │   ├── multiple_pages.json
│   │   │   │   │   ├── simple_response.json
│   │   │   │   │   └── table_without_headers.json
│   │   │   │   └── json/
│   │   │   │       ├── data.bad.invalid_keys.json
│   │   │   │       ├── data.bad.not_a_list.json
│   │   │   │       └── data.valid.json
│   │   │   ├── test_document_intelligence_loader.py
│   │   │   └── test_docx_loader.py
│   │   └── textLoader.py
│   ├── embedding/
│   │   ├── __init__.py
│   │   ├── aoai_embedding_model.py
│   │   ├── embedding_model.py
│   │   ├── factory.py
│   │   ├── st_embedding_model.py
│   │   └── tests/
│   │       ├── test_aoai_embedding_model.py
│   │       ├── test_factory.py
│   │       └── test_st_embedding_model.py
│   ├── evaluation/
│   │   ├── LICENSE.txt
│   │   ├── __init__.py
│   │   ├── eval.py
│   │   ├── llm_based_metrics.py
│   │   ├── plain_metrics.py
│   │   ├── plot_metrics.py
│   │   ├── search_eval.py
│   │   ├── spacy_evaluator.py
│   │   ├── tests/
│   │   │   ├── test_llm_based_metrics.py
│   │   │   ├── test_plain_metrics.py
│   │   │   ├── test_search_eval.py
│   │   │   ├── test_spacy_evaluator.py
│   │   │   └── test_transformer_based_metrics.py
│   │   └── transformer_based_metrics.py
│   ├── ingest_data/
│   │   ├── __init__.py
│   │   ├── acs_ingest.py
│   │   └── tests/
│   │       └── test_acs_ingest.py
│   ├── init_Index/
│   │   ├── __init__.py
│   │   ├── create_index.py
│   │   └── tests/
│   │       └── test_create_index.py
│   ├── io/
│   │   ├── __init__.py
│   │   ├── exceptions.py
│   │   ├── loader.py
│   │   ├── local/
│   │   │   ├── __init__.py
│   │   │   ├── base.py
│   │   │   ├── loaders/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── jsonl_loader.py
│   │   │   │   ├── local_loader.py
│   │   │   │   └── tests/
│   │   │   │       ├── test_jsonl_loader.py
│   │   │   │       └── test_local_loader.py
│   │   │   ├── tests/
│   │   │   │   └── test_local_io_base.py
│   │   │   └── writers/
│   │   │       ├── __init__.py
│   │   │       ├── jsonl_writer.py
│   │   │       ├── local_writer.py
│   │   │       └── tests/
│   │   │           ├── test_jsonl_writer.py
│   │   │           └── test_local_writer.py
│   │   └── writer.py
│   ├── llm/
│   │   ├── __init__.py
│   │   ├── exceptions.py
│   │   ├── prompt/
│   │   │   ├── __init__.py
│   │   │   ├── hyde_prompts.py
│   │   │   ├── instruction_prompts.py
│   │   │   ├── multiprompts.py
│   │   │   ├── prompt.py
│   │   │   ├── qna_prompts.py
│   │   │   ├── ragas_prompts.py
│   │   │   └── rerank_prompts.py
│   │   ├── prompts_text/
│   │   │   ├── do_need_multiple_prompt_instruction.txt
│   │   │   ├── generate_qna_long_multi_context.txt
│   │   │   ├── generate_qna_long_single_context.txt
│   │   │   ├── generate_qna_short_multi_context.txt
│   │   │   ├── generate_qna_short_single_context.txt
│   │   │   ├── generate_qna_short_single_context_no_cot.txt
│   │   │   ├── llm_answer_relevance_instruction.txt
│   │   │   ├── llm_context_precision_instruction.txt
│   │   │   ├── llm_context_recall_instruction.txt
│   │   │   ├── main_instruction_long.txt
│   │   │   ├── main_instruction_short.txt
│   │   │   ├── multiple_prompt_instruction.txt
│   │   │   ├── prompt_generate_hypothetical_answer.txt
│   │   │   ├── prompt_generate_hypothetical_document.txt
│   │   │   ├── prompt_generate_hypothetical_questions.txt
│   │   │   ├── prompt_instruction_entities.txt
│   │   │   ├── prompt_instruction_keywords.txt
│   │   │   ├── prompt_instruction_summary.txt
│   │   │   ├── prompt_instruction_title.txt
│   │   │   └── rerank_prompt_instruction.txt
│   │   ├── response_generator.py
│   │   └── tests/
│   │       └── test_response_generator.py
│   ├── nlp/
│   │   ├── __init__.py
│   │   ├── language_evaluator.py
│   │   ├── preprocess.py
│   │   └── tests/
│   │       ├── test_language_evaluator.py
│   │       └── test_preprocessor.py
│   ├── reranking/
│   │   ├── __init__.py
│   │   └── reranker.py
│   ├── run/
│   │   ├── evaluation.py
│   │   ├── index.py
│   │   ├── qa_generation.py
│   │   ├── querying.py
│   │   └── tests/
│   │       ├── data/
│   │       │   └── test_data.jsonl
│   │       ├── test_index.py
│   │       ├── test_qa_generation.py
│   │       └── test_querying.py
│   ├── sampling/
│   │   ├── __init__.py
│   │   ├── clustering.py
│   │   └── tests/
│   │       ├── data/
│   │       │   └── test1.txt
│   │       └── test_clustering.py
│   ├── search_type/
│   │   ├── __init__.py
│   │   ├── acs_search_methods.py
│   │   └── tests/
│   │       └── test_acs_search_methods.py
│   └── utils/
│       ├── __init__.py
│       ├── auth.py
│       ├── logging.py
│       └── timetook.py
├── requirements.txt
├── setup.cfg
└── setup.py
Download .txt
SYMBOL INDEX (541 symbols across 123 files)

FILE: azureml/eval.py
  function main (line 15) | def main():

FILE: azureml/index.py
  function init (line 17) | def init():
  function run (line 59) | def run(input_paths: list[str]) -> list[str]:

FILE: azureml/pipeline.py
  function generate_conda_file (line 33) | def generate_conda_file():
  function initialise_mlflow_client (line 57) | def initialise_mlflow_client(environment: Environment, config: Config):
  function start_pipeline (line 75) | def start_pipeline(

FILE: azureml/query.py
  function main (line 17) | def main():

FILE: promptflow/rag-experiment-accelerator/evaluation/evaluation.py
  function my_python_tool (line 15) | def my_python_tool(config_path: str) -> bool:

FILE: promptflow/rag-experiment-accelerator/index/create_index.py
  function my_python_tool (line 10) | def my_python_tool(should_index: bool, config_path: str) -> bool:

FILE: promptflow/rag-experiment-accelerator/qa_generation/generate_qa.py
  function my_python_tool (line 9) | def my_python_tool(config_path: str, should_generate_qa: bool) -> bool:

FILE: promptflow/rag-experiment-accelerator/querying/querying.py
  function my_python_tool (line 8) | def my_python_tool(config_path: str) -> bool:

FILE: promptflow/rag-experiment-accelerator/setup/setup_env.py
  function my_python_tool (line 9) | def my_python_tool(connection: CustomConnection):

FILE: rag_experiment_accelerator/artifact/handlers/artifact_handler.py
  class ArtifactHandler (line 11) | class ArtifactHandler:
    method __init__ (line 27) | def __init__(self, data_location: str, writer: T, loader: U) -> None:
    method load (line 33) | def load(self, name: str, **kwargs) -> list:
    method handle_archive (line 63) | def handle_archive(self, name: str) -> str | None:
    method save_dict (line 95) | def save_dict(self, data: dict, name: str, **kwargs):

FILE: rag_experiment_accelerator/artifact/handlers/exceptions.py
  class LoadException (line 1) | class LoadException(Exception):
    method __init__ (line 2) | def __init__(self, path: str):

FILE: rag_experiment_accelerator/artifact/handlers/query_output_handler.py
  class QueryOutputHandler (line 10) | class QueryOutputHandler(ArtifactHandler):
    method __init__ (line 15) | def __init__(
    method _get_output_name (line 28) | def _get_output_name(
    method get_output_path (line 42) | def get_output_path(
    method load (line 56) | def load(
    method handle_archive_by_index (line 81) | def handle_archive_by_index(
    method save (line 96) | def save(

FILE: rag_experiment_accelerator/artifact/handlers/tests/test_artifact_handler.py
  function test_loads (line 10) | def test_loads():
  function test_save_dict (line 25) | def test_save_dict():
  function test_loads_raises_no_data_returned (line 40) | def test_loads_raises_no_data_returned():
  function test_load_raises_cant_handle (line 52) | def test_load_raises_cant_handle():
  function test_handle_archive (line 63) | def test_handle_archive():
  function test_handle_archive_no_op (line 78) | def test_handle_archive_no_op():

FILE: rag_experiment_accelerator/artifact/handlers/tests/test_query_output_handler.py
  function test_handle_archive_by_index (line 14) | def test_handle_archive_by_index(mock_artifact_handler_handle_archive):
  function test_get_output_path (line 27) | def test_get_output_path():
  function test__get_output_name (line 38) | def test__get_output_name():
  function test_save (line 52) | def test_save(mock_artifact_handler_save_dict):
  function test_load (line 84) | def test_load(mock_artifact_handler_load):
  function test_load_raises_when_loaded_data_not_dict (line 130) | def test_load_raises_when_loaded_data_not_dict(mock_artifact_handler_load):

FILE: rag_experiment_accelerator/artifact/models/query_output.py
  class QueryOutput (line 1) | class QueryOutput:
    method __init__ (line 22) | def __init__(

FILE: rag_experiment_accelerator/checkpoint/checkpoint.py
  class Checkpoint (line 8) | class Checkpoint(ABC):
    method load_or_run (line 17) | def load_or_run(self, method, id: str, *args, **kwargs) -> Any:
    method _has_data (line 49) | def _has_data(self, id: str, method) -> bool:
    method _load (line 60) | def _load(self, id: str, method) -> Any:
    method _save (line 74) | def _save(self, data: Any, id: str, method):

FILE: rag_experiment_accelerator/checkpoint/checkpoint_decorator.py
  function cache_with_checkpoint (line 4) | def cache_with_checkpoint(id=None):

FILE: rag_experiment_accelerator/checkpoint/checkpoint_factory.py
  function get_checkpoint (line 7) | def get_checkpoint():
  function init_checkpoint (line 17) | def init_checkpoint(config: Config):
  function _get_checkpoint_base_on_config (line 25) | def _get_checkpoint_base_on_config(config: Config):

FILE: rag_experiment_accelerator/checkpoint/local_storage_checkpoint.py
  class LocalStorageCheckpoint (line 9) | class LocalStorageCheckpoint(Checkpoint):
    method __init__ (line 14) | def __init__(self, directory: str = "."):
    method _has_data (line 19) | def _has_data(self, id: str, method) -> bool:
    method _load (line 23) | def _load(self, id: str, method) -> List:
    method _save (line 29) | def _save(self, data: Any, id: str, method):
    method _get_checkpoint_file_path (line 36) | def _get_checkpoint_file_path(self, id: str, method):
    method _build_internal_id (line 40) | def _build_internal_id(self, id: str, method):
    method _get_existing_checkpoint_ids (line 44) | def _get_existing_checkpoint_ids(self) -> Set[str]:

FILE: rag_experiment_accelerator/checkpoint/null_checkpoint.py
  class NullCheckpoint (line 5) | class NullCheckpoint(Checkpoint):
    method __init__ (line 10) | def __init__(self):
    method _has_data (line 13) | def _has_data(self, id: str, method) -> bool:
    method _load (line 16) | def _load(self, id: str, method) -> Any:
    method _save (line 19) | def _save(self, data: Any, id: str, method):

FILE: rag_experiment_accelerator/checkpoint/tests/test_checkpoint.py
  function mock_checkpoints (line 17) | def mock_checkpoints():
  function test_get_checkpoint_without_init_fails (line 24) | def test_get_checkpoint_without_init_fails():
  function test_get_checkpoint_for_local_executions (line 33) | def test_get_checkpoint_for_local_executions(mock_checkpoints):
  function test_get_checkpoint_for_azure_ml (line 43) | def test_get_checkpoint_for_azure_ml(mock_checkpoints):
  function test_get_checkpoint_when_should_not_use_checkpoints_locally (line 54) | def test_get_checkpoint_when_should_not_use_checkpoints_locally(mock_che...
  function test_get_checkpoint_when_should_not_use_checkpoints_in_azure_ml (line 64) | def test_get_checkpoint_when_should_not_use_checkpoints_in_azure_ml(mock...

FILE: rag_experiment_accelerator/checkpoint/tests/test_local_storage_checkpoint.py
  function dummy (line 20) | def dummy(word, call_identifier):
  class TestLocalStorageCheckpoint (line 24) | class TestLocalStorageCheckpoint(unittest.TestCase):
    method setUp (line 25) | def setUp(self):
    method tearDown (line 28) | def tearDown(self):
    method test_wrapped_method_is_cached (line 32) | def test_wrapped_method_is_cached(self):

FILE: rag_experiment_accelerator/checkpoint/tests/test_null_checkpoint.py
  function dummy (line 6) | def dummy(word):
  class TestNullCheckpoint (line 10) | class TestNullCheckpoint(unittest.TestCase):
    method test_wrapped_method_is_not_cached (line 11) | def test_wrapped_method_is_not_cached(self):

FILE: rag_experiment_accelerator/config/base_config.py
  class BaseConfig (line 13) | class BaseConfig:
    method from_dict (line 15) | def from_dict(cls, config_dict: dict) -> "BaseConfig":
    method to_dict (line 34) | def to_dict(self) -> dict:
    method flatten (line 51) | def flatten(self, randomize: bool = False):
    method sample (line 96) | def sample(self) -> list["BaseConfig"]:

FILE: rag_experiment_accelerator/config/chunking_config.py
  class ChunkingStrategy (line 6) | class ChunkingStrategy(StrEnum):
    method __repr__ (line 10) | def __repr__(self) -> str:
  class ChunkingConfig (line 15) | class ChunkingConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/config.py
  class ExecutionEnvironment (line 29) | class ExecutionEnvironment(StrEnum):
  class Config (line 35) | class Config(BaseConfig):
    method from_path (line 54) | def from_path(
    method validate_inputs (line 94) | def validate_inputs(self, use_semantic_search: bool = False):
    method initialize_embedding_models (line 108) | def initialize_embedding_models(self, environment: Environment):
    method get_embedding_model (line 116) | def get_embedding_model(self, model_name) -> EmbeddingModel:

FILE: rag_experiment_accelerator/config/config_validator.py
  function fetch_json_schema_from_url (line 9) | def fetch_json_schema_from_url(schema_url):
  function fetch_json_schema_from_file (line 16) | def fetch_json_schema_from_file(schema_file_path, source_file_path):
  function get_normalised_schema_path (line 29) | def get_normalised_schema_path(schema_file_path, source_file_path):
  function fetch_json_schema (line 35) | def fetch_json_schema(schema_reference, source_file_path):
  function validate_json_with_schema (line 50) | def validate_json_with_schema(

FILE: rag_experiment_accelerator/config/embedding_model_config.py
  class EmbeddingModelConfig (line 6) | class EmbeddingModelConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/environment.py
  function field_to_env_name (line 17) | def field_to_env_name(field_name: str) -> str:
  function _get_value_from_env (line 25) | def _get_value_from_env(var_name: str, is_optional: bool = False) -> Opt...
  function init_keyvault (line 38) | def init_keyvault(azure_key_vault_endpoint: str) -> SecretClient:
  function field_to_keyvault_name (line 48) | def field_to_keyvault_name(field_name: str) -> str:
  function _get_value_from_keyvault (line 56) | def _get_value_from_keyvault(
  class Environment (line 77) | class Environment:
    method _field_names (line 97) | def _field_names(cls) -> list[str]:
    method _is_field_optional (line 104) | def _is_field_optional(cls, field_name: str) -> bool:
    method fields (line 111) | def fields(self) -> list[Tuple[str, str]]:
    method _from_env (line 118) | def _from_env(cls) -> "Environment":
    method from_keyvault (line 131) | def from_keyvault(cls, azure_key_vault_endpoint: str) -> "Environment":
    method from_env_or_keyvault (line 145) | def from_env_or_keyvault(cls) -> "Environment":
    method to_keyvault (line 189) | def to_keyvault(self, azure_key_vault_endpoint: str = None) -> None:

FILE: rag_experiment_accelerator/config/eval_config.py
  class EvalConfig (line 6) | class EvalConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/index_config.py
  class IndexKey (line 12) | class IndexKey(StrEnum):
  class IndexConfig (line 29) | class IndexConfig(BaseConfig):
    method __label_properties (line 54) | def __label_properties(self) -> dict:
    method __from_label_properties (line 81) | def __from_label_properties(cls, properties: dict) -> "IndexConfig":
    method index_name (line 113) | def index_name(self) -> str:
    method from_index_name (line 129) | def from_index_name(cls, index_name: str) -> "IndexConfig":

FILE: rag_experiment_accelerator/config/language_config.py
  class LanguageAnalyzerConfig (line 6) | class LanguageAnalyzerConfig(BaseConfig):
  class LanguageConfig (line 16) | class LanguageConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/openai_config.py
  class OpenAIConfig (line 6) | class OpenAIConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/path_config.py
  class Paths (line 7) | class Paths:
  class PathConfig (line 18) | class PathConfig(BaseConfig):
    method initialize_paths (line 27) | def initialize_paths(self, config_file_path: str, data_dir: str) -> None:
    method sampled_cluster_predictions_path (line 61) | def sampled_cluster_predictions_path(self, optimum_k: int) -> str:

FILE: rag_experiment_accelerator/config/paths.py
  function get_all_file_paths (line 11) | def get_all_file_paths(directory: str) -> list[str]:
  function try_create_directory (line 19) | def try_create_directory(directory: str) -> None:
  function formatted_datetime_suffix (line 38) | def formatted_datetime_suffix():
  function mlflow_run_name (line 43) | def mlflow_run_name(job_name: str, suffix: str = None):

FILE: rag_experiment_accelerator/config/query_expansion.py
  class QueryExpansionConfig (line 6) | class QueryExpansionConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/rerank_config.py
  class RerankConfig (line 6) | class RerankConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/sampling_config.py
  class SamplingConfig (line 6) | class SamplingConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/search_config.py
  class SearchConfig (line 6) | class SearchConfig(BaseConfig):

FILE: rag_experiment_accelerator/config/tests/test_config.py
  function init_config (line 10) | def init_config():
  function get_test_config_dir (line 19) | def get_test_config_dir():
  function test_config_init (line 25) | def test_config_init(mock_validate_json_with_schema, mock_create_embeddi...
  function test_config_init_raises_error (line 180) | def test_config_init_raises_error(
  function test_chunk_size_greater_than_overlap_size (line 192) | def test_chunk_size_greater_than_overlap_size():
  function test_validate_semantic_search_config (line 206) | def test_validate_semantic_search_config():

FILE: rag_experiment_accelerator/config/tests/test_config_validator.py
  function test_fetch_json_schema_from_url_returns_json (line 17) | def test_fetch_json_schema_from_url_returns_json(mock_get):
  function test_fetch_json_schema_from_url_raises_error_for_timeout (line 31) | def test_fetch_json_schema_from_url_raises_error_for_timeout(mock_get):
  function test_fetch_json_schema_from_file_returns_json_from_file (line 46) | def test_fetch_json_schema_from_file_returns_json_from_file(mock_open, m...
  function test_fetch_json_schema_from_file_uses_a_relative_path (line 65) | def test_fetch_json_schema_from_file_uses_a_relative_path(mock_open, moc...
  function test_fetch_json_schema_from_file_raises_error_for_non_file_input (line 81) | def test_fetch_json_schema_from_file_raises_error_for_non_file_input(moc...
  function test_get_normalised_schema_path (line 92) | def test_get_normalised_schema_path():
  function test_fetch_json_schema_returns_from_cache (line 104) | def test_fetch_json_schema_returns_from_cache(mock_schema_cache):
  function test_fetch_json_schema_updates_cache (line 117) | def test_fetch_json_schema_updates_cache(
  function test_fetch_json_schema_returns_from_url_when_http (line 137) | def test_fetch_json_schema_returns_from_url_when_http(
  function test_fetch_json_schema_returns_from_url_when_https (line 153) | def test_fetch_json_schema_returns_from_url_when_https(
  function test_fetch_json_schema_returns_from_file (line 169) | def test_fetch_json_schema_returns_from_file(
  function test_validate_json_with_schema_returns_true_for_no_schema (line 185) | def test_validate_json_with_schema_returns_true_for_no_schema():
  function test_validate_json_with_schema_returns_for_valid_json (line 195) | def test_validate_json_with_schema_returns_for_valid_json(
  function test_validate_json_with_schema_returns_for_invalid_json (line 211) | def test_validate_json_with_schema_returns_for_invalid_json(

FILE: rag_experiment_accelerator/config/tests/test_environment.py
  function mock_get_value_from_env_with_keyvault (line 10) | def mock_get_value_from_env_with_keyvault(
  function mock_get_secret_value_from_keyvault (line 28) | def mock_get_secret_value_from_keyvault(
  function mock_get_any_value_from_keyvault (line 38) | def mock_get_any_value_from_keyvault(field_name: str) -> Optional[str]:
  function test_create_environment_from_env_or_keyvault (line 68) | def test_create_environment_from_env_or_keyvault(_, __, mock_init_keyvau...
  function test_create_environment_from_keyvault (line 85) | def test_create_environment_from_keyvault(mock_init_keyvault):
  function test_to_keyvault (line 105) | def test_to_keyvault(mock_init_keyvault):

FILE: rag_experiment_accelerator/config/tests/test_index_config.py
  function test_index_config_to_index_name (line 9) | def test_index_config_to_index_name():
  function test_index_name_to_index_config (line 35) | def test_index_name_to_index_config():
  function test_index_name_to_index_config_shuffled_order (line 52) | def test_index_name_to_index_config_shuffled_order():
  function test_index_name_to_index_config_missing_property (line 69) | def test_index_name_to_index_config_missing_property():
  function test_index_name_to_index_config_hyphens (line 82) | def test_index_name_to_index_config_hyphens():

FILE: rag_experiment_accelerator/data_assets/data_asset.py
  function create_data_asset (line 12) | def create_data_asset(data_path: str, data_asset_name: str, environment:...

FILE: rag_experiment_accelerator/doc_loader/customJsonLoader.py
  class CustomJSONLoader (line 12) | class CustomJSONLoader(BaseLoader):
    method __init__ (line 13) | def __init__(
    method _load_schema_from_dict (line 23) | def _load_schema_from_dict(self, data: dict) -> str:
    method load (line 37) | def load(self) -> list[Document]:

FILE: rag_experiment_accelerator/doc_loader/documentIntelligenceLoader.py
  function is_supported_by_document_intelligence (line 22) | def is_supported_by_document_intelligence(format: str) -> bool:
  function load_with_azure_document_intelligence (line 45) | def load_with_azure_document_intelligence(
  class DocumentIntelligenceLoader (line 105) | class DocumentIntelligenceLoader(BaseLoader):
    method __init__ (line 110) | def __init__(
    method load (line 146) | def load(self) -> List[Document]:
    method lazy_load (line 166) | def lazy_load(self) -> Iterator[Document]:
    method _get_file_paths (line 171) | def _get_file_paths(self):
    method _analyze_document (line 182) | def _analyze_document(self, file_path: str):
    method _call_document_intelligence (line 227) | def _call_document_intelligence(self, file_path):
    method _clean_content (line 240) | def _clean_content(self, content: str):
    method _convert_to_langchain_document (line 251) | def _convert_to_langchain_document(self, paragraphs, file_path, page_n...
    method _is_intersecting_regions (line 259) | def _is_intersecting_regions(self, bounding_region1, bounding_region2):
    method _is_intersecting_polygons (line 271) | def _is_intersecting_polygons(self, polygon1, polygon2):
    method _assign_tables_to_paragraphs (line 293) | def _assign_tables_to_paragraphs(self, paragraphs, tables):
    method _convert_to_paragraph (line 318) | def _convert_to_paragraph(self, table):
    method _format_table (line 324) | def _format_table(self, table):
    method _substitute_table_paragraphs (line 360) | def _substitute_table_paragraphs(self, paragraphs, tables):
    method _split_paragraphs_by_page (line 383) | def _split_paragraphs_by_page(self, paragraphs):
    method _load_with_langchain (line 393) | def _load_with_langchain(self, file_path, api_model):

FILE: rag_experiment_accelerator/doc_loader/documentLoader.py
  function determine_processor (line 37) | def determine_processor(chunking_strategy: ChunkingStrategy, format: str...
  function load_documents (line 50) | def load_documents(

FILE: rag_experiment_accelerator/doc_loader/docxLoader.py
  function load_docx_files (line 12) | def load_docx_files(

FILE: rag_experiment_accelerator/doc_loader/htmlLoader.py
  function load_html_files (line 12) | def load_html_files(

FILE: rag_experiment_accelerator/doc_loader/jsonLoader.py
  function load_json_files (line 13) | def load_json_files(

FILE: rag_experiment_accelerator/doc_loader/markdownLoader.py
  function load_markdown_files (line 12) | def load_markdown_files(

FILE: rag_experiment_accelerator/doc_loader/pdfLoader.py
  function preprocess_pdf_content (line 13) | def preprocess_pdf_content(content: str):
  function load_pdf_files (line 40) | def load_pdf_files(

FILE: rag_experiment_accelerator/doc_loader/structuredLoader.py
  function load_structured_files (line 11) | def load_structured_files(

FILE: rag_experiment_accelerator/doc_loader/tests/test_custom_html_loader.py
  function test_load_html_files (line 7) | def test_load_html_files():

FILE: rag_experiment_accelerator/doc_loader/tests/test_custom_json_loader.py
  function test_load_json_files (line 12) | def test_load_json_files():
  function test_load_json_files_raises_invalid_keys (line 43) | def test_load_json_files_raises_invalid_keys():
  function test_load_json_files_raises_not_a_list (line 71) | def test_load_json_files_raises_not_a_list():

FILE: rag_experiment_accelerator/doc_loader/tests/test_document_intelligence_loader.py
  class SimplePythonObject (line 8) | class SimplePythonObject:
    method __init__ (line 9) | def __init__(self, **kwargs):
    method __getitem__ (line 12) | def __getitem__(self, key):
    method get (line 15) | def get(self, key, default=None):
    method keys (line 18) | def keys(self):
  function mock_simple_response (line 22) | def mock_simple_response(file_name):
  function test__load (line 37) | def test__load(mock_document_intelligence, _):
  function test_load_with_langchain_is_used_as_fallback (line 72) | def test_load_with_langchain_is_used_as_fallback(mock_load_with_langchai...
  function test_content_cleaning (line 94) | def test_content_cleaning(mock_document_intelligence, _):
  function test_table_without_headers (line 123) | def test_table_without_headers(mock_document_intelligence, _):
  function test_document_with_multiple_pages_without_splitting_documents_by_page (line 151) | def test_document_with_multiple_pages_without_splitting_documents_by_page(
  function test_document_with_multiple_pages_with_split_documents_by_page (line 183) | def test_document_with_multiple_pages_with_split_documents_by_page(
  function test_excluding_paragraphs (line 223) | def test_excluding_paragraphs(mock_document_intelligence, _):
  function test_get_file_paths (line 245) | def test_get_file_paths():
  function test_get_file_paths_returns_according_to_glob (line 263) | def test_get_file_paths_returns_according_to_glob():
  function test_get_file_paths_works_for_single_files (line 275) | def test_get_file_paths_works_for_single_files():

FILE: rag_experiment_accelerator/doc_loader/tests/test_docx_loader.py
  function test_load_docx_files (line 7) | def test_load_docx_files():

FILE: rag_experiment_accelerator/doc_loader/textLoader.py
  function load_text_files (line 12) | def load_text_files(

FILE: rag_experiment_accelerator/embedding/aoai_embedding_model.py
  class AOAIEmbeddingModel (line 7) | class AOAIEmbeddingModel(EmbeddingModel):
    method __init__ (line 23) | def __init__(
    method _initialize_client (line 36) | def _initialize_client(self, environment: Environment) -> AzureOpenAI:
    method generate_embedding (line 53) | def generate_embedding(self, chunk: str) -> list[float]:

FILE: rag_experiment_accelerator/embedding/embedding_model.py
  class EmbeddingModel (line 4) | class EmbeddingModel(ABC):
    method __init__ (line 19) | def __init__(self, name: str, dimension: int, **kwargs) -> None:
    method generate_embedding (line 24) | def generate_embedding(self, chunk: str) -> list[float]:
    method to_dict (line 36) | def to_dict(self) -> dict:

FILE: rag_experiment_accelerator/embedding/factory.py
  function create_embedding_model (line 5) | def create_embedding_model(model_type: str, **kwargs):

FILE: rag_experiment_accelerator/embedding/st_embedding_model.py
  class STEmbeddingModel (line 10) | class STEmbeddingModel(EmbeddingModel):
    method __init__ (line 36) | def __init__(
    method generate_embedding (line 66) | def generate_embedding(self, chunk: str) -> list[float]:

FILE: rag_experiment_accelerator/embedding/tests/test_aoai_embedding_model.py
  function test_generate_embedding (line 12) | def test_generate_embedding(mock_client):
  function test_emebdding_dimension_has_default (line 31) | def test_emebdding_dimension_has_default():
  function test_can_set_embedding_dimension (line 37) | def test_can_set_embedding_dimension():
  function test_generate_embeddings_no_shortening (line 46) | def test_generate_embeddings_no_shortening(mock_client):
  function test_generate_embeddings_with_shortening (line 63) | def test_generate_embeddings_with_shortening(mock_client):

FILE: rag_experiment_accelerator/embedding/tests/test_factory.py
  function test_create_aoai_embedding_model (line 9) | def test_create_aoai_embedding_model():
  function test_create_st_embedding_model (line 24) | def test_create_st_embedding_model(mock_sentence_transformer):
  function test_create_raises_invalid_embedding_type (line 38) | def test_create_raises_invalid_embedding_type():

FILE: rag_experiment_accelerator/embedding/tests/test_st_embedding_model.py
  function test_generate_embedding (line 8) | def test_generate_embedding(mock_sentence_transformer):
  function test_sentence_transformer_embedding_model_raises_non_existing_model (line 19) | def test_sentence_transformer_embedding_model_raises_non_existing_model():
  function test_sentence_transformer_embedding_model_raises_unsupported_model (line 24) | def test_sentence_transformer_embedding_model_raises_unsupported_model():
  function test_sentence_transformer_embedding_model_succeeds (line 30) | def test_sentence_transformer_embedding_model_succeeds(mock_sentence_tra...

FILE: rag_experiment_accelerator/evaluation/eval.py
  function compute_metrics (line 44) | def compute_metrics(
  function evaluate_single_prompt (line 129) | def evaluate_single_prompt(
  function evaluate_prompts (line 178) | def evaluate_prompts(

FILE: rag_experiment_accelerator/evaluation/llm_based_metrics.py
  function lower_and_strip (line 15) | def lower_and_strip(text):
  function llm_answer_relevance (line 31) | def llm_answer_relevance(
  function llm_context_precision (line 63) | def llm_context_precision(
  function llm_context_recall (line 104) | def llm_context_recall(
  function compute_llm_based_score (line 153) | def compute_llm_based_score(

FILE: rag_experiment_accelerator/evaluation/plain_metrics.py
  function bleu (line 9) | def bleu(predictions: list[str], references: list[str]) -> float:
  function fuzzy_score (line 33) | def fuzzy_score(str1: str, str2: str, match_type: str = "token_set_ratio...
  function rouge_score (line 74) | def rouge_score(ground_truth: str, prediction: str, rouge_metric_name: s...
  function levenshtein (line 110) | def levenshtein(str1: str, str2: str) -> int:
  function jaccard (line 125) | def jaccard(str1: str, str2: str) -> int:
  function hamming (line 140) | def hamming(str1: str, str2: str) -> int:
  function jaro_winkler (line 155) | def jaro_winkler(str1: str, str2: str) -> int:
  function cosine_ochiai (line 170) | def cosine_ochiai(str1: str, str2: str) -> float:
  function lcsseq (line 185) | def lcsseq(str1: str, str2: str) -> int:
  function lcsstr (line 200) | def lcsstr(str1: str, str2: str) -> int:

FILE: rag_experiment_accelerator/evaluation/plot_metrics.py
  function generate_metrics (line 11) | def generate_metrics(experiment_name, run_id, mlflow_client):
  function draw_hist_df (line 83) | def draw_hist_df(df, run_id, mlflow_client):
  function plot_apk_scores (line 106) | def plot_apk_scores(df, run_id, mlflow_client):
  function plot_mapk_scores (line 113) | def plot_mapk_scores(df, run_id, mlflow_client):
  function plot_map_scores (line 119) | def plot_map_scores(df, run_id, mlflow_client):
  function draw_search_chart (line 125) | def draw_search_chart(temp_df, run_id, mlflow_client):

FILE: rag_experiment_accelerator/evaluation/search_eval.py
  function evaluate_search_result (line 11) | def evaluate_search_result(

FILE: rag_experiment_accelerator/evaluation/spacy_evaluator.py
  class SpacyEvaluator (line 8) | class SpacyEvaluator:
    method __init__ (line 25) | def __init__(self, similarity_threshold=0.8, model="en_core_web_lg") -...
    method similarity (line 36) | def similarity(self, doc1: str, doc2: str):
    method is_relevant (line 41) | def is_relevant(self, doc1: str, doc2: str):

FILE: rag_experiment_accelerator/evaluation/tests/test_llm_based_metrics.py
  function test_llm_answer_relevance (line 12) | def test_llm_answer_relevance(mock_st, mock_generate_response):
  function test_llm_context_precision (line 32) | def test_llm_context_precision(mock_generate_response):
  function test_llm_context_recall (line 48) | def test_llm_context_recall(mock_generate_response):

FILE: rag_experiment_accelerator/evaluation/tests/test_plain_metrics.py
  function test_fuzzy_score (line 18) | def test_fuzzy_score():
  function test_levenshtein (line 26) | def test_levenshtein():
  function test_jaccard (line 33) | def test_jaccard():
  function test_hamming (line 40) | def test_hamming():
  function test_jaro_winkler (line 47) | def test_jaro_winkler():
  function test_cosine_ochiai (line 54) | def test_cosine_ochiai():
  function test_rouge_score (line 61) | def test_rouge_score():
  function test_lcsseq (line 81) | def test_lcsseq():
  function test_lcsstr (line 88) | def test_lcsstr():
  function test_bleu (line 96) | def test_bleu(mock_evaluate_load):

FILE: rag_experiment_accelerator/evaluation/tests/test_search_eval.py
  function test_evaluate_search_result_calulates_precision_score (line 24) | def test_evaluate_search_result_calulates_precision_score():
  function test_evaluate_search_result_calulates_recall_score (line 39) | def test_evaluate_search_result_calulates_recall_score():
  function test_evaluate_search_result_returns_all_search_content (line 54) | def test_evaluate_search_result_returns_all_search_content():

FILE: rag_experiment_accelerator/evaluation/tests/test_spacy_evaluator.py
  function test_evaluator_init (line 8) | def test_evaluator_init(mock_nlp):
  function test_similarity_returns_similar (line 15) | def test_similarity_returns_similar(mock_nlp):
  function test_is_relevant_returns_valid (line 32) | def test_is_relevant_returns_valid(mock_nlp, mock_similarity):

FILE: rag_experiment_accelerator/evaluation/tests/test_transformer_based_metrics.py
  function test_compare_semantic_document_values (line 11) | def test_compare_semantic_document_values():

FILE: rag_experiment_accelerator/evaluation/transformer_based_metrics.py
  function compare_semantic_document_values (line 16) | def compare_semantic_document_values(doc1, doc2, model_type):
  function semantic_compare_values (line 33) | def semantic_compare_values(
  function compute_transformer_based_score (line 56) | def compute_transformer_based_score(

FILE: rag_experiment_accelerator/ingest_data/acs_ingest.py
  function my_hash (line 23) | def my_hash(s):
  function upload_data (line 36) | def upload_data(
  function generate_qna (line 92) | def generate_qna(environment, config, docs, azure_oai_deployment_name):
  function generate_qna_for_chunk (line 139) | def generate_qna_for_chunk(chunk, response_generator):
  function generate_multiple_questions (line 158) | def generate_multiple_questions(question, response_generator: ResponseGe...
  function do_we_need_multiple_questions (line 176) | def do_we_need_multiple_questions(
  function chunks_to_index_documents (line 198) | def chunks_to_index_documents(chunks):

FILE: rag_experiment_accelerator/ingest_data/tests/test_acs_ingest.py
  function test_my_hash_with_string (line 19) | def test_my_hash_with_string():
  function test_my_hash_with_empty_string (line 33) | def test_my_hash_with_empty_string():
  function test_my_hash_with_numbers (line 47) | def test_my_hash_with_numbers():
  function test_generate_title (line 62) | def test_generate_title(mock_response_generator):
  function test_generate_summary (line 84) | def test_generate_summary(mock_response_generator):
  function test_upload_data (line 108) | def test_upload_data(
  function test_we_need_multiple_questions (line 153) | def test_we_need_multiple_questions(mock_response_generator):
  function test_do_we_need_multiple_questions_true (line 173) | def test_do_we_need_multiple_questions_true(mock_response_generator):
  function test_do_we_need_multiple_questions_false (line 193) | def test_do_we_need_multiple_questions_false(mock_response_generator):

FILE: rag_experiment_accelerator/init_Index/create_index.py
  function create_acs_index (line 29) | def create_acs_index(

FILE: rag_experiment_accelerator/init_Index/tests/test_create_index.py
  class TestCreateIndex (line 17) | class TestCreateIndex(unittest.TestCase):
    method test_create_acs_index (line 27) | def test_create_acs_index(
    method test_analyzer_name_alone (line 70) | def test_analyzer_name_alone(
    method test_analyzer_with_index_and_search_analyzer (line 97) | def test_analyzer_with_index_and_search_analyzer(self):
    method test_analyzer_with_index_or_search_analyzer (line 178) | def test_analyzer_with_index_or_search_analyzer(
    method test_create_acs_index_analyzers_non_none (line 246) | def test_create_acs_index_analyzers_non_none(
    method test_create_acs_index_analyzers_none (line 269) | def test_create_acs_index_analyzers_none(
    method test_create_acs_index_invalid_parameters (line 291) | def test_create_acs_index_invalid_parameters(
    method test_create_acs_index_create_or_update_index_fails (line 303) | def test_create_acs_index_create_or_update_index_fails(
    method test_create_acs_index_create_or_update_index_returns_non_none (line 321) | def test_create_acs_index_create_or_update_index_returns_non_none(
    method test_dimension_setting (line 345) | def test_dimension_setting(

FILE: rag_experiment_accelerator/io/exceptions.py
  class WriteException (line 1) | class WriteException(Exception):
    method __init__ (line 2) | def __init__(self, path: str, e: Exception):
  class CopyException (line 10) | class CopyException(Exception):
    method __init__ (line 11) | def __init__(self, src: str, dest: str, e: Exception):

FILE: rag_experiment_accelerator/io/loader.py
  class Loader (line 4) | class Loader(ABC):
    method load (line 10) | def load(self, src: str, **kwargs) -> list:
    method can_handle (line 24) | def can_handle(self, src: str) -> bool:
    method exists (line 37) | def exists(self, src: str) -> bool:

FILE: rag_experiment_accelerator/io/local/base.py
  class LocalIOBase (line 4) | class LocalIOBase:
    method exists (line 9) | def exists(self, path: str) -> bool:

FILE: rag_experiment_accelerator/io/local/loaders/jsonl_loader.py
  class JsonlLoader (line 7) | class JsonlLoader(LocalLoader):
    method load (line 10) | def load(self, path: str, **kwargs) -> list:
    method can_handle (line 38) | def can_handle(self, path: str) -> bool:

FILE: rag_experiment_accelerator/io/local/loaders/local_loader.py
  class LocalLoader (line 8) | class LocalLoader(LocalIOBase, Loader):
    method load (line 29) | def load(self, src: str, **kwargs) -> list:
    method can_handle (line 42) | def can_handle(self, src: str) -> bool:
    method _get_file_ext (line 54) | def _get_file_ext(self, path: str):

FILE: rag_experiment_accelerator/io/local/loaders/tests/test_jsonl_loader.py
  function temp_dir (line 11) | def temp_dir():
  function test_loads (line 18) | def test_loads(temp_dir: str):
  function test_loads_raises_file_not_found (line 32) | def test_loads_raises_file_not_found(temp_dir: str):
  function test_can_handle_true (line 39) | def test_can_handle_true():
  function test_can_handle_false (line 45) | def test_can_handle_false():

FILE: rag_experiment_accelerator/io/local/loaders/tests/test_local_loader.py
  function test__get_file_ext (line 4) | def test__get_file_ext():

FILE: rag_experiment_accelerator/io/local/tests/test_local_io_base.py
  function temp_dir (line 10) | def temp_dir():
  function test_exists_true (line 17) | def test_exists_true(temp_dir: str) -> bool:
  function test_exists_false (line 22) | def test_exists_false() -> bool:

FILE: rag_experiment_accelerator/io/local/writers/jsonl_writer.py
  class JsonlWriter (line 9) | class JsonlWriter(LocalWriter):
    method _write_file (line 23) | def _write_file(self, path: str, data, **kwargs):

FILE: rag_experiment_accelerator/io/local/writers/local_writer.py
  class LocalWriter (line 15) | class LocalWriter(LocalIOBase, Writer):
    method _make_dir (line 22) | def _make_dir(self, dir: str):
    method _get_dirname (line 38) | def _get_dirname(self, path: str):
    method _write_file (line 51) | def _write_file(path: str, data, **kwargs):
    method write (line 65) | def write(self, path: str, data, **kwargs):
    method copy (line 84) | def copy(self, src: str, dest: str, **kwargs):
    method delete (line 108) | def delete(self, src: str):
    method list_filenames (line 121) | def list_filenames(self, dir: str):

FILE: rag_experiment_accelerator/io/local/writers/tests/test_jsonl_writer.py
  function temp_dir (line 13) | def temp_dir():
  function test__write_file (line 20) | def test__write_file(temp_dir: str):

FILE: rag_experiment_accelerator/io/local/writers/tests/test_local_writer.py
  function temp_dirname (line 13) | def temp_dirname():
  function temp_dir (line 22) | def temp_dir():
  function writer_impl (line 31) | def writer_impl():
  function test__make_dir (line 45) | def test__make_dir(temp_dirname: str, writer_impl: LocalWriter):
  function test__make_dir_raises (line 53) | def test__make_dir_raises(writer_impl: LocalWriter):
  function test_write_calls__write_file (line 61) | def test_write_calls__write_file(temp_dir: str, writer_impl: LocalWriter):
  function test_write_creates_parent_dir (line 72) | def test_write_creates_parent_dir(temp_dirname: str, writer_impl: LocalW...
  function test_write_raises_write_exception (line 80) | def test_write_raises_write_exception(writer_impl: LocalWriter):
  function test_copy (line 86) | def test_copy(temp_dirname: str, writer_impl: LocalWriter):
  function test_copy_raises_copy_exception (line 101) | def test_copy_raises_copy_exception(temp_dirname: str, writer_impl: Loca...
  function test_copy_raises_file_not_found (line 117) | def test_copy_raises_file_not_found(temp_dirname: str, writer_impl: Loca...
  function test_delete (line 130) | def test_delete(temp_dirname: str, writer_impl: LocalWriter):
  function test_list_filenames (line 144) | def test_list_filenames(temp_dirname: str, writer_impl: LocalWriter):

FILE: rag_experiment_accelerator/io/writer.py
  class Writer (line 4) | class Writer(ABC):
    method write (line 8) | def write(self, path: str, data, **kwargs):
    method copy (line 22) | def copy(self, src: str, dest: str, **kwargs):
    method delete (line 36) | def delete(self, src: str):
    method exists (line 48) | def exists(self, path: str) -> bool:

FILE: rag_experiment_accelerator/llm/exceptions.py
  class ContentFilteredException (line 1) | class ContentFilteredException(Exception):

FILE: rag_experiment_accelerator/llm/prompt/hyde_prompts.py
  function validate_hypothetical_questions (line 9) | def validate_hypothetical_questions(text: str) -> bool:

FILE: rag_experiment_accelerator/llm/prompt/instruction_prompts.py
  function validate_instruction_keyword (line 9) | def validate_instruction_keyword(text: str) -> bool:
  function validate_instruction_entities (line 16) | def validate_instruction_entities(text: str) -> bool:

FILE: rag_experiment_accelerator/llm/prompt/multiprompts.py
  function validate_do_we_need_multiple (line 5) | def validate_do_we_need_multiple(text: str) -> bool:
  function validate_multiple_prompt (line 9) | def validate_multiple_prompt(text: str) -> bool:

FILE: rag_experiment_accelerator/llm/prompt/prompt.py
  function _default_validation (line 13) | def _default_validation(x: any) -> bool:
  class PromptTag (line 17) | class PromptTag(StrEnum):
  class Prompt (line 24) | class Prompt:
    method __init__ (line 29) | def __init__(
    method arguments_in_prompt (line 46) | def arguments_in_prompt(prompt: str) -> set[str]:
    method check_formatting_argument (line 52) | def check_formatting_argument(text: str, field: str) -> bool:
    method _get_prompt_file_path (line 56) | def _get_prompt_file_path(prompt_file: str) -> str:
    method _try_load_prompt_file (line 63) | def _try_load_prompt_file(prompt_file: str) -> str:
    method update_system_prompt (line 88) | def update_system_prompt(self, system_message: str) -> "Prompt":
    method update_user_prompt (line 93) | def update_user_prompt(self, user_template: str) -> "Prompt":
  class CoTPrompt (line 99) | class CoTPrompt(Prompt):
    method __init__ (line 100) | def __init__(
    method _check_separator_declaration (line 129) | def _check_separator_declaration(
    method update_system_prompt (line 151) | def update_system_prompt(self, system_message: str) -> Prompt:
  class StructuredPrompt (line 160) | class StructuredPrompt(Prompt):
    method __init__ (line 165) | def __init__(
  class StructuredWithCoTPrompt (line 179) | class StructuredWithCoTPrompt(CoTPrompt, StructuredPrompt):
    method __init__ (line 180) | def __init__(

FILE: rag_experiment_accelerator/llm/prompt/qna_prompts.py
  function qna_generation_validate (line 9) | def qna_generation_validate(response: str) -> bool:

FILE: rag_experiment_accelerator/llm/prompt/ragas_prompts.py
  function validate_context_precision (line 10) | def validate_context_precision(text: str) -> bool:
  function validate_context_recall (line 14) | def validate_context_recall(text: str) -> bool:

FILE: rag_experiment_accelerator/llm/prompt/rerank_prompts.py
  function validate_rerank (line 6) | def validate_rerank(text: str) -> bool:

FILE: rag_experiment_accelerator/llm/response_generator.py
  class ResponseGenerator (line 32) | class ResponseGenerator:
    method __init__ (line 33) | def __init__(self, environment: Environment, config: Config, deploymen...
    method _initialize_azure_openai_client (line 41) | def _initialize_azure_openai_client(self, environment: Environment):
    method _interpret_response (line 48) | def _interpret_response(self, response: str, prompt: Prompt) -> any:
    method _get_response (line 87) | def _get_response(
    method generate_response (line 120) | def generate_response(

FILE: rag_experiment_accelerator/llm/tests/test_response_generator.py
  class TestResponseGenerator (line 14) | class TestResponseGenerator(unittest.TestCase):
    method setUp (line 15) | def setUp(self):
    method create_mock_prompt (line 25) | def create_mock_prompt(self, prompt_type, tags, separator=None, valida...
    method test_interpret_response_with_cot_prompt (line 34) | def test_interpret_response_with_cot_prompt(self):
    method test_interpret_response_with_structured_prompt (line 42) | def test_interpret_response_with_structured_prompt(self):
    method test_interpret_response_with_invalid_separator (line 53) | def test_interpret_response_with_invalid_separator(self):
    method test_interpret_response_non_strict_mode (line 61) | def test_interpret_response_non_strict_mode(self):
    method test_get_response_normal (line 68) | def test_get_response_normal(self, mock_logger):
    method test_get_response_content_filtered (line 83) | def test_get_response_content_filtered(self, mock_logger):
    method test_get_response_retries_on_random_exception (line 96) | def test_get_response_retries_on_random_exception(self, mock_logger):
    method test_generate_response_full_system_message (line 118) | def test_generate_response_full_system_message(self, mock_get_response):
    method test_generate_response_full_user_template (line 134) | def test_generate_response_full_user_template(self, mock_get_response):
    method test_generate_response_mixed_messages (line 150) | def test_generate_response_mixed_messages(self, mock_get_response):
    method test_generate_response_missing_system_argument (line 166) | def test_generate_response_missing_system_argument(self, mock_get_resp...
    method test_generate_response_missing_user_argument_non_strict (line 178) | def test_generate_response_missing_user_argument_non_strict(
    method test_generate_response_exception_handling_strict (line 196) | def test_generate_response_exception_handling_strict(self, mock_get_re...
    method test_initialize_azure_openai_client (line 208) | def test_initialize_azure_openai_client(self, mock_initialize_azure_op...

FILE: rag_experiment_accelerator/nlp/language_evaluator.py
  class LanguageEvaluator (line 10) | class LanguageEvaluator:
    method __init__ (line 41) | def __init__(
    method check_string (line 63) | def check_string(self, input_string):
    method detect_language (line 75) | def detect_language(self, text: str):
    method is_confident (line 100) | def is_confident(self, text: str):
    method is_language_match (line 108) | def is_language_match(self, text: str, language_code: str):

FILE: rag_experiment_accelerator/nlp/preprocess.py
  class Preprocess (line 10) | class Preprocess:
    method __init__ (line 13) | def __init__(self, enabled=False):
    method preprocess (line 25) | def preprocess(self, text) -> str:
    method remove_punctuation (line 50) | def remove_punctuation(self, text):
    method remove_tags (line 62) | def remove_tags(self, text):
    method sentence_tokenize (line 75) | def sentence_tokenize(self, text):
    method word_tokenize (line 88) | def word_tokenize(self, text):
    method remove_stop_words (line 100) | def remove_stop_words(self, sentence):
    method lemmatize (line 117) | def lemmatize(self, text):

FILE: rag_experiment_accelerator/nlp/tests/test_language_evaluator.py
  function test_language_evaluator_init (line 40) | def test_language_evaluator_init():
  function test_detect_language (line 49) | def test_detect_language():
  function test_detect_languages (line 60) | def test_detect_languages():
  function test_is_confident_returns_certainty (line 74) | def test_is_confident_returns_certainty():
  function test_is_language_match (line 84) | def test_is_language_match():
  function test_check_string (line 93) | def test_check_string():

FILE: rag_experiment_accelerator/nlp/tests/test_preprocessor.py
  function test_sentence_tokenize (line 7) | def test_sentence_tokenize(mock_nlp):
  function test_word_tokenize (line 22) | def test_word_tokenize(mock_nlp):
  function test_remove_stopwords (line 39) | def test_remove_stopwords(mock_nlp):
  function test_lemmatize (line 71) | def test_lemmatize(mock_nlp):
  function test_remove_punct (line 92) | def test_remove_punct(mock_nlp):

FILE: rag_experiment_accelerator/reranking/reranker.py
  function cross_encoder_rerank_documents (line 12) | def cross_encoder_rerank_documents(
  function llm_rerank_documents (line 46) | def llm_rerank_documents(

FILE: rag_experiment_accelerator/run/evaluation.py
  function _flatten_dict_gen (line 17) | def _flatten_dict_gen(d, parent_key, sep):
  function flatten_dict (line 26) | def flatten_dict(d: MutableMapping, parent_key: str = "", sep: str = "."):
  function get_job_hyper_params (line 30) | def get_job_hyper_params(config: Config, index_config: IndexConfig) -> d...
  function run (line 45) | def run(

FILE: rag_experiment_accelerator/run/index.py
  function run (line 30) | def run(
  function convert_docs_to_vector_db_records (line 103) | def convert_docs_to_vector_db_records(docs):
  function embed_chunks (line 134) | def embed_chunks(config: Config, index_config: IndexConfig, pre_process,...
  function embed_chunk (line 188) | def embed_chunk(pre_process, embedding_model, chunk):
  function generate_titles_from_chunks (line 212) | def generate_titles_from_chunks(
  function generate_summaries_from_chunks (line 253) | def generate_summaries_from_chunks(
  function process_title (line 293) | def process_title(
  function process_summary (line 333) | def process_summary(
  function generate_title (line 373) | def generate_title(chunk, azure_oai_deployment_name, environment, config):
  function generate_summary (line 393) | def generate_summary(chunk, azure_oai_deployment_name, environment, conf...

FILE: rag_experiment_accelerator/run/qa_generation.py
  function run (line 23) | def run(

FILE: rag_experiment_accelerator/run/querying.py
  function query_acs (line 73) | def query_acs(
  function rerank_documents (line 106) | def rerank_documents(
  function hyde (line 145) | def hyde(
  function query_expansion (line 172) | def query_expansion(
  function deduplicate_search_results (line 199) | def deduplicate_search_results(search_results: list[dict]) -> list[dict]:
  class QueryAndEvalACSResult (line 217) | class QueryAndEvalACSResult:
    method __init__ (line 218) | def __init__(self, documents: list[str], evaluations: dict[str, any]):
  function query_and_eval_acs (line 223) | def query_and_eval_acs(
  function filter_non_related_questions (line 286) | def filter_non_related_questions(
  function query_and_eval_acs_multi (line 316) | def query_and_eval_acs_multi(
  function query_and_eval_single_line (line 398) | def query_and_eval_single_line(
  function get_query_output (line 469) | def get_query_output(
  function run (line 560) | def run(

FILE: rag_experiment_accelerator/run/tests/test_index.py
  function test_run (line 26) | def test_run(

FILE: rag_experiment_accelerator/run/tests/test_qa_generation.py
  function test_run (line 12) | def test_run(

FILE: rag_experiment_accelerator/run/tests/test_querying.py
  class TestQuerying (line 27) | class TestQuerying(unittest.TestCase):
    method setUp (line 28) | def setUp(self):
    method test_query_acs (line 77) | def test_query_acs(self, mock_search_mapping):
    method test_rerank_documents (line 101) | def test_rerank_documents(
    method test_query_and_eval_acs (line 121) | def test_query_and_eval_acs(
    method test_query_and_eval_acs_multi_rerank (line 171) | def test_query_and_eval_acs_multi_rerank(
    method test_query_and_eval_acs_multi_no_rerank (line 245) | def test_query_and_eval_acs_multi_no_rerank(
    method test_run_no_multi_no_rerank (line 315) | def test_run_no_multi_no_rerank(

FILE: rag_experiment_accelerator/sampling/clustering.py
  function load_parser (line 24) | def load_parser():
  function spacy_tokenizer (line 41) | def spacy_tokenizer(sentence, parser):
  function determine_optimum_k_elbow (line 65) | def determine_optimum_k_elbow(embeddings_2d, X, min_cluster, max_cluster...
  function vectorize_tfidf (line 140) | def vectorize_tfidf(text, max_features):
  function dataframe_to_chunk_dict (line 156) | def dataframe_to_chunk_dict(df_concat):
  function chunk_dict_to_dataframe (line 174) | def chunk_dict_to_dataframe(all_chunks):
  function cluster_kmeans (line 200) | def cluster_kmeans(embeddings_2d, optimum_k, df, result_dir):
  function cluster (line 249) | def cluster(index_name, all_chunks, config: Config, parser):

FILE: rag_experiment_accelerator/sampling/tests/test_clustering.py
  function mock_logger (line 11) | def mock_logger():
  function mock_df (line 16) | def mock_df():
  function mock_reducer (line 46) | def mock_reducer():
  function mock_df_concat (line 51) | def mock_df_concat():
  function mock_data_dir (line 70) | def mock_data_dir(tmpdir):
  function test_cluster (line 74) | def test_cluster(mock_logger, mock_df, mock_reducer, mock_df_concat, moc...

FILE: rag_experiment_accelerator/search_type/acs_search_methods.py
  function create_client (line 18) | def create_client(service_endpoint, index_name, key):
  function format_results (line 38) | def format_results(results):
  function search_for_match_semantic (line 58) | def search_for_match_semantic(
  function search_for_match_Hybrid_multi (line 117) | def search_for_match_Hybrid_multi(
  function search_for_match_Hybrid_cross (line 173) | def search_for_match_Hybrid_cross(
  function search_for_match_text (line 222) | def search_for_match_text(
  function search_for_match_pure_vector (line 255) | def search_for_match_pure_vector(
  function search_for_match_pure_vector_multi (line 298) | def search_for_match_pure_vector_multi(
  function search_for_match_pure_vector_cross (line 352) | def search_for_match_pure_vector_cross(
  function search_for_manual_hybrid (line 396) | def search_for_manual_hybrid(**kwargs):

FILE: rag_experiment_accelerator/search_type/tests/test_acs_search_methods.py
  function test_create_client (line 26) | def test_create_client(mock_azure_key_credential, mock_search_client):
  function test_format_results (line 45) | def test_format_results():
  function test_search_for_match_semantic (line 59) | def test_search_for_match_semantic(mock_vector_query):
  function test_search_for_match_semantic_handles_exception (line 122) | def test_search_for_match_semantic_handles_exception(mock_logger, mock_v...
  function test_search_for_match_Hybrid_multi (line 152) | def test_search_for_match_Hybrid_multi(mock_vector_query):
  function test_search_for_match_Hybrid_multi_handles_exception (line 215) | def test_search_for_match_Hybrid_multi_handles_exception(
  function test_search_for_match_Hybrid_cross (line 262) | def test_search_for_match_Hybrid_cross(mock_vector_query):
  function test_search_for_match_Hybrid_cross_handles_exception (line 320) | def test_search_for_match_Hybrid_cross_handles_exception(
  function test_search_for_match_text (line 368) | def test_search_for_match_text():
  function test_search_for_match_text_handles_exception (line 404) | def test_search_for_match_text_handles_exception(mock_logger):
  function test_search_for_match_pure_vector (line 430) | def test_search_for_match_pure_vector(mock_vector_query):
  function test_search_for_match_pure_vector_handles_exception (line 483) | def test_search_for_match_pure_vector_handles_exception(
  function test_search_for_match_pure_vector_multi (line 528) | def test_search_for_match_pure_vector_multi(mock_vector_query):
  function test_search_for_match_pure_vector_multi_handles_exception (line 584) | def test_search_for_match_pure_vector_multi_handles_exception(
  function test_search_for_match_pure_vector_cross (line 631) | def test_search_for_match_pure_vector_cross(mock_vector_query):
  function test_search_for_match_pure_vector_cross_handles_exception (line 687) | def test_search_for_match_pure_vector_cross_handles_exception(
  function test_search_for_manual_hybrid (line 737) | def test_search_for_manual_hybrid(

FILE: rag_experiment_accelerator/utils/auth.py
  function get_default_az_cred (line 8) | def get_default_az_cred():

FILE: rag_experiment_accelerator/utils/logging.py
  function get_logger (line 9) | def get_logger(name: str) -> logging.Logger:

FILE: rag_experiment_accelerator/utils/timetook.py
  class TimeTook (line 5) | class TimeTook(object):
    method __init__ (line 14) | def __init__(self, description, logger):
    method __enter__ (line 20) | def __enter__(self):
    method __exit__ (line 24) | def __exit__(self, type, value, traceback):
Condensed preview — 242 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,167K chars).
[
  {
    "path": ".coveragerc",
    "chars": 30,
    "preview": "[run]\nomit =\n    */__init__.py"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 633,
    "preview": "{\n\t\"name\": \"RAG Experiment Accelerator\",\n\t\"image\": \"mcr.microsoft.com/devcontainers/python:1-3.11-bullseye\",\n\t\"features\""
  },
  {
    "path": ".devcontainer/post-create.sh",
    "chars": 299,
    "preview": "#!/bin/bash\n\npip install --upgrade pip\n\npip install -r requirements.txt\n\npip install -r dev-requirements.txt\n\npython -m "
  },
  {
    "path": ".flake8",
    "chars": 57,
    "preview": "[flake8]\nmax-line-length = 120\nextend-ignore = E203, E501"
  },
  {
    "path": ".github/actions/configure_azureml_agent/action.yml",
    "chars": 623,
    "preview": "name: Prepare build environment\n\ndescription: Prepares build environment for python and prompt flow related workflow exe"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 560,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/build_validation_workflow.yml",
    "chars": 1478,
    "preview": "name: Build validation\n\non:\n  workflow_call:\n  workflow_dispatch:\n  pull_request:\n    branches:\n      - main\n      - dev"
  },
  {
    "path": ".github/workflows/rag_exp_acc_ci.yml",
    "chars": 2517,
    "preview": "name: RAG Experiment Accelerator CI\n\non:\n  workflow_call:\n  workflow_dispatch:\n  pull_request:\n    types: [opened, ready"
  },
  {
    "path": ".gitignore",
    "chars": 3615,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 861,
    "preview": "repos:\n  - repo: https://github.com/psf/black\n    rev: 23.12.1\n    hooks:\n      - id: black\n        language_version: py"
  },
  {
    "path": "01_index.py",
    "chars": 1883,
    "preview": "import json\nimport argparse\nimport mlflow\n\nfrom azureml.pipeline import initialise_mlflow_client\n\nfrom rag_experiment_ac"
  },
  {
    "path": "02_qa_generation.py",
    "chars": 873,
    "preview": "import argparse\n\nfrom rag_experiment_accelerator.checkpoint import init_checkpoint\nfrom rag_experiment_accelerator.run.q"
  },
  {
    "path": "03_querying.py",
    "chars": 1835,
    "preview": "import argparse\nimport mlflow\nfrom azureml.pipeline import initialise_mlflow_client\n\nfrom rag_experiment_accelerator.che"
  },
  {
    "path": "04_evaluation.py",
    "chars": 1383,
    "preview": "import argparse\n\nimport mlflow\n\nfrom azureml.pipeline import initialise_mlflow_client\nfrom rag_experiment_accelerator.co"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 444,
    "preview": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://op"
  },
  {
    "path": "LICENSE",
    "chars": 206672,
    "preview": "    MIT License\n\n    Copyright (c) Microsoft Corporation.\n\n    Permission is hereby granted, free of charge, to any pers"
  },
  {
    "path": "Makefile",
    "chars": 3088,
    "preview": ".PHONY: all index qnagen query eval help azureml clear_docs clear_artifacts test flake updatekv\n.DEFAULT_GOAL := help\n\n#"
  },
  {
    "path": "README.md",
    "chars": 38071,
    "preview": "# RAG Experiment Accelerator\n\n## Overview\n\nThe **RAG Experiment Accelerator** is a versatile tool that helps you conduct"
  },
  {
    "path": "SECURITY.md",
    "chars": 2656,
    "preview": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.9 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products an"
  },
  {
    "path": "SUPPORT.md",
    "chars": 1244,
    "preview": "# TODO: The maintainer of this repo has not yet edited this file\r\n\r\n**REPO OWNER**: Do you want Customer Service & Suppo"
  },
  {
    "path": "azure.yaml",
    "chars": 189,
    "preview": "# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json\n\nnam"
  },
  {
    "path": "azureml/eval.py",
    "chars": 2103,
    "preview": "import os\nimport sys\nimport argparse\nimport mlflow\n\nproject_dir = os.path.abspath(os.path.join(os.path.dirname(__file__)"
  },
  {
    "path": "azureml/index.py",
    "chars": 2025,
    "preview": "from rag_experiment_accelerator.checkpoint import init_checkpoint\nimport os\nimport sys\nimport argparse\n\nimport mlflow\n\np"
  },
  {
    "path": "azureml/pipeline.py",
    "chars": 10541,
    "preview": "import os\nimport sys\nimport argparse\nfrom azure.ai.ml import MLClient, Input, Output, dsl, command\nfrom azure.ai.ml.para"
  },
  {
    "path": "azureml/query.py",
    "chars": 2176,
    "preview": "import os\nimport sys\nimport argparse\n\nimport mlflow\n\nproject_dir = os.path.abspath(os.path.join(os.path.dirname(__file__"
  },
  {
    "path": "config.sample.json",
    "chars": 2633,
    "preview": "{\n    \"$schema\": \"https://raw.githubusercontent.com/microsoft/rag-experiment-accelerator/development/config.schema.json\""
  },
  {
    "path": "config.schema.json",
    "chars": 24004,
    "preview": "{\n    \"$schema\": \"http://json-schema.org/draft-06/schema#\",\n    \"type\": \"object\",\n    \"properties\": {\n        \"experimen"
  },
  {
    "path": "cspell.json",
    "chars": 940,
    "preview": "{\n    \"version\": \"0.2\",\n    \"ignorePaths\": [],\n    \"dictionaryDefinitions\": [],\n    \"dictionaries\": [],\n    \"words\": [\n "
  },
  {
    "path": "dev-requirements.txt",
    "chars": 121,
    "preview": "promptflow==1.15.0\npromptflow-tools==1.4.0\npytest==8.3.3\npytest-cov==5.0.0\nflake8==7.1.1\npre-commit==3.8.0\nblack==24.8.0"
  },
  {
    "path": "docs/azureml-pipeline.md",
    "chars": 5144,
    "preview": "# AzureML Pipeline\r\n\r\n## What is it\r\n\r\nRAG Experiment Accelerator supports running the pipeline on Azure ML compute, in "
  },
  {
    "path": "docs/configs-appendix.md",
    "chars": 2468,
    "preview": "# Understanding the config files\n\n## Prerequisites\nFamiliarity with [ReadMe configuration of elements](/README.md#Descri"
  },
  {
    "path": "docs/environment-variables.md",
    "chars": 3725,
    "preview": "# Resource Deployment and Environment Variables\n\n## Required Resources\n\nTo use the rag-experiment-accelerator, create th"
  },
  {
    "path": "docs/evaluation-metrics.md",
    "chars": 10427,
    "preview": "# Evaluation Metrics\n\nThe following is an overview of the available evaluation metrics that can be used to evaluate end-"
  },
  {
    "path": "docs/script-inputs-outputs.md",
    "chars": 3877,
    "preview": "# Script Overview\n\nThis document provides an overview of the scripts that are used to run the RAG Experiment Accelerator"
  },
  {
    "path": "docs/wsl.md",
    "chars": 1704,
    "preview": "# Setting up WSL\n\nThere are numerous guides to setting up WSL, and this is not a comprehensive guide. Instead this might"
  },
  {
    "path": "env_to_keyvault.py",
    "chars": 929,
    "preview": "\"\"\"\nThis script is used to create secrets in Azure Keyvault from the environment variables.\n\nFor the list of environment"
  },
  {
    "path": "experimental/readme.md",
    "chars": 175,
    "preview": "\nRAG EXPERIMENT ACCELERATOR EXPERIMENTAL\n\nThis is the experimental version of the RAG Experiment Accelerator. It is a wo"
  },
  {
    "path": "images/AzureMLPipeline.drawio",
    "chars": 11470,
    "preview": "<mxfile host=\"app.diagrams.net\" modified=\"2024-03-15T10:47:30.734Z\" agent=\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_"
  },
  {
    "path": "infra/abbreviations.json",
    "chars": 5338,
    "preview": "{\n    \"analysisServicesServers\": \"as\",\n    \"apiManagementService\": \"apim-\",\n    \"appConfigurationConfigurationStores\": \""
  },
  {
    "path": "infra/generate_arm_template.sh",
    "chars": 635,
    "preview": "#!/usr/bin/env bash\n\nset -e\n\naz bicep version 2>/dev/null || az bicep install\n\nTEMPLATES=()\nFILES=()\n\nfor ARG in $@; do\n"
  },
  {
    "path": "infra/main.bicep",
    "chars": 8672,
    "preview": "targetScope = 'subscription'\n\n@minLength(1)\n@maxLength(64)\n@description('Name of the the environment which is used to ge"
  },
  {
    "path": "infra/main.bicepparam",
    "chars": 255,
    "preview": "using './main.bicep'\n\nparam environmentName = readEnvironmentVariable('AZURE_ENV_NAME', 'env_name')\n\nparam location = re"
  },
  {
    "path": "infra/main.json",
    "chars": 56839,
    "preview": "{\n  \"$schema\": \"https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#\",\n  \"content"
  },
  {
    "path": "infra/network/azure_bastion.bicep",
    "chars": 743,
    "preview": "param vnetName string\nparam bastionName string\nparam bastionSubnetName string\nparam location string\nparam publicIpName s"
  },
  {
    "path": "infra/network/network_isolation.bicep",
    "chars": 1361,
    "preview": "param vnetName string\nparam location string\n\n@minLength(1)\nparam vnetAddressSpace string\nparam proxySubnetName string\n\n@"
  },
  {
    "path": "infra/shared/cognitiveservices.bicep",
    "chars": 1474,
    "preview": "metadata description = 'Creates an Azure Cognitive Services instance.'\nparam name string\nparam location string = resourc"
  },
  {
    "path": "infra/shared/keyvault-secret.bicep",
    "chars": 789,
    "preview": "metadata description = 'Creates or updates a secret in an Azure Key Vault.'\nparam name string\nparam tags object = {}\npar"
  },
  {
    "path": "infra/shared/keyvault.bicep",
    "chars": 914,
    "preview": "param name string\nparam location string = resourceGroup().location\nparam tags object = {}\n\n@description('Service princip"
  },
  {
    "path": "infra/shared/machineLearning.bicep",
    "chars": 683,
    "preview": "metadata description = 'Creates an Azure Machine Learning Workspace.'\nparam name string\nparam location string = resource"
  },
  {
    "path": "infra/shared/monitoring.bicep",
    "chars": 915,
    "preview": "param logAnalyticsName string\nparam applicationInsightsName string\nparam location string = resourceGroup().location\npara"
  },
  {
    "path": "infra/shared/search-services.bicep",
    "chars": 1338,
    "preview": "metadata description = 'Creates an Azure AI Search instance.'\nparam name string\nparam location string = resourceGroup()."
  },
  {
    "path": "infra/shared/storage.bicep",
    "chars": 2329,
    "preview": "metadata description = 'Creates an Azure storage account.'\nparam name string\nparam location string = resourceGroup().loc"
  },
  {
    "path": "infra/shared/storekeys.bicep",
    "chars": 1795,
    "preview": "param keyVaultName string = ''\nparam azureOpenAIName string = ''\nparam documentIntelligenceName string = ''\nparam azureA"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/README.md",
    "chars": 10985,
    "preview": "# **RAG Experiment Accelerator** with Prompt Flow\n\n## Flow description\nThe RAG Experiment Accelerator is a versatile too"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/custom_environment/Dockerfile",
    "chars": 251,
    "preview": "FROM mcr.microsoft.com/azureml/promptflow/promptflow-runtime:20231207.v2\nCOPY ./rag_experiment_accelerator-0.9-py3-none-"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/custom_environment/environment.yaml",
    "chars": 139,
    "preview": "$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json\nname: rag-experiment-accelerator-environmen"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/env_setup.md",
    "chars": 2103,
    "preview": "# Promptflow Secret Setup\n\n## Prerequisites\nInstall the dev-requirements and login to the az cli.\n``` bash\n# Install the"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/evaluation/evaluation.py",
    "chars": 1134,
    "preview": "from promptflow import tool\r\nimport mlflow\r\n\r\nfrom rag_experiment_accelerator.evaluation.eval import get_run_tags\r\nfrom "
  },
  {
    "path": "promptflow/rag-experiment-accelerator/evaluation/flow.dag.yaml",
    "chars": 379,
    "preview": "inputs:\n  config_dir:\n    type: string\n    default: ../\noutputs: {}\nnodes:\n- name: setup_env\n  type: python\n  source:\n  "
  },
  {
    "path": "promptflow/rag-experiment-accelerator/flow.dag.yaml",
    "chars": 1155,
    "preview": "inputs:\n  should_index:\n    type: bool\n    default: true\n  config_dir:\n    type: string\n    default: ../..\n  should_gene"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/index/create_index.py",
    "chars": 793,
    "preview": "from promptflow import tool\r\nfrom rag_experiment_accelerator.checkpoint import init_checkpoint\r\nfrom rag_experiment_acce"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/index/flow.dag.yaml",
    "chars": 455,
    "preview": "inputs:\n  config_dir:\n    type: string\n    default: ../\n  should_index:\n    type: bool\n    default: true\noutputs: {}\nnod"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/qa_generation/flow.dag.yaml",
    "chars": 381,
    "preview": "inputs:\n  config_dir:\n    type: string\n    default: ../\noutputs: {}\nnodes:\n- name: setup_env\n  type: python\n  source:\n  "
  },
  {
    "path": "promptflow/rag-experiment-accelerator/qa_generation/generate_qa.py",
    "chars": 613,
    "preview": "from promptflow import tool\r\nfrom rag_experiment_accelerator.run.qa_generation import run\r\nfrom rag_experiment_accelerat"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/querying/flow.dag.yaml",
    "chars": 375,
    "preview": "inputs:\n  config_dir:\n    type: string\n    default: ../\noutputs: {}\nnodes:\n- name: setup_env\n  type: python\n  source:\n  "
  },
  {
    "path": "promptflow/rag-experiment-accelerator/querying/querying.py",
    "chars": 503,
    "preview": "from promptflow import tool\r\nfrom rag_experiment_accelerator.run.querying import run\r\nfrom rag_experiment_accelerator.co"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/setup/flow.dag.yaml",
    "chars": 111,
    "preview": "inputs: {}\noutputs: {}\nnodes:\n- name: setup_env\n  type: python\n  source:\n    type: code\n    path: setup_env.py\n"
  },
  {
    "path": "promptflow/rag-experiment-accelerator/setup/setup_env.py",
    "chars": 1407,
    "preview": "import os\n\nfrom promptflow.connections import CustomConnection\n\nfrom promptflow import tool\n\n\n@tool\ndef my_python_tool(c"
  },
  {
    "path": "pyproject.toml",
    "chars": 285,
    "preview": "[tool.pylic]\nsafe_licenses = [\n    \"Apache Software License\",\n    \"Apache License 2.0\",\n    \"MIT License\",\n    \"Python S"
  },
  {
    "path": "rag_experiment_accelerator/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/artifact/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/artifact_handler.py",
    "chars": 3559,
    "preview": "import time\n\nfrom rag_experiment_accelerator.artifact.handlers.exceptions import LoadException\nfrom rag_experiment_accel"
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/exceptions.py",
    "chars": 192,
    "preview": "class LoadException(Exception):\n    def __init__(self, path: str):\n        super().__init__(\n            f\"Cannot load a"
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/query_output_handler.py",
    "chars": 3639,
    "preview": "from rag_experiment_accelerator.artifact.handlers.artifact_handler import (\n    ArtifactHandler,\n)\nfrom rag_experiment_a"
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/tests/test_artifact_handler.py",
    "chars": 2572,
    "preview": "from unittest.mock import Mock\nimport pytest\n\nfrom rag_experiment_accelerator.artifact.handlers.artifact_handler import "
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/tests/test_query_output_handler.py",
    "chars": 4725,
    "preview": "from unittest.mock import patch\n\nimport pytest\n\nfrom rag_experiment_accelerator.artifact.handlers.query_output_handler i"
  },
  {
    "path": "rag_experiment_accelerator/artifact/handlers/typing.py",
    "chars": 202,
    "preview": "from typing import TypeVar\nfrom rag_experiment_accelerator.io.loader import Loader\nfrom rag_experiment_accelerator.io.wr"
  },
  {
    "path": "rag_experiment_accelerator/artifact/models/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/artifact/models/query_output.py",
    "chars": 1962,
    "preview": "class QueryOutput:\n    \"\"\"\n    Represents the output of a query.\n\n    Attributes:\n        rerank (bool): Indicates wheth"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/README.md",
    "chars": 2125,
    "preview": "# Checkpoints\n\n## What is a checkpoint?\nCheckpoints are used to skip the processing of data that has already been proces"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/__init__.py",
    "chars": 238,
    "preview": "# flake8: noqa: F401\n\nfrom rag_experiment_accelerator.checkpoint.checkpoint_factory import (\n    init_checkpoint,\n    ge"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/checkpoint.py",
    "chars": 2896,
    "preview": "from abc import ABC, abstractmethod\nfrom typing import Any\nfrom rag_experiment_accelerator.utils.logging import get_logg"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/checkpoint_decorator.py",
    "chars": 1410,
    "preview": "from rag_experiment_accelerator.checkpoint.checkpoint_factory import get_checkpoint\n\n\ndef cache_with_checkpoint(id=None)"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/checkpoint_factory.py",
    "chars": 1317,
    "preview": "from rag_experiment_accelerator.config.config import Config, ExecutionEnvironment\n\nglobal _checkpoint_instance\n_checkpoi"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/local_storage_checkpoint.py",
    "chars": 1823,
    "preview": "import os\nimport pickle\nimport hashlib\n\nfrom typing import Any, List, Set\nfrom rag_experiment_accelerator.checkpoint.che"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/null_checkpoint.py",
    "chars": 499,
    "preview": "from typing import Any\nfrom rag_experiment_accelerator.checkpoint.checkpoint import Checkpoint\n\n\nclass NullCheckpoint(Ch"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/tests/test_checkpoint.py",
    "chars": 2234,
    "preview": "from unittest.mock import MagicMock\nimport pytest\nfrom unittest.mock import patch\n\nfrom rag_experiment_accelerator.check"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/tests/test_local_storage_checkpoint.py",
    "chars": 1318,
    "preview": "import unittest\nimport os\nimport tempfile\nimport shutil\nfrom unittest.mock import MagicMock\n\nfrom rag_experiment_acceler"
  },
  {
    "path": "rag_experiment_accelerator/checkpoint/tests/test_null_checkpoint.py",
    "chars": 605,
    "preview": "import unittest\n\nfrom rag_experiment_accelerator.checkpoint.null_checkpoint import NullCheckpoint\n\n\ndef dummy(word):\n   "
  },
  {
    "path": "rag_experiment_accelerator/config/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/config/base_config.py",
    "chars": 3442,
    "preview": "from copy import deepcopy\nfrom typing import get_type_hints\nfrom itertools import product\n\nimport random\n\n\nfrom rag_expe"
  },
  {
    "path": "rag_experiment_accelerator/config/chunking_config.py",
    "chars": 736,
    "preview": "from enum import StrEnum\nfrom dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import Bas"
  },
  {
    "path": "rag_experiment_accelerator/config/config.py",
    "chars": 5086,
    "preview": "from enum import StrEnum\nimport json\nimport os\n\nfrom dataclasses import dataclass, field\n\nfrom rag_experiment_accelerato"
  },
  {
    "path": "rag_experiment_accelerator/config/config_validator.py",
    "chars": 2060,
    "preview": "import json\nimport os\nfrom jsonschema import ValidationError, validate\nimport requests\n\nschema_cache = {}\n\n\ndef fetch_js"
  },
  {
    "path": "rag_experiment_accelerator/config/embedding_model_config.py",
    "chars": 300,
    "preview": "from dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@dataclass\nclas"
  },
  {
    "path": "rag_experiment_accelerator/config/environment.py",
    "chars": 7423,
    "preview": "import os\nfrom typing import Optional\nfrom dataclasses import dataclass\n\nfrom dotenv import load_dotenv\nfrom azure.keyva"
  },
  {
    "path": "rag_experiment_accelerator/config/eval_config.py",
    "chars": 463,
    "preview": "from dataclasses import dataclass, field\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@datacla"
  },
  {
    "path": "rag_experiment_accelerator/config/index_config.py",
    "chars": 5383,
    "preview": "from dataclasses import dataclass, field\nfrom enum import StrEnum\n\nfrom rag_experiment_accelerator.config.base_config im"
  },
  {
    "path": "rag_experiment_accelerator/config/language_config.py",
    "chars": 613,
    "preview": "from dataclasses import dataclass, field\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@datacla"
  },
  {
    "path": "rag_experiment_accelerator/config/openai_config.py",
    "chars": 291,
    "preview": "from dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@dataclass\nclas"
  },
  {
    "path": "rag_experiment_accelerator/config/path_config.py",
    "chars": 2311,
    "preview": "from dataclasses import dataclass\nimport os\nfrom rag_experiment_accelerator.config import paths\nfrom rag_experiment_acce"
  },
  {
    "path": "rag_experiment_accelerator/config/paths.py",
    "chars": 1273,
    "preview": "import os\nimport glob\nfrom datetime import datetime\n\nfrom rag_experiment_accelerator.utils.logging import get_logger\n\n\nl"
  },
  {
    "path": "rag_experiment_accelerator/config/query_expansion.py",
    "chars": 389,
    "preview": "from dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@dataclass\nclas"
  },
  {
    "path": "rag_experiment_accelerator/config/rerank_config.py",
    "chars": 353,
    "preview": "from dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@dataclass\nclas"
  },
  {
    "path": "rag_experiment_accelerator/config/sampling_config.py",
    "chars": 749,
    "preview": "from dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@dataclass\nclas"
  },
  {
    "path": "rag_experiment_accelerator/config/search_config.py",
    "chars": 282,
    "preview": "from dataclasses import dataclass\nfrom rag_experiment_accelerator.config.base_config import BaseConfig\n\n\n@dataclass\nclas"
  },
  {
    "path": "rag_experiment_accelerator/config/tests/test_config.py",
    "chars": 10155,
    "preview": "import pytest\nimport json\nimport os\nfrom unittest.mock import MagicMock, patch\n\nfrom rag_experiment_accelerator.config.c"
  },
  {
    "path": "rag_experiment_accelerator/config/tests/test_config_validator.py",
    "chars": 7821,
    "preview": "from jsonschema import ValidationError\nfrom unittest.mock import MagicMock, mock_open, patch\nimport pytest\nimport os\nimp"
  },
  {
    "path": "rag_experiment_accelerator/config/tests/test_environment.py",
    "chars": 5307,
    "preview": "from unittest.mock import patch, MagicMock\nfrom typing import Optional\n\nfrom azure.keyvault.secrets import SecretClient\n"
  },
  {
    "path": "rag_experiment_accelerator/config/tests/test_index_config.py",
    "chars": 3576,
    "preview": "from rag_experiment_accelerator.config.chunking_config import ChunkingConfig\nfrom rag_experiment_accelerator.config.embe"
  },
  {
    "path": "rag_experiment_accelerator/data_assets/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/data_assets/data_asset.py",
    "chars": 1441,
    "preview": "from azure.ai.ml import MLClient\nfrom azure.ai.ml.entities import Data\nfrom azure.ai.ml.constants import AssetTypes\n\nfro"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/customJsonLoader.py",
    "chars": 2086,
    "preview": "import json\nfrom pathlib import Path\nfrom typing import Union\n\nfrom langchain.docstore.document import Document\nfrom lan"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/documentIntelligenceLoader.py",
    "chars": 16148,
    "preview": "from concurrent.futures import ThreadPoolExecutor, as_completed\nfrom contextlib import ExitStack\nimport re\nimport os\nimp"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/documentLoader.py",
    "chars": 3965,
    "preview": "from rag_experiment_accelerator.doc_loader.docxLoader import load_docx_files\nfrom rag_experiment_accelerator.doc_loader."
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/docxLoader.py",
    "chars": 1211,
    "preview": "from langchain_community.document_loaders import Docx2txtLoader\n\nfrom rag_experiment_accelerator.doc_loader.structuredLo"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/htmlLoader.py",
    "chars": 1415,
    "preview": "from langchain_community.document_loaders import BSHTMLLoader\n\nfrom rag_experiment_accelerator.doc_loader.structuredLoad"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/jsonLoader.py",
    "chars": 1357,
    "preview": "from rag_experiment_accelerator.doc_loader.customJsonLoader import (\n    CustomJSONLoader,\n)\nfrom rag_experiment_acceler"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/markdownLoader.py",
    "chars": 1256,
    "preview": "from langchain_community.document_loaders import UnstructuredMarkdownLoader\n\nfrom rag_experiment_accelerator.doc_loader."
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/pdfLoader.py",
    "chars": 2926,
    "preview": "import uuid\nimport re\n\nfrom langchain_community.document_loaders import PyPDFLoader\nfrom langchain.text_splitter import "
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/structuredLoader.py",
    "chars": 2441,
    "preview": "import uuid\n\nfrom langchain.document_loaders.base import BaseLoader\nfrom langchain.text_splitter import RecursiveCharact"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_custom_html_loader.py",
    "chars": 767,
    "preview": "from unittest.mock import Mock\n\nfrom rag_experiment_accelerator.doc_loader.htmlLoader import load_html_files\nfrom rag_ex"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_custom_json_loader.py",
    "chars": 3219,
    "preview": "import os\nimport pytest\n\nfrom rag_experiment_accelerator.doc_loader.customJsonLoader import (\n    CustomJSONLoader,\n)\nfr"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_data/document_intelligence_response/multiple_pages.json",
    "chars": 47790,
    "preview": "{\n    \"apiVersion\": \"2023-10-31-preview\",\n    \"modelId\": \"prebuilt-layout\",\n    \"content\": \"Title for page number one So"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_data/document_intelligence_response/simple_response.json",
    "chars": 47075,
    "preview": "{\n    \"apiVersion\": \"2023-10-31-preview\",\n    \"modelId\": \"prebuilt-layout\",\n    \"content\": \"This is the Title\\n\\\\nSome t"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_data/document_intelligence_response/table_without_headers.json",
    "chars": 34648,
    "preview": "{\n    \"apiVersion\": \"2023-10-31-preview\",\n    \"modelId\": \"prebuilt-layout\",\n    \"content\": \"Table without Headers\\n===\\\\"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_data/json/data.bad.invalid_keys.json",
    "chars": 134,
    "preview": "[\n    {\n        \"title\": \"Contains 'contents' key instead of 'content'\",\n        \"contents\": \"This is the content for it"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_data/json/data.bad.not_a_list.json",
    "chars": 90,
    "preview": "{\n    \"title\": \"Data should be a list\",\n    \"content\": \"This is the content for item 1.\"\n}"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_data/json/data.valid.json",
    "chars": 1657,
    "preview": "[\n  {\n    \"item_id\": \"1\",\n    \"title\": \"Title TEST 1\",\n    \"content\": \"This is the content for item 1.\",\n    \"summary\": "
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_document_intelligence_loader.py",
    "chars": 9507,
    "preview": "import json\nfrom rag_experiment_accelerator.doc_loader.documentIntelligenceLoader import (\n    DocumentIntelligenceLoade"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/tests/test_docx_loader.py",
    "chars": 790,
    "preview": "from unittest.mock import Mock\n\nfrom rag_experiment_accelerator.doc_loader.docxLoader import load_docx_files\nfrom rag_ex"
  },
  {
    "path": "rag_experiment_accelerator/doc_loader/textLoader.py",
    "chars": 1315,
    "preview": "from langchain_community.document_loaders import TextLoader\n\nfrom rag_experiment_accelerator.doc_loader.structuredLoader"
  },
  {
    "path": "rag_experiment_accelerator/embedding/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/embedding/aoai_embedding_model.py",
    "chars": 2230,
    "preview": "from openai import AzureOpenAI\n\nfrom rag_experiment_accelerator.config.environment import Environment\nfrom rag_experimen"
  },
  {
    "path": "rag_experiment_accelerator/embedding/embedding_model.py",
    "chars": 1076,
    "preview": "from abc import abstractmethod, ABC\n\n\nclass EmbeddingModel(ABC):\n    \"\"\"\n    Base class for embedding models.\n\n    Args:"
  },
  {
    "path": "rag_experiment_accelerator/embedding/factory.py",
    "chars": 572,
    "preview": "from rag_experiment_accelerator.embedding.aoai_embedding_model import AOAIEmbeddingModel\nfrom rag_experiment_accelerator"
  },
  {
    "path": "rag_experiment_accelerator/embedding/st_embedding_model.py",
    "chars": 2970,
    "preview": "from sentence_transformers import SentenceTransformer\nfrom rag_experiment_accelerator.embedding.embedding_model import E"
  },
  {
    "path": "rag_experiment_accelerator/embedding/tests/test_aoai_embedding_model.py",
    "chars": 2531,
    "preview": "from unittest.mock import patch, MagicMock\n\nfrom openai.types.create_embedding_response import CreateEmbeddingResponse, "
  },
  {
    "path": "rag_experiment_accelerator/embedding/tests/test_factory.py",
    "chars": 1567,
    "preview": "from unittest.mock import patch, MagicMock\nimport pytest\n\nfrom rag_experiment_accelerator.embedding.aoai_embedding_model"
  },
  {
    "path": "rag_experiment_accelerator/embedding/tests/test_st_embedding_model.py",
    "chars": 1258,
    "preview": "from unittest.mock import patch\nimport pytest\nimport numpy as np\nfrom rag_experiment_accelerator.embedding.st_embedding_"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/LICENSE.txt",
    "chars": 11353,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "rag_experiment_accelerator/evaluation/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/evaluation/eval.py",
    "chars": 13626,
    "preview": "from concurrent.futures import ThreadPoolExecutor, as_completed\nfrom contextlib import ExitStack\nimport os\nimport warnin"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/llm_based_metrics.py",
    "chars": 5880,
    "preview": "from sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\nfrom rag_e"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/plain_metrics.py",
    "chars": 7510,
    "preview": "import evaluate\nfrom rapidfuzz import fuzz\nfrom rapidfuzz import distance\nfrom textdistance import algorithms\nfrom rouge"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/plot_metrics.py",
    "chars": 5631,
    "preview": "import ast\n\nimport plotly.express as px\nimport plotly.graph_objects as go\nimport plotly.subplots as sp\nfrom rag_experime"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/search_eval.py",
    "chars": 1869,
    "preview": "from sklearn import metrics\n\nfrom rag_experiment_accelerator.evaluation.spacy_evaluator import (\n    SpacyEvaluator,\n)\nf"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/spacy_evaluator.py",
    "chars": 1692,
    "preview": "from spacy import load\n\nfrom rag_experiment_accelerator.utils.logging import get_logger\n\nlogger = get_logger(__name__)\n\n"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/tests/test_llm_based_metrics.py",
    "chars": 3386,
    "preview": "from unittest.mock import patch\n\nfrom rag_experiment_accelerator.evaluation.llm_based_metrics import (\n    llm_answer_re"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/tests/test_plain_metrics.py",
    "chars": 3037,
    "preview": "from unittest.mock import patch\nfrom pytest import approx\n\nfrom rag_experiment_accelerator.evaluation.plain_metrics impo"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/tests/test_search_eval.py",
    "chars": 2024,
    "preview": "from unittest.mock import patch\n\nfrom rag_experiment_accelerator.evaluation.search_eval import (\n    evaluate_search_res"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/tests/test_spacy_evaluator.py",
    "chars": 1494,
    "preview": "from unittest.mock import MagicMock, call, patch\nfrom rag_experiment_accelerator.evaluation.spacy_evaluator import (\n   "
  },
  {
    "path": "rag_experiment_accelerator/evaluation/tests/test_transformer_based_metrics.py",
    "chars": 621,
    "preview": "from unittest.mock import MagicMock\n\nimport numpy as np\n\n\nfrom rag_experiment_accelerator.evaluation.transformer_based_m"
  },
  {
    "path": "rag_experiment_accelerator/evaluation/transformer_based_metrics.py",
    "chars": 2353,
    "preview": "from sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n\n# todo: c"
  },
  {
    "path": "rag_experiment_accelerator/ingest_data/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/ingest_data/acs_ingest.py",
    "chars": 7665,
    "preview": "from concurrent.futures import ThreadPoolExecutor, as_completed\nfrom contextlib import ExitStack\nimport hashlib\n\nimport "
  },
  {
    "path": "rag_experiment_accelerator/ingest_data/tests/test_acs_ingest.py",
    "chars": 5772,
    "preview": "from unittest.mock import patch, Mock, ANY\n\nfrom rag_experiment_accelerator.ingest_data.acs_ingest import (\n    my_hash,"
  },
  {
    "path": "rag_experiment_accelerator/init_Index/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/init_Index/create_index.py",
    "chars": 6649,
    "preview": "from azure.core.credentials import AzureKeyCredential\nfrom azure.search.documents.indexes import SearchIndexClient\nfrom "
  },
  {
    "path": "rag_experiment_accelerator/init_Index/tests/test_create_index.py",
    "chars": 14507,
    "preview": "import unittest\nfrom unittest.mock import patch, Mock\n\nfrom rag_experiment_accelerator.config.language_config import Lan"
  },
  {
    "path": "rag_experiment_accelerator/io/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/io/exceptions.py",
    "chars": 554,
    "preview": "class WriteException(Exception):\n    def __init__(self, path: str, e: Exception):\n        super().__init__(\n            "
  },
  {
    "path": "rag_experiment_accelerator/io/loader.py",
    "chars": 1033,
    "preview": "from abc import ABC, abstractmethod\n\n\nclass Loader(ABC):\n    \"\"\"\n    Abstract base class for data loaders.\n    \"\"\"\n\n    "
  },
  {
    "path": "rag_experiment_accelerator/io/local/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/io/local/base.py",
    "chars": 453,
    "preview": "import os\n\n\nclass LocalIOBase:\n    \"\"\"\n    Base class for local input/output operations.\n    \"\"\"\n\n    def exists(self, p"
  },
  {
    "path": "rag_experiment_accelerator/io/local/loaders/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/io/local/loaders/jsonl_loader.py",
    "chars": 1461,
    "preview": "import json\nfrom json.decoder import JSONDecodeError\n\nfrom rag_experiment_accelerator.io.local.loaders.local_loader impo"
  },
  {
    "path": "rag_experiment_accelerator/io/local/loaders/local_loader.py",
    "chars": 1642,
    "preview": "from abc import abstractmethod\nimport pathlib\n\nfrom rag_experiment_accelerator.io.loader import Loader\nfrom rag_experime"
  },
  {
    "path": "rag_experiment_accelerator/io/local/loaders/tests/test_jsonl_loader.py",
    "chars": 1078,
    "preview": "import json\nimport os\nimport shutil\nimport tempfile\nimport pytest\n\nfrom rag_experiment_accelerator.io.local.loaders.json"
  },
  {
    "path": "rag_experiment_accelerator/io/local/loaders/tests/test_local_loader.py",
    "chars": 395,
    "preview": "from rag_experiment_accelerator.io.local.loaders.local_loader import LocalLoader\n\n\ndef test__get_file_ext():\n    class T"
  },
  {
    "path": "rag_experiment_accelerator/io/local/tests/test_local_io_base.py",
    "chars": 509,
    "preview": "import os\nimport shutil\nimport tempfile\nimport pytest\n\nfrom rag_experiment_accelerator.io.local.base import LocalIOBase\n"
  },
  {
    "path": "rag_experiment_accelerator/io/local/writers/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/io/local/writers/jsonl_writer.py",
    "chars": 894,
    "preview": "import json\n\nfrom rag_experiment_accelerator.io.local.writers.local_writer import LocalWriter\nfrom rag_experiment_accele"
  },
  {
    "path": "rag_experiment_accelerator/io/local/writers/local_writer.py",
    "chars": 3674,
    "preview": "from abc import abstractmethod\nimport os\nimport pathlib\nimport shutil\nfrom rag_experiment_accelerator.io.exceptions impo"
  },
  {
    "path": "rag_experiment_accelerator/io/local/writers/tests/test_jsonl_writer.py",
    "chars": 624,
    "preview": "import os\nimport shutil\nimport tempfile\n\nimport pytest\n\nfrom rag_experiment_accelerator.io.local.writers.jsonl_writer im"
  },
  {
    "path": "rag_experiment_accelerator/io/local/writers/tests/test_local_writer.py",
    "chars": 4292,
    "preview": "import os\nimport shutil\nimport tempfile\nimport uuid\n\nimport pytest\n\nfrom rag_experiment_accelerator.io.exceptions import"
  },
  {
    "path": "rag_experiment_accelerator/io/writer.py",
    "chars": 1276,
    "preview": "from abc import ABC, abstractmethod\n\n\nclass Writer(ABC):\n    \"\"\"Abstract base class for a writer.\"\"\"\n\n    @abstractmetho"
  },
  {
    "path": "rag_experiment_accelerator/llm/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "rag_experiment_accelerator/llm/exceptions.py",
    "chars": 52,
    "preview": "class ContentFilteredException(Exception):\n    pass\n"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/__init__.py",
    "chars": 1464,
    "preview": "# flake8: noqa\n\nfrom rag_experiment_accelerator.llm.prompt.prompt import (\n    Prompt,\n    StructuredPrompt,\n    Structu"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/hyde_prompts.py",
    "chars": 861,
    "preview": "import json\nfrom rag_experiment_accelerator.llm.prompt.prompt import (\n    Prompt,\n    StructuredPrompt,\n    PromptTag,\n"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/instruction_prompts.py",
    "chars": 1592,
    "preview": "import json\nfrom rag_experiment_accelerator.llm.prompt.prompt import (\n    Prompt,\n    StructuredPrompt,\n    PromptTag,\n"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/multiprompts.py",
    "chars": 854,
    "preview": "import json\nfrom rag_experiment_accelerator.llm.prompt.prompt import StructuredPrompt, PromptTag\n\n\ndef validate_do_we_ne"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/prompt.py",
    "chars": 6547,
    "preview": "import os\nfrom importlib import resources\nimport re\n\nfrom string import Template\n\nfrom enum import StrEnum\nfrom rag_expe"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/qna_prompts.py",
    "chars": 2123,
    "preview": "import json\nfrom rag_experiment_accelerator.llm.prompt.prompt import (\n    StructuredWithCoTPrompt,\n    StructuredPrompt"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/ragas_prompts.py",
    "chars": 1479,
    "preview": "import re\nimport json\nfrom rag_experiment_accelerator.llm.prompt.prompt import (\n    Prompt,\n    StructuredPrompt,\n    P"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompt/rerank_prompts.py",
    "chars": 746,
    "preview": "import re\nimport json\nfrom rag_experiment_accelerator.llm.prompt.prompt import StructuredPrompt, PromptTag\n\n\ndef validat"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/do_need_multiple_prompt_instruction.txt",
    "chars": 1627,
    "preview": "Analyze the given question to determine if it falls into one of the following categories:\n\n1. Simple, Factual Question\n "
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/generate_qna_long_multi_context.txt",
    "chars": 19461,
    "preview": "Your task is to create a question and answer pair from provided pieces of documents. You will be given chunks of documen"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/generate_qna_long_single_context.txt",
    "chars": 18570,
    "preview": "Your task is to create a question and answer pair from provided pieces of documents. You will be given chunks of documen"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/generate_qna_short_multi_context.txt",
    "chars": 5972,
    "preview": "Your task is to create a question and answer pair from provided pieces of documents. You will be given chunks of documen"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/generate_qna_short_single_context.txt",
    "chars": 5715,
    "preview": "Your task is to create a question and answer pair from provided pieces of documents. You will be given chunks of documen"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/generate_qna_short_single_context_no_cot.txt",
    "chars": 8401,
    "preview": "Your task is to create a question and answer pair from provided pieces of documents. You will be given chunks of documen"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/llm_answer_relevance_instruction.txt",
    "chars": 369,
    "preview": "Generate question for the given answer.\nExample:\nUser:\n    The PSLV-C56 mission is scheduled to be launched on Sunday, 3"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/llm_context_precision_instruction.txt",
    "chars": 666,
    "preview": "Given a question and a context, verify if the information in the given context is useful in answering the question. Retu"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/llm_context_recall_instruction.txt",
    "chars": 3439,
    "preview": "Given a context, and an answer, analyze each sentence in the answer and classify if the sentence can be attributed to th"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/main_instruction_long.txt",
    "chars": 1671,
    "preview": "You provide answers to questions based solely on the information provided below.\nAnswer precisely and concisely, address"
  },
  {
    "path": "rag_experiment_accelerator/llm/prompts_text/main_instruction_short.txt",
    "chars": 435,
    "preview": "You provide answers to questions based solely on the information provided below.\nAnswer precisely and concisely, address"
  }
]

// ... and 42 more files (download for full content)

About this extraction

This page contains the full source code of the microsoft/rag-experiment-accelerator GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 242 files (1.1 MB), approximately 238.6k tokens, and a symbol index with 541 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!